diff options
Diffstat (limited to 'devtools/client/memory/test/unit/test_action-import-snapshot-dominator-tree.js')
-rw-r--r-- | devtools/client/memory/test/unit/test_action-import-snapshot-dominator-tree.js | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/devtools/client/memory/test/unit/test_action-import-snapshot-dominator-tree.js b/devtools/client/memory/test/unit/test_action-import-snapshot-dominator-tree.js new file mode 100644 index 000000000..868f22ccf --- /dev/null +++ b/devtools/client/memory/test/unit/test_action-import-snapshot-dominator-tree.js @@ -0,0 +1,84 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ +"use strict"; + +/** + * Tests `importSnapshotAndCensus()` when importing snapshots from the dominator + * tree view. The snapshot is expected to be loaded and its dominator tree + * should be computed. + */ + +let { snapshotState, dominatorTreeState, viewState, treeMapState } = + require("devtools/client/memory/constants"); +let { importSnapshotAndCensus } = require("devtools/client/memory/actions/io"); +let { changeViewAndRefresh } = require("devtools/client/memory/actions/view"); + +function run_test() { + run_next_test(); +} + +add_task(function* () { + let front = new StubbedMemoryFront(); + let heapWorker = new HeapAnalysesClient(); + yield front.attach(); + let store = Store(); + let { subscribe, dispatch, getState } = store; + + dispatch(changeViewAndRefresh(viewState.DOMINATOR_TREE, heapWorker)); + equal(getState().view.state, viewState.DOMINATOR_TREE, + "We should now be in the DOMINATOR_TREE view"); + + let i = 0; + let expected = [ + "IMPORTING", + "READING", + "READ", + "treeMap:SAVING", + "treeMap:SAVED", + "dominatorTree:COMPUTING", + "dominatorTree:FETCHING", + "dominatorTree:LOADED", + ]; + let expectStates = () => { + let snapshot = getState().snapshots[0]; + if (snapshot && hasExpectedState(snapshot, expected[i])) { + ok(true, `Found expected state ${expected[i]}`); + i++; + } + }; + + let unsubscribe = subscribe(expectStates); + const snapshotPath = yield front.saveHeapSnapshot(); + dispatch(importSnapshotAndCensus(heapWorker, snapshotPath)); + + yield waitUntilState(store, () => i === expected.length); + unsubscribe(); + equal(i, expected.length, "importSnapshotAndCensus() produces the correct " + + "sequence of states in a snapshot"); + equal(getState().snapshots[0].dominatorTree.state, dominatorTreeState.LOADED, + "imported snapshot's dominator tree is in LOADED state"); + ok(getState().snapshots[0].selected, "imported snapshot is selected"); +}); + +/** + * Check that the provided snapshot is in the expected state. The expected state + * is a snapshotState by default. If the expected state is prefixed by + * dominatorTree, a dominatorTree is expected on the provided snapshot, in the + * corresponding state from dominatorTreeState. + */ +function hasExpectedState(snapshot, expectedState) { + let isDominatorState = expectedState.indexOf("dominatorTree:") === 0; + if (isDominatorState) { + let state = dominatorTreeState[expectedState.replace("dominatorTree:", "")]; + return snapshot.dominatorTree && snapshot.dominatorTree.state === state; + } + + let isTreeMapState = expectedState.indexOf("treeMap:") === 0; + if (isTreeMapState) { + let state = treeMapState[expectedState.replace("treeMap:", "")]; + return snapshot.treeMap && snapshot.treeMap.state === state; + } + + let state = snapshotState[expectedState]; + return snapshot.state === state; +} |