OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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 // Unit tests for GoogleChromeDistribution class. | 5 // Unit tests for GoogleChromeDistribution class. |
6 | 6 |
7 #include <windows.h> | 7 #include <windows.h> |
8 | 8 |
9 #include "base/registry.h" | |
10 #include "base/scoped_ptr.h" | 9 #include "base/scoped_ptr.h" |
11 #include "base/file_util.h" | |
12 #include "chrome/common/json_value_serializer.h" | 10 #include "chrome/common/json_value_serializer.h" |
13 #include "chrome/installer/util/browser_distribution.h" | 11 #include "chrome/installer/util/browser_distribution.h" |
14 #include "chrome/installer/util/google_update_constants.h" | 12 #include "chrome/installer/util/google_update_constants.h" |
15 #include "chrome/installer/util/google_chrome_distribution.h" | 13 #include "chrome/installer/util/google_chrome_distribution.h" |
16 #include "chrome/installer/util/work_item_list.h" | |
17 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
18 | 15 |
19 namespace { | 16 TEST(GoogleChromeDistributionTest, TestExtractUninstallMetrics) { |
20 class GoogleChromeDistributionTest : public testing::Test { | |
21 protected: | |
22 virtual void SetUp() { | |
23 // Currently no setup required. | |
24 } | |
25 | |
26 virtual void TearDown() { | |
27 // Currently no tear down required. | |
28 } | |
29 | |
30 // Creates "ap" key with the value given as parameter. Also adds work | |
31 // items to work_item_list given so that they can be rolled back later. | |
32 bool CreateApKey(WorkItemList* work_item_list, const std::wstring& value) { | |
33 HKEY reg_root = HKEY_CURRENT_USER; | |
34 std::wstring reg_key = GetApKeyPath(); | |
35 work_item_list->AddCreateRegKeyWorkItem(reg_root, reg_key); | |
36 work_item_list->AddSetRegValueWorkItem(reg_root, reg_key, | |
37 google_update::kRegApField, value.c_str(), true); | |
38 if (!work_item_list->Do()) { | |
39 work_item_list->Rollback(); | |
40 return false; | |
41 } | |
42 return true; | |
43 } | |
44 | |
45 // Returns the key path of "ap" key Google\Update\ClientState\<chrome-guid> | |
46 std::wstring GetApKeyPath() { | |
47 std::wstring reg_key(google_update::kRegPathClientState); | |
48 reg_key.append(L"\\"); | |
49 | |
50 BrowserDistribution* dist = BrowserDistribution::GetDistribution(); | |
51 reg_key.append(dist->GetAppGuid()); | |
52 return reg_key; | |
53 } | |
54 | |
55 // Utility method to read "ap" key value | |
56 std::wstring ReadApKeyValue() { | |
57 RegKey key; | |
58 std::wstring ap_key_value; | |
59 std::wstring reg_key = GetApKeyPath(); | |
60 if (key.Open(HKEY_CURRENT_USER, reg_key.c_str(), KEY_ALL_ACCESS) && | |
61 key.ReadValue(google_update::kRegApField, &ap_key_value)) { | |
62 return ap_key_value; | |
63 } | |
64 return std::wstring(); | |
65 } | |
66 }; | |
67 } // namespace | |
68 | |
69 #if defined(GOOGLE_CHROME_BUILD) | |
70 TEST_F(GoogleChromeDistributionTest, GetNewGoogleUpdateApKeyTest) { | |
71 GoogleChromeDistribution* dist = static_cast<GoogleChromeDistribution*>( | |
72 BrowserDistribution::GetDistribution()); | |
73 installer_util::InstallStatus s = installer_util::FIRST_INSTALL_SUCCESS; | |
74 installer_util::InstallStatus f = installer_util::INSTALL_FAILED; | |
75 | |
76 // Incremental Installer that worked. | |
77 EXPECT_EQ(dist->GetNewGoogleUpdateApKey(true, s, L""), L""); | |
78 EXPECT_EQ(dist->GetNewGoogleUpdateApKey(true, s, L"1.1"), L"1.1"); | |
79 EXPECT_EQ(dist->GetNewGoogleUpdateApKey(true, s, L"1.1-dev"), L"1.1-dev"); | |
80 EXPECT_EQ(dist->GetNewGoogleUpdateApKey(true, s, L"-full"), L""); | |
81 EXPECT_EQ(dist->GetNewGoogleUpdateApKey(true, s, L"1.1-full"), L"1.1"); | |
82 EXPECT_EQ(dist->GetNewGoogleUpdateApKey(true, s, L"1.1-dev-full"), | |
83 L"1.1-dev"); | |
84 | |
85 // Incremental Installer that failed. | |
86 EXPECT_EQ(dist->GetNewGoogleUpdateApKey(true, f, L""), L"-full"); | |
87 EXPECT_EQ(dist->GetNewGoogleUpdateApKey(true, f, L"1.1"), L"1.1-full"); | |
88 EXPECT_EQ(dist->GetNewGoogleUpdateApKey(true, f, L"1.1-dev"), | |
89 L"1.1-dev-full"); | |
90 EXPECT_EQ(dist->GetNewGoogleUpdateApKey(true, f, L"-full"), L"-full"); | |
91 EXPECT_EQ(dist->GetNewGoogleUpdateApKey(true, f, L"1.1-full"), L"1.1-full"); | |
92 EXPECT_EQ(dist->GetNewGoogleUpdateApKey(true, f, L"1.1-dev-full"), | |
93 L"1.1-dev-full"); | |
94 | |
95 // Full Installer that worked. | |
96 EXPECT_EQ(dist->GetNewGoogleUpdateApKey(false, s, L""), L""); | |
97 EXPECT_EQ(dist->GetNewGoogleUpdateApKey(false, s, L"1.1"), L"1.1"); | |
98 EXPECT_EQ(dist->GetNewGoogleUpdateApKey(false, s, L"1.1-dev"), L"1.1-dev"); | |
99 EXPECT_EQ(dist->GetNewGoogleUpdateApKey(false, s, L"-full"), L""); | |
100 EXPECT_EQ(dist->GetNewGoogleUpdateApKey(false, s, L"1.1-full"), L"1.1"); | |
101 EXPECT_EQ(dist->GetNewGoogleUpdateApKey(false, s, L"1.1-dev-full"), | |
102 L"1.1-dev"); | |
103 | |
104 // Full Installer that failed. | |
105 EXPECT_EQ(dist->GetNewGoogleUpdateApKey(false, f, L""), L""); | |
106 EXPECT_EQ(dist->GetNewGoogleUpdateApKey(false, f, L"1.1"), L"1.1"); | |
107 EXPECT_EQ(dist->GetNewGoogleUpdateApKey(false, f, L"1.1-dev"), L"1.1-dev"); | |
108 EXPECT_EQ(dist->GetNewGoogleUpdateApKey(false, f, L"-full"), L""); | |
109 EXPECT_EQ(dist->GetNewGoogleUpdateApKey(false, f, L"1.1-full"), L"1.1"); | |
110 EXPECT_EQ(dist->GetNewGoogleUpdateApKey(false, f, L"1.1-dev-full"), | |
111 L"1.1-dev"); | |
112 } | |
113 | |
114 TEST_F(GoogleChromeDistributionTest, UpdateDiffInstallStatusTest) { | |
115 // Get Google Chrome distribution | |
116 GoogleChromeDistribution* dist = static_cast<GoogleChromeDistribution*>( | |
117 BrowserDistribution::GetDistribution()); | |
118 | |
119 scoped_ptr<WorkItemList> work_item_list(WorkItem::CreateWorkItemList()); | |
120 // Test incremental install failure | |
121 if (!CreateApKey(work_item_list.get(), L"")) | |
122 FAIL() << "Failed to create ap key."; | |
123 dist->UpdateDiffInstallStatus(false, true, installer_util::INSTALL_FAILED); | |
124 EXPECT_STREQ(ReadApKeyValue().c_str(), L"-full"); | |
125 work_item_list->Rollback(); | |
126 | |
127 work_item_list.reset(WorkItem::CreateWorkItemList()); | |
128 // Test incremental install success | |
129 if (!CreateApKey(work_item_list.get(), L"")) | |
130 FAIL() << "Failed to create ap key."; | |
131 dist->UpdateDiffInstallStatus(false, true, | |
132 installer_util::FIRST_INSTALL_SUCCESS); | |
133 EXPECT_STREQ(ReadApKeyValue().c_str(), L""); | |
134 work_item_list->Rollback(); | |
135 | |
136 work_item_list.reset(WorkItem::CreateWorkItemList()); | |
137 // Test full install failure | |
138 if (!CreateApKey(work_item_list.get(), L"-full")) | |
139 FAIL() << "Failed to create ap key."; | |
140 dist->UpdateDiffInstallStatus(false, false, installer_util::INSTALL_FAILED); | |
141 EXPECT_STREQ(ReadApKeyValue().c_str(), L""); | |
142 work_item_list->Rollback(); | |
143 | |
144 work_item_list.reset(WorkItem::CreateWorkItemList()); | |
145 // Test full install success | |
146 if (!CreateApKey(work_item_list.get(), L"-full")) | |
147 FAIL() << "Failed to create ap key."; | |
148 dist->UpdateDiffInstallStatus(false, false, | |
149 installer_util::FIRST_INSTALL_SUCCESS); | |
150 EXPECT_STREQ(ReadApKeyValue().c_str(), L""); | |
151 work_item_list->Rollback(); | |
152 | |
153 work_item_list.reset(WorkItem::CreateWorkItemList()); | |
154 // Test the case of when "ap" key doesnt exist at all | |
155 std::wstring ap_key_value = ReadApKeyValue(); | |
156 std::wstring reg_key = GetApKeyPath(); | |
157 HKEY reg_root = HKEY_CURRENT_USER; | |
158 bool ap_key_deleted = false; | |
159 RegKey key; | |
160 if (!key.Open(HKEY_CURRENT_USER, reg_key.c_str(), KEY_ALL_ACCESS)) { | |
161 work_item_list->AddCreateRegKeyWorkItem(reg_root, reg_key); | |
162 if (!work_item_list->Do()) | |
163 FAIL() << "Failed to create ClientState key."; | |
164 } else if (key.DeleteValue(google_update::kRegApField)) { | |
165 ap_key_deleted = true; | |
166 } | |
167 // try differential installer | |
168 dist->UpdateDiffInstallStatus(false, true, installer_util::INSTALL_FAILED); | |
169 EXPECT_STREQ(ReadApKeyValue().c_str(), L"-full"); | |
170 // try full installer now | |
171 dist->UpdateDiffInstallStatus(false, false, installer_util::INSTALL_FAILED); | |
172 EXPECT_STREQ(ReadApKeyValue().c_str(), L""); | |
173 // Now cleanup to leave the system in unchanged state. | |
174 // - Diff installer creates an ap key if it didnt exist, so delete this ap key | |
175 // - If we created any reg key path for ap, roll it back | |
176 // - Finally restore the original value of ap key. | |
177 key.Open(HKEY_CURRENT_USER, reg_key.c_str(), KEY_ALL_ACCESS); | |
178 key.DeleteValue(google_update::kRegApField); | |
179 work_item_list->Rollback(); | |
180 if (ap_key_deleted) { | |
181 work_item_list.reset(WorkItem::CreateWorkItemList()); | |
182 if (!CreateApKey(work_item_list.get(), ap_key_value)) | |
183 FAIL() << "Failed to restore ap key."; | |
184 } | |
185 } | |
186 | |
187 TEST_F(GoogleChromeDistributionTest, TestExtractUninstallMetrics) { | |
188 // A make-believe JSON preferences file. | 17 // A make-believe JSON preferences file. |
189 std::string pref_string( | 18 std::string pref_string( |
190 "{ \n" | 19 "{ \n" |
191 " \"foo\": \"bar\",\n" | 20 " \"foo\": \"bar\",\n" |
192 " \"uninstall_metrics\": { \n" | 21 " \"uninstall_metrics\": { \n" |
193 " \"last_launch_time_sec\": \"1235341118\"," | 22 " \"last_launch_time_sec\": \"1235341118\"," |
194 " \"last_observed_running_time_sec\": \"1235341183\"," | 23 " \"last_observed_running_time_sec\": \"1235341183\"," |
195 " \"launch_count\": \"11\"," | 24 " \"launch_count\": \"11\"," |
196 " \"page_load_count\": \"68\"," | 25 " \"page_load_count\": \"68\"," |
197 " \"uptime_sec\": \"809\"," | 26 " \"uptime_sec\": \"809\"," |
(...skipping 23 matching lines...) Expand all Loading... |
221 ASSERT_TRUE(root.get()); | 50 ASSERT_TRUE(root.get()); |
222 | 51 |
223 std::wstring uninstall_metrics_string; | 52 std::wstring uninstall_metrics_string; |
224 GoogleChromeDistribution* dist = static_cast<GoogleChromeDistribution*>( | 53 GoogleChromeDistribution* dist = static_cast<GoogleChromeDistribution*>( |
225 BrowserDistribution::GetDistribution()); | 54 BrowserDistribution::GetDistribution()); |
226 EXPECT_TRUE( | 55 EXPECT_TRUE( |
227 dist->ExtractUninstallMetrics(*static_cast<DictionaryValue*>(root.get()), | 56 dist->ExtractUninstallMetrics(*static_cast<DictionaryValue*>(root.get()), |
228 &uninstall_metrics_string)); | 57 &uninstall_metrics_string)); |
229 EXPECT_EQ(expected_url_string, uninstall_metrics_string); | 58 EXPECT_EQ(expected_url_string, uninstall_metrics_string); |
230 } | 59 } |
231 #endif | |
OLD | NEW |