release-actors.test.js (6929B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 "use strict"; 4 5 const { 6 getFirstMessage, 7 setupActions, 8 setupStore, 9 getWebConsoleUiMock, 10 } = require("resource://devtools/client/webconsole/test/node/helpers.js"); 11 12 const { 13 stubPackets, 14 } = require("resource://devtools/client/webconsole/test/node/fixtures/stubs/index.js"); 15 const expect = require("expect"); 16 17 describe("Release actor enhancer:", () => { 18 let actions; 19 20 beforeAll(() => { 21 actions = setupActions(); 22 }); 23 24 describe("release", () => { 25 it("releases backend actors when limit reached adding a single message", () => { 26 const logLimit = 100; 27 const releasedActors = []; 28 29 const { dispatch, getState } = setupStore([], { 30 storeOptions: { logLimit }, 31 webConsoleUI: getWebConsoleUiMock({ 32 commands: { 33 client: { 34 mainRoot: {}, 35 }, 36 objectCommand: { 37 releaseObjects: async frontsToRelease => { 38 for (const front of frontsToRelease) { 39 releasedActors.push(front.actorID); 40 } 41 }, 42 }, 43 }, 44 }), 45 }); 46 47 // Add a log message. 48 const packet = stubPackets.get( 49 "console.log('myarray', ['red', 'green', 'blue'])" 50 ); 51 dispatch(actions.messagesAdd([packet])); 52 53 const firstMessage = getFirstMessage(getState()); 54 const firstMessageActor = firstMessage.parameters[1].actorID; 55 56 // Add an evaluation result message (see Bug 1408321). 57 const evaluationResultPacket = stubPackets.get("new Date(0)"); 58 dispatch(actions.messagesAdd([evaluationResultPacket])); 59 const secondMessageActor = evaluationResultPacket.result.actorID; 60 61 const logCount = logLimit + 1; 62 const assertPacket = stubPackets.get( 63 "console.assert(false, {message: 'foobar'})" 64 ); 65 const thirdMessageActor = assertPacket.arguments[0].actorID; 66 67 for (let i = 1; i <= logCount; i++) { 68 assertPacket.arguments.push(`message num ${i}`); 69 dispatch(actions.messagesAdd([assertPacket])); 70 } 71 72 expect(releasedActors.length).toBe(3); 73 expect(releasedActors).toInclude(firstMessageActor); 74 expect(releasedActors).toInclude(secondMessageActor); 75 expect(releasedActors).toInclude(thirdMessageActor); 76 }); 77 78 it("releases backend actors when limit reached adding multiple messages", () => { 79 const logLimit = 100; 80 const releasedActors = []; 81 const { dispatch, getState } = setupStore([], { 82 storeOptions: { logLimit }, 83 webConsoleUI: getWebConsoleUiMock({ 84 commands: { 85 client: { 86 mainRoot: {}, 87 }, 88 objectCommand: { 89 releaseObjects: async frontsToRelease => { 90 for (const front of frontsToRelease) { 91 releasedActors.push(front.actorID); 92 } 93 }, 94 }, 95 }, 96 }), 97 }); 98 99 // Add a log message. 100 const logPacket = stubPackets.get( 101 "console.log('myarray', ['red', 'green', 'blue'])" 102 ); 103 dispatch(actions.messagesAdd([logPacket])); 104 105 const firstMessage = getFirstMessage(getState()); 106 const firstMessageActor = firstMessage.parameters[1].actorID; 107 108 // Add an evaluation result message (see Bug 1408321). 109 const evaluationResultPacket = stubPackets.get("new Date(0)"); 110 dispatch(actions.messagesAdd([evaluationResultPacket])); 111 const secondMessageActor = evaluationResultPacket.result.actorID; 112 113 // Add an assertion message. 114 const assertPacket = stubPackets.get( 115 "console.assert(false, {message: 'foobar'})" 116 ); 117 dispatch(actions.messagesAdd([assertPacket])); 118 const thirdMessageActor = assertPacket.arguments[0].actorID; 119 120 // Add ${logLimit} messages so we prune the ones we added before. 121 const packets = []; 122 // Alternate between 2 packets so we don't trigger the repeat message mechanism. 123 const oddPacket = stubPackets.get("console.log(undefined)"); 124 const evenPacket = stubPackets.get("console.log('foobar', 'test')"); 125 for (let i = 0; i < logLimit; i++) { 126 const packet = i % 2 === 0 ? evenPacket : oddPacket; 127 packets.push(packet); 128 } 129 130 // Add all the packets at once. This will prune the first 3 messages. 131 dispatch(actions.messagesAdd(packets)); 132 133 expect(releasedActors.length).toBe(3); 134 expect(releasedActors).toInclude(firstMessageActor); 135 expect(releasedActors).toInclude(secondMessageActor); 136 expect(releasedActors).toInclude(thirdMessageActor); 137 }); 138 139 it("properly releases backend actors after clear", () => { 140 const releasedActors = []; 141 const { dispatch, getState } = setupStore([], { 142 webConsoleUI: getWebConsoleUiMock({ 143 commands: { 144 client: { 145 mainRoot: {}, 146 }, 147 objectCommand: { 148 releaseObjects: async frontsToRelease => { 149 for (const front of frontsToRelease) { 150 releasedActors.push(front.actorID); 151 } 152 }, 153 }, 154 }, 155 }), 156 }); 157 158 // Add a log message. 159 const logPacket = stubPackets.get( 160 "console.log('myarray', ['red', 'green', 'blue'])" 161 ); 162 dispatch(actions.messagesAdd([logPacket])); 163 164 const firstMessage = getFirstMessage(getState()); 165 const firstMessageActor = firstMessage.parameters[1].actorID; 166 167 // Add an assertion message. 168 const assertPacket = stubPackets.get( 169 "console.assert(false, {message: 'foobar'})" 170 ); 171 dispatch(actions.messagesAdd([assertPacket])); 172 const secondMessageActor = assertPacket.arguments[0].actorID; 173 174 // Add an evaluation result message (see Bug 1408321). 175 const evaluationResultPacket = stubPackets.get("new Date(0)"); 176 dispatch(actions.messagesAdd([evaluationResultPacket])); 177 const thirdMessageActor = evaluationResultPacket.result.actorID; 178 179 // Add a message with a long string messageText property. 180 const longStringPacket = stubPackets.get("TypeError longString message"); 181 dispatch(actions.messagesAdd([longStringPacket])); 182 const fourthMessageActor = 183 longStringPacket.pageError.errorMessage.actorID; 184 const fifthMessageActor = longStringPacket.pageError.exception.actorID; 185 186 // Kick-off the actor release. 187 dispatch(actions.messagesClear()); 188 189 expect(releasedActors.length).toBe(5); 190 expect(releasedActors).toInclude(firstMessageActor); 191 expect(releasedActors).toInclude(secondMessageActor); 192 expect(releasedActors).toInclude(thirdMessageActor); 193 expect(releasedActors).toInclude(fourthMessageActor); 194 expect(releasedActors).toInclude(fifthMessageActor); 195 }); 196 }); 197 });