OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/webui/ntp/ntp_user_data_logger.h" | 5 #include "chrome/browser/ui/webui/ntp/ntp_user_data_logger.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" |
9 #include "base/metrics/statistics_recorder.h" | 9 #include "base/metrics/statistics_recorder.h" |
| 10 #include "base/strings/utf_string_conversions.h" |
10 #include "chrome/common/ntp_logging_events.h" | 11 #include "chrome/common/ntp_logging_events.h" |
11 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
12 | 13 |
13 namespace { | 14 namespace { |
14 | 15 |
15 class TestNTPUserDataLogger : public NTPUserDataLogger { | 16 class TestNTPUserDataLogger : public NTPUserDataLogger { |
16 public: | 17 public: |
17 TestNTPUserDataLogger() : NTPUserDataLogger(NULL) {} | 18 TestNTPUserDataLogger() : NTPUserDataLogger(NULL) {} |
18 virtual ~TestNTPUserDataLogger() {} | 19 virtual ~TestNTPUserDataLogger() {} |
19 }; | 20 }; |
20 | 21 |
21 base::HistogramBase::Count GetTotalCount(const std::string& histogram_name) { | 22 base::HistogramBase::Count GetTotalCount(const std::string& histogram_name) { |
22 base::HistogramBase* histogram = base::StatisticsRecorder::FindHistogram( | 23 base::HistogramBase* histogram = base::StatisticsRecorder::FindHistogram( |
23 histogram_name); | 24 histogram_name); |
24 return histogram->SnapshotSamples()->TotalCount(); | 25 // Return 0 if history is uninitialized. |
| 26 return histogram ? histogram->SnapshotSamples()->TotalCount() : 0; |
25 } | 27 } |
26 | 28 |
27 base::HistogramBase::Count GetBinCount(const std::string& histogram_name, | 29 base::HistogramBase::Count GetBinCount(const std::string& histogram_name, |
28 base::HistogramBase::Sample value) { | 30 base::HistogramBase::Sample value) { |
29 base::HistogramBase* histogram = base::StatisticsRecorder::FindHistogram( | 31 base::HistogramBase* histogram = base::StatisticsRecorder::FindHistogram( |
30 histogram_name); | 32 histogram_name); |
31 return histogram->SnapshotSamples()->GetCount(value); | 33 // Return 0 if history is uninitialized. |
| 34 return histogram ? histogram->SnapshotSamples()->GetCount(value) : 0; |
32 } | 35 } |
33 | 36 |
34 } // namespace | 37 } // namespace |
35 | 38 |
36 TEST(NTPUserDataLoggerTest, TestLogging) { | 39 TEST(NTPUserDataLoggerTest, TestLogging) { |
37 base::StatisticsRecorder::Initialize(); | 40 base::StatisticsRecorder::Initialize(); |
| 41 |
| 42 // Ensure empty statistics. |
| 43 EXPECT_EQ(0, GetTotalCount("NewTabPage.NumberOfMouseOvers")); |
| 44 EXPECT_EQ(0, GetBinCount("NewTabPage.NumberOfMouseOvers", 0)); |
| 45 |
| 46 // Enusure non-zero statistics. |
38 TestNTPUserDataLogger logger; | 47 TestNTPUserDataLogger logger; |
39 | 48 |
40 // Ensure it works when the statistics are all empty. Only the mouseover | |
41 // should be logged in this case. The other histograms are not created yet so | |
42 // we can't query them. | |
43 logger.EmitNtpStatistics(); | |
44 | |
45 EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfMouseOvers")); | |
46 EXPECT_EQ(1, GetBinCount("NewTabPage.NumberOfMouseOvers", 0)); | |
47 | |
48 // Ensure it works with some non-zero statistics. All statistics should now | |
49 // be logged. | |
50 for (int i = 0; i < 20; ++i) | 49 for (int i = 0; i < 20; ++i) |
51 logger.LogEvent(NTP_MOUSEOVER); | 50 logger.LogEvent(NTP_MOUSEOVER); |
52 for (int i = 0; i < 8; ++i) | 51 for (int i = 0; i < 8; ++i) |
53 logger.LogEvent(NTP_TILE); | 52 logger.LogEvent(NTP_TILE); |
54 for (int i = 0; i < 4; ++i) | 53 for (int i = 0; i < 4; ++i) |
55 logger.LogEvent(NTP_THUMBNAIL_TILE); | 54 logger.LogEvent(NTP_THUMBNAIL_TILE); |
56 for (int i = 0; i < 2; ++i) | 55 for (int i = 0; i < 2; ++i) |
57 logger.LogEvent(NTP_THUMBNAIL_ERROR); | 56 logger.LogEvent(NTP_THUMBNAIL_ERROR); |
58 logger.LogEvent(NTP_GRAY_TILE_FALLBACK); | 57 logger.LogEvent(NTP_GRAY_TILE_FALLBACK); |
59 logger.LogEvent(NTP_EXTERNAL_TILE_FALLBACK); | 58 logger.LogEvent(NTP_EXTERNAL_TILE_FALLBACK); |
60 for (int i = 0; i < 2; ++i) | 59 for (int i = 0; i < 2; ++i) |
61 logger.LogEvent(NTP_EXTERNAL_TILE); | 60 logger.LogEvent(NTP_EXTERNAL_TILE); |
62 for (int i = 0; i < 2; ++i) | 61 for (int i = 0; i < 2; ++i) |
63 logger.LogEvent(NTP_GRAY_TILE); | 62 logger.LogEvent(NTP_GRAY_TILE); |
64 logger.LogEvent(NTP_SERVER_SIDE_SUGGESTION); | 63 logger.LogEvent(NTP_SERVER_SIDE_SUGGESTION); |
| 64 |
65 logger.EmitNtpStatistics(); | 65 logger.EmitNtpStatistics(); |
66 | 66 |
67 EXPECT_EQ(2, GetTotalCount("NewTabPage.NumberOfMouseOvers")); | 67 EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfMouseOvers")); |
68 EXPECT_EQ(1, GetBinCount("NewTabPage.NumberOfMouseOvers", 0)); | 68 EXPECT_EQ(0, GetBinCount("NewTabPage.NumberOfMouseOvers", 0)); |
69 EXPECT_EQ(1, GetBinCount("NewTabPage.NumberOfMouseOvers", 20)); | 69 EXPECT_EQ(1, GetBinCount("NewTabPage.NumberOfMouseOvers", 20)); |
70 EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfTiles")); | 70 EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfTiles")); |
71 EXPECT_EQ(1, GetBinCount("NewTabPage.NumberOfTiles", 8)); | 71 EXPECT_EQ(1, GetBinCount("NewTabPage.NumberOfTiles", 8)); |
72 EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfThumbnailTiles")); | 72 EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfThumbnailTiles")); |
73 EXPECT_EQ(1, GetBinCount("NewTabPage.NumberOfThumbnailTiles", 4)); | 73 EXPECT_EQ(1, GetBinCount("NewTabPage.NumberOfThumbnailTiles", 4)); |
74 EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfThumbnailErrors")); | 74 EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfThumbnailErrors")); |
75 EXPECT_EQ(1, GetBinCount("NewTabPage.NumberOfThumbnailErrors", 2)); | 75 EXPECT_EQ(1, GetBinCount("NewTabPage.NumberOfThumbnailErrors", 2)); |
76 EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfGrayTileFallbacks")); | 76 EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfGrayTileFallbacks")); |
77 EXPECT_EQ(1, GetBinCount("NewTabPage.NumberOfGrayTileFallbacks", 1)); | 77 EXPECT_EQ(1, GetBinCount("NewTabPage.NumberOfGrayTileFallbacks", 1)); |
78 EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfExternalTileFallbacks")); | 78 EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfExternalTileFallbacks")); |
79 EXPECT_EQ(1, GetBinCount("NewTabPage.NumberOfExternalTileFallbacks", 1)); | 79 EXPECT_EQ(1, GetBinCount("NewTabPage.NumberOfExternalTileFallbacks", 1)); |
80 EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfExternalTiles")); | 80 EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfExternalTiles")); |
81 EXPECT_EQ(1, GetBinCount("NewTabPage.NumberOfExternalTiles", 2)); | 81 EXPECT_EQ(1, GetBinCount("NewTabPage.NumberOfExternalTiles", 2)); |
82 EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfGrayTiles")); | 82 EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfGrayTiles")); |
83 EXPECT_EQ(1, GetBinCount("NewTabPage.NumberOfGrayTiles", 2)); | 83 EXPECT_EQ(1, GetBinCount("NewTabPage.NumberOfGrayTiles", 2)); |
84 EXPECT_EQ(1, GetTotalCount("NewTabPage.SuggestionsType")); | 84 EXPECT_EQ(1, GetTotalCount("NewTabPage.SuggestionsType")); |
85 EXPECT_EQ(1, GetBinCount("NewTabPage.SuggestionsType", 1)); | 85 EXPECT_EQ(1, GetBinCount("NewTabPage.SuggestionsType", 1)); |
86 | 86 |
87 // Statistics should be reset to 0, so we should not log anything else. | 87 // Statistics should be reset to 0, so we should not log anything else. |
88 logger.EmitNtpStatistics(); | 88 logger.EmitNtpStatistics(); |
89 EXPECT_EQ(3, GetTotalCount("NewTabPage.NumberOfMouseOvers")); | 89 EXPECT_EQ(2, GetTotalCount("NewTabPage.NumberOfMouseOvers")); |
90 EXPECT_EQ(2, GetBinCount("NewTabPage.NumberOfMouseOvers", 0)); | 90 EXPECT_EQ(1, GetBinCount("NewTabPage.NumberOfMouseOvers", 0)); |
91 EXPECT_EQ(1, GetBinCount("NewTabPage.NumberOfMouseOvers", 20)); | 91 EXPECT_EQ(1, GetBinCount("NewTabPage.NumberOfMouseOvers", 20)); |
92 EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfTiles")); | 92 EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfTiles")); |
93 EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfThumbnailTiles")); | 93 EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfThumbnailTiles")); |
94 EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfThumbnailErrors")); | 94 EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfThumbnailErrors")); |
95 EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfGrayTileFallbacks")); | 95 EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfGrayTileFallbacks")); |
96 EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfExternalTileFallbacks")); | 96 EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfExternalTileFallbacks")); |
97 EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfExternalTiles")); | 97 EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfExternalTiles")); |
98 EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfGrayTiles")); | 98 EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfGrayTiles")); |
99 EXPECT_EQ(1, GetTotalCount("NewTabPage.SuggestionsType")); | 99 EXPECT_EQ(1, GetTotalCount("NewTabPage.SuggestionsType")); |
100 } | 100 } |
| 101 |
| 102 TEST(NTPUserDataLoggerTest, TestLogMostVisitedImpression) { |
| 103 base::StatisticsRecorder::Initialize(); |
| 104 |
| 105 EXPECT_EQ(0, GetBinCount("NewTabPage.SuggestionsImpression.foobar", 1)); |
| 106 EXPECT_EQ(0, GetBinCount("NewTabPage.SuggestionsImpression.foobar", 5)); |
| 107 |
| 108 TestNTPUserDataLogger logger; |
| 109 |
| 110 logger.LogMostVisitedImpression(1, base::ASCIIToUTF16("foobar")); |
| 111 EXPECT_EQ(1, GetBinCount("NewTabPage.SuggestionsImpression.foobar", 1)); |
| 112 EXPECT_EQ(0, GetBinCount("NewTabPage.SuggestionsImpression.foobar", 5)); |
| 113 |
| 114 logger.LogMostVisitedImpression(5, base::ASCIIToUTF16("foobar")); |
| 115 EXPECT_EQ(1, GetBinCount("NewTabPage.SuggestionsImpression.foobar", 1)); |
| 116 EXPECT_EQ(1, GetBinCount("NewTabPage.SuggestionsImpression.foobar", 5)); |
| 117 |
| 118 // Try without provider. Only total increases. |
| 119 logger.LogMostVisitedImpression(5, base::ASCIIToUTF16("")); |
| 120 EXPECT_EQ(1, GetBinCount("NewTabPage.SuggestionsImpression.foobar", 1)); |
| 121 EXPECT_EQ(1, GetBinCount("NewTabPage.SuggestionsImpression.foobar", 5)); |
| 122 |
| 123 logger.LogMostVisitedImpression(1, base::ASCIIToUTF16("foobar")); |
| 124 EXPECT_EQ(2, GetBinCount("NewTabPage.SuggestionsImpression.foobar", 1)); |
| 125 EXPECT_EQ(1, GetBinCount("NewTabPage.SuggestionsImpression.foobar", 5)); |
| 126 } |
| 127 |
| 128 TEST(NTPUserDataLoggerTest, TestLogMostVisitedNavigation) { |
| 129 base::StatisticsRecorder::Initialize(); |
| 130 |
| 131 EXPECT_EQ(0, GetTotalCount("NewTabPage.MostVisited")); |
| 132 EXPECT_EQ(0, GetBinCount("NewTabPage.MostVisited.foobar", 1)); |
| 133 EXPECT_EQ(0, GetBinCount("NewTabPage.MostVisited.foobar", 5)); |
| 134 |
| 135 TestNTPUserDataLogger logger; |
| 136 |
| 137 logger.LogMostVisitedNavigation(1, base::ASCIIToUTF16("foobar")); |
| 138 EXPECT_EQ(1, GetTotalCount("NewTabPage.MostVisited")); |
| 139 EXPECT_EQ(1, GetBinCount("NewTabPage.MostVisited.foobar", 1)); |
| 140 EXPECT_EQ(0, GetBinCount("NewTabPage.MostVisited.foobar", 5)); |
| 141 |
| 142 logger.LogMostVisitedNavigation(5, base::ASCIIToUTF16("foobar")); |
| 143 EXPECT_EQ(2, GetTotalCount("NewTabPage.MostVisited")); |
| 144 EXPECT_EQ(1, GetBinCount("NewTabPage.MostVisited.foobar", 1)); |
| 145 EXPECT_EQ(1, GetBinCount("NewTabPage.MostVisited.foobar", 5)); |
| 146 |
| 147 // Try without provider. Only total increases. |
| 148 logger.LogMostVisitedNavigation(5, base::ASCIIToUTF16("")); |
| 149 EXPECT_EQ(3, GetTotalCount("NewTabPage.MostVisited")); |
| 150 EXPECT_EQ(1, GetBinCount("NewTabPage.MostVisited.foobar", 1)); |
| 151 EXPECT_EQ(1, GetBinCount("NewTabPage.MostVisited.foobar", 5)); |
| 152 |
| 153 logger.LogMostVisitedNavigation(1, base::ASCIIToUTF16("foobar")); |
| 154 EXPECT_EQ(4, GetTotalCount("NewTabPage.MostVisited")); |
| 155 EXPECT_EQ(2, GetBinCount("NewTabPage.MostVisited.foobar", 1)); |
| 156 EXPECT_EQ(1, GetBinCount("NewTabPage.MostVisited.foobar", 5)); |
| 157 } |
OLD | NEW |