| 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 |