OLD | NEW |
| (Empty) |
1 // Copyright 2010 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 #include <string.h> | |
17 #include "omaha/base/string.h" | |
18 #include "omaha/base/logging.h" | |
19 #include "omaha/base/omaha_version.h" | |
20 #include "omaha/base/utils.h" | |
21 #include "omaha/common/command_line.h" | |
22 #include "omaha/common/ping.h" | |
23 #include "omaha/testing/unit_test.h" | |
24 | |
25 namespace omaha { | |
26 | |
27 class PingTest : public testing::Test { | |
28 }; | |
29 | |
30 TEST_F(PingTest, BuildOmahaPing) { | |
31 PingEventPtr ping_event1( | |
32 new PingEvent(PingEvent::EVENT_INSTALL_COMPLETE, | |
33 PingEvent::EVENT_RESULT_SUCCESS, | |
34 10, | |
35 20)); | |
36 | |
37 PingEventPtr ping_event2( | |
38 new PingEvent(PingEvent::EVENT_INSTALL_COMPLETE, | |
39 PingEvent::EVENT_RESULT_SUCCESS, | |
40 30, | |
41 40)); | |
42 | |
43 CommandLineExtraArgs command_line_extra_args; | |
44 StringToGuidSafe(_T("{DE06587E-E5AB-4364-A46B-F3AC733007B3}"), | |
45 &command_line_extra_args.installation_id); | |
46 command_line_extra_args.brand_code = _T("GGLS"); | |
47 command_line_extra_args.client_id = _T("a client id"); | |
48 command_line_extra_args.language = _T("en"); | |
49 | |
50 // Machine ping. | |
51 Ping install_ping(true, _T("session"), _T("oneclick")); | |
52 install_ping.LoadAppDataFromExtraArgs(command_line_extra_args); | |
53 install_ping.BuildOmahaPing(_T("1.0.0.0"), | |
54 _T("2.0.0.0"), | |
55 ping_event1, | |
56 ping_event2); | |
57 | |
58 CString expected_ping_request_substring; | |
59 expected_ping_request_substring.Format(_T("<app appid=\"{430FD4D0-B729-4F61-AA
34-91526481799D}\" version=\"1.0.0.0\" nextversion=\"2.0.0.0\" lang=\"en\" brand
=\"GGLS\" client=\"a client id\" iid=\"{DE06587E-E5AB-4364-A46B-F3AC733007B3}\">
<event eventtype=\"2\" eventresult=\"1\" errorcode=\"10\" extracode1=\"20\"/><ev
ent eventtype=\"2\" eventresult=\"1\" errorcode=\"30\" extracode1=\"40\"/></app>
")); // NOLINT | |
60 | |
61 CString actual_ping_request; | |
62 install_ping.BuildRequestString(&actual_ping_request); | |
63 | |
64 // The ping_request_string contains some data that depends on the machine | |
65 // environment, such as operating system version. Look for a partial match in | |
66 // the string corresponding to the <app> element. | |
67 EXPECT_NE(-1, actual_ping_request.Find(expected_ping_request_substring)); | |
68 } | |
69 | |
70 TEST_F(PingTest, BuildAppsPing) { | |
71 const TCHAR* const kOmahaUserClientStatePath = | |
72 _T("HKCU\\Software\\") SHORT_COMPANY_NAME _T("\\") PRODUCT_NAME | |
73 _T("\\ClientState\\") GOOPDATE_APP_ID; | |
74 | |
75 const CString expected_pv = _T("1.3.23.0"); | |
76 const CString expected_lang = _T("en"); | |
77 const CString expected_brand_code = _T("GGLS"); | |
78 const CString expected_client_id = _T("someclientid"); | |
79 const CString expected_iid = | |
80 _T("{7C0B6E56-B24B-436b-A960-A6EA201E886F}"); | |
81 const CString expected_experiment_label = | |
82 _T("some_experiment=a|Fri, 14 Aug 2015 16:13:03 GMT"); | |
83 | |
84 EXPECT_HRESULT_SUCCEEDED(RegKey::SetValue(kOmahaUserClientStatePath, | |
85 kRegValueProductVersion, | |
86 expected_pv)); | |
87 EXPECT_HRESULT_SUCCEEDED(RegKey::SetValue(kOmahaUserClientStatePath, | |
88 kRegValueLanguage, | |
89 expected_lang)); | |
90 EXPECT_HRESULT_SUCCEEDED(RegKey::SetValue(kOmahaUserClientStatePath, | |
91 kRegValueBrandCode, | |
92 expected_brand_code)); | |
93 EXPECT_HRESULT_SUCCEEDED(RegKey::SetValue(kOmahaUserClientStatePath, | |
94 kRegValueClientId, | |
95 expected_client_id)); | |
96 EXPECT_HRESULT_SUCCEEDED(RegKey::SetValue(kOmahaUserClientStatePath, | |
97 kRegValueInstallationId, | |
98 expected_iid)); | |
99 EXPECT_HRESULT_SUCCEEDED(RegKey::SetValue(kOmahaUserClientStatePath, | |
100 kRegValueExperimentLabels, | |
101 expected_experiment_label)); | |
102 | |
103 PingEventPtr ping_event( | |
104 new PingEvent(PingEvent::EVENT_INSTALL_COMPLETE, | |
105 PingEvent::EVENT_RESULT_SUCCESS, | |
106 34, | |
107 6)); | |
108 | |
109 Ping apps_ping(false, _T("unittest"), _T("InstallSource_Foo")); | |
110 std::vector<CString> apps; | |
111 apps.push_back(GOOPDATE_APP_ID); | |
112 apps_ping.LoadAppDataFromRegistry(apps); | |
113 apps_ping.BuildAppsPing(ping_event); | |
114 | |
115 CString expected_ping_request_substring; | |
116 expected_ping_request_substring.Format(_T("<app appid=\"{430FD4D0-B729-4F61-AA
34-91526481799D}\" version=\"1.3.23.0\" nextversion=\"\" lang=\"en\" brand=\"GGL
S\" client=\"someclientid\" experiments=\"some_experiment=a|Fri, 14 Aug 2015 16:
13:03 GMT\" iid=\"{7C0B6E56-B24B-436b-A960-A6EA201E886F}\"><event eventtype=\"2\
" eventresult=\"1\" errorcode=\"34\" extracode1=\"6\"/></app>")); // NOLINT | |
117 | |
118 CString actual_ping_request; | |
119 apps_ping.BuildRequestString(&actual_ping_request); | |
120 | |
121 EXPECT_NE(-1, actual_ping_request.Find(expected_ping_request_substring)); | |
122 } | |
123 | |
124 TEST_F(PingTest, SendString) { | |
125 CString request_string = _T("<?xml version=\"1.0\" encoding=\"UTF-8\"?><reques
t protocol=\"3.0\" version=\"1.3.23.0\" ismachine=\"1\" sessionid=\"unittest\" i
nstallsource=\"oneclick\" testsource=\"dev\" requestid=\"{EC821C33-E4EE-4E75-BC8
5-7E9DFC3652F5}\" periodoverridesec=\"7407360\"><os platform=\"win\" version=\"6
.0\" sp=\"Service Pack 1\"/><app appid=\"{430FD4D0-B729-4F61-AA34-91526481799D}\
" version=\"1.0.0.0\" nextversion=\"2.0.0.0\" lang=\"en\" brand=\"GGLS\" client=
\"a client id\" iid=\"{DE06587E-E5AB-4364-A46B-F3AC733007B3}\"><event eventtype=
\"10\" eventresult=\"1\" errorcode=\"0\" extracode1=\"0\"/></app></request>");
// NOLINT | |
126 EXPECT_HRESULT_SUCCEEDED(Ping::SendString(false, | |
127 HeadersVector(), | |
128 request_string)); | |
129 | |
130 // 400 Bad Request returned by the server. | |
131 EXPECT_EQ(0x80042190, Ping::SendString(false, HeadersVector(), _T(""))); | |
132 } | |
133 | |
134 TEST_F(PingTest, HandlePing) { | |
135 CString request_string = _T("<?xml version=\"1.0\" encoding=\"UTF-8\"?><reques
t protocol=\"3.0\" version=\"1.3.23.0\" ismachine=\"1\" sessionid=\"unittest\" i
nstallsource=\"oneclick\" testsource=\"dev\" requestid=\"{EC821C33-E4EE-4E75-BC8
5-7E9DFC3652F5}\" periodoverridesec=\"7407360\"><os platform=\"win\" version=\"6
.0\" sp=\"Service Pack 1\"/><app appid=\"{430FD4D0-B729-4F61-AA34-91526481799D}\
" version=\"1.0.0.0\" nextversion=\"2.0.0.0\" lang=\"en\" brand=\"GGLS\" client=
\"a client id\" iid=\"{DE06587E-E5AB-4364-A46B-F3AC733007B3}\"><event eventtype=
\"10\" eventresult=\"1\" errorcode=\"0\" extracode1=\"0\"/></app></request>");
// NOLINT | |
136 | |
137 CStringA request_string_utf8(WideToUtf8(request_string)); | |
138 CStringA ping_string_utf8; | |
139 WebSafeBase64Escape(request_string_utf8, &ping_string_utf8); | |
140 | |
141 EXPECT_HRESULT_SUCCEEDED( | |
142 Ping::HandlePing(false, Utf8ToWideChar(ping_string_utf8, | |
143 ping_string_utf8.GetLength()))); | |
144 | |
145 // 400 Bad Request returned by the server. | |
146 EXPECT_EQ(0x80042190, Ping::HandlePing(false, _T(""))); | |
147 } | |
148 | |
149 TEST_F(PingTest, SendInProcess) { | |
150 PingEventPtr ping_event( | |
151 new PingEvent(PingEvent::EVENT_INSTALL_COMPLETE, | |
152 PingEvent::EVENT_RESULT_SUCCESS, | |
153 0, | |
154 0)); | |
155 | |
156 CommandLineExtraArgs command_line_extra_args; | |
157 StringToGuidSafe(_T("{DE06587E-E5AB-4364-A46B-F3AC733007B3}"), | |
158 &command_line_extra_args.installation_id); | |
159 command_line_extra_args.brand_code = _T("GGLS"); | |
160 command_line_extra_args.client_id = _T("a client id"); | |
161 command_line_extra_args.language = _T("en"); | |
162 | |
163 // User ping. | |
164 Ping install_ping(false, _T("unittest"), _T("oneclick")); | |
165 install_ping.LoadAppDataFromExtraArgs(command_line_extra_args); | |
166 install_ping.BuildOmahaPing(_T("1.0.0.0"), _T("2.0.0.0"), ping_event); | |
167 | |
168 CString request_string; | |
169 EXPECT_HRESULT_SUCCEEDED(install_ping.BuildRequestString(&request_string)); | |
170 EXPECT_HRESULT_SUCCEEDED(install_ping.SendInProcess(request_string)); | |
171 } | |
172 | |
173 TEST_F(PingTest, IsPingExpired_PastTime) { | |
174 const time64 time = GetCurrent100NSTime() - (Ping::kPingExpiry100ns + 1); | |
175 EXPECT_TRUE(Ping::IsPingExpired(time)); | |
176 } | |
177 | |
178 TEST_F(PingTest, IsPingExpired_CurrentTime) { | |
179 const time64 time = GetCurrent100NSTime(); | |
180 EXPECT_FALSE(Ping::IsPingExpired(time)); | |
181 } | |
182 | |
183 TEST_F(PingTest, IsPingExpired_FutureTime) { | |
184 const time64 time = GetCurrent100NSTime() + 10; | |
185 EXPECT_TRUE(Ping::IsPingExpired(time)); | |
186 } | |
187 | |
188 TEST_F(PingTest, LoadPersistedPings_NoPersistedPings) { | |
189 Ping::PingsVector pings; | |
190 EXPECT_EQ(HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), | |
191 Ping::LoadPersistedPings(false, &pings)); | |
192 EXPECT_EQ(0, pings.size()); | |
193 } | |
194 | |
195 TEST_F(PingTest, LoadPersistedPings) { | |
196 CString ping_reg_path(Ping::GetPingRegPath(false)); | |
197 | |
198 EXPECT_HRESULT_SUCCEEDED(RegKey::SetValue(ping_reg_path, | |
199 _T("1"), | |
200 _T("Test Ping String 1"))); | |
201 EXPECT_HRESULT_SUCCEEDED(RegKey::SetValue(ping_reg_path, | |
202 _T("2"), | |
203 _T("Test Ping String 2"))); | |
204 EXPECT_HRESULT_SUCCEEDED(RegKey::SetValue(ping_reg_path, | |
205 _T("3"), | |
206 _T("Test Ping String 3"))); | |
207 | |
208 Ping::PingsVector pings; | |
209 EXPECT_HRESULT_SUCCEEDED(Ping::LoadPersistedPings(false, &pings)); | |
210 EXPECT_EQ(3, pings.size()); | |
211 | |
212 EXPECT_EQ(1, pings[0].first); | |
213 EXPECT_EQ(2, pings[1].first); | |
214 EXPECT_EQ(3, pings[2].first); | |
215 EXPECT_STREQ(_T("Test Ping String 1"), pings[0].second); | |
216 EXPECT_STREQ(_T("Test Ping String 2"), pings[1].second); | |
217 EXPECT_STREQ(_T("Test Ping String 3"), pings[2].second); | |
218 | |
219 EXPECT_HRESULT_SUCCEEDED(RegKey::DeleteKey(ping_reg_path)); | |
220 } | |
221 | |
222 TEST_F(PingTest, PersistPing) { | |
223 EXPECT_HRESULT_SUCCEEDED(Ping::PersistPing(false, _T("Test Ping String 1"))); | |
224 ::Sleep(15); | |
225 EXPECT_HRESULT_SUCCEEDED(Ping::PersistPing(false, _T("Test Ping String 2"))); | |
226 ::Sleep(15); | |
227 EXPECT_HRESULT_SUCCEEDED(Ping::PersistPing(false, _T("Test Ping String 3"))); | |
228 | |
229 Ping::PingsVector pings; | |
230 EXPECT_HRESULT_SUCCEEDED(Ping::LoadPersistedPings(false, &pings)); | |
231 EXPECT_EQ(3, pings.size()); | |
232 | |
233 EXPECT_FALSE(Ping::IsPingExpired(pings[0].first)); | |
234 EXPECT_FALSE(Ping::IsPingExpired(pings[1].first)); | |
235 EXPECT_FALSE(Ping::IsPingExpired(pings[2].first)); | |
236 EXPECT_STREQ(_T("Test Ping String 1"), pings[0].second); | |
237 EXPECT_STREQ(_T("Test Ping String 2"), pings[1].second); | |
238 EXPECT_STREQ(_T("Test Ping String 3"), pings[2].second); | |
239 | |
240 EXPECT_HRESULT_SUCCEEDED(RegKey::DeleteKey(Ping::GetPingRegPath(false))); | |
241 } | |
242 | |
243 TEST_F(PingTest, DeletePersistedPing) { | |
244 CString ping_reg_path(Ping::GetPingRegPath(false)); | |
245 | |
246 EXPECT_HRESULT_SUCCEEDED(RegKey::SetValue(ping_reg_path, | |
247 _T("1"), | |
248 _T("Test Ping String 1"))); | |
249 EXPECT_HRESULT_SUCCEEDED(RegKey::SetValue(ping_reg_path, | |
250 _T("2"), | |
251 _T("Test Ping String 2"))); | |
252 | |
253 EXPECT_HRESULT_SUCCEEDED(Ping::DeletePersistedPing(false, 1)); | |
254 EXPECT_HRESULT_SUCCEEDED(Ping::DeletePersistedPing(false, 2)); | |
255 | |
256 EXPECT_FALSE(RegKey::HasKey(ping_reg_path)); | |
257 } | |
258 | |
259 TEST_F(PingTest, SendPersistedPings) { | |
260 PingEventPtr ping_event( | |
261 new PingEvent(PingEvent::EVENT_INSTALL_COMPLETE, | |
262 PingEvent::EVENT_RESULT_SUCCESS, | |
263 0, | |
264 0)); | |
265 | |
266 CommandLineExtraArgs command_line_extra_args; | |
267 StringToGuidSafe(_T("{DE06587E-E5AB-4364-A46B-F3AC733007B3}"), | |
268 &command_line_extra_args.installation_id); | |
269 command_line_extra_args.brand_code = _T("GGLS"); | |
270 command_line_extra_args.client_id = _T("a client id"); | |
271 command_line_extra_args.language = _T("en"); | |
272 | |
273 // User ping. | |
274 Ping install_ping(false, _T("unittest"), _T("oneclick")); | |
275 install_ping.LoadAppDataFromExtraArgs(command_line_extra_args); | |
276 install_ping.BuildOmahaPing(_T("1.0.0.0"), _T("2.0.0.0"), ping_event); | |
277 | |
278 CString request_string; | |
279 EXPECT_HRESULT_SUCCEEDED(install_ping.BuildRequestString(&request_string)); | |
280 EXPECT_HRESULT_SUCCEEDED(Ping::PersistPing(false, request_string)); | |
281 | |
282 EXPECT_HRESULT_SUCCEEDED(Ping::SendPersistedPings(false)); | |
283 | |
284 EXPECT_FALSE(RegKey::HasKey(Ping::GetPingRegPath(false))); | |
285 } | |
286 | |
287 // The tests below rely on the out-of-process mechanism to send install pings. | |
288 // Enable the test to debug the sending code. | |
289 TEST_F(PingTest, DISABLED_SendUsingGoogleUpdate) { | |
290 PingEventPtr ping_event( | |
291 new PingEvent(PingEvent::EVENT_INSTALL_COMPLETE, | |
292 PingEvent::EVENT_RESULT_SUCCESS, | |
293 0, | |
294 0)); | |
295 | |
296 CommandLineExtraArgs command_line_extra_args; | |
297 StringToGuidSafe(_T("{DE06587E-E5AB-4364-A46B-F3AC733007B3}"), | |
298 &command_line_extra_args.installation_id); | |
299 command_line_extra_args.brand_code = _T("GGLS"); | |
300 command_line_extra_args.client_id = _T("a client id"); | |
301 command_line_extra_args.language = _T("en"); | |
302 | |
303 // User ping and wait for completion. | |
304 Ping install_ping(false, _T("unittest"), _T("oneclick")); | |
305 install_ping.LoadAppDataFromExtraArgs(command_line_extra_args); | |
306 install_ping.BuildOmahaPing(_T("1.0.0.0"), _T("2.0.0.0"), ping_event); | |
307 | |
308 const int kWaitForPingProcessToCompleteMs = 60000; | |
309 CString request_string; | |
310 EXPECT_HRESULT_SUCCEEDED(install_ping.BuildRequestString(&request_string)); | |
311 EXPECT_HRESULT_SUCCEEDED(install_ping.SendUsingGoogleUpdate( | |
312 request_string, kWaitForPingProcessToCompleteMs)); | |
313 } | |
314 | |
315 TEST_F(PingTest, Send_Empty) { | |
316 CommandLineExtraArgs command_line_extra_args; | |
317 Ping install_ping(false, _T("unittest"), _T("oneclick")); | |
318 EXPECT_EQ(S_FALSE, install_ping.Send(false)); | |
319 } | |
320 | |
321 TEST_F(PingTest, DISABLED_Send) { | |
322 PingEventPtr ping_event( | |
323 new PingEvent(PingEvent::EVENT_INSTALL_COMPLETE, | |
324 PingEvent::EVENT_RESULT_SUCCESS, | |
325 0, | |
326 0)); | |
327 | |
328 CommandLineExtraArgs command_line_extra_args; | |
329 StringToGuidSafe(_T("{DE06587E-E5AB-4364-A46B-F3AC733007B3}"), | |
330 &command_line_extra_args.installation_id); | |
331 command_line_extra_args.brand_code = _T("GGLS"); | |
332 command_line_extra_args.client_id = _T("a client id"); | |
333 command_line_extra_args.language = _T("en"); | |
334 | |
335 // User ping and wait for completion. | |
336 Ping install_ping(false, _T("unittest"), _T("oneclick")); | |
337 install_ping.LoadAppDataFromExtraArgs(command_line_extra_args); | |
338 install_ping.BuildOmahaPing(_T("1.0.0.0"), _T("2.0.0.0"), ping_event); | |
339 | |
340 EXPECT_HRESULT_SUCCEEDED(install_ping.Send(false)); | |
341 } | |
342 | |
343 TEST_F(PingTest, DISABLED_SendFireAndForget) { | |
344 PingEventPtr ping_event( | |
345 new PingEvent(PingEvent::EVENT_INSTALL_COMPLETE, | |
346 PingEvent::EVENT_RESULT_SUCCESS, | |
347 0, | |
348 0)); | |
349 | |
350 CommandLineExtraArgs command_line_extra_args; | |
351 StringToGuidSafe(_T("{DE06587E-E5AB-4364-A46B-F3AC733007B3}"), | |
352 &command_line_extra_args.installation_id); | |
353 command_line_extra_args.brand_code = _T("GGLS"); | |
354 command_line_extra_args.client_id = _T("a client id"); | |
355 command_line_extra_args.language = _T("en"); | |
356 | |
357 // User ping and do not wait for completion. | |
358 Ping install_ping(false, _T("unittest"), _T("oneclick")); | |
359 install_ping.LoadAppDataFromExtraArgs(command_line_extra_args); | |
360 install_ping.BuildOmahaPing(_T("1.0.0.0"), _T("2.0.0.0"), ping_event); | |
361 | |
362 EXPECT_HRESULT_SUCCEEDED(install_ping.Send(true)); | |
363 } | |
364 | |
365 } // namespace omaha | |
366 | |
OLD | NEW |