* Copyright (C) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { BaseStruct } from '../../../../src/trace/bean/BaseStruct';
import { SpXpowerChart, convertHoverValue, convertTitle } from '../../../../src/trace/component/chart/SpXpowerChart';
import { TraceRow } from '../../../../src/trace/component/trace/base/TraceRow';
import { XpowerStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerXpower';
import { XpowerAppDetailStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerXpowerAppDetail';
import { XpowerGpuFreqStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerXpowerGpuFreq';
import { XpowerGpuFreqCountStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerXpowerGpuFreqCount';
import { XpowerStatisticStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerXpowerStatistic';
import { XpowerThreadCountStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerXpowerThreadCount';
import { XpowerThreadInfoStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerXpowerThreadInfo';
import { XpowerWifiStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerXpowerWifi';
jest.mock('../../../../src/js-heap/model/DatabaseStruct');
const XpowerSql = require('../../../../src/trace/database/sql/Xpower.sql');
jest.mock('../../../../src/trace/database/sql/Xpower.sql');
jest.mock('../../../../src/trace/component/SpSystemTrace', () => {
return {};
});
const intersectionObserverMock = () => ({
observe: () => null,
});
window.IntersectionObserver = jest.fn().mockImplementation(intersectionObserverMock);
window.ResizeObserver =
window.ResizeObserver ||
jest.fn().mockImplementation(() => ({
disconnect: jest.fn(),
observe: jest.fn(),
unobserve: jest.fn(),
}));
describe('spXpowerChart Test', () => {
let htmlElement: any = document.createElement('sp-system-trace');
let spXpowerChart = new SpXpowerChart(htmlElement);
let xPowerMeasureData = XpowerSql.queryXpowerMeasureData;
xPowerMeasureData.mockResolvedValue([
{
name: 'Battery.Capacity',
},
{
name: 'Battery.Level',
},
{
name: 'Battery.GasGauge',
},
{
name: 'Battery.Screen',
},
{
name: 'Battery.RealCurrent',
},
{
name: 'ThermalReport.ShellTemp',
},
{
name: 'ThermalReport.ThermalLevel',
},
]);
xPowerMeasureData.mockResolvedValue([]);
let xPowerData = XpowerSql.queryXpowerData;
xPowerData.mockResolvedValue([
{
name: 'ThermalReport.ShellTemp',
num: 10,
maxValue: 100,
minValue: 10,
},
{
name: 'Battery.RealCurrent',
num: 20,
maxValue: 200,
minValue: 20,
},
]);
xPowerData.mockResolvedValue([]);
let traceConfig = XpowerSql.queryTraceConfig;
traceConfig.mockResolvedValue([
{
traceSource: 'xpower_config',
key: 'bundleName',
value: 'com.sina.weibo.stage',
},
{
traceSource: 'xpower_config',
key: 'bundleName',
value: 'com.sina.weibo.stage',
},
]);
let xPowerComponentTop = XpowerSql.queryXpowerComponentTop;
xPowerComponentTop.mockResolvedValue([
{
structType: 'xpower component',
startTime: 10,
startTimeStr: '10',
componentTypeId: 10,
componentTypeName: '10',
appNameStr: '10',
appName: 10,
backgroundDuration: 10,
backgroundEnergy: '10',
foregroundDuration: 10,
foregroundEnergy: '10',
screenOffDuration: 10,
screenOffEnergy: '10',
screenOnDuration: 10,
screenOnEnergy: '10',
backgroundDurationStr: '10',
foregroundDurationStr: '10',
screenOffDurationStr: '10',
screenOnDurationStr: '10',
cameraId: 10,
uId: 10,
load: '10',
appUsageDuration: 10,
appUsageDurationStr: '10',
appUsageEnergy: '10',
},
{
structType: 'xpower component',
startTime: 10,
startTimeStr: '10',
componentTypeId: 10,
componentTypeName: '10',
appNameStr: '10',
appName: 10,
backgroundDuration: 10,
backgroundEnergy: '10',
foregroundDuration: 10,
foregroundEnergy: '10',
screenOffDuration: 10,
screenOffEnergy: '10',
screenOnDuration: 10,
screenOnEnergy: '10',
backgroundDurationStr: '10',
foregroundDurationStr: '10',
screenOffDurationStr: '10',
screenOnDurationStr: '10',
cameraId: 10,
uId: 10,
load: '10',
appUsageDuration: 10,
appUsageDurationStr: '10',
appUsageEnergy: '10',
},
]);
spXpowerChart.bundleNameFolder = TraceRow.skeleton<BaseStruct>();
let threadInfoStructArray = [
{
value: 10,
valueStr: '10',
startNS: 0,
startTimeStr: '0',
dur: 10,
threadTime: 10,
threadTimeStr: '10',
threadName: 'stage_CompositorGpuTh',
threadNameId: 320,
valueType: 'thread_energy',
translateY: 10,
frame: undefined,
isHover: true,
},
{
value: 10,
valueStr: '10',
startNS: 10,
startTimeStr: '10',
dur: 10,
threadTime: 10,
threadTimeStr: '10',
threadName: 'stage_CompositorGpuTh',
threadNameId: 320,
valueType: 'thread_loads',
translateY: 10,
frame: undefined,
isHover: true,
},
];
let gpuFreqStructArray = [
{
value: 10,
valueStr: '10',
startNS: 0,
startTimeStr: '0',
dur: 10,
runTime: 10,
idleTime: 10,
runTimeStr: '10',
idleTimeStr: '10',
frequency: 10,
count: 10,
valueType: '',
translateY: 10,
frame: undefined,
isHover: true,
},
{
value: 10,
valueStr: '10',
startNS: 0,
startTimeStr: '0',
dur: 10,
runTime: 100,
idleTime: 100,
runTimeStr: '100',
idleTimeStr: '100',
frequency: 100,
count: 100,
valueType: '',
translateY: 10,
frame: undefined,
isHover: true,
},
];
it('spXpowerChart01', function () {
expect(spXpowerChart.init()).toBeDefined();
});
it('spXpowerChart02', function () {
expect(spXpowerChart.initXpowerFolder()).toBeDefined();
});
it('spXpowerChart03', function () {
expect(spXpowerChart.initFolder('system', TraceRow.ROW_TYPE_XPOWER_SYSTEM_GROUP, 'System', '0')).toBeDefined();
expect(
spXpowerChart.initFolder('bundleName', TraceRow.ROW_TYPE_XPOWER_BUNDLE_NAME_GROUP, 'com.sina.weibo.stage', '0')
).toBeDefined();
});
it('spXpowerChart04', function () {
let xpowerList = [
{
name: '',
num: 10,
maxValue: 100,
minValue: 10,
},
];
expect(spXpowerChart.initSystemData(spXpowerChart.systemFolder, xpowerList)).toBeDefined();
});
it('spXpowerChart05', function () {
expect(convertTitle('Battery.Capacity')).toBe('电池容量(单位mAh)');
expect(convertTitle('Battery.Charge')).toBe('充电状态(充电1,非充电0)');
expect(convertTitle('Battery.GasGauge')).toBe('电池剩余电量(单位mAh)');
expect(convertTitle('Battery.Level')).toBe('电池百分比');
expect(convertTitle('Battery.RealCurrent')).toBe('实时电流(单位mAh,充电时为正数,耗电时为负数)');
expect(convertTitle('Battery.Screen')).toBe('屏幕状态(亮屏1,灭屏0)');
expect(convertTitle('ThermalReport.ShellTemp')).toBe('外壳温度(单位℃)');
expect(convertTitle('ThermalReport.ThermalLevel')).toBe('温度等级');
expect(convertTitle('aaa')).toBe('aaa');
});
it('spXpowerChart06', function () {
expect(convertHoverValue('0')).toBe('COOL');
expect(convertHoverValue('1')).toBe('WARM');
expect(convertHoverValue('2')).toBe('HOT');
expect(convertHoverValue('3')).toBe('OVERHEATED');
expect(convertHoverValue('aaa')).toBe('aaa');
});
it('spXpowerChart07', function () {
expect(spXpowerChart.initXpowerStatisticData(spXpowerChart.bundleNameFolder)).toBeDefined();
expect(spXpowerChart.initXpowerWifiData(spXpowerChart.bundleNameFolder)).toBeDefined();
expect(spXpowerChart.initXpowerAppDetatilDisplayData(spXpowerChart.bundleNameFolder)).toBeDefined();
expect(spXpowerChart.initThreadCountData(spXpowerChart.bundleNameFolder)).toBeDefined();
expect(spXpowerChart.initThreadInfoData(spXpowerChart.bundleNameFolder, 'thread_energy')).toBeDefined();
expect(spXpowerChart.initThreadInfoData(spXpowerChart.bundleNameFolder, 'thread_loads')).toBeDefined();
expect(spXpowerChart.initGpuFreqCountData(spXpowerChart.bundleNameFolder)).toBeDefined();
expect(spXpowerChart.initGpuFreqData(spXpowerChart.bundleNameFolder)).toBeDefined();
});
it('spXpowerChart08', function () {
let XpowerStatisticTraceRow = TraceRow.skeleton<XpowerStatisticStruct>();
expect(spXpowerChart.xpowerStatisticThreadHandler(XpowerStatisticTraceRow)).not.toBeDefined();
let XpowerTraceRow = TraceRow.skeleton<XpowerStruct>();
let it = {
name: 'Battery.Capacity',
num: 10,
maxValue: 100,
minValue: 10,
};
expect(spXpowerChart.xpowerThreadHandler(XpowerTraceRow, it, 0)).not.toBeDefined();
let XpowerThreadInfoTraceRow = TraceRow.skeleton<XpowerThreadInfoStruct>();
expect(spXpowerChart.xpowerThreadInfoThreadHandler(XpowerThreadInfoTraceRow, 'thread_energy')).not.toBeDefined();
expect(spXpowerChart.xpowerThreadInfoThreadHandler(XpowerThreadInfoTraceRow, 'thread_loads')).not.toBeDefined();
let XpowerAppDetailTraceRow = TraceRow.skeleton<XpowerAppDetailStruct>();
expect(spXpowerChart.xpowerAppDetailThreadHandler(XpowerAppDetailTraceRow)).not.toBeDefined();
let XpowerWifiTraceRow = TraceRow.skeleton<XpowerWifiStruct>();
expect(spXpowerChart.xpowerWifiThreadHandler(XpowerWifiTraceRow, 'WIFIBytes')).not.toBeDefined();
expect(spXpowerChart.xpowerWifiThreadHandler(XpowerWifiTraceRow, 'WIFIPackets')).not.toBeDefined();
let XpowerGpuFreqTraceRow = TraceRow.skeleton<XpowerGpuFreqStruct>();
expect(spXpowerChart.xpowerGpuFreqThreadHandler(XpowerGpuFreqTraceRow)).not.toBeDefined();
});
it('spXpowerChart09', function () {
expect(spXpowerChart.setDataMap(threadInfoStructArray));
});
it('spXpowerChart10', function () {
expect(spXpowerChart.getThreadInfoDrawData(threadInfoStructArray, 'thread_loads')).toBeDefined();
expect(spXpowerChart.getThreadInfoDrawData(threadInfoStructArray, 'thread_energy')).toBeDefined();
expect(spXpowerChart.getGpuFreqDrawData(gpuFreqStructArray)).toBeDefined();
});
it('spXpowerChart11', function () {
let XpowerTraceRow = TraceRow.skeleton<XpowerStruct>();
let it = {
name: 'Battery.Capacity',
num: 10,
maxValue: 100,
minValue: 10,
};
expect(spXpowerChart.xpowerSupplierFrame(XpowerTraceRow, it)).not.toBeDefined();
let XpowerThreadCountTraceRow = TraceRow.skeleton<XpowerThreadCountStruct>();
expect(spXpowerChart.xpowerThreadCountSupplierFrame(XpowerThreadCountTraceRow)).not.toBeDefined();
let XpowerThreadInfoTraceRow = TraceRow.skeleton<XpowerThreadInfoStruct>();
expect(spXpowerChart.xpowerThreadInfoSupplierFrame(XpowerThreadInfoTraceRow, 'thread_energy')).not.toBeDefined();
expect(spXpowerChart.xpowerThreadInfoSupplierFrame(XpowerThreadInfoTraceRow, 'thread_loads')).not.toBeDefined();
let XpowerGpuFreqCountTraceRow = TraceRow.skeleton<XpowerGpuFreqCountStruct>();
expect(spXpowerChart.xpowerGpuFreqCountSupplierFrame(XpowerGpuFreqCountTraceRow)).not.toBeDefined();
let XpowerGpuFreqTraceRow = TraceRow.skeleton<XpowerGpuFreqStruct>();
expect(spXpowerChart.xpowerGpuFreqSupplierFrame(XpowerGpuFreqTraceRow)).not.toBeDefined();
});
});