12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/spellchecker/spellcheck_host_metrics.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 99ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/histogram_samples.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/statistics_recorder.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/test/histogram_tester.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#if defined(OS_WIN) 173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// For version specific disabled tests below (http://crbug.com/230534). 183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/win/windows_version.h" 193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif 203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SpellcheckHostMetricsTest : public testing::Test { 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SpellcheckHostMetricsTest() { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static void SetUpTestCase() { 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StatisticsRecorder::Initialize(); 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void SetUp() OVERRIDE { 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) metrics_.reset(new SpellCheckHostMetrics); 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpellCheckHostMetrics* metrics() { return metrics_.get(); } 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RecordWordCountsForTesting() { metrics_->RecordWordCounts(); } 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop loop_; 3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<SpellCheckHostMetrics> metrics_; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SpellcheckHostMetricsTest, RecordEnabledStats) { 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char kMetricName[] = "SpellCheck.Enabled"; 4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::HistogramTester histogram_tester1; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) metrics()->RecordEnabledStats(false); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) histogram_tester1.ExpectBucketCount(kMetricName, 0, 1); 4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) histogram_tester1.ExpectBucketCount(kMetricName, 1, 0); 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::HistogramTester histogram_tester2; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) metrics()->RecordEnabledStats(true); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) histogram_tester2.ExpectBucketCount(kMetricName, 0, 0); 5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) histogram_tester2.ExpectBucketCount(kMetricName, 1, 1); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SpellcheckHostMetricsTest, CustomWordStats) { 603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#if defined(OS_WIN) 613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Failing consistently on Win7. See crbug.com/230534. 623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (base::win::GetVersion() >= base::win::VERSION_VISTA) 633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpellCheckHostMetrics::RecordCustomWordCountStats(123); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Determine if test failures are due the statistics recorder not being 683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // available or because the histogram just isn't there: crbug.com/230534. 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(base::StatisticsRecorder::IsActive()); 703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 7103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::HistogramTester histogram_tester; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpellCheckHostMetrics::RecordCustomWordCountStats(23); 7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) histogram_tester.ExpectBucketCount("SpellCheck.CustomWords", 23, 1); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SpellcheckHostMetricsTest, RecordWordCountsDiscardsDuplicates) { 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This test ensures that RecordWordCounts only records metrics if they 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // have changed from the last invocation. 8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const char* const histogram_names[] = { 8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "SpellCheck.CheckedWords", "SpellCheck.MisspelledWords", 8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "SpellCheck.ReplacedWords", "SpellCheck.UniqueWords", 8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "SpellCheck.ShownSuggestions"}; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ensure all histograms exist. 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) metrics()->RecordCheckedWordStats(base::ASCIIToUTF16("test"), false); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RecordWordCountsForTesting(); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Create the tester, taking a snapshot of current histogram samples. 9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::HistogramTester histogram_tester; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Nothing changed, so this invocation should not affect any histograms. 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RecordWordCountsForTesting(); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Get samples for all affected histograms. 9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) for (size_t i = 0; i < arraysize(histogram_names); ++i) 9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) histogram_tester.ExpectTotalCount(histogram_names[i], 0); 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SpellcheckHostMetricsTest, RecordSpellingServiceStats) { 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char kMetricName[] = "SpellCheck.SpellingService.Enabled"; 10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::HistogramTester histogram_tester1; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) metrics()->RecordSpellingServiceStats(false); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) histogram_tester1.ExpectBucketCount(kMetricName, 0, 1); 10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) histogram_tester1.ExpectBucketCount(kMetricName, 1, 0); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::HistogramTester histogram_tester2; 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) metrics()->RecordSpellingServiceStats(true); 11203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) histogram_tester2.ExpectBucketCount(kMetricName, 0, 0); 11303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) histogram_tester2.ExpectBucketCount(kMetricName, 1, 1); 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 115