1fb726d48Sopenharmony_ci 2fb726d48Sopenharmony_ci 3fb726d48Sopenharmony_ci/* 4fb726d48Sopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd. 5fb726d48Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 6fb726d48Sopenharmony_ci * you may not use this file except in compliance with the License. 7fb726d48Sopenharmony_ci * You may obtain a copy of the License at 8fb726d48Sopenharmony_ci * 9fb726d48Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 10fb726d48Sopenharmony_ci * 11fb726d48Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 12fb726d48Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 13fb726d48Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14fb726d48Sopenharmony_ci * See the License for the specific language governing permissions and 15fb726d48Sopenharmony_ci * limitations under the License. 16fb726d48Sopenharmony_ci */ 17fb726d48Sopenharmony_ci 18fb726d48Sopenharmony_ciimport { HeapLoader } from '../../../src/js-heap/logic/HeapLoader'; 19fb726d48Sopenharmony_ciimport { ConstructorItem, FileType } from '../../../src/js-heap/model/UiStruct'; 20fb726d48Sopenharmony_ci 21fb726d48Sopenharmony_cijest.mock('../../../src/js-heap/model/DatabaseStruct', () => ({ 22fb726d48Sopenharmony_ci DetachedNessState: { 23fb726d48Sopenharmony_ci UNKNOWN: 0, 24fb726d48Sopenharmony_ci ATTACHED: 1, 25fb726d48Sopenharmony_ci DETACHED: 2, 26fb726d48Sopenharmony_ci }, 27fb726d48Sopenharmony_ci NodeType: { 28fb726d48Sopenharmony_ci HIDDEN : 0, 29fb726d48Sopenharmony_ci ARRAY : 1, 30fb726d48Sopenharmony_ci STRING : 2, 31fb726d48Sopenharmony_ci OBJECT : 3, 32fb726d48Sopenharmony_ci CODE : 4, 33fb726d48Sopenharmony_ci CLOSURE : 5, 34fb726d48Sopenharmony_ci REGEXP : 6, 35fb726d48Sopenharmony_ci NUMBER : 7, 36fb726d48Sopenharmony_ci NATIVE : 8, 37fb726d48Sopenharmony_ci SYNTHETIC : 9, 38fb726d48Sopenharmony_ci CONCATENATED_STRING : 10, 39fb726d48Sopenharmony_ci SLICED_STRING : 11, 40fb726d48Sopenharmony_ci SYMBOL : 12, 41fb726d48Sopenharmony_ci BIGINT : 13, 42fb726d48Sopenharmony_ci OBJECT_SHAPE : 14, 43fb726d48Sopenharmony_ci }, 44fb726d48Sopenharmony_ci EdgeType: { 45fb726d48Sopenharmony_ci CONTEXT : 0, 46fb726d48Sopenharmony_ci ELEMENT : 1, 47fb726d48Sopenharmony_ci PROPERTY : 2, 48fb726d48Sopenharmony_ci INTERNAL : 3, 49fb726d48Sopenharmony_ci HIDDEN : 4, 50fb726d48Sopenharmony_ci SHORTCUT : 5, 51fb726d48Sopenharmony_ci WEAK : 6, 52fb726d48Sopenharmony_ci STRING_OR_NUMBER : 6, 53fb726d48Sopenharmony_ci NODE : 7, 54fb726d48Sopenharmony_ci INVISIBLE : 8, 55fb726d48Sopenharmony_ci } 56fb726d48Sopenharmony_ci})) 57fb726d48Sopenharmony_ci 58fb726d48Sopenharmony_cijest.mock('../../../src/js-heap/utils/Utils', () => { 59fb726d48Sopenharmony_ci return { 60fb726d48Sopenharmony_ci HeapNodeToConstructorItem: (node: any) => { 61fb726d48Sopenharmony_ci return {}; 62fb726d48Sopenharmony_ci }, 63fb726d48Sopenharmony_ci }; 64fb726d48Sopenharmony_ci}); 65fb726d48Sopenharmony_ci 66fb726d48Sopenharmony_cidescribe('HeapLoader Test', () => { 67fb726d48Sopenharmony_ci let rootNode = { 68fb726d48Sopenharmony_ci detachedness: 7, 69fb726d48Sopenharmony_ci displayName: '', 70fb726d48Sopenharmony_ci distance: 13200000, 71fb726d48Sopenharmony_ci edgeCount: 215, 72fb726d48Sopenharmony_ci fileId: 1, 73fb726d48Sopenharmony_ci firstEdgeIndex: 0, 74fb726d48Sopenharmony_ci flag: 1, 75fb726d48Sopenharmony_ci id: 24, 76fb726d48Sopenharmony_ci name: 'Test', 77fb726d48Sopenharmony_ci nodeIndex: 0, 78fb726d48Sopenharmony_ci nodeOldIndex: 0, 79fb726d48Sopenharmony_ci retainedSize: 728167, 80fb726d48Sopenharmony_ci retainsCount: 0, 81fb726d48Sopenharmony_ci retainsEdgeIdx: [2], 82fb726d48Sopenharmony_ci retainsNodeIdx: [0,2], 83fb726d48Sopenharmony_ci selfSize: 0, 84fb726d48Sopenharmony_ci traceNodeId: 0, 85fb726d48Sopenharmony_ci type: 9, 86fb726d48Sopenharmony_ci edges: [ 87fb726d48Sopenharmony_ci { 88fb726d48Sopenharmony_ci edgeIndex: 43, 89fb726d48Sopenharmony_ci edgeOldIndex: 3, 90fb726d48Sopenharmony_ci fromNodeId: 1, 91fb726d48Sopenharmony_ci nameOrIndex: '-test-', 92fb726d48Sopenharmony_ci nodeId: 15436, 93fb726d48Sopenharmony_ci retainEdge: [], 94fb726d48Sopenharmony_ci retainsNode: [], 95fb726d48Sopenharmony_ci toNodeId: 43427, 96fb726d48Sopenharmony_ci type: 5, 97fb726d48Sopenharmony_ci }, 98fb726d48Sopenharmony_ci { 99fb726d48Sopenharmony_ci edgeIndex: 15, 100fb726d48Sopenharmony_ci edgeOldIndex: 53, 101fb726d48Sopenharmony_ci fromNodeId: 15, 102fb726d48Sopenharmony_ci nameOrIndex: '-test-', 103fb726d48Sopenharmony_ci nodeId: 76, 104fb726d48Sopenharmony_ci retainEdge: [], 105fb726d48Sopenharmony_ci retainsNode: [], 106fb726d48Sopenharmony_ci toNodeId: 23, 107fb726d48Sopenharmony_ci type: 5, 108fb726d48Sopenharmony_ci }, 109fb726d48Sopenharmony_ci ], 110fb726d48Sopenharmony_ci }; 111fb726d48Sopenharmony_ci let data = { 112fb726d48Sopenharmony_ci end_ts: 2206, 113fb726d48Sopenharmony_ci id: 29, 114fb726d48Sopenharmony_ci isParseSuccess: true, 115fb726d48Sopenharmony_ci name: 'Test', 116fb726d48Sopenharmony_ci path: '', 117fb726d48Sopenharmony_ci pid: 423, 118fb726d48Sopenharmony_ci tart_ts: 83693464, 119fb726d48Sopenharmony_ci type: 0, 120fb726d48Sopenharmony_ci heapLoader: { 121fb726d48Sopenharmony_ci rootNode: rootNode, 122fb726d48Sopenharmony_ci }, 123fb726d48Sopenharmony_ci snapshotStruct: { 124fb726d48Sopenharmony_ci traceNodes: [], 125fb726d48Sopenharmony_ci nodeMap: new Map(), 126fb726d48Sopenharmony_ci nodeCount: 1, 127fb726d48Sopenharmony_ci edges: [ 128fb726d48Sopenharmony_ci { 129fb726d48Sopenharmony_ci edgeIndex: 1, 130fb726d48Sopenharmony_ci edgeOldIndex: 0, 131fb726d48Sopenharmony_ci fromNodeId: 5, 132fb726d48Sopenharmony_ci nameOrIndex: 152, 133fb726d48Sopenharmony_ci nodeId: 1436, 134fb726d48Sopenharmony_ci retainEdge: [], 135fb726d48Sopenharmony_ci retainsNode: [], 136fb726d48Sopenharmony_ci toNodeId: 4347, 137fb726d48Sopenharmony_ci type: 15, 138fb726d48Sopenharmony_ci }, 139fb726d48Sopenharmony_ci { 140fb726d48Sopenharmony_ci edgeIndex: 31, 141fb726d48Sopenharmony_ci edgeOldIndex: 33, 142fb726d48Sopenharmony_ci fromNodeId: 1, 143fb726d48Sopenharmony_ci nameOrIndex: 958, 144fb726d48Sopenharmony_ci nodeId: 344, 145fb726d48Sopenharmony_ci retainEdge: [], 146fb726d48Sopenharmony_ci retainsNode: [], 147fb726d48Sopenharmony_ci toNodeId: 44405, 148fb726d48Sopenharmony_ci type: 5, 149fb726d48Sopenharmony_ci }, 150fb726d48Sopenharmony_ci ], 151fb726d48Sopenharmony_ci samples: [], 152fb726d48Sopenharmony_ci }, 153fb726d48Sopenharmony_ci }; 154fb726d48Sopenharmony_ci 155fb726d48Sopenharmony_ci let item = { 156fb726d48Sopenharmony_ci addedCount: 1, 157fb726d48Sopenharmony_ci addedIndx: [30, 326], 158fb726d48Sopenharmony_ci addedSize: 316, 159fb726d48Sopenharmony_ci childCount: 1296, 160fb726d48Sopenharmony_ci children: [], 161fb726d48Sopenharmony_ci classChildren: [], 162fb726d48Sopenharmony_ci deletedIdx: [9, 338], 163fb726d48Sopenharmony_ci deltaCount: 0, 164fb726d48Sopenharmony_ci deltaSize: -16, 165fb726d48Sopenharmony_ci distance: -1, 166fb726d48Sopenharmony_ci edgeCount: 0, 167fb726d48Sopenharmony_ci edgeName: '', 168fb726d48Sopenharmony_ci fileId: 0, 169fb726d48Sopenharmony_ci hasNext: true, 170fb726d48Sopenharmony_ci id: 30, 171fb726d48Sopenharmony_ci index: 0, 172fb726d48Sopenharmony_ci isAdd: false, 173fb726d48Sopenharmony_ci isHover: false, 174fb726d48Sopenharmony_ci isSelected: false, 175fb726d48Sopenharmony_ci nextId: [], 176fb726d48Sopenharmony_ci nodeName: 'SourceTextModule', 177fb726d48Sopenharmony_ci objectName: 'SourceTextModule@521', 178fb726d48Sopenharmony_ci removedCount: 28, 179fb726d48Sopenharmony_ci removedSize: 332, 180fb726d48Sopenharmony_ci retainedSize: 32, 181fb726d48Sopenharmony_ci retains: [], 182fb726d48Sopenharmony_ci shallowSize: 21, 183fb726d48Sopenharmony_ci showBox: false, 184fb726d48Sopenharmony_ci showCut: false, 185fb726d48Sopenharmony_ci status: true, 186fb726d48Sopenharmony_ci targetFileId: 211, 187fb726d48Sopenharmony_ci traceNodeId: 34, 188fb726d48Sopenharmony_ci type: 4, 189fb726d48Sopenharmony_ci }; 190fb726d48Sopenharmony_ci 191fb726d48Sopenharmony_ci it('HeapLoaderTest01', () => { 192fb726d48Sopenharmony_ci let heapLoader = new HeapLoader(data); 193fb726d48Sopenharmony_ci heapLoader.fileId = jest.fn(() => true); 194fb726d48Sopenharmony_ci expect(heapLoader).not.toBeUndefined(); 195fb726d48Sopenharmony_ci }); 196fb726d48Sopenharmony_ci it('HeapLoaderTest02', () => { 197fb726d48Sopenharmony_ci let heapLoader = new HeapLoader(data); 198fb726d48Sopenharmony_ci expect(heapLoader.loadAllocationParent({})).toBeUndefined(); 199fb726d48Sopenharmony_ci }); 200fb726d48Sopenharmony_ci 201fb726d48Sopenharmony_ci it('HeapLoaderTest03', () => { 202fb726d48Sopenharmony_ci let heapLoader = new HeapLoader(data); 203fb726d48Sopenharmony_ci heapLoader.rootNode = rootNode; 204fb726d48Sopenharmony_ci heapLoader.nodes = [rootNode]; 205fb726d48Sopenharmony_ci heapLoader.nodes[0].addEdge = jest.fn(() => true); 206fb726d48Sopenharmony_ci heapLoader.isEssentialEdge = jest.fn(() => false); 207fb726d48Sopenharmony_ci expect(heapLoader.preprocess()).toBeUndefined(); 208fb726d48Sopenharmony_ci }); 209fb726d48Sopenharmony_ci 210fb726d48Sopenharmony_ci it('HeapLoaderTest04', () => { 211fb726d48Sopenharmony_ci let heapLoader = new HeapLoader(data); 212fb726d48Sopenharmony_ci heapLoader.nodes = [rootNode]; 213fb726d48Sopenharmony_ci expect(heapLoader.getClassesForSummary(1,2)).toBeTruthy(); 214fb726d48Sopenharmony_ci }); 215fb726d48Sopenharmony_ci 216fb726d48Sopenharmony_ci it('HeapLoaderTest05', () => { 217fb726d48Sopenharmony_ci let heapLoader = new HeapLoader(data); 218fb726d48Sopenharmony_ci heapLoader.nodes = [rootNode]; 219fb726d48Sopenharmony_ci heapLoader.rootNode = rootNode; 220fb726d48Sopenharmony_ci expect(heapLoader.getRetains(item)).toBeDefined(); 221fb726d48Sopenharmony_ci }); 222fb726d48Sopenharmony_ci it('HeapLoaderTest06', () => { 223fb726d48Sopenharmony_ci let heapLoader = new HeapLoader(data); 224fb726d48Sopenharmony_ci expect(heapLoader.getAllocationFunctionList()).toStrictEqual([]); 225fb726d48Sopenharmony_ci }); 226fb726d48Sopenharmony_ci it('HeapLoaderTest07', () => { 227fb726d48Sopenharmony_ci let heapLoader = new HeapLoader(data); 228fb726d48Sopenharmony_ci expect(heapLoader.getAllocationStack(1)).toStrictEqual([]); 229fb726d48Sopenharmony_ci }); 230fb726d48Sopenharmony_ci it('HeapLoaderTest08', () => { 231fb726d48Sopenharmony_ci let heapLoader = new HeapLoader(data); 232fb726d48Sopenharmony_ci expect(heapLoader.getFunctionNodeIds(1)).toStrictEqual([]); 233fb726d48Sopenharmony_ci }); 234fb726d48Sopenharmony_ci it('HeapLoaderTest09', () => { 235fb726d48Sopenharmony_ci let heapLoader = new HeapLoader(data); 236fb726d48Sopenharmony_ci expect(heapLoader.calDistances()).toBeUndefined(); 237fb726d48Sopenharmony_ci }); 238fb726d48Sopenharmony_ci it('HeapLoaderTest10', () => { 239fb726d48Sopenharmony_ci let heapLoader = new HeapLoader(data); 240fb726d48Sopenharmony_ci heapLoader.buildOrderIdxAndDominateTree = jest.fn(()=>{true}); 241fb726d48Sopenharmony_ci expect(heapLoader.calRetainedSize()).toBeUndefined(); 242fb726d48Sopenharmony_ci }); 243fb726d48Sopenharmony_ci it('HeapLoaderTest11', () => { 244fb726d48Sopenharmony_ci let heapLoader = new HeapLoader(data); 245fb726d48Sopenharmony_ci heapLoader.buildDominatedNode = jest.fn(()=>{true}); 246fb726d48Sopenharmony_ci expect(heapLoader.buildDominatedNode()).toStrictEqual(); 247fb726d48Sopenharmony_ci }); 248fb726d48Sopenharmony_ci it('HeapLoaderTest12', () => { 249fb726d48Sopenharmony_ci let heapLoader = new HeapLoader(data); 250fb726d48Sopenharmony_ci expect(heapLoader.buildSamples()).toBeUndefined(); 251fb726d48Sopenharmony_ci }); 252fb726d48Sopenharmony_ci it('HeapLoaderTest13', () => { 253fb726d48Sopenharmony_ci let heapLoader = new HeapLoader(data); 254fb726d48Sopenharmony_ci let samples = [ 255fb726d48Sopenharmony_ci {length: 1}, 256fb726d48Sopenharmony_ci {mid: 1} 257fb726d48Sopenharmony_ci ] 258fb726d48Sopenharmony_ci expect(heapLoader.binarySearchNodeInSamples(1, samples)).toBe(0); 259fb726d48Sopenharmony_ci }); 260fb726d48Sopenharmony_ci it('HeapLoaderTest14', () => { 261fb726d48Sopenharmony_ci let heapLoader = new HeapLoader(data); 262fb726d48Sopenharmony_ci let node = { 263fb726d48Sopenharmony_ci index:1, 264fb726d48Sopenharmony_ci nodesToVisitLen:1 265fb726d48Sopenharmony_ci } 266fb726d48Sopenharmony_ci let edge = { 267fb726d48Sopenharmony_ci nodesToVisitLen:3, 268fb726d48Sopenharmony_ci } 269fb726d48Sopenharmony_ci expect(heapLoader.bfs(node,edge)).toBeUndefined(); 270fb726d48Sopenharmony_ci }); 271fb726d48Sopenharmony_ci it('HeapLoaderTest15', () => { 272fb726d48Sopenharmony_ci let heapLoader = new HeapLoader(data); 273fb726d48Sopenharmony_ci expect(heapLoader.markPageOwnedNodes()).toBeUndefined(); 274fb726d48Sopenharmony_ci }); 275fb726d48Sopenharmony_ci it('HeapLoaderTest16', () => { 276fb726d48Sopenharmony_ci let heapLoader = new HeapLoader(data); 277fb726d48Sopenharmony_ci let node = { 278fb726d48Sopenharmony_ci nodeIndex:1 279fb726d48Sopenharmony_ci } 280fb726d48Sopenharmony_ci expect(heapLoader.hasOnlyWeakRetainers(node)).toBe(true); 281fb726d48Sopenharmony_ci }); 282fb726d48Sopenharmony_ci it('HeapLoaderTest17', () => { 283fb726d48Sopenharmony_ci let heapLoader = new HeapLoader(data); 284fb726d48Sopenharmony_ci let targetClass = { 285fb726d48Sopenharmony_ci fileId:1, 286fb726d48Sopenharmony_ci nodeName:'', 287fb726d48Sopenharmony_ci childCount:2, 288fb726d48Sopenharmony_ci classChildren:[], 289fb726d48Sopenharmony_ci } 290fb726d48Sopenharmony_ci let baseClass = { 291fb726d48Sopenharmony_ci childCount:1, 292fb726d48Sopenharmony_ci classChildren:[] 293fb726d48Sopenharmony_ci } 294fb726d48Sopenharmony_ci heapLoader.calClassDiff = jest.fn(()=>{true}) 295fb726d48Sopenharmony_ci expect(heapLoader.calClassDiff(targetClass,baseClass)).toBeUndefined(); 296fb726d48Sopenharmony_ci }); 297fb726d48Sopenharmony_ci it('HeapLoaderTest18', () => { 298fb726d48Sopenharmony_ci let heapLoader = new HeapLoader(data); 299fb726d48Sopenharmony_ci let item = { 300fb726d48Sopenharmony_ci children:[{length: 1}], 301fb726d48Sopenharmony_ci index:1, 302fb726d48Sopenharmony_ci childCount:1, 303fb726d48Sopenharmony_ci edgeName:'', 304fb726d48Sopenharmony_ci hasNext:true, 305fb726d48Sopenharmony_ci traceNodeId:1, 306fb726d48Sopenharmony_ci type:0, 307fb726d48Sopenharmony_ci parent:{}, 308fb726d48Sopenharmony_ci id:1 309fb726d48Sopenharmony_ci } 310fb726d48Sopenharmony_ci expect(heapLoader.getNextNode(item)).toStrictEqual([{"length": 1}]); 311fb726d48Sopenharmony_ci }); 312fb726d48Sopenharmony_ci it('HeapLoaderTest19', () => { 313fb726d48Sopenharmony_ci let heapLoader = new HeapLoader(data); 314fb726d48Sopenharmony_ci let item = { 315fb726d48Sopenharmony_ci retains:[{length: 1}], 316fb726d48Sopenharmony_ci index:1, 317fb726d48Sopenharmony_ci childCount:1, 318fb726d48Sopenharmony_ci edgeName:'', 319fb726d48Sopenharmony_ci hasNext:true, 320fb726d48Sopenharmony_ci traceNodeId:1, 321fb726d48Sopenharmony_ci type:0, 322fb726d48Sopenharmony_ci parent:{}, 323fb726d48Sopenharmony_ci id:1 324fb726d48Sopenharmony_ci } 325fb726d48Sopenharmony_ci expect(heapLoader.getRetains(item)).toStrictEqual([{"length": 1}]); 326fb726d48Sopenharmony_ci }); 327fb726d48Sopenharmony_ci it('HeapLoaderTest20', () => { 328fb726d48Sopenharmony_ci let heapLoader = new HeapLoader(data); 329fb726d48Sopenharmony_ci let node = { 330fb726d48Sopenharmony_ci index:1, 331fb726d48Sopenharmony_ci nodesToVisitLen:1 332fb726d48Sopenharmony_ci } 333fb726d48Sopenharmony_ci let edge = { 334fb726d48Sopenharmony_ci nodesToVisitLen:3, 335fb726d48Sopenharmony_ci } 336fb726d48Sopenharmony_ci expect(heapLoader.filterForBpf(node,edge)).toBe(true); 337fb726d48Sopenharmony_ci }); 338fb726d48Sopenharmony_ci it('HeapLoaderTest21', () => { 339fb726d48Sopenharmony_ci let heapLoader = new HeapLoader(data); 340fb726d48Sopenharmony_ci let datas = { 341fb726d48Sopenharmony_ci visited:[ 342fb726d48Sopenharmony_ci {node:{nodeIndex:1}}, 343fb726d48Sopenharmony_ci ], 344fb726d48Sopenharmony_ci attached:[], 345fb726d48Sopenharmony_ci detached:[], 346fb726d48Sopenharmony_ci } 347fb726d48Sopenharmony_ci let node = { 348fb726d48Sopenharmony_ci nodeIndex:1, 349fb726d48Sopenharmony_ci type:1, 350fb726d48Sopenharmony_ci detachedness:1, 351fb726d48Sopenharmony_ci id:1, 352fb726d48Sopenharmony_ci displayName: 'Detached ', 353fb726d48Sopenharmony_ci name:'', 354fb726d48Sopenharmony_ci flag:1 355fb726d48Sopenharmony_ci } 356fb726d48Sopenharmony_ci expect(heapLoader.processNode(datas,node,1)).toBeUndefined(); 357fb726d48Sopenharmony_ci }); 358fb726d48Sopenharmony_ci it('HeapLoaderTest22', () => { 359fb726d48Sopenharmony_ci let heapLoader = new HeapLoader(data); 360fb726d48Sopenharmony_ci expect(heapLoader.allocation).toBeTruthy(); 361fb726d48Sopenharmony_ci }); 362fb726d48Sopenharmony_ci it('HeapLoaderTest23', () => { 363fb726d48Sopenharmony_ci let heapLoader = new HeapLoader(data); 364fb726d48Sopenharmony_ci expect(heapLoader.getAllocation()).toBeTruthy(); 365fb726d48Sopenharmony_ci }); 366fb726d48Sopenharmony_ci}); 367