test_action-set-display-and-refresh-01.js (5748B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 /** 7 * Tests the task creator `setCensusDisplayAndRefreshAndRefresh()` for display 8 * changing. We test this rather than `setCensusDisplayAndRefresh` directly, as 9 * we use the refresh action in the app itself composed from 10 * `setCensusDisplayAndRefresh`. 11 */ 12 13 const { 14 censusDisplays, 15 censusState, 16 viewState, 17 } = require("resource://devtools/client/memory/constants.js"); 18 const { 19 setCensusDisplayAndRefresh, 20 } = require("resource://devtools/client/memory/actions/census-display.js"); 21 const { 22 takeSnapshotAndCensus, 23 selectSnapshotAndRefresh, 24 } = require("resource://devtools/client/memory/actions/snapshot.js"); 25 const { 26 changeView, 27 } = require("resource://devtools/client/memory/actions/view.js"); 28 29 // We test setting an invalid display, which triggers an assertion failure. 30 EXPECTED_DTU_ASSERT_FAILURE_COUNT = 1; 31 32 add_task(async function () { 33 const front = new StubbedMemoryFront(); 34 const heapWorker = new HeapAnalysesClient(); 35 await front.attach(); 36 const store = Store(); 37 const { getState, dispatch } = store; 38 39 dispatch(changeView(viewState.CENSUS)); 40 41 // Test default display with no snapshots 42 equal( 43 getState().censusDisplay.breakdown.by, 44 "coarseType", 45 "default coarseType display selected at start." 46 ); 47 dispatch( 48 setCensusDisplayAndRefresh(heapWorker, censusDisplays.allocationStack) 49 ); 50 equal( 51 getState().censusDisplay.breakdown.by, 52 "allocationStack", 53 "display changed with no snapshots" 54 ); 55 56 // Test invalid displays 57 Assert.strictEqual( 58 getState().errors.length, 59 0, 60 "No error actions in the queue." 61 ); 62 dispatch(setCensusDisplayAndRefresh(heapWorker, {})); 63 await waitUntilState(store, () => getState().errors.length === 1); 64 ok(true, "Emits an error action when passing in an invalid display object"); 65 66 equal( 67 getState().censusDisplay.breakdown.by, 68 "allocationStack", 69 "current display unchanged when passing invalid display" 70 ); 71 72 // Test new snapshots 73 dispatch(takeSnapshotAndCensus(front, heapWorker)); 74 await waitUntilCensusState(store, snapshot => snapshot.census, [ 75 censusState.SAVED, 76 ]); 77 78 equal( 79 getState().snapshots[0].census.display, 80 censusDisplays.allocationStack, 81 "New snapshot's census uses correct display" 82 ); 83 84 // Updates when changing display during `SAVING` 85 dispatch(takeSnapshotAndCensus(front, heapWorker)); 86 await waitUntilCensusState(store, snapshot => snapshot.census, [ 87 censusState.SAVED, 88 censusState.SAVING, 89 ]); 90 dispatch(setCensusDisplayAndRefresh(heapWorker, censusDisplays.coarseType)); 91 await waitUntilCensusState(store, snapshot => snapshot.census, [ 92 censusState.SAVED, 93 censusState.SAVED, 94 ]); 95 equal( 96 getState().snapshots[1].census.display, 97 censusDisplays.coarseType, 98 "Changing display while saving a snapshot results " + 99 "in a census using the new display" 100 ); 101 102 // Updates when changing display during `SAVING_CENSUS` 103 dispatch(takeSnapshotAndCensus(front, heapWorker)); 104 await waitUntilCensusState(store, snapshot => snapshot.census, [ 105 censusState.SAVED, 106 censusState.SAVED, 107 censusState.SAVING, 108 ]); 109 dispatch( 110 setCensusDisplayAndRefresh(heapWorker, censusDisplays.allocationStack) 111 ); 112 await waitUntilCensusState(store, snapshot => snapshot.census, [ 113 censusState.SAVED, 114 censusState.SAVED, 115 censusState.SAVED, 116 ]); 117 equal( 118 getState().snapshots[2].census.display, 119 censusDisplays.allocationStack, 120 "Display can be changed while saving census, stores updated display in snapshot" 121 ); 122 123 // Updates census on currently selected snapshot when changing display 124 ok(getState().snapshots[2].selected, "Third snapshot currently selected"); 125 dispatch(setCensusDisplayAndRefresh(heapWorker, censusDisplays.coarseType)); 126 await waitUntilState( 127 store, 128 state => state.snapshots[2].census.state === censusState.SAVING 129 ); 130 await waitUntilState( 131 store, 132 state => state.snapshots[2].census.state === censusState.SAVED 133 ); 134 equal( 135 getState().snapshots[2].census.display, 136 censusDisplays.coarseType, 137 "Snapshot census updated when changing displays " + 138 "after already generating one census" 139 ); 140 141 dispatch( 142 setCensusDisplayAndRefresh(heapWorker, censusDisplays.allocationStack) 143 ); 144 await waitUntilState( 145 store, 146 state => state.snapshots[2].census.state === censusState.SAVED 147 ); 148 equal( 149 getState().snapshots[2].census.display, 150 censusDisplays.allocationStack, 151 "Snapshot census updated when changing displays " + 152 "after already generating one census" 153 ); 154 155 // Does not update unselected censuses. 156 ok(!getState().snapshots[1].selected, "Second snapshot selected currently"); 157 equal( 158 getState().snapshots[1].census.display, 159 censusDisplays.coarseType, 160 "Second snapshot using `coarseType` display still and " + 161 "not yet updated to correct display" 162 ); 163 164 // Updates to current display when switching to stale snapshot. 165 dispatch(selectSnapshotAndRefresh(heapWorker, getState().snapshots[1].id)); 166 await waitUntilCensusState(store, snapshot => snapshot.census, [ 167 censusState.SAVED, 168 censusState.SAVING, 169 censusState.SAVED, 170 ]); 171 await waitUntilCensusState(store, snapshot => snapshot.census, [ 172 censusState.SAVED, 173 censusState.SAVED, 174 censusState.SAVED, 175 ]); 176 177 ok(getState().snapshots[1].selected, "Second snapshot selected currently"); 178 equal( 179 getState().snapshots[1].census.display, 180 censusDisplays.allocationStack, 181 "Second snapshot using `allocationStack` display and updated to correct display" 182 ); 183 184 heapWorker.destroy(); 185 await front.detach(); 186 });