Index: test/cctest/test-abort-on-uncaught-exception.cc |
diff --git a/test/cctest/test-abort-on-uncaught-exception.cc b/test/cctest/test-abort-on-uncaught-exception.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..84c0a18f9152e040c551006550ce39f854052e23 |
--- /dev/null |
+++ b/test/cctest/test-abort-on-uncaught-exception.cc |
@@ -0,0 +1,57 @@ |
+// Copyright 2013 the V8 project authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "src/v8.h" |
+ |
+#include "test/cctest/cctest.h" |
+ |
+const char* BOOM_FUNC = "function boom() { throw new Error(\"boom\") }"; |
+ |
+TEST(AbortOnUncaughtExceptionDefault) { |
+ v8::Isolate* isolate = CcTest::isolate(); |
+ v8::HandleScope handle_scope(isolate); |
+ v8::Handle<v8::ObjectTemplate> global_template = |
+ v8::ObjectTemplate::New(isolate); |
+ LocalContext env(NULL, global_template); |
+ |
+ i::FLAG_abort_on_uncaught_exception = true; |
+ CompileRun(BOOM_FUNC); |
+ |
+ v8::Local<v8::Object> global_object = env->Global(); |
+ v8::Local<v8::Function> foo = |
+ v8::Local<v8::Function>::Cast(global_object->Get(v8_str("boom"))); |
+ |
+ USE(foo); |
+ /* |
+ Ideally, I'd like to use EXPECT_EXIT like following: |
+ |
+ EXPECT_EXIT(foo->Call(global_object, 0, NULL);, |
+ ::testing::KilledBySignal(SIGKILL), |
+ "throwing and using --abort-on-uncaught-exception should cause process " |
+ "to abort"); |
+ */ |
+} |
+ |
+ |
+bool NoAbortOnUncaughtException(v8::Isolate* isolate) { return false; } |
+ |
+ |
+TEST(AbortOnUncaughtExceptionUncaughtExceptionCallbackNoAbort) { |
+ v8::Isolate* isolate = CcTest::isolate(); |
+ v8::HandleScope handle_scope(isolate); |
+ v8::Handle<v8::ObjectTemplate> global_template = |
+ v8::ObjectTemplate::New(isolate); |
+ LocalContext env(NULL, global_template); |
+ |
+ i::FLAG_abort_on_uncaught_exception = true; |
+ isolate->SetAbortOnUncaughtExceptionCallback(NoAbortOnUncaughtException); |
+ |
+ CompileRun(BOOM_FUNC); |
+ |
+ v8::Local<v8::Object> global_object = env->Global(); |
+ v8::Local<v8::Function> foo = |
+ v8::Local<v8::Function>::Cast(global_object->Get(v8_str("boom"))); |
+ |
+ foo->Call(global_object, 0, NULL); |
+} |