// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
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 {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');
}
// Sets the value that will be returned when calling getSystemInfo().
setFakeSystemInfo(systemInfo: SystemInfo): void {
this.methods.setResult('getSystemInfo', {systemInfo});
}
// Implements SystemDataProviderInterface.GetBatteryInfo.
getBatteryInfo(): Promise<{batteryInfo: BatteryInfo}> {
return this.methods.resolveMethod('getBatteryInfo');
}
// Sets the value that will be returned when calling getBatteryInfo().
setFakeBatteryInfo(batteryInfo: BatteryInfo): void {
this.methods.setResult('getBatteryInfo', {batteryInfo});
}
// Implements SystemDataProviderInterface.ObserveBatteryChargeStatus.
observeBatteryChargeStatus(remote: BatteryChargeStatusObserverRemote): void {
this.observeBatteryChargeStatusPromise = this.observe(
'BatteryChargeStatusObserver_onBatteryChargeStatusUpdated',
(batteryChargeStatus) => {
remote.onBatteryChargeStatusUpdated(
/** @type {!BatteryChargeStatus} */ (batteryChargeStatus));
});
}
// Returns the promise for the most recent battery charge status observation.
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);
}
// Causes the battery charge status observer to fire.
triggerBatteryChargeStatusObserver(): void {
this.observables.trigger(
'BatteryChargeStatusObserver_onBatteryChargeStatusUpdated');
}
// Implements SystemDataProviderInterface.ObserveBatteryHealth.
observeBatteryHealth(remote: BatteryHealthObserverRemote): void {
this.observeBatteryHealthPromise = this.observe(
'BatteryHealthObserver_onBatteryHealthUpdated', (batteryHealth) => {
remote.onBatteryHealthUpdated(
/** @type {!BatteryHealth} */ (batteryHealth));
});
}
// Returns the promise for the most recent battery health observation.
getObserveBatteryHealthPromiseForTesting(): Promise<void> {
assert(this.observeBatteryHealthPromise);
return this.observeBatteryHealthPromise;
}
// Sets the values that will observed from observeBatteryHealth.
setFakeBatteryHealth(batteryHealthList: BatteryHealth[]): void {
this.observables.setObservableData(
'BatteryHealthObserver_onBatteryHealthUpdated', batteryHealthList);
}
// Causes the battery health observer to fire.
triggerBatteryHealthObserver(): void {
this.observables.trigger('BatteryHealthObserver_onBatteryHealthUpdated');
}
// Implements SystemDataProviderInterface.ObserveCpuUsage.
observeCpuUsage(remote: CpuUsageObserverRemote): void {
this.observeCpuUsagePromise =
this.observe('CpuUsageObserver_onCpuUsageUpdated', (cpuUsage) => {
remote.onCpuUsageUpdated(
/** @type {!CpuUsage} */ (cpuUsage));
});
}
// Returns the promise for the most recent cpu usage observation.
getObserveCpuUsagePromiseForTesting(): Promise<void> {
assert(this.observeCpuUsagePromise);
return this.observeCpuUsagePromise;
}
// Sets the values that will observed from observeCpuUsage.
setFakeCpuUsage(cpuUsageList: CpuUsage[]): void {
this.observables.setObservableData(
'CpuUsageObserver_onCpuUsageUpdated', cpuUsageList);
}
// Causes the CPU usage observer to fire.
triggerCpuUsageObserver(): void {
this.observables.trigger('CpuUsageObserver_onCpuUsageUpdated');
}
// Implements SystemDataProviderInterface.ObserveMemoryUsage.
observeMemoryUsage(remote: MemoryUsageObserverRemote): void {
this.observeCpuUsagePromise = this.observe(
'MemoryUsageObserver_onMemoryUsageUpdated', (memoryUsage) => {
remote.onMemoryUsageUpdated(
/** @type {!MemoryUsage} */ (memoryUsage));
});
}
// Returns the promise for the most recent memory usage observation.
getObserveMemoryUsagePromiseForTesting(): Promise<void> {
assert(this.observeCpuUsagePromise);
return this.observeCpuUsagePromise;
}
// Sets the values that will observed from ObserveCpuUsage.
setFakeMemoryUsage(memoryUsageList: MemoryUsage[]): void {
this.observables.setObservableData(
'MemoryUsageObserver_onMemoryUsageUpdated', memoryUsageList);
}
// Causes the memory usage observer to fire.
triggerMemoryUsageObserver(): void {
this.observables.trigger('MemoryUsageObserver_onMemoryUsageUpdated');
}
// Make the observables fire automatically on various intervals.
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);
}
// Stop automatically triggering observables.
stopTriggerIntervals(): void {
this.observables.stopAllTriggerIntervals();
}
// Setup method resolvers.
registerMethods(): void {
this.methods.register('getSystemInfo');
this.methods.register('getBatteryInfo');
}
// Setup observables.
registerObservables(): void {
this.observables.register(
'BatteryChargeStatusObserver_onBatteryChargeStatusUpdated');
this.observables.register('BatteryHealthObserver_onBatteryHealthUpdated');
this.observables.register('CpuUsageObserver_onCpuUsageUpdated');
this.observables.register('MemoryUsageObserver_onMemoryUsageUpdated');
}
// Disables all observers and resets provider to its initial state.
reset(): void {
this.observables.stopAllTriggerIntervals();
this.methods = new FakeMethodResolver();
this.observables = new FakeObservables();
this.registerMethods();
this.registerObservables();
}
// Sets up an observer for methodName.
private observe(methodName: string, callback: (T: any) => void):
Promise<void> {
return new Promise((resolve) => {
this.observables.observe(methodName, callback);
this.observables.trigger(methodName);
resolve();
});
}
}