tor-browser

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

testException.cpp (3098B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
      2 * vim: set ts=8 sts=2 et sw=2 tw=80:
      3 */
      4 /* This Source Code Form is subject to the terms of the Mozilla Public
      5 * License, v. 2.0. If a copy of the MPL was not distributed with this
      6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      7 
      8 #include "js/CallAndConstruct.h"    // JS_CallFunctionValue
      9 #include "js/ColumnNumber.h"        // JS::ColumnNumberOneOrigin
     10 #include "js/PropertyAndElement.h"  // JS_GetProperty
     11 #include "jsapi-tests/tests.h"
     12 
     13 BEGIN_TEST(testException_bug860435) {
     14  JS::RootedValue fun(cx);
     15 
     16  EVAL("ReferenceError", &fun);
     17  CHECK(fun.isObject());
     18 
     19  JS::RootedValue v(cx);
     20  CHECK(
     21      JS_CallFunctionValue(cx, global, fun, JS::HandleValueArray::empty(), &v));
     22  CHECK(v.isObject());
     23  JS::RootedObject obj(cx, &v.toObject());
     24 
     25  CHECK(JS_GetProperty(cx, obj, "stack", &v));
     26  CHECK(v.isString());
     27  return true;
     28 }
     29 END_TEST(testException_bug860435)
     30 
     31 BEGIN_TEST(testException_getCause) {
     32  JS::RootedValue err(cx);
     33  EVAL("new Error('message', { cause: new Error('message 2') })", &err);
     34  CHECK(err.isObject());
     35 
     36  JS::RootedString msg(cx, JS::ToString(cx, err));
     37  CHECK(msg);
     38  // Check that we have the outer error
     39  bool match;
     40  CHECK(JS_StringEqualsLiteral(cx, msg, "Error: message", &match));
     41  CHECK(match);
     42 
     43  JS::Rooted<mozilla::Maybe<JS::Value>> maybeCause(
     44      cx, JS::GetExceptionCause(&err.toObject()));
     45  CHECK(maybeCause.isSome());
     46  JS::RootedValue cause(cx, *maybeCause);
     47  CHECK(cause.isObject());
     48 
     49  msg = JS::ToString(cx, cause);
     50  CHECK(msg);
     51  // Check that we have the inner error
     52  CHECK(JS_StringEqualsLiteral(cx, msg, "Error: message 2", &match));
     53  CHECK(match);
     54 
     55  maybeCause = JS::GetExceptionCause(&cause.toObject());
     56  CHECK(maybeCause.isNothing());
     57 
     58  return true;
     59 }
     60 END_TEST(testException_getCause)
     61 
     62 BEGIN_TEST(testException_getCausePlainObject) {
     63  JS::RootedObject plain(cx, JS_NewPlainObject(cx));
     64  CHECK(plain);
     65  JS::Rooted<mozilla::Maybe<JS::Value>> maybeCause(
     66      cx, JS::GetExceptionCause(plain));
     67  CHECK(maybeCause.isNothing());
     68  return true;
     69 }
     70 END_TEST(testException_getCausePlainObject)
     71 
     72 BEGIN_TEST(testException_createErrorWithCause) {
     73  JS::RootedString empty(cx, JS_GetEmptyString(cx));
     74  JS::Rooted<mozilla::Maybe<JS::Value>> cause(
     75      cx, mozilla::Some(JS::Int32Value(-1)));
     76  JS::RootedValue err(cx);
     77  CHECK(JS::CreateError(cx, JSEXN_ERR, nullptr, empty, 1,
     78                        JS::ColumnNumberOneOrigin(1), nullptr, empty, cause,
     79                        &err));
     80  CHECK(err.isObject());
     81  JS::Rooted<mozilla::Maybe<JS::Value>> maybeCause(
     82      cx, JS::GetExceptionCause(&err.toObject()));
     83  CHECK(maybeCause.isSome());
     84  CHECK_SAME(*cause, *maybeCause);
     85 
     86  CHECK(JS::CreateError(cx, JSEXN_ERR, nullptr, empty, 1,
     87                        JS::ColumnNumberOneOrigin(1), nullptr, empty,
     88                        JS::NothingHandleValue, &err));
     89  CHECK(err.isObject());
     90  maybeCause = JS::GetExceptionCause(&err.toObject());
     91  CHECK(maybeCause.isNothing());
     92 
     93  return true;
     94 }
     95 END_TEST(testException_createErrorWithCause)