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