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

Unified Diff: components/browser_watcher/stability_report_extractor_unittest.cc

Issue 2927653003: Stability instrumentation: add a Vectored Exception Handler (Closed)
Patch Set: merge Created 3 years, 6 months 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
« no previous file with comments | « components/browser_watcher/stability_report_extractor.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/browser_watcher/stability_report_extractor_unittest.cc
diff --git a/components/browser_watcher/stability_report_extractor_unittest.cc b/components/browser_watcher/stability_report_extractor_unittest.cc
index 63dd24d4511174b9e5ff0c5fa0568277dd4241a0..d5f50b631b88ec3ea3a2b18ceab55df454dc4d1a 100644
--- a/components/browser_watcher/stability_report_extractor_unittest.cc
+++ b/components/browser_watcher/stability_report_extractor_unittest.cc
@@ -15,6 +15,7 @@
#include "base/memory/ptr_util.h"
#include "base/metrics/persistent_memory_allocator.h"
#include "base/stl_util.h"
+#include "base/time/time.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/crashpad/crashpad/client/crash_report_database.h"
@@ -119,6 +120,22 @@ class StabilityReportExtractorThreadTrackerTest : public testing::Test {
return WrapUnique(new ThreadActivityTracker(mem_base, tracker_mem_size));
}
+ void PerformBasicReportValidation(const StabilityReport& report) {
+ // One report with one thread that has the expected name and id.
+ ASSERT_EQ(1, report.process_states_size());
+ const ProcessState& process_state = report.process_states(0);
+ EXPECT_EQ(base::GetCurrentProcId(), process_state.process_id());
+ ASSERT_EQ(1, process_state.threads_size());
+ const ThreadState& thread_state = process_state.threads(0);
+ EXPECT_EQ(base::PlatformThread::GetName(), thread_state.thread_name());
+#if defined(OS_WIN)
+ EXPECT_EQ(base::PlatformThread::CurrentId(), thread_state.thread_id());
+#elif defined(OS_POSIX)
+ EXPECT_EQ(base::PlatformThread::CurrentHandle().platform_handle(),
+ thread_state.thread_id());
+#endif
+ }
+
const FilePath& debug_file_path() const { return debug_file_path_; }
protected:
@@ -163,19 +180,8 @@ TEST_F(StabilityReportExtractorThreadTrackerTest, CollectSuccess) {
ASSERT_EQ(SUCCESS, Extract(debug_file_path(), &report));
// Validate the report.
- ASSERT_EQ(1, report.process_states_size());
- const ProcessState& process_state = report.process_states(0);
- EXPECT_EQ(base::GetCurrentProcId(), process_state.process_id());
- ASSERT_EQ(1, process_state.threads_size());
-
- const ThreadState& thread_state = process_state.threads(0);
- EXPECT_EQ(base::PlatformThread::GetName(), thread_state.thread_name());
-#if defined(OS_WIN)
- EXPECT_EQ(base::PlatformThread::CurrentId(), thread_state.thread_id());
-#elif defined(OS_POSIX)
- EXPECT_EQ(base::PlatformThread::CurrentHandle().platform_handle(),
- thread_state.thread_id());
-#endif
+ ASSERT_NO_FATAL_FAILURE(PerformBasicReportValidation(report));
+ const ThreadState& thread_state = report.process_states(0).threads(0);
EXPECT_EQ(7, thread_state.activity_count());
ASSERT_EQ(6, thread_state.activities_size());
@@ -223,6 +229,48 @@ TEST_F(StabilityReportExtractorThreadTrackerTest, CollectSuccess) {
}
}
+TEST_F(StabilityReportExtractorThreadTrackerTest, CollectException) {
+ const void* expected_pc = reinterpret_cast<void*>(0xCAFE);
+ const void* expected_address = nullptr;
+ const uint32_t expected_code = 42U;
+
+ // Record an exception.
+ const int64_t timestamp = base::Time::Now().ToInternalValue();
+ tracker_->RecordExceptionActivity(expected_pc, expected_address,
+ base::debug::Activity::ACT_EXCEPTION,
+ ActivityData::ForException(expected_code));
+
+ // Collect report and validate.
+ StabilityReport report;
+ ASSERT_EQ(SUCCESS, Extract(debug_file_path(), &report));
+
+ // Validate the presence of the exception.
+ ASSERT_NO_FATAL_FAILURE(PerformBasicReportValidation(report));
+ const ThreadState& thread_state = report.process_states(0).threads(0);
+ ASSERT_TRUE(thread_state.has_exception());
+ const Exception& exception = thread_state.exception();
+ EXPECT_EQ(expected_code, exception.code());
+ EXPECT_EQ(expected_pc, reinterpret_cast<void*>(exception.program_counter()));
+ EXPECT_EQ(expected_address,
+ reinterpret_cast<void*>(exception.exception_address()));
+ const int64_t tolerance_us = 1000ULL;
+ EXPECT_LE(std::abs(timestamp - exception.time()), tolerance_us);
+}
+
+TEST_F(StabilityReportExtractorThreadTrackerTest, CollectNoException) {
+ // Record something.
+ tracker_->PushActivity(reinterpret_cast<void*>(kTaskOrigin),
+ base::debug::Activity::ACT_TASK_RUN,
+ ActivityData::ForTask(kTaskSequenceNum));
+
+ // Collect report and validate there is no exception.
+ StabilityReport report;
+ ASSERT_EQ(SUCCESS, Extract(debug_file_path(), &report));
+ ASSERT_NO_FATAL_FAILURE(PerformBasicReportValidation(report));
+ const ThreadState& thread_state = report.process_states(0).threads(0);
+ ASSERT_FALSE(thread_state.has_exception());
+}
+
// Tests stability report extraction.
class StabilityReportExtractorTest : public testing::Test {
public:
« no previous file with comments | « components/browser_watcher/stability_report_extractor.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698