tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 });