summaryrefslogtreecommitdiffstats
path: root/devtools/shared/tests/xpcshell/test_require.js
blob: b94aca23e7f41480248c5703e485e19be4179a02 (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
/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */

"use strict";

// Test require

// Ensure that DevtoolsLoader.require doesn't spawn multiple
// loader/modules when early cached
function testBug1091706() {
  const loader = new DevToolsLoader();
  const require = loader.require;

  const indent1 = require("resource://devtools/shared/indentation.js");
  const indent2 = require("resource://devtools/shared/indentation.js");

  Assert.ok(indent1 === indent2);
}

function testInvalidModule() {
  const loader = new DevToolsLoader();
  const require = loader.require;

  try {
    // This will result in an invalid URL with no scheme and mae loadSubScript
    // throws "Error creating URI" error
    require("foo");
    Assert.ok(false, "require should throw");
  } catch (error) {
    Assert.equal(error.message, "Module `foo` is not found at foo.js");
    Assert.ok(
      error.stack.includes("testInvalidModule"),
      "Exception's stack includes the test function"
    );
  }

  try {
    // But when using devtools prefix, the URL is going to be correct but the file
    // doesn't exists, leading to "Error opening input stream (invalid filename?)" error
    require("resource://devtools/foo.js");
    Assert.ok(false, "require should throw");
  } catch (error) {
    Assert.equal(
      error.message,
      "Module `resource://devtools/foo.js` is not found at resource://devtools/foo.js"
    );
    Assert.ok(
      error.stack.includes("testInvalidModule"),
      "Exception's stack includes the test function"
    );
  }
}

function testThrowingModule() {
  const loader = new DevToolsLoader();
  const require = loader.require;

  try {
    // Require a test module that is throwing an Error object
    require("xpcshell-test/throwing-module-1.js");
    Assert.ok(false, "require should throw");
  } catch (error) {
    Assert.equal(error.message, "my-exception");
    Assert.ok(
      error.stack.includes("testThrowingModule"),
      "Exception's stack includes the test function"
    );
    Assert.ok(
      error.stack.includes("throwingMethod"),
      "Exception's stack also includes the module function that throws"
    );
  }
  try {
    // Require a test module that is throwing a string
    require("xpcshell-test/throwing-module-2.js");
    Assert.ok(false, "require should throw");
  } catch (error) {
    Assert.equal(
      error.message,
      "Error while loading module `xpcshell-test/throwing-module-2.js` at " +
        "resource://test/throwing-module-2.js:\nmy-exception"
    );
    Assert.ok(
      error.stack.includes("testThrowingModule"),
      "Exception's stack includes the test function"
    );
    Assert.ok(
      !error.stack.includes("throwingMethod"),
      "Exception's stack also includes the module function that throws"
    );
  }
}

function run_test() {
  testBug1091706();

  testInvalidModule();

  testThrowingModule();
}