Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(200)

Unified Diff: runtime/vm/dart_api_impl_test.cc

Issue 51793002: Add an API function to get a debugger stack trace from an error handle. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/vm/dart_api_impl_test.cc
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index a177a486e722953aede61631b9dd4e74b5d61444..c72bd559f1b1ace5f4db937a38b8c1ecc9786a52 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -56,9 +56,363 @@ TEST_CASE(ErrorHandleBasics) {
EXPECT(Dart_IsError(Dart_ErrorGetException(error)));
EXPECT_VALID(Dart_ErrorGetException(exception));
- EXPECT(Dart_IsError(Dart_ErrorGetStacktrace(instance)));
- EXPECT(Dart_IsError(Dart_ErrorGetStacktrace(error)));
- EXPECT_VALID(Dart_ErrorGetStacktrace(exception));
+ Dart_ExceptionStackTrace trace;
+ EXPECT(Dart_IsError(Dart_ErrorGetStacktrace(instance, &trace)));
+ EXPECT(Dart_IsError(Dart_ErrorGetStacktrace(error, &trace)));
+ EXPECT_VALID(Dart_ErrorGetStacktrace(exception, &trace));
+}
+
+
+TEST_CASE(StacktraceInfo) {
+ const char* kScriptChars =
+ "bar() => throw new Error();\n"
+ "foo() => bar();\n"
+ "testMain() => foo();\n";
+
+ Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+ Dart_Handle error = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
+
+ EXPECT(Dart_IsError(error));
+
+ Dart_ExceptionStackTrace stacktrace;
+ Dart_Handle result = Dart_ErrorGetStacktrace(error, &stacktrace);
+ EXPECT_VALID(result);
+
+ intptr_t frame_count = 0;
+ result = Dart_StacktraceLength(stacktrace, &frame_count);
+ EXPECT_VALID(result);
+ EXPECT_EQ(3, frame_count);
+
+ Dart_Handle function_name;
+ Dart_Handle script_url;
+ intptr_t line_number = 0;
+ intptr_t column_number = 0;
+ const char* cstr = "";
+
+ result = Dart_StacktraceFrameInfo(stacktrace,
+ 0,
+ &function_name,
+ &script_url,
+ &line_number,
+ &column_number);
+ EXPECT_VALID(result);
+ Dart_StringToCString(function_name, &cstr);
+ EXPECT_STREQ("bar", cstr);
+ Dart_StringToCString(script_url, &cstr);
+ EXPECT_STREQ("dart:test-lib", cstr);
+ EXPECT_EQ(1, line_number);
+ EXPECT_EQ(10, column_number);
+
+ result = Dart_StacktraceFrameInfo(stacktrace,
+ 1,
+ &function_name,
+ &script_url,
+ &line_number,
+ &column_number);
+ EXPECT_VALID(result);
+ Dart_StringToCString(function_name, &cstr);
+ EXPECT_STREQ("foo", cstr);
+ Dart_StringToCString(script_url, &cstr);
+ EXPECT_STREQ("dart:test-lib", cstr);
+ EXPECT_EQ(2, line_number);
+ EXPECT_EQ(13, column_number);
+
+ result = Dart_StacktraceFrameInfo(stacktrace,
+ 2,
+ &function_name,
+ &script_url,
+ &line_number,
+ &column_number);
+ EXPECT_VALID(result);
+ Dart_StringToCString(function_name, &cstr);
+ EXPECT_STREQ("testMain", cstr);
+ Dart_StringToCString(script_url, &cstr);
+ EXPECT_STREQ("dart:test-lib", cstr);
+ EXPECT_EQ(3, line_number);
+ EXPECT_EQ(18, column_number);
+
+ result = Dart_StacktraceFrameInfo(stacktrace,
+ frame_count + 1,
+ &function_name,
+ &script_url,
+ &line_number,
+ &column_number);
+ EXPECT(Dart_IsError(result));
+
+ result = Dart_StacktraceFrameInfo(stacktrace,
+ -1,
+ &function_name,
+ &script_url,
+ &line_number,
+ &column_number);
+ EXPECT(Dart_IsError(result));
+}
+
+
+TEST_CASE(DeepStacktraceInfo) {
+ const char* kScriptChars =
+ "foo(n) => n == 1 ? throw new Error() : foo(n-1);\n"
+ "testMain() => foo(50);\n";
+
+ Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+ Dart_Handle error = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
+
+ EXPECT(Dart_IsError(error));
+
+ Dart_ExceptionStackTrace stacktrace;
+ Dart_Handle result = Dart_ErrorGetStacktrace(error, &stacktrace);
+ EXPECT_VALID(result);
+
+ intptr_t frame_count = 0;
+ result = Dart_StacktraceLength(stacktrace, &frame_count);
+ EXPECT_VALID(result);
+ EXPECT_EQ(51, frame_count);
+ // Test something bigger than the preallocated size to verify nothing was
+ // truncated.
+ EXPECT(51 > Stacktrace::kPreallocatedStackdepth);
+
+ Dart_Handle function_name;
+ Dart_Handle script_url;
+ intptr_t line_number = 0;
+ intptr_t column_number = 0;
+ const char* cstr = "";
+
+ // Top frame at positioned at throw.
+ result = Dart_StacktraceFrameInfo(stacktrace,
+ 0,
+ &function_name,
+ &script_url,
+ &line_number,
+ &column_number);
+ EXPECT_VALID(result);
+ Dart_StringToCString(function_name, &cstr);
+ EXPECT_STREQ("foo", cstr);
+ Dart_StringToCString(script_url, &cstr);
+ EXPECT_STREQ("dart:test-lib", cstr);
+ EXPECT_EQ(1, line_number);
+ EXPECT_EQ(20, column_number);
+
+ // Middle frames positioned at the recursive call.
+ for (intptr_t frame_index = 1;
+ frame_index < (frame_count - 1);
+ frame_index++) {
+ result = Dart_StacktraceFrameInfo(stacktrace,
+ frame_index,
+ &function_name,
+ &script_url,
+ &line_number,
+ &column_number);
+ EXPECT_VALID(result);
+ Dart_StringToCString(function_name, &cstr);
+ EXPECT_STREQ("foo", cstr);
+ Dart_StringToCString(script_url, &cstr);
+ EXPECT_STREQ("dart:test-lib", cstr);
+ EXPECT_EQ(1, line_number);
+ EXPECT_EQ(43, column_number);
+ }
+
+ // Bottom frame positioned at testMain().
+ result = Dart_StacktraceFrameInfo(stacktrace,
+ frame_count - 1,
+ &function_name,
+ &script_url,
+ &line_number,
+ &column_number);
+ EXPECT_VALID(result);
+ Dart_StringToCString(function_name, &cstr);
+ EXPECT_STREQ("testMain", cstr);
+ Dart_StringToCString(script_url, &cstr);
+ EXPECT_STREQ("dart:test-lib", cstr);
+ EXPECT_EQ(2, line_number);
+ EXPECT_EQ(18, column_number);
+
+ // Out-of-bounds frames.
+ result = Dart_StacktraceFrameInfo(stacktrace,
+ frame_count,
+ &function_name,
+ &script_url,
+ &line_number,
+ &column_number);
+ EXPECT(Dart_IsError(result));
+ result = Dart_StacktraceFrameInfo(stacktrace,
+ -1,
+ &function_name,
+ &script_url,
+ &line_number,
+ &column_number);
+ EXPECT(Dart_IsError(result));
+}
+
+
+TEST_CASE(StackOverflowStacktraceInfo) {
+ const char* kScriptChars =
+ "class C {\n"
+ " static foo() => foo();\n"
+ "}\n"
+ "testMain() => C.foo();\n";
+
+ Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+ Dart_Handle error = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
+
+ EXPECT(Dart_IsError(error));
+
+ Dart_ExceptionStackTrace stacktrace;
+ Dart_Handle result = Dart_ErrorGetStacktrace(error, &stacktrace);
+ EXPECT_VALID(result);
+
+ intptr_t frame_count = 0;
+ result = Dart_StacktraceLength(stacktrace, &frame_count);
+ EXPECT_VALID(result);
+ EXPECT_EQ(Stacktrace::kPreallocatedStackdepth + 0, frame_count);
+
+ Dart_Handle function_name;
+ Dart_Handle script_url;
+ intptr_t line_number = 0;
+ intptr_t column_number = 0;
+ const char* cstr = "";
+
+ result = Dart_StacktraceFrameInfo(stacktrace,
+ 0,
+ &function_name,
+ &script_url,
+ &line_number,
+ &column_number);
+ EXPECT_VALID(result);
+ Dart_StringToCString(function_name, &cstr);
+ EXPECT_STREQ("C.foo", cstr);
+ Dart_StringToCString(script_url, &cstr);
+ EXPECT_STREQ("dart:test-lib", cstr);
+ EXPECT_EQ(2, line_number);
+ EXPECT_EQ(3, column_number);
+
+ result = Dart_StacktraceFrameInfo(stacktrace,
+ frame_count + 1,
+ &function_name,
+ &script_url,
+ &line_number,
+ &column_number);
+ EXPECT(Dart_IsError(result));
+
+ result = Dart_StacktraceFrameInfo(stacktrace,
+ -1,
+ &function_name,
+ &script_url,
+ &line_number,
+ &column_number);
+ EXPECT(Dart_IsError(result));
+}
+
+
+TEST_CASE(OutOfMemoryStacktraceInfo) {
+ const char* kScriptChars =
+ "var number_of_ints = 134000000;\n"
+ "testMain() {\n"
+ " new List<int>(number_of_ints)\n"
+ "}\n";
+
+ Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+ Dart_Handle error = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
+
+ EXPECT(Dart_IsError(error));
+
+ Dart_ExceptionStackTrace stacktrace;
+ Dart_Handle result = Dart_ErrorGetStacktrace(error, &stacktrace);
+ EXPECT(Dart_IsError(result)); // No Stacktrace for OutOfMemory.
+}
+
+
+TEST_CASE(CurrentStacktraceInfo) {
+ const char* kScriptChars =
+ "foo(n) => n == 1 ? throw new Error() : foo(n-1);\n"
+ "testMain() => foo(50);\n";
+
+ Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+ Dart_Handle error = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
+
+ EXPECT(Dart_IsError(error));
+
+ Dart_ExceptionStackTrace stacktrace;
+ Dart_Handle result = Dart_CurrentStacktrace(&stacktrace);
+ EXPECT_VALID(result);
+
+ intptr_t frame_count = 0;
+ result = Dart_StacktraceLength(stacktrace, &frame_count);
+ EXPECT_VALID(result);
+ EXPECT_EQ(51, frame_count);
+ // Test something bigger than the preallocated size to verify nothing was
+ // truncated.
+ EXPECT(51 > Stacktrace::kPreallocatedStackdepth);
+
+ Dart_Handle function_name;
+ Dart_Handle script_url;
+ intptr_t line_number = 0;
+ intptr_t column_number = 0;
+ const char* cstr = "";
+
+ // Top frame at positioned at throw.
+ result = Dart_StacktraceFrameInfo(stacktrace,
+ 0,
+ &function_name,
+ &script_url,
+ &line_number,
+ &column_number);
+ EXPECT_VALID(result);
+ Dart_StringToCString(function_name, &cstr);
+ EXPECT_STREQ("foo", cstr);
+ Dart_StringToCString(script_url, &cstr);
+ EXPECT_STREQ("dart:test-lib", cstr);
+ EXPECT_EQ(1, line_number);
+ EXPECT_EQ(20, column_number);
+
+ // Middle frames positioned at the recursive call.
+ for (intptr_t frame_index = 1;
+ frame_index < (frame_count - 1);
+ frame_index++) {
+ result = Dart_StacktraceFrameInfo(stacktrace,
+ frame_index,
+ &function_name,
+ &script_url,
+ &line_number,
+ &column_number);
+ EXPECT_VALID(result);
+ Dart_StringToCString(function_name, &cstr);
+ EXPECT_STREQ("foo", cstr);
+ Dart_StringToCString(script_url, &cstr);
+ EXPECT_STREQ("dart:test-lib", cstr);
+ EXPECT_EQ(1, line_number);
+ EXPECT_EQ(43, column_number);
+ }
+
+ // Bottom frame positioned at testMain().
+ result = Dart_StacktraceFrameInfo(stacktrace,
+ frame_count - 1,
+ &function_name,
+ &script_url,
+ &line_number,
+ &column_number);
+ EXPECT_VALID(result);
+ Dart_StringToCString(function_name, &cstr);
+ EXPECT_STREQ("testMain", cstr);
+ Dart_StringToCString(script_url, &cstr);
+ EXPECT_STREQ("dart:test-lib", cstr);
+ EXPECT_EQ(2, line_number);
+ EXPECT_EQ(18, column_number);
+
+ // Out-of-bounds frames.
+ result = Dart_StacktraceFrameInfo(stacktrace,
+ frame_count,
+ &function_name,
+ &script_url,
+ &line_number,
+ &column_number);
+ EXPECT(Dart_IsError(result));
+ result = Dart_StacktraceFrameInfo(stacktrace,
+ -1,
+ &function_name,
+ &script_url,
+ &line_number,
+ &column_number);
+ EXPECT(Dart_IsError(result));
}

Powered by Google App Engine
This is Rietveld 408576698