import {FakeMethodResolver} from 'chrome://resources/ash/common/fake_method_resolver.js';
import {FakeObservables} from 'chrome://resources/ash/common/fake_observables.js';
import {assert} from 'chrome://resources/js/assert.js';
import type {BatteryChargeStatus, BatteryChargeStatusObserverRemote, BatteryHealth, BatteryHealthObserverRemote, BatteryInfo, CpuUsage, CpuUsageObserverRemote, MemoryUsage, MemoryUsageObserverRemote, SystemDataProviderInterface, SystemInfo} from './system_data_provider.mojom-webui.js';
* @fileoverview
* Implements a fake version of the SystemDataProvider mojo interface.
*/
* Type for methods needed for the fake SystemDataProvider implementation.
*/
export type FakeSystemDataProviderInterface = SystemDataProviderInterface&{
setFakeBatteryChargeStatus(batteryChargeStatusList: BatteryChargeStatus[]):
void,
setFakeBatteryHealth(batteryHealthList: BatteryHealth[]): void,
setFakeBatteryInfo(batteryInfo: BatteryInfo): void,
setFakeCpuUsage(cpuUsageList: CpuUsage[]): void,
setFakeMemoryUsage(memoryUsageList: MemoryUsage[]): void,
setFakeSystemInfo(systemInfo: SystemInfo): void,
};
export class FakeSystemDataProvider implements FakeSystemDataProviderInterface {
private methods: FakeMethodResolver = new FakeMethodResolver();
private observables: FakeObservables = new FakeObservables();
private observeBatteryChargeStatusPromise: Promise<void>|null = null;
private observeBatteryHealthPromise: Promise<void>|null = null;
private observeCpuUsagePromise: Promise<void>|null = null;
private observeMemoryUsagePromise: Promise<void>|null = null;
constructor() {
this.registerMethods();
this.registerObservables();
}
getSystemInfo(): Promise<{systemInfo: SystemInfo}> {
return this.methods.resolveMethod('getSystemInfo');
}
setFakeSystemInfo(systemInfo: SystemInfo): void {
this.methods.setResult('getSystemInfo', {systemInfo});
}
getBatteryInfo(): Promise<{batteryInfo: BatteryInfo}> {
return this.methods.resolveMethod('getBatteryInfo');
}
setFakeBatteryInfo(batteryInfo: BatteryInfo): void {
this.methods.setResult('getBatteryInfo', {batteryInfo});
}
observeBatteryChargeStatus(remote: BatteryChargeStatusObserverRemote): void {
this.observeBatteryChargeStatusPromise = this.observe(
'BatteryChargeStatusObserver_onBatteryChargeStatusUpdated',
(batteryChargeStatus) => {
remote.onBatteryChargeStatusUpdated(
(batteryChargeStatus));
});
}
getObserveBatteryChargeStatusPromiseForTesting(): Promise<void> {
assert(this.observeBatteryChargeStatusPromise);
return this.observeBatteryChargeStatusPromise;
}
* Sets the values that will observed from observeBatteryChargeStatus.
*/
setFakeBatteryChargeStatus(batteryChargeStatusList: BatteryChargeStatus[]):
void {
this.observables.setObservableData(
'BatteryChargeStatusObserver_onBatteryChargeStatusUpdated',
batteryChargeStatusList);
}
triggerBatteryChargeStatusObserver(): void {
this.observables.trigger(
'BatteryChargeStatusObserver_onBatteryChargeStatusUpdated');
}
observeBatteryHealth(remote: BatteryHealthObserverRemote): void {
this.observeBatteryHealthPromise = this.observe(
'BatteryHealthObserver_onBatteryHealthUpdated', (batteryHealth) => {
remote.onBatteryHealthUpdated(
(batteryHealth));
});
}
getObserveBatteryHealthPromiseForTesting(): Promise<void> {
assert(this.observeBatteryHealthPromise);
return this.observeBatteryHealthPromise;
}
setFakeBatteryHealth(batteryHealthList: BatteryHealth[]): void {
this.observables.setObservableData(
'BatteryHealthObserver_onBatteryHealthUpdated', batteryHealthList);
}
triggerBatteryHealthObserver(): void {
this.observables.trigger('BatteryHealthObserver_onBatteryHealthUpdated');
}
observeCpuUsage(remote: CpuUsageObserverRemote): void {
this.observeCpuUsagePromise =
this.observe('CpuUsageObserver_onCpuUsageUpdated', (cpuUsage) => {
remote.onCpuUsageUpdated(
(cpuUsage));
});
}
getObserveCpuUsagePromiseForTesting(): Promise<void> {
assert(this.observeCpuUsagePromise);
return this.observeCpuUsagePromise;
}
setFakeCpuUsage(cpuUsageList: CpuUsage[]): void {
this.observables.setObservableData(
'CpuUsageObserver_onCpuUsageUpdated', cpuUsageList);
}
triggerCpuUsageObserver(): void {
this.observables.trigger('CpuUsageObserver_onCpuUsageUpdated');
}
observeMemoryUsage(remote: MemoryUsageObserverRemote): void {
this.observeMemoryUsagePromise = this.observe(
'MemoryUsageObserver_onMemoryUsageUpdated', (memoryUsage) => {
remote.onMemoryUsageUpdated(
(memoryUsage));
});
}
getObserveMemoryUsagePromiseForTesting(): Promise<void> {
assert(this.observeMemoryUsagePromise);
return this.observeMemoryUsagePromise;
}
setFakeMemoryUsage(memoryUsageList: MemoryUsage[]): void {
this.observables.setObservableData(
'MemoryUsageObserver_onMemoryUsageUpdated', memoryUsageList);
}
triggerMemoryUsageObserver(): void {
this.observables.trigger('MemoryUsageObserver_onMemoryUsageUpdated');
}
startTriggerIntervals(): void {
this.observables.startTriggerOnInterval(
'CpuUsageObserver_onCpuUsageUpdated', 1000);
this.observables.startTriggerOnInterval(
'MemoryUsageObserver_onMemoryUsageUpdated', 5000);
this.observables.startTriggerOnInterval(
'BatteryHealthObserver_onBatteryHealthUpdated', 30000);
this.observables.startTriggerOnInterval(
'BatteryChargeStatusObserver_onBatteryChargeStatusUpdated', 30000);
}
stopTriggerIntervals(): void {
this.observables.stopAllTriggerIntervals();
}
registerMethods(): void {
this.methods.register('getSystemInfo');
this.methods.register('getBatteryInfo');
}
registerObservables(): void {
this.observables.register(
'BatteryChargeStatusObserver_onBatteryChargeStatusUpdated');
this.observables.register('BatteryHealthObserver_onBatteryHealthUpdated');
this.observables.register('CpuUsageObserver_onCpuUsageUpdated');
this.observables.register('MemoryUsageObserver_onMemoryUsageUpdated');
}
reset(): void {
this.observables.stopAllTriggerIntervals();
this.methods = new FakeMethodResolver();
this.observables = new FakeObservables();
this.registerMethods();
this.registerObservables();
}
private observe(methodName: string, callback: (T: any) => void):
Promise<void> {
return new Promise((resolve) => {
this.observables.observe(methodName, callback);
this.observables.trigger(methodName);
resolve();
});
}
}