summaryrefslogtreecommitdiffstats
path: root/devtools/shared/heapsnapshot/tests/xpcshell/test_SaveHeapSnapshot.js
blob: 641b019a8e6fd1beb99f6115c11758b3cd8ea84e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */

// Test the ChromeUtils interface.
// eslint-disable-next-line
if (typeof Debugger != "function") {
  const { addDebuggerToGlobal } = ChromeUtils.importESModule(
    "resource://gre/modules/jsdebugger.sys.mjs"
  );
  addDebuggerToGlobal(globalThis);
}

function run_test() {
  ok(ChromeUtils, "Should be able to get the ChromeUtils interface");

  testBadParameters();
  testGoodParameters();

  do_test_finished();
}

function testBadParameters() {
  Assert.throws(
    () => ChromeUtils.saveHeapSnapshot(),
    /NS_ERROR_ILLEGAL_VALUE/,
    "Should throw if arguments aren't passed in."
  );

  Assert.throws(
    () => ChromeUtils.saveHeapSnapshot(null),
    /NS_ERROR_ILLEGAL_VALUE/,
    "Should throw if boundaries isn't an object."
  );

  Assert.throws(
    () => ChromeUtils.saveHeapSnapshot({}),
    /NS_ERROR_ILLEGAL_VALUE/,
    "Should throw if the boundaries object doesn't have any properties."
  );

  Assert.throws(
    () => ChromeUtils.saveHeapSnapshot({ runtime: true, globals: [this] }),
    /NS_ERROR_ILLEGAL_VALUE/,
    "Should throw if the boundaries object has more than one property."
  );

  Assert.throws(
    () => ChromeUtils.saveHeapSnapshot({ debugger: {} }),
    /NS_ERROR_ILLEGAL_VALUE/,
    "Should throw if the debuggees object is not a Debugger object"
  );

  Assert.throws(
    () => ChromeUtils.saveHeapSnapshot({ globals: [{}] }),
    /NS_ERROR_ILLEGAL_VALUE/,
    "Should throw if the globals array contains non-global objects."
  );

  Assert.throws(
    () => ChromeUtils.saveHeapSnapshot({ runtime: false }),
    /NS_ERROR_ILLEGAL_VALUE/,
    "Should throw if runtime is supplied and is not true."
  );

  Assert.throws(
    () => ChromeUtils.saveHeapSnapshot({ globals: null }),
    /TypeError:.*can't be converted to a sequence/,
    "Should throw if globals is not an object."
  );

  Assert.throws(
    () => ChromeUtils.saveHeapSnapshot({ globals: {} }),
    /TypeError:.*can't be converted to a sequence/,
    "Should throw if globals is not an array."
  );

  Assert.throws(
    () => ChromeUtils.saveHeapSnapshot({ debugger: Debugger.prototype }),
    /NS_ERROR_ILLEGAL_VALUE/,
    "Should throw if debugger is the Debugger.prototype object."
  );

  Assert.throws(
    () =>
      ChromeUtils.saveHeapSnapshot({
        get globals() {
          return [this];
        },
      }),
    /NS_ERROR_ILLEGAL_VALUE/,
    "Should throw if boundaries property is a getter."
  );
}

const makeNewSandbox = () =>
  Cu.Sandbox(CC("@mozilla.org/systemprincipal;1", "nsIPrincipal")());

function testGoodParameters() {
  const sandbox = makeNewSandbox();
  let dbg = new Debugger(sandbox);

  ChromeUtils.saveHeapSnapshot({ debugger: dbg });
  ok(true, "Should be able to save a snapshot for a debuggee global.");

  dbg = new Debugger();
  const sandboxes = Array(10)
    .fill(null)
    .map(makeNewSandbox);
  sandboxes.forEach(sb => dbg.addDebuggee(sb));

  ChromeUtils.saveHeapSnapshot({ debugger: dbg });
  ok(true, "Should be able to save a snapshot for many debuggee globals.");

  dbg = new Debugger();
  ChromeUtils.saveHeapSnapshot({ debugger: dbg });
  ok(true, "Should be able to save a snapshot with no debuggee globals.");

  ChromeUtils.saveHeapSnapshot({ globals: [this] });
  ok(true, "Should be able to save a snapshot for a specific global.");

  ChromeUtils.saveHeapSnapshot({ runtime: true });
  ok(true, "Should be able to save a snapshot of the full runtime.");
}