test_error.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. /* This Source Code Form is subject to the terms of the Mozilla Public
  2. * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  3. * You can obtain one at http://mozilla.org/MPL/2.0/. */
  4. const {utils: Cu} = Components;
  5. Cu.import("chrome://marionette/content/error.js");
  6. function notok(condition) {
  7. ok(!(condition));
  8. }
  9. add_test(function test_isError() {
  10. notok(error.isError(null));
  11. notok(error.isError([]));
  12. notok(error.isError(new Date()));
  13. ok(error.isError(new Components.Exception()));
  14. ok(error.isError(new Error()));
  15. ok(error.isError(new EvalError()));
  16. ok(error.isError(new InternalError()));
  17. ok(error.isError(new RangeError()));
  18. ok(error.isError(new ReferenceError()));
  19. ok(error.isError(new SyntaxError()));
  20. ok(error.isError(new TypeError()));
  21. ok(error.isError(new URIError()));
  22. ok(error.isError(new WebDriverError()));
  23. ok(error.isError(new InvalidArgumentError()));
  24. run_next_test();
  25. });
  26. add_test(function test_isWebDriverError() {
  27. notok(error.isWebDriverError(new Components.Exception()));
  28. notok(error.isWebDriverError(new Error()));
  29. notok(error.isWebDriverError(new EvalError()));
  30. notok(error.isWebDriverError(new InternalError()));
  31. notok(error.isWebDriverError(new RangeError()));
  32. notok(error.isWebDriverError(new ReferenceError()));
  33. notok(error.isWebDriverError(new SyntaxError()));
  34. notok(error.isWebDriverError(new TypeError()));
  35. notok(error.isWebDriverError(new URIError()));
  36. ok(error.isWebDriverError(new WebDriverError()));
  37. ok(error.isWebDriverError(new InvalidArgumentError()));
  38. ok(error.isWebDriverError(new JavaScriptError()));
  39. run_next_test();
  40. });
  41. add_test(function test_wrap() {
  42. // webdriver-derived errors should not be wrapped
  43. equal(error.wrap(new WebDriverError()).name, "WebDriverError");
  44. ok(error.wrap(new WebDriverError()) instanceof WebDriverError);
  45. equal(error.wrap(new InvalidArgumentError()).name, "InvalidArgumentError");
  46. ok(error.wrap(new InvalidArgumentError()) instanceof WebDriverError);
  47. ok(error.wrap(new InvalidArgumentError()) instanceof InvalidArgumentError);
  48. // JS errors should be wrapped in WebDriverError
  49. equal(error.wrap(new Error()).name, "WebDriverError");
  50. ok(error.wrap(new Error()) instanceof WebDriverError);
  51. equal(error.wrap(new EvalError()).name, "WebDriverError");
  52. equal(error.wrap(new InternalError()).name, "WebDriverError");
  53. equal(error.wrap(new RangeError()).name, "WebDriverError");
  54. equal(error.wrap(new ReferenceError()).name, "WebDriverError");
  55. equal(error.wrap(new SyntaxError()).name, "WebDriverError");
  56. equal(error.wrap(new TypeError()).name, "WebDriverError");
  57. equal(error.wrap(new URIError()).name, "WebDriverError");
  58. // wrapped JS errors should retain their type
  59. // as part of the message field
  60. equal(error.wrap(new WebDriverError("foo")).message, "foo");
  61. equal(error.wrap(new TypeError("foo")).message, "TypeError: foo");
  62. run_next_test();
  63. });
  64. add_test(function test_stringify() {
  65. equal("<unprintable error>", error.stringify());
  66. equal("<unprintable error>", error.stringify("foo"));
  67. equal("[object Object]", error.stringify({}));
  68. equal("[object Object]\nfoo", error.stringify({stack: "foo"}));
  69. equal("Error: foo", error.stringify(new Error("foo")).split("\n")[0]);
  70. equal("WebDriverError: foo",
  71. error.stringify(new WebDriverError("foo")).split("\n")[0]);
  72. equal("InvalidArgumentError: foo",
  73. error.stringify(new InvalidArgumentError("foo")).split("\n")[0]);
  74. run_next_test();
  75. });
  76. add_test(function test_pprint() {
  77. equal('[object Object] {"foo":"bar"}', error.pprint`${{foo: "bar"}}`);
  78. equal("[object Number] 42", error.pprint`${42}`);
  79. equal("[object Boolean] true", error.pprint`${true}`);
  80. equal("[object Undefined] undefined", error.pprint`${undefined}`);
  81. equal("[object Null] null", error.pprint`${null}`);
  82. let complexObj = {toJSON: () => "foo"};
  83. equal('[object Object] "foo"', error.pprint`${complexObj}`);
  84. let cyclic = {};
  85. cyclic.me = cyclic;
  86. equal("[object Object] <cyclic object value>", error.pprint`${cyclic}`);
  87. let el = {
  88. nodeType: 1,
  89. localName: "input",
  90. id: "foo",
  91. classList: {length: 1},
  92. className: "bar baz",
  93. };
  94. equal('<input id="foo" class="bar baz">', error.pprint`${el}`);
  95. run_next_test();
  96. });
  97. add_test(function test_toJSON() {
  98. let e0 = new WebDriverError();
  99. let e0s = e0.toJSON();
  100. equal(e0s.error, "webdriver error");
  101. equal(e0s.message, "");
  102. equal(e0s.stacktrace, e0.stack);
  103. let e1 = new WebDriverError("a");
  104. let e1s = e1.toJSON();
  105. equal(e1s.message, e1.message);
  106. equal(e1s.stacktrace, e1.stack);
  107. let e2 = new JavaScriptError("first", "second", "third", "fourth");
  108. let e2s = e2.toJSON();
  109. equal(e2.status, e2s.error);
  110. equal(e2.message, e2s.message);
  111. ok(e2s.stacktrace.match(/second/));
  112. ok(e2s.stacktrace.match(/third/));
  113. ok(e2s.stacktrace.match(/fourth/));
  114. run_next_test();
  115. });
  116. add_test(function test_fromJSON() {
  117. Assert.throws(() => WebDriverError.fromJSON({error: "foo"}),
  118. /Not of WebDriverError descent/);
  119. Assert.throws(() => WebDriverError.fromJSON({error: "Error"}),
  120. /Not of WebDriverError descent/);
  121. Assert.throws(() => WebDriverError.fromJSON({}),
  122. /Undeserialisable error type/);
  123. Assert.throws(() => WebDriverError.fromJSON(undefined),
  124. /TypeError/);
  125. // stacks will be different
  126. let e1 = new WebDriverError("1");
  127. let e1r = WebDriverError.fromJSON({error: "webdriver error", message: "1"});
  128. ok(e1r instanceof WebDriverError);
  129. equal(e1r.name, e1.name);
  130. equal(e1r.status, e1.status);
  131. equal(e1r.message, e1.message);
  132. // stacks will be different
  133. let e2 = new InvalidArgumentError("2");
  134. let e2r = WebDriverError.fromJSON({error: "invalid argument", message: "2"});
  135. ok(e2r instanceof WebDriverError);
  136. ok(e2r instanceof InvalidArgumentError);
  137. equal(e2r.name, e2.name);
  138. equal(e2r.status, e2.status);
  139. equal(e2r.message, e2.message);
  140. // test stacks
  141. let e3j = {error: "no such element", message: "3", stacktrace: "4"};
  142. let e3r = WebDriverError.fromJSON(e3j);
  143. ok(e3r instanceof WebDriverError);
  144. ok(e3r instanceof NoSuchElementError);
  145. equal(e3r.name, "NoSuchElementError");
  146. equal(e3r.status, e3j.error);
  147. equal(e3r.message, e3j.message);
  148. equal(e3r.stack, e3j.stacktrace);
  149. // parity with toJSON
  150. let e4 = new JavaScriptError("first", "second", "third", "fourth");
  151. let e4s = e4.toJSON();
  152. deepEqual(e4, WebDriverError.fromJSON(e4s));
  153. run_next_test();
  154. });
  155. add_test(function test_WebDriverError() {
  156. let err = new WebDriverError("foo");
  157. equal("WebDriverError", err.name);
  158. equal("foo", err.message);
  159. equal("webdriver error", err.status);
  160. ok(err instanceof WebDriverError);
  161. run_next_test();
  162. });
  163. add_test(function test_ElementClickInterceptedError() {
  164. let otherEl = {
  165. nodeType: 1,
  166. localName: "a",
  167. classList: [],
  168. };
  169. let obscuredEl = {
  170. nodeType: 1,
  171. localName: "b",
  172. classList: [],
  173. ownerDocument: {
  174. elementFromPoint: function (x, y) {
  175. return otherEl;
  176. },
  177. },
  178. style: {
  179. pointerEvents: "auto",
  180. }
  181. };
  182. let err1 = new ElementClickInterceptedError(obscuredEl, {x: 1, y: 2});
  183. equal("ElementClickInterceptedError", err1.name);
  184. equal("Element <b> is not clickable at point (1,2) " +
  185. "because another element <a> obscures it",
  186. err1.message);
  187. equal("element click intercepted", err1.status);
  188. ok(err1 instanceof WebDriverError);
  189. obscuredEl.style.pointerEvents = "none";
  190. let err2 = new ElementClickInterceptedError(obscuredEl, {x: 1, y: 2});
  191. equal("Element <b> is not clickable at point (1,2) " +
  192. "because it does not have pointer events enabled, " +
  193. "and element <a> would receive the click instead",
  194. err2.message);
  195. run_next_test();
  196. });
  197. add_test(function test_ElementNotAccessibleError() {
  198. let err = new ElementNotAccessibleError("foo");
  199. equal("ElementNotAccessibleError", err.name);
  200. equal("foo", err.message);
  201. equal("element not accessible", err.status);
  202. ok(err instanceof WebDriverError);
  203. run_next_test();
  204. });
  205. add_test(function test_ElementNotInteractableError() {
  206. let err = new ElementNotInteractableError("foo");
  207. equal("ElementNotInteractableError", err.name);
  208. equal("foo", err.message);
  209. equal("element not interactable", err.status);
  210. ok(err instanceof WebDriverError);
  211. run_next_test();
  212. });
  213. add_test(function test_InvalidArgumentError() {
  214. let err = new InvalidArgumentError("foo");
  215. equal("InvalidArgumentError", err.name);
  216. equal("foo", err.message);
  217. equal("invalid argument", err.status);
  218. ok(err instanceof WebDriverError);
  219. run_next_test();
  220. });
  221. add_test(function test_InvalidElementStateError() {
  222. let err = new InvalidElementStateError("foo");
  223. equal("InvalidElementStateError", err.name);
  224. equal("foo", err.message);
  225. equal("invalid element state", err.status);
  226. ok(err instanceof WebDriverError);
  227. run_next_test();
  228. });
  229. add_test(function test_InvalidSelectorError() {
  230. let err = new InvalidSelectorError("foo");
  231. equal("InvalidSelectorError", err.name);
  232. equal("foo", err.message);
  233. equal("invalid selector", err.status);
  234. ok(err instanceof WebDriverError);
  235. run_next_test();
  236. });
  237. add_test(function test_InvalidSessionIDError() {
  238. let err = new InvalidSessionIDError("foo");
  239. equal("InvalidSessionIDError", err.name);
  240. equal("foo", err.message);
  241. equal("invalid session id", err.status);
  242. ok(err instanceof WebDriverError);
  243. run_next_test();
  244. });
  245. add_test(function test_JavaScriptError() {
  246. let err = new JavaScriptError("foo");
  247. equal("JavaScriptError", err.name);
  248. equal("foo", err.message);
  249. equal("javascript error", err.status);
  250. ok(err instanceof WebDriverError);
  251. equal("undefined", new JavaScriptError(undefined).message);
  252. // TODO(ato): Bug 1240550
  253. //equal("funcname @file", new JavaScriptError("message", "funcname", "file").stack);
  254. equal("funcname @file, line line",
  255. new JavaScriptError("message", "funcname", "file", "line").stack);
  256. // TODO(ato): More exhaustive tests for JS stack computation
  257. run_next_test();
  258. });
  259. add_test(function test_NoAlertOpenError() {
  260. let err = new NoAlertOpenError("foo");
  261. equal("NoAlertOpenError", err.name);
  262. equal("foo", err.message);
  263. equal("no such alert", err.status);
  264. ok(err instanceof WebDriverError);
  265. run_next_test();
  266. });
  267. add_test(function test_NoSuchElementError() {
  268. let err = new NoSuchElementError("foo");
  269. equal("NoSuchElementError", err.name);
  270. equal("foo", err.message);
  271. equal("no such element", err.status);
  272. ok(err instanceof WebDriverError);
  273. run_next_test();
  274. });
  275. add_test(function test_NoSuchFrameError() {
  276. let err = new NoSuchFrameError("foo");
  277. equal("NoSuchFrameError", err.name);
  278. equal("foo", err.message);
  279. equal("no such frame", err.status);
  280. ok(err instanceof WebDriverError);
  281. run_next_test();
  282. });
  283. add_test(function test_NoSuchWindowError() {
  284. let err = new NoSuchWindowError("foo");
  285. equal("NoSuchWindowError", err.name);
  286. equal("foo", err.message);
  287. equal("no such window", err.status);
  288. ok(err instanceof WebDriverError);
  289. run_next_test();
  290. });
  291. add_test(function test_ScriptTimeoutError() {
  292. let err = new ScriptTimeoutError("foo");
  293. equal("ScriptTimeoutError", err.name);
  294. equal("foo", err.message);
  295. equal("script timeout", err.status);
  296. ok(err instanceof WebDriverError);
  297. run_next_test();
  298. });
  299. add_test(function test_SessionNotCreatedError() {
  300. let err = new SessionNotCreatedError("foo");
  301. equal("SessionNotCreatedError", err.name);
  302. equal("foo", err.message);
  303. equal("session not created", err.status);
  304. ok(err instanceof WebDriverError);
  305. run_next_test();
  306. });
  307. add_test(function test_StaleElementReferenceError() {
  308. let err = new StaleElementReferenceError("foo");
  309. equal("StaleElementReferenceError", err.name);
  310. equal("foo", err.message);
  311. equal("stale element reference", err.status);
  312. ok(err instanceof WebDriverError);
  313. run_next_test();
  314. });
  315. add_test(function test_TimeoutError() {
  316. let err = new TimeoutError("foo");
  317. equal("TimeoutError", err.name);
  318. equal("foo", err.message);
  319. equal("timeout", err.status);
  320. ok(err instanceof WebDriverError);
  321. run_next_test();
  322. });
  323. add_test(function test_UnableToSetCookieError() {
  324. let err = new UnableToSetCookieError("foo");
  325. equal("UnableToSetCookieError", err.name);
  326. equal("foo", err.message);
  327. equal("unable to set cookie", err.status);
  328. ok(err instanceof WebDriverError);
  329. run_next_test();
  330. });
  331. add_test(function test_UnknownCommandError() {
  332. let err = new UnknownCommandError("foo");
  333. equal("UnknownCommandError", err.name);
  334. equal("foo", err.message);
  335. equal("unknown command", err.status);
  336. ok(err instanceof WebDriverError);
  337. run_next_test();
  338. });
  339. add_test(function test_UnknownError() {
  340. let err = new UnknownError("foo");
  341. equal("UnknownError", err.name);
  342. equal("foo", err.message);
  343. equal("unknown error", err.status);
  344. ok(err instanceof WebDriverError);
  345. run_next_test();
  346. });
  347. add_test(function test_UnsupportedOperationError() {
  348. let err = new UnsupportedOperationError("foo");
  349. equal("UnsupportedOperationError", err.name);
  350. equal("foo", err.message);
  351. equal("unsupported operation", err.status);
  352. ok(err instanceof WebDriverError);
  353. run_next_test();
  354. });