Index: components/browser_watcher/watcher_metrics_provider_win_unittest.cc |
diff --git a/components/browser_watcher/watcher_metrics_provider_win_unittest.cc b/components/browser_watcher/watcher_metrics_provider_win_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..be2542fc24e39ace2547ac46ce61495dc3bc46e9 |
--- /dev/null |
+++ b/components/browser_watcher/watcher_metrics_provider_win_unittest.cc |
@@ -0,0 +1,108 @@ |
+// Copyright (c) 2014 The Chromium 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 "components/browser_watcher/watcher_metrics_provider_win.h" |
+ |
+#include "base/process/process_handle.h" |
+#include "base/strings/stringprintf.h" |
+#include "base/test/histogram_tester.h" |
+#include "base/test/test_reg_util_win.h" |
+#include "base/time/time.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace browser_watcher { |
+ |
+namespace { |
+ |
+const wchar_t kRegistryPath[] = L"Software\\WatcherMetricsProviderWinTest"; |
+ |
+class WatcherMetricsProviderWinTest : public testing::Test { |
+ public: |
+ typedef testing::Test Super; |
+ |
+ virtual void SetUp() OVERRIDE { |
+ Super::SetUp(); |
+ |
+ override_manager_.OverrideRegistry(HKEY_CURRENT_USER); |
+ } |
+ |
+ virtual void TearDown() OVERRIDE { |
+ Super::TearDown(); |
+ } |
+ |
+ void AddProcessExitCode(bool use_own_pid, int exit_code) { |
+ int pid = 0; |
+ if (use_own_pid) { |
+ pid = base::GetCurrentProcId(); |
+ } else { |
+ // Make sure not to accidentally collide with own pid. |
+ do { |
+ pid = rand(); |
+ } while (pid == static_cast<int>(base::GetCurrentProcId())); |
+ } |
+ |
+ base::win::RegKey key(HKEY_CURRENT_USER, kRegistryPath, KEY_WRITE); |
+ |
+ // Make up a creation time to store in registry. |
+ int64 time = base::Time::Now().ToInternalValue(); |
+ base::string16 key_name(base::StringPrintf(L"%d-%lld", pid, time)); |
+ |
+ // Write the exit code to registry. |
+ ULONG result = key.WriteValue(key_name.c_str(), exit_code); |
+ ASSERT_EQ(result, ERROR_SUCCESS); |
+ } |
+ |
+ size_t ExitCodeRegistryPathValueCount() { |
+ base::win::RegKey key(HKEY_CURRENT_USER, kRegistryPath, KEY_READ); |
+ return key.GetValueCount(); |
+ } |
+ |
+ protected: |
+ registry_util::RegistryOverrideManager override_manager_; |
+ base::HistogramTester histogram_tester_; |
+}; |
+ |
+} // namespace |
+ |
+TEST_F(WatcherMetricsProviderWinTest, RecordsStabilityHistogram) { |
+ // Record multiple success exits. |
+ for (size_t i = 0; i < 11; ++i) |
+ AddProcessExitCode(false, 0); |
+ |
+ // Record a single failure. |
+ AddProcessExitCode(false, 100); |
+ |
+ WatcherMetricsProviderWin provider(kRegistryPath); |
+ |
+ provider.ProvideStabilityMetrics(NULL); |
+ histogram_tester_.ExpectBucketCount( |
+ WatcherMetricsProviderWin::kBrowserExitCodeHistogramName, 0, 11); |
+ histogram_tester_.ExpectBucketCount( |
+ WatcherMetricsProviderWin::kBrowserExitCodeHistogramName, 100, 1); |
+ histogram_tester_.ExpectTotalCount( |
+ WatcherMetricsProviderWin::kBrowserExitCodeHistogramName, 12); |
+ |
+ // Verify that the reported values are gone. |
+ EXPECT_EQ(ExitCodeRegistryPathValueCount(), 0); |
+} |
+ |
+TEST_F(WatcherMetricsProviderWinTest, DoesNotReportOwnProcessId) { |
+ // Record multiple success exits. |
+ for (size_t i = 0; i < 11; ++i) |
+ AddProcessExitCode(i, 0); |
+ |
+ // Record own process as STILL_ACTIVE. |
+ AddProcessExitCode(true, STILL_ACTIVE); |
+ |
+ WatcherMetricsProviderWin provider(kRegistryPath); |
+ |
+ provider.ProvideStabilityMetrics(NULL); |
+ histogram_tester_.ExpectUniqueSample( |
+ WatcherMetricsProviderWin::kBrowserExitCodeHistogramName, 0, 11); |
+ |
+ // Verify that the reported values are gone. |
+ EXPECT_EQ(ExitCodeRegistryPathValueCount(), 1); |
+} |
+ |
+} // namespace browser_watcher |