OLD | NEW |
| (Empty) |
1 // Copyright 2008-2009 Google Inc. | |
2 // | |
3 // Licensed under the Apache License, Version 2.0 (the "License"); | |
4 // you may not use this file except in compliance with the License. | |
5 // You may obtain a copy of the License at | |
6 // | |
7 // http://www.apache.org/licenses/LICENSE-2.0 | |
8 // | |
9 // Unless required by applicable law or agreed to in writing, software | |
10 // distributed under the License is distributed on an "AS IS" BASIS, | |
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
12 // See the License for the specific language governing permissions and | |
13 // limitations under the License. | |
14 // ======================================================================== | |
15 | |
16 // All tests are user only. | |
17 | |
18 #include <windows.h> | |
19 #include <limits.h> | |
20 #include <ctime> | |
21 #include "base/basictypes.h" | |
22 #include "base/scoped_ptr.h" | |
23 #include "omaha/base/constants.h" | |
24 #include "omaha/base/error.h" | |
25 #include "omaha/base/reg_key.h" | |
26 #include "omaha/base/scoped_ptr_address.h" | |
27 #include "omaha/common/stats_uploader.h" | |
28 #include "omaha/statsreport/metrics.h" | |
29 #include "omaha/testing/unit_test.h" | |
30 | |
31 namespace omaha { | |
32 | |
33 namespace { | |
34 | |
35 DEFINE_METRIC_bool(test_bool); | |
36 | |
37 } // namespace | |
38 | |
39 class StatsUploaderTest : public testing::Test { | |
40 protected: | |
41 // These tests assume that metric collection is enabled. Since HKLM is not | |
42 // overridden, save the existing value if present before overriding it. | |
43 static void SetUpTestCase() { | |
44 is_updatedev_usagestats_present_ = | |
45 SUCCEEDED(RegKey::GetValue(MACHINE_REG_UPDATE_DEV, | |
46 kRegValueForceUsageStats, | |
47 &existing_updatedev_usagestats_value_)); | |
48 | |
49 EXPECT_SUCCEEDED(RegKey::SetValue(MACHINE_REG_UPDATE_DEV, | |
50 kRegValueForceUsageStats, | |
51 static_cast<DWORD>(1))); | |
52 } | |
53 | |
54 static void TearDownTestCase() { | |
55 if (is_updatedev_usagestats_present_) { | |
56 EXPECT_SUCCEEDED(RegKey::SetValue(MACHINE_REG_UPDATE_DEV, | |
57 kRegValueForceUsageStats, | |
58 existing_updatedev_usagestats_value_)); | |
59 } else { | |
60 EXPECT_SUCCEEDED(RegKey::DeleteValue(MACHINE_REG_UPDATE_DEV, | |
61 kRegValueForceUsageStats)); | |
62 } | |
63 } | |
64 | |
65 virtual void SetUp() { | |
66 RegKey::DeleteKey(kRegistryHiveOverrideRoot); | |
67 | |
68 // Overriding HKLM prevents the Windows DNS resolver from working. | |
69 // Only override HKCU and run the tests as user. | |
70 OverrideSpecifiedRegistryHives(kRegistryHiveOverrideRoot, false, true); | |
71 stats_report::g_global_metrics.Initialize(); | |
72 } | |
73 | |
74 virtual void TearDown() { | |
75 stats_report::g_global_metrics.Uninitialize(); | |
76 RestoreRegistryHives(); | |
77 RegKey::DeleteKey(kRegistryHiveOverrideRoot); | |
78 } | |
79 | |
80 HRESULT GetMetricValue(const TCHAR* value_name, bool* value) { | |
81 CString key_name = key_name_ + CString(_T("Booleans")); | |
82 | |
83 scoped_array<byte> buffer; | |
84 DWORD byte_count(0); | |
85 HRESULT hr = RegKey::GetValue(key_name, | |
86 value_name, | |
87 address(buffer), | |
88 &byte_count); | |
89 if (FAILED(hr)) { | |
90 return hr; | |
91 } | |
92 if (byte_count != sizeof(uint32)) { // NOLINT | |
93 return HRESULT_FROM_WIN32(ERROR_INVALID_DATA); | |
94 } | |
95 *value = *reinterpret_cast<uint32*>(buffer.get()) != 0; | |
96 return S_OK; | |
97 } | |
98 | |
99 HRESULT GetLastTrasmission(DWORD* last_transmission) { | |
100 const TCHAR value_name[] = _T("LastTransmission"); | |
101 return RegKey::GetValue(key_name_, value_name, last_transmission); | |
102 } | |
103 | |
104 HRESULT SetLastTransmission(DWORD last_transmission) { | |
105 const TCHAR value_name[] = _T("LastTransmission"); | |
106 return RegKey::SetValue(key_name_, value_name, last_transmission); | |
107 } | |
108 | |
109 bool AreMetricsEmpty() { | |
110 RegKey reg_key; | |
111 HRESULT hr = reg_key.Open(key_name_, KEY_READ); | |
112 if (FAILED(hr)) { | |
113 return true; | |
114 } | |
115 return reg_key.GetSubkeyCount() == 0; | |
116 } | |
117 | |
118 static const TCHAR key_name_[]; | |
119 static const TCHAR metric_name_[]; | |
120 | |
121 private: | |
122 static bool is_updatedev_usagestats_present_; | |
123 static DWORD existing_updatedev_usagestats_value_; | |
124 }; | |
125 | |
126 const TCHAR StatsUploaderTest::key_name_[] = | |
127 _T("HKCU\\Software\\") SHORT_COMPANY_NAME | |
128 _T("\\") PRODUCT_NAME _T("\\UsageStats\\Daily\\"); | |
129 const TCHAR StatsUploaderTest::metric_name_[] = _T("test_bool"); | |
130 | |
131 bool StatsUploaderTest::is_updatedev_usagestats_present_ = false; | |
132 DWORD StatsUploaderTest::existing_updatedev_usagestats_value_ = 0; | |
133 | |
134 TEST_F(StatsUploaderTest, AggregateMetrics) { | |
135 bool value = false; | |
136 EXPECT_HRESULT_FAILED(GetMetricValue(metric_name_, &value)); | |
137 | |
138 metric_test_bool = true; | |
139 EXPECT_HRESULT_SUCCEEDED(AggregateMetrics(false)); // User. | |
140 | |
141 EXPECT_HRESULT_SUCCEEDED(GetMetricValue(metric_name_, &value)); | |
142 EXPECT_EQ(true, value); | |
143 | |
144 metric_test_bool = false; | |
145 EXPECT_HRESULT_SUCCEEDED(AggregateMetrics(false)); // User. | |
146 | |
147 EXPECT_HRESULT_SUCCEEDED(GetMetricValue(metric_name_, &value)); | |
148 EXPECT_EQ(false, value); | |
149 } | |
150 | |
151 TEST_F(StatsUploaderTest, AggregateAndReportMetrics) { | |
152 metric_test_bool = true; | |
153 | |
154 // Metrics are not in the registry until they are aggregated. | |
155 bool value = false; | |
156 EXPECT_HRESULT_FAILED(GetMetricValue(metric_name_, &value)); | |
157 | |
158 // AggregateAndReportMetrics resets metrics and updates 'LastTransmission' to | |
159 // the current time since there was no 'LastTransmission'. | |
160 EXPECT_HRESULT_SUCCEEDED(AggregateAndReportMetrics(false, false)); | |
161 EXPECT_TRUE(AreMetricsEmpty()); | |
162 DWORD last_transmission(0); | |
163 EXPECT_HRESULT_SUCCEEDED(GetLastTrasmission(&last_transmission)); | |
164 EXPECT_NE(0, last_transmission); | |
165 | |
166 // AggregateAndReportMetrics aggregates but it does not report since | |
167 // 'LastTransmission is current. | |
168 EXPECT_HRESULT_SUCCEEDED(AggregateAndReportMetrics(false, false)); | |
169 EXPECT_FALSE(AreMetricsEmpty()); | |
170 EXPECT_HRESULT_SUCCEEDED(GetMetricValue(metric_name_, &value)); | |
171 EXPECT_EQ(true, value); | |
172 DWORD previous_last_transmission = last_transmission; | |
173 EXPECT_HRESULT_SUCCEEDED(GetLastTrasmission(&last_transmission)); | |
174 EXPECT_EQ(previous_last_transmission, last_transmission); | |
175 | |
176 // Roll back 'Last Trasmission' by 26 hours. AggregateAndReportMetrics | |
177 // aggregates, reports metrics, and updates 'LastTransmission'. | |
178 metric_test_bool = true; | |
179 last_transmission -= 26 * 60 * 60; | |
180 EXPECT_HRESULT_SUCCEEDED(SetLastTransmission(last_transmission)); | |
181 EXPECT_HRESULT_SUCCEEDED(AggregateAndReportMetrics(false, false)); | |
182 EXPECT_TRUE(AreMetricsEmpty()); | |
183 previous_last_transmission = last_transmission; | |
184 EXPECT_HRESULT_SUCCEEDED(GetLastTrasmission(&last_transmission)); | |
185 EXPECT_NE(previous_last_transmission, last_transmission); | |
186 | |
187 // Roll forward the 'LastTransmission' by 60 seconds. | |
188 // AggregateAndReportMetrics resets metrics and updates 'LastTransmission' to | |
189 // the current time since there 'LastTransmission' was in the future. | |
190 metric_test_bool = true; | |
191 last_transmission = static_cast<DWORD>(time(NULL)) + 60; | |
192 EXPECT_HRESULT_SUCCEEDED(SetLastTransmission(last_transmission)); | |
193 EXPECT_HRESULT_SUCCEEDED(AggregateAndReportMetrics(false, false)); | |
194 EXPECT_TRUE(AreMetricsEmpty()); | |
195 EXPECT_HRESULT_SUCCEEDED(GetLastTrasmission(&last_transmission)); | |
196 EXPECT_NE(0, last_transmission); | |
197 | |
198 // Force reporting the metrics. | |
199 metric_test_bool = true; | |
200 EXPECT_HRESULT_SUCCEEDED(AggregateAndReportMetrics(false, true)); | |
201 EXPECT_TRUE(AreMetricsEmpty()); | |
202 } | |
203 | |
204 TEST_F(StatsUploaderTest, ResetPersistentMetricsTest) { | |
205 const TCHAR* keys[] = { | |
206 _T("HKCU\\Software\\") SHORT_COMPANY_NAME _T("\\") PRODUCT_NAME _T("\\UsageS
tats\\Daily\\Timings"), // NOLINT | |
207 _T("HKCU\\Software\\") SHORT_COMPANY_NAME _T("\\") PRODUCT_NAME _T("\\UsageS
tats\\Daily\\Counts"), // NOLINT | |
208 _T("HKCU\\Software\\") SHORT_COMPANY_NAME _T("\\") PRODUCT_NAME _T("\\UsageS
tats\\Daily\\Integers"), // NOLINT | |
209 _T("HKCU\\Software\\") SHORT_COMPANY_NAME _T("\\") PRODUCT_NAME _T("\\UsageS
tats\\Daily\\Booleans"), // NOLINT | |
210 }; | |
211 EXPECT_HRESULT_SUCCEEDED(RegKey::CreateKeys(keys, arraysize(keys))); | |
212 EXPECT_HRESULT_SUCCEEDED(ResetMetrics(false)); // User. | |
213 | |
214 for (size_t i = 0; i != arraysize(keys); ++i) { | |
215 EXPECT_FALSE(RegKey::HasKey(keys[i])); | |
216 } | |
217 EXPECT_TRUE(AreMetricsEmpty()); | |
218 | |
219 DWORD last_transmission(ULONG_MAX); | |
220 EXPECT_HRESULT_SUCCEEDED(GetLastTrasmission(&last_transmission)); | |
221 EXPECT_NE(0, last_transmission); | |
222 } | |
223 | |
224 // AggregateAndReportMetrics aggregates, but is unable to report metrics and | |
225 // does not update 'LastTransmission'. | |
226 TEST_F(StatsUploaderTest, | |
227 AggregateAndReportMetrics_GoogleUpdateEulaNotAccepted_DoNotForce) { | |
228 EXPECT_SUCCEEDED(RegKey::SetValue(USER_REG_UPDATE, | |
229 _T("eulaaccepted"), | |
230 static_cast<DWORD>(0))); | |
231 | |
232 metric_test_bool = true; | |
233 DWORD last_transmission = 12345678; | |
234 EXPECT_HRESULT_SUCCEEDED(SetLastTransmission(last_transmission)); | |
235 EXPECT_EQ(GOOPDATE_E_CANNOT_USE_NETWORK, | |
236 AggregateAndReportMetrics(false, false)); | |
237 EXPECT_FALSE(AreMetricsEmpty()); | |
238 DWORD previous_last_transmission = last_transmission; | |
239 EXPECT_HRESULT_SUCCEEDED(GetLastTrasmission(&last_transmission)); | |
240 EXPECT_EQ(12345678, last_transmission); | |
241 } | |
242 | |
243 // AggregateAndReportMetrics aggregates, but is unable to report metrics and | |
244 // does not update 'LastTransmission'. | |
245 TEST_F(StatsUploaderTest, | |
246 AggregateAndReportMetrics_GoogleUpdateEulaNotAccepted_Force) { | |
247 EXPECT_SUCCEEDED(RegKey::SetValue(USER_REG_UPDATE, | |
248 _T("eulaaccepted"), | |
249 static_cast<DWORD>(0))); | |
250 | |
251 metric_test_bool = true; | |
252 DWORD last_transmission = 12345678; | |
253 EXPECT_HRESULT_SUCCEEDED(SetLastTransmission(last_transmission)); | |
254 EXPECT_EQ(GOOPDATE_E_CANNOT_USE_NETWORK, | |
255 AggregateAndReportMetrics(false, true)); | |
256 EXPECT_FALSE(AreMetricsEmpty()); | |
257 DWORD previous_last_transmission = last_transmission; | |
258 EXPECT_HRESULT_SUCCEEDED(GetLastTrasmission(&last_transmission)); | |
259 EXPECT_EQ(12345678, last_transmission); | |
260 } | |
261 | |
262 } // namespace omaha | |
OLD | NEW |