1/* 2 * Copyright (C) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16import { BaseStruct } from '../../../../src/trace/bean/BaseStruct'; 17import { SpXpowerChart, convertHoverValue, convertTitle } from '../../../../src/trace/component/chart/SpXpowerChart'; 18import { TraceRow } from '../../../../src/trace/component/trace/base/TraceRow'; 19import { XpowerStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerXpower'; 20import { XpowerAppDetailStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerXpowerAppDetail'; 21import { XpowerGpuFreqStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerXpowerGpuFreq'; 22import { XpowerGpuFreqCountStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerXpowerGpuFreqCount'; 23import { XpowerStatisticStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerXpowerStatistic'; 24import { XpowerThreadCountStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerXpowerThreadCount'; 25import { XpowerThreadInfoStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerXpowerThreadInfo'; 26import { XpowerWifiStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerXpowerWifi'; 27jest.mock('../../../../src/js-heap/model/DatabaseStruct'); 28const XpowerSql = require('../../../../src/trace/database/sql/Xpower.sql'); 29jest.mock('../../../../src/trace/database/sql/Xpower.sql'); 30jest.mock('../../../../src/trace/component/SpSystemTrace', () => { 31 return {}; 32}); 33 34const intersectionObserverMock = () => ({ 35 observe: () => null, 36}); 37window.IntersectionObserver = jest.fn().mockImplementation(intersectionObserverMock); 38window.ResizeObserver = 39 window.ResizeObserver || 40 jest.fn().mockImplementation(() => ({ 41 disconnect: jest.fn(), 42 observe: jest.fn(), 43 unobserve: jest.fn(), 44 })); 45describe('spXpowerChart Test', () => { 46 let htmlElement: any = document.createElement('sp-system-trace'); 47 let spXpowerChart = new SpXpowerChart(htmlElement); 48 let xPowerMeasureData = XpowerSql.queryXpowerMeasureData; 49 xPowerMeasureData.mockResolvedValue([ 50 { 51 name: 'Battery.Capacity', 52 }, 53 { 54 name: 'Battery.Level', 55 }, 56 { 57 name: 'Battery.GasGauge', 58 }, 59 { 60 name: 'Battery.Screen', 61 }, 62 { 63 name: 'Battery.RealCurrent', 64 }, 65 { 66 name: 'ThermalReport.ShellTemp', 67 }, 68 { 69 name: 'ThermalReport.ThermalLevel', 70 }, 71 ]); 72 xPowerMeasureData.mockResolvedValue([]); 73 let xPowerData = XpowerSql.queryXpowerData; 74 xPowerData.mockResolvedValue([ 75 { 76 name: 'ThermalReport.ShellTemp', 77 num: 10, 78 maxValue: 100, 79 minValue: 10, 80 }, 81 { 82 name: 'Battery.RealCurrent', 83 num: 20, 84 maxValue: 200, 85 minValue: 20, 86 }, 87 ]); 88 xPowerData.mockResolvedValue([]); 89 let traceConfig = XpowerSql.queryTraceConfig; 90 traceConfig.mockResolvedValue([ 91 { 92 traceSource: 'xpower_config', 93 key: 'bundleName', 94 value: 'com.sina.weibo.stage', 95 }, 96 { 97 traceSource: 'xpower_config', 98 key: 'bundleName', 99 value: 'com.sina.weibo.stage', 100 }, 101 ]); 102 103 let xPowerComponentTop = XpowerSql.queryXpowerComponentTop; 104 xPowerComponentTop.mockResolvedValue([ 105 { 106 structType: 'xpower component', 107 startTime: 10, 108 startTimeStr: '10', 109 componentTypeId: 10, 110 componentTypeName: '10', 111 appNameStr: '10', 112 appName: 10, 113 backgroundDuration: 10, 114 backgroundEnergy: '10', 115 foregroundDuration: 10, 116 foregroundEnergy: '10', 117 screenOffDuration: 10, 118 screenOffEnergy: '10', 119 screenOnDuration: 10, 120 screenOnEnergy: '10', 121 backgroundDurationStr: '10', 122 foregroundDurationStr: '10', 123 screenOffDurationStr: '10', 124 screenOnDurationStr: '10', 125 cameraId: 10, 126 uId: 10, 127 load: '10', 128 appUsageDuration: 10, 129 appUsageDurationStr: '10', 130 appUsageEnergy: '10', 131 }, 132 { 133 structType: 'xpower component', 134 startTime: 10, 135 startTimeStr: '10', 136 componentTypeId: 10, 137 componentTypeName: '10', 138 appNameStr: '10', 139 appName: 10, 140 backgroundDuration: 10, 141 backgroundEnergy: '10', 142 foregroundDuration: 10, 143 foregroundEnergy: '10', 144 screenOffDuration: 10, 145 screenOffEnergy: '10', 146 screenOnDuration: 10, 147 screenOnEnergy: '10', 148 backgroundDurationStr: '10', 149 foregroundDurationStr: '10', 150 screenOffDurationStr: '10', 151 screenOnDurationStr: '10', 152 cameraId: 10, 153 uId: 10, 154 load: '10', 155 appUsageDuration: 10, 156 appUsageDurationStr: '10', 157 appUsageEnergy: '10', 158 }, 159 ]); 160 spXpowerChart.bundleNameFolder = TraceRow.skeleton<BaseStruct>(); 161 let threadInfoStructArray = [ 162 { 163 value: 10, 164 valueStr: '10', 165 startNS: 0, 166 startTimeStr: '0', 167 dur: 10, 168 threadTime: 10, 169 threadTimeStr: '10', 170 threadName: 'stage_CompositorGpuTh', 171 threadNameId: 320, 172 valueType: 'thread_energy', 173 translateY: 10, 174 frame: undefined, 175 isHover: true, 176 }, 177 { 178 value: 10, 179 valueStr: '10', 180 startNS: 10, 181 startTimeStr: '10', 182 dur: 10, 183 threadTime: 10, 184 threadTimeStr: '10', 185 threadName: 'stage_CompositorGpuTh', 186 threadNameId: 320, 187 valueType: 'thread_loads', 188 translateY: 10, 189 frame: undefined, 190 isHover: true, 191 }, 192 ]; 193 let gpuFreqStructArray = [ 194 { 195 value: 10, 196 valueStr: '10', 197 startNS: 0, 198 startTimeStr: '0', 199 dur: 10, 200 runTime: 10, 201 idleTime: 10, 202 runTimeStr: '10', 203 idleTimeStr: '10', 204 frequency: 10, 205 count: 10, 206 valueType: '', 207 translateY: 10, 208 frame: undefined, 209 isHover: true, 210 }, 211 { 212 value: 10, 213 valueStr: '10', 214 startNS: 0, 215 startTimeStr: '0', 216 dur: 10, 217 runTime: 100, 218 idleTime: 100, 219 runTimeStr: '100', 220 idleTimeStr: '100', 221 frequency: 100, 222 count: 100, 223 valueType: '', 224 translateY: 10, 225 frame: undefined, 226 isHover: true, 227 }, 228 ]; 229 230 it('spXpowerChart01', function () { 231 expect(spXpowerChart.init()).toBeDefined(); 232 }); 233 it('spXpowerChart02', function () { 234 expect(spXpowerChart.initXpowerFolder()).toBeDefined(); 235 }); 236 it('spXpowerChart03', function () { 237 expect(spXpowerChart.initFolder('system', TraceRow.ROW_TYPE_XPOWER_SYSTEM_GROUP, 'System', '0')).toBeDefined(); 238 expect( 239 spXpowerChart.initFolder('bundleName', TraceRow.ROW_TYPE_XPOWER_BUNDLE_NAME_GROUP, 'com.sina.weibo.stage', '0') 240 ).toBeDefined(); 241 }); 242 it('spXpowerChart04', function () { 243 let xpowerList = [ 244 { 245 name: '', 246 num: 10, 247 maxValue: 100, 248 minValue: 10, 249 }, 250 ]; 251 expect(spXpowerChart.initSystemData(spXpowerChart.systemFolder, xpowerList)).toBeDefined(); 252 }); 253 it('spXpowerChart05', function () { 254 expect(convertTitle('Battery.Capacity')).toBe('电池容量(单位mAh)'); 255 expect(convertTitle('Battery.Charge')).toBe('充电状态(充电1,非充电0)'); 256 expect(convertTitle('Battery.GasGauge')).toBe('电池剩余电量(单位mAh)'); 257 expect(convertTitle('Battery.Level')).toBe('电池百分比'); 258 expect(convertTitle('Battery.RealCurrent')).toBe('实时电流(单位mAh,充电时为正数,耗电时为负数)'); 259 expect(convertTitle('Battery.Screen')).toBe('屏幕状态(亮屏1,灭屏0)'); 260 expect(convertTitle('ThermalReport.ShellTemp')).toBe('外壳温度(单位℃)'); 261 expect(convertTitle('ThermalReport.ThermalLevel')).toBe('温度等级'); 262 expect(convertTitle('aaa')).toBe('aaa'); 263 }); 264 it('spXpowerChart06', function () { 265 expect(convertHoverValue('0')).toBe('COOL'); 266 expect(convertHoverValue('1')).toBe('WARM'); 267 expect(convertHoverValue('2')).toBe('HOT'); 268 expect(convertHoverValue('3')).toBe('OVERHEATED'); 269 expect(convertHoverValue('aaa')).toBe('aaa'); 270 }); 271 it('spXpowerChart07', function () { 272 expect(spXpowerChart.initXpowerStatisticData(spXpowerChart.bundleNameFolder)).toBeDefined(); 273 expect(spXpowerChart.initXpowerWifiData(spXpowerChart.bundleNameFolder)).toBeDefined(); 274 expect(spXpowerChart.initXpowerAppDetatilDisplayData(spXpowerChart.bundleNameFolder)).toBeDefined(); 275 expect(spXpowerChart.initThreadCountData(spXpowerChart.bundleNameFolder)).toBeDefined(); 276 expect(spXpowerChart.initThreadInfoData(spXpowerChart.bundleNameFolder, 'thread_energy')).toBeDefined(); 277 expect(spXpowerChart.initThreadInfoData(spXpowerChart.bundleNameFolder, 'thread_loads')).toBeDefined(); 278 expect(spXpowerChart.initGpuFreqCountData(spXpowerChart.bundleNameFolder)).toBeDefined(); 279 expect(spXpowerChart.initGpuFreqData(spXpowerChart.bundleNameFolder)).toBeDefined(); 280 }); 281 it('spXpowerChart08', function () { 282 let XpowerStatisticTraceRow = TraceRow.skeleton<XpowerStatisticStruct>(); 283 expect(spXpowerChart.xpowerStatisticThreadHandler(XpowerStatisticTraceRow)).not.toBeDefined(); 284 let XpowerTraceRow = TraceRow.skeleton<XpowerStruct>(); 285 let it = { 286 name: 'Battery.Capacity', 287 num: 10, 288 maxValue: 100, 289 minValue: 10, 290 }; 291 expect(spXpowerChart.xpowerThreadHandler(XpowerTraceRow, it, 0)).not.toBeDefined(); 292 let XpowerThreadInfoTraceRow = TraceRow.skeleton<XpowerThreadInfoStruct>(); 293 expect(spXpowerChart.xpowerThreadInfoThreadHandler(XpowerThreadInfoTraceRow, 'thread_energy')).not.toBeDefined(); 294 expect(spXpowerChart.xpowerThreadInfoThreadHandler(XpowerThreadInfoTraceRow, 'thread_loads')).not.toBeDefined(); 295 let XpowerAppDetailTraceRow = TraceRow.skeleton<XpowerAppDetailStruct>(); 296 expect(spXpowerChart.xpowerAppDetailThreadHandler(XpowerAppDetailTraceRow)).not.toBeDefined(); 297 let XpowerWifiTraceRow = TraceRow.skeleton<XpowerWifiStruct>(); 298 expect(spXpowerChart.xpowerWifiThreadHandler(XpowerWifiTraceRow, 'WIFIBytes')).not.toBeDefined(); 299 expect(spXpowerChart.xpowerWifiThreadHandler(XpowerWifiTraceRow, 'WIFIPackets')).not.toBeDefined(); 300 let XpowerGpuFreqTraceRow = TraceRow.skeleton<XpowerGpuFreqStruct>(); 301 expect(spXpowerChart.xpowerGpuFreqThreadHandler(XpowerGpuFreqTraceRow)).not.toBeDefined(); 302 }); 303 it('spXpowerChart09', function () { 304 expect(spXpowerChart.setDataMap(threadInfoStructArray)); 305 }); 306 it('spXpowerChart10', function () { 307 expect(spXpowerChart.getThreadInfoDrawData(threadInfoStructArray, 'thread_loads')).toBeDefined(); 308 expect(spXpowerChart.getThreadInfoDrawData(threadInfoStructArray, 'thread_energy')).toBeDefined(); 309 expect(spXpowerChart.getGpuFreqDrawData(gpuFreqStructArray)).toBeDefined(); 310 }); 311 it('spXpowerChart11', function () { 312 let XpowerTraceRow = TraceRow.skeleton<XpowerStruct>(); 313 let it = { 314 name: 'Battery.Capacity', 315 num: 10, 316 maxValue: 100, 317 minValue: 10, 318 }; 319 expect(spXpowerChart.xpowerSupplierFrame(XpowerTraceRow, it)).not.toBeDefined(); 320 let XpowerThreadCountTraceRow = TraceRow.skeleton<XpowerThreadCountStruct>(); 321 expect(spXpowerChart.xpowerThreadCountSupplierFrame(XpowerThreadCountTraceRow)).not.toBeDefined(); 322 let XpowerThreadInfoTraceRow = TraceRow.skeleton<XpowerThreadInfoStruct>(); 323 expect(spXpowerChart.xpowerThreadInfoSupplierFrame(XpowerThreadInfoTraceRow, 'thread_energy')).not.toBeDefined(); 324 expect(spXpowerChart.xpowerThreadInfoSupplierFrame(XpowerThreadInfoTraceRow, 'thread_loads')).not.toBeDefined(); 325 let XpowerGpuFreqCountTraceRow = TraceRow.skeleton<XpowerGpuFreqCountStruct>(); 326 expect(spXpowerChart.xpowerGpuFreqCountSupplierFrame(XpowerGpuFreqCountTraceRow)).not.toBeDefined(); 327 let XpowerGpuFreqTraceRow = TraceRow.skeleton<XpowerGpuFreqStruct>(); 328 expect(spXpowerChart.xpowerGpuFreqSupplierFrame(XpowerGpuFreqTraceRow)).not.toBeDefined(); 329 }); 330}); 331