Add ability to generate a Heap Snapshot
[WebKit.git] / Source / JavaScriptCore / tests / heapProfiler / basic-nodes.js
1 load("./driver/driver.js");
2
3 function hasDifferentSizeNodes(nodes) {
4     let seenSize = nodes[0].size;
5     for (let node of nodes) {
6         if (node.size !== seenSize)
7             return true;
8     }
9     return false;
10 }
11
12 function hasAllInternalNodes(nodes) {
13     for (let node of nodes) {
14         if (!node.internal)
15             return false;
16     }
17     return true;
18 }
19
20 function sorted(nodes) {
21     return nodes.sort((a, b) => a.id - b.id);
22 }
23
24 let simpleObject1NodeId;
25 let simpleObject2NodeId;
26
27 (function() {
28     let snapshot = createCheapHeapSnapshot();
29     assert(snapshot.nodesWithClassName("global").length === 1, "Snapshot should contain a single 'global' node");
30     assert(snapshot.nodesWithClassName("Structure").length > 0, "Snapshot should contain 'Structure' nodes");
31     assert(snapshot.nodesWithClassName("ThisClassNameDoesNotExist").length === 0, "Snapshot should not contain 'ThisClassNameDoesNotExist' nodes");
32
33     let strings = snapshot.nodesWithClassName("string");
34     assert(strings.length > 0, "Snapshot should contain 'string' nodes");
35     assert(hasDifferentSizeNodes(strings), "'string' nodes should have different sizes");
36
37     let nativeExecutables = snapshot.nodesWithClassName("NativeExecutable");
38     assert(nativeExecutables.length > 0, "Snapshot should contain 'NativeExecutable' nodes");
39     assert(!hasDifferentSizeNodes(nativeExecutables), "'NativeExecutable' nodes should all be the same size");
40     assert(hasAllInternalNodes(nativeExecutables), "'NativeExecutable' nodes should all be internal");
41
42     assert(snapshot.nodesWithClassName("SimpleObject").length === 0, "Snapshot should not contain a 'SimpleObject' instance");
43 })();
44
45 let simpleObject1 = new SimpleObject;
46
47 (function() {
48     let snapshot = createCheapHeapSnapshot();
49     let nodes = sorted(snapshot.nodesWithClassName("SimpleObject"));
50     let [simpleObject1Node] = nodes;
51     simpleObject1NodeId = nodes[0].id;
52     assert(nodes.length === 1, "Snapshot should contain 1 'SimpleObject' instance");
53     assert(simpleObject1Node.outgoingEdges.length === 1, "'simpleObject1' should only reference its structure");
54     assert(simpleObject1Node.outgoingEdges[0].to.className === "Structure", "'simpleObject1' should reference a Structure");
55 })();
56
57 let simpleObjectList = [];
58 for (let i = 0; i < 1234; ++i)
59     simpleObjectList.push(new SimpleObject);
60
61 (function() {
62     let snapshot = createCheapHeapSnapshot();
63     let nodes = sorted(snapshot.nodesWithClassName("SimpleObject"));
64     simpleObject1NodeId = nodes[0].id;
65     simpleObject2NodeId = nodes[1].id;
66     assert(nodes.length === 1235, "Snapshot should contain 1235 'SimpleObject' instances");
67     assert(nodes[0].id === simpleObject1NodeId, "'simpleObject1' should maintain the same identifier");
68     assert(simpleObject1NodeId < simpleObject2NodeId, "node identifiers should always increase across snapshots");
69 })();
70
71 simpleObject1 = null;
72 simpleObjectList.fill(null);
73
74 (function() {
75     let snapshot = createCheapHeapSnapshot();
76     let nodes = snapshot.nodesWithClassName("SimpleObject");
77     assert(nodes.length === 0, "Snapshot should not contain a 'SimpleObject' instance");
78 })();