OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 package org.chromium.chrome.browser.omaha; | 5 package org.chromium.chrome.browser.omaha; |
6 | 6 |
7 import android.content.Context; | 7 import android.content.Context; |
8 import android.content.SharedPreferences; | 8 import android.content.SharedPreferences; |
| 9 import android.support.test.InstrumentationRegistry; |
9 import android.support.test.filters.SmallTest; | 10 import android.support.test.filters.SmallTest; |
10 import android.test.InstrumentationTestCase; | 11 |
| 12 import org.junit.After; |
| 13 import org.junit.Assert; |
| 14 import org.junit.Before; |
| 15 import org.junit.Test; |
| 16 import org.junit.runner.RunWith; |
11 | 17 |
12 import org.chromium.base.test.util.AdvancedMockContext; | 18 import org.chromium.base.test.util.AdvancedMockContext; |
13 import org.chromium.base.test.util.Feature; | 19 import org.chromium.base.test.util.Feature; |
| 20 import org.chromium.chrome.test.ChromeJUnit4ClassRunner; |
14 import org.chromium.chrome.test.omaha.MockRequestGenerator; | 21 import org.chromium.chrome.test.omaha.MockRequestGenerator; |
15 import org.chromium.chrome.test.omaha.MockRequestGenerator.DeviceType; | 22 import org.chromium.chrome.test.omaha.MockRequestGenerator.DeviceType; |
16 | 23 |
17 import java.io.ByteArrayInputStream; | 24 import java.io.ByteArrayInputStream; |
18 import java.io.ByteArrayOutputStream; | 25 import java.io.ByteArrayOutputStream; |
19 import java.io.IOException; | 26 import java.io.IOException; |
20 import java.io.InputStream; | 27 import java.io.InputStream; |
21 import java.io.OutputStream; | 28 import java.io.OutputStream; |
22 import java.net.HttpURLConnection; | 29 import java.net.HttpURLConnection; |
23 import java.net.MalformedURLException; | 30 import java.net.MalformedURLException; |
24 import java.net.SocketTimeoutException; | 31 import java.net.SocketTimeoutException; |
25 import java.net.URL; | 32 import java.net.URL; |
26 import java.util.ArrayList; | 33 import java.util.ArrayList; |
27 import java.util.LinkedList; | 34 import java.util.LinkedList; |
28 import java.util.List; | 35 import java.util.List; |
29 | 36 |
30 /** | 37 /** |
31 * Tests for the {@link OmahaClient}. | 38 * Tests for the {@link OmahaClient}. |
32 * Tests override the original OmahaClient's functions with the MockOmahaClient,
which | 39 * Tests override the original OmahaClient's functions with the MockOmahaClient,
which |
33 * provides a way to hook into functions to return values that would normally be
provided by the | 40 * provides a way to hook into functions to return values that would normally be
provided by the |
34 * system, such as whether Chrome was installed through the system image. | 41 * system, such as whether Chrome was installed through the system image. |
35 */ | 42 */ |
36 public class OmahaBaseTest extends InstrumentationTestCase { | 43 @RunWith(ChromeJUnit4ClassRunner.class) |
| 44 public class OmahaBaseTest { |
37 private static class TimestampPair { | 45 private static class TimestampPair { |
38 public long timestampNextRequest; | 46 public long timestampNextRequest; |
39 public long timestampNextPost; | 47 public long timestampNextPost; |
40 | 48 |
41 public TimestampPair(long timestampNextRequest, long timestampNextPost)
{ | 49 public TimestampPair(long timestampNextRequest, long timestampNextPost)
{ |
42 this.timestampNextRequest = timestampNextRequest; | 50 this.timestampNextRequest = timestampNextRequest; |
43 this.timestampNextPost = timestampNextPost; | 51 this.timestampNextPost = timestampNextPost; |
44 } | 52 } |
45 } | 53 } |
46 | 54 |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
147 return createOmahaBase( | 155 return createOmahaBase( |
148 ServerResponse.SUCCESS, ConnectionStatus.RESPONDS, DeviceType.HA
NDSET); | 156 ServerResponse.SUCCESS, ConnectionStatus.RESPONDS, DeviceType.HA
NDSET); |
149 } | 157 } |
150 | 158 |
151 private MockOmahaBase createOmahaBase( | 159 private MockOmahaBase createOmahaBase( |
152 ServerResponse response, ConnectionStatus status, DeviceType deviceT
ype) { | 160 ServerResponse response, ConnectionStatus status, DeviceType deviceT
ype) { |
153 MockOmahaBase omahaClient = new MockOmahaBase(mDelegate, response, statu
s, deviceType); | 161 MockOmahaBase omahaClient = new MockOmahaBase(mDelegate, response, statu
s, deviceType); |
154 return omahaClient; | 162 return omahaClient; |
155 } | 163 } |
156 | 164 |
157 @Override | 165 @Before |
158 protected void setUp() throws Exception { | 166 public void setUp() throws Exception { |
159 super.setUp(); | 167 Context targetContext = InstrumentationRegistry.getInstrumentation().get
TargetContext(); |
160 Context targetContext = getInstrumentation().getTargetContext(); | |
161 OmahaBase.setIsDisabledForTesting(false); | 168 OmahaBase.setIsDisabledForTesting(false); |
162 mContext = new AdvancedMockContext(targetContext); | 169 mContext = new AdvancedMockContext(targetContext); |
163 } | 170 } |
164 | 171 |
165 @Override | 172 @After |
166 public void tearDown() throws Exception { | 173 public void tearDown() throws Exception { |
167 OmahaBase.setIsDisabledForTesting(true); | 174 OmahaBase.setIsDisabledForTesting(true); |
168 super.tearDown(); | |
169 } | 175 } |
170 | 176 |
171 private class MockOmahaBase extends OmahaBase { | 177 private class MockOmahaBase extends OmahaBase { |
172 private final LinkedList<MockConnection> mMockConnections = new LinkedLi
st<>(); | 178 private final LinkedList<MockConnection> mMockConnections = new LinkedLi
st<>(); |
173 | 179 |
174 private final boolean mSendValidResponse; | 180 private final boolean mSendValidResponse; |
175 private final boolean mConnectionTimesOut; | 181 private final boolean mConnectionTimesOut; |
176 private final boolean mIsOnTablet; | 182 private final boolean mIsOnTablet; |
177 | 183 |
178 public MockOmahaBase(OmahaDelegate delegate, ServerResponse serverRespon
se, | 184 public MockOmahaBase(OmahaDelegate delegate, ServerResponse serverRespon
se, |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 | 220 |
215 @Override | 221 @Override |
216 protected HttpURLConnection createConnection() throws RequestFailureExce
ption { | 222 protected HttpURLConnection createConnection() throws RequestFailureExce
ption { |
217 MockConnection connection = null; | 223 MockConnection connection = null; |
218 try { | 224 try { |
219 URL url = new URL(mDelegate.getRequestGenerator().getServerUrl()
); | 225 URL url = new URL(mDelegate.getRequestGenerator().getServerUrl()
); |
220 connection = new MockConnection(url, mIsOnTablet, mSendValidResp
onse, | 226 connection = new MockConnection(url, mIsOnTablet, mSendValidResp
onse, |
221 mSendInstallEvent, mConnectionTimesOut); | 227 mSendInstallEvent, mConnectionTimesOut); |
222 mMockConnections.addLast(connection); | 228 mMockConnections.addLast(connection); |
223 } catch (MalformedURLException e) { | 229 } catch (MalformedURLException e) { |
224 fail("Caught a malformed URL exception: " + e); | 230 Assert.fail("Caught a malformed URL exception: " + e); |
225 } | 231 } |
226 return connection; | 232 return connection; |
227 } | 233 } |
228 } | 234 } |
229 | 235 |
| 236 @Test |
230 @SmallTest | 237 @SmallTest |
231 @Feature({"Omaha"}) | 238 @Feature({"Omaha"}) |
232 public void testPipelineFreshInstall() { | 239 public void testPipelineFreshInstall() { |
233 final long now = 11684; | 240 final long now = 11684; |
234 | 241 |
235 mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallS
ource.ORGANIC); | 242 mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallS
ource.ORGANIC); |
236 mDelegate.getScheduler().setCurrentTime(now); | 243 mDelegate.getScheduler().setCurrentTime(now); |
237 | 244 |
238 // Trigger Omaha. | 245 // Trigger Omaha. |
239 mOmahaBase = createOmahaBase(); | 246 mOmahaBase = createOmahaBase(); |
240 mOmahaBase.run(); | 247 mOmahaBase.run(); |
241 | 248 |
242 // A fresh install results in two requests to the Omaha server: one for
the install request | 249 // A fresh install results in two requests to the Omaha server: one for
the install request |
243 // and one for the ping request. | 250 // and one for the ping request. |
244 assertTrue(mDelegate.mInstallEventWasSent); | 251 Assert.assertTrue(mDelegate.mInstallEventWasSent); |
245 assertEquals(1, mDelegate.mPostResults.size()); | 252 Assert.assertEquals(1, mDelegate.mPostResults.size()); |
246 assertEquals(OmahaBase.POST_RESULT_SENT, mDelegate.mPostResults.get(0).i
ntValue()); | 253 Assert.assertEquals(OmahaBase.POST_RESULT_SENT, mDelegate.mPostResults.g
et(0).intValue()); |
247 assertEquals(2, mDelegate.mGenerateAndPostRequestResults.size()); | 254 Assert.assertEquals(2, mDelegate.mGenerateAndPostRequestResults.size()); |
248 assertTrue(mDelegate.mGenerateAndPostRequestResults.get(0)); | 255 Assert.assertTrue(mDelegate.mGenerateAndPostRequestResults.get(0)); |
249 assertTrue(mDelegate.mGenerateAndPostRequestResults.get(1)); | 256 Assert.assertTrue(mDelegate.mGenerateAndPostRequestResults.get(1)); |
250 | 257 |
251 // Successful requests mean that the next scheduled event should be chec
king for when the | 258 // Successful requests mean that the next scheduled event should be chec
king for when the |
252 // user is active. | 259 // user is active. |
253 assertEquals(now + OmahaBase.MS_BETWEEN_REQUESTS, mDelegate.mNextSchedul
edTimestamp); | 260 Assert.assertEquals(now + OmahaBase.MS_BETWEEN_REQUESTS, mDelegate.mNext
ScheduledTimestamp); |
254 checkTimestamps(now + OmahaBase.MS_BETWEEN_REQUESTS, now + OmahaBase.MS_
POST_BASE_DELAY, | 261 checkTimestamps(now + OmahaBase.MS_BETWEEN_REQUESTS, now + OmahaBase.MS_
POST_BASE_DELAY, |
255 mDelegate.mTimestampsOnSaveState); | 262 mDelegate.mTimestampsOnSaveState); |
256 } | 263 } |
257 | 264 |
| 265 @Test |
258 @SmallTest | 266 @SmallTest |
259 @Feature({"Omaha"}) | 267 @Feature({"Omaha"}) |
260 public void testPipelineRegularPing() { | 268 public void testPipelineRegularPing() { |
261 final long now = 11684; | 269 final long now = 11684; |
262 | 270 |
263 mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallS
ource.ORGANIC); | 271 mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallS
ource.ORGANIC); |
264 mDelegate.getScheduler().setCurrentTime(now); | 272 mDelegate.getScheduler().setCurrentTime(now); |
265 | 273 |
266 // Record that an install event has already been sent and that we're due
for a new request. | 274 // Record that an install event has already been sent and that we're due
for a new request. |
267 SharedPreferences.Editor editor = OmahaBase.getSharedPreferences(mContex
t).edit(); | 275 SharedPreferences.Editor editor = OmahaBase.getSharedPreferences(mContex
t).edit(); |
268 editor.putBoolean(OmahaBase.PREF_SEND_INSTALL_EVENT, false); | 276 editor.putBoolean(OmahaBase.PREF_SEND_INSTALL_EVENT, false); |
269 editor.putLong(OmahaBase.PREF_TIMESTAMP_FOR_NEW_REQUEST, now); | 277 editor.putLong(OmahaBase.PREF_TIMESTAMP_FOR_NEW_REQUEST, now); |
270 editor.putLong(OmahaBase.PREF_TIMESTAMP_FOR_NEXT_POST_ATTEMPT, now); | 278 editor.putLong(OmahaBase.PREF_TIMESTAMP_FOR_NEXT_POST_ATTEMPT, now); |
271 editor.apply(); | 279 editor.apply(); |
272 | 280 |
273 // Trigger Omaha. | 281 // Trigger Omaha. |
274 mOmahaBase = createOmahaBase(); | 282 mOmahaBase = createOmahaBase(); |
275 mOmahaBase.run(); | 283 mOmahaBase.run(); |
276 | 284 |
277 // Only the regular ping should have been sent. | 285 // Only the regular ping should have been sent. |
278 assertFalse(mDelegate.mInstallEventWasSent); | 286 Assert.assertFalse(mDelegate.mInstallEventWasSent); |
279 assertEquals(1, mDelegate.mPostResults.size()); | 287 Assert.assertEquals(1, mDelegate.mPostResults.size()); |
280 assertEquals(OmahaBase.POST_RESULT_SENT, mDelegate.mPostResults.get(0).i
ntValue()); | 288 Assert.assertEquals(OmahaBase.POST_RESULT_SENT, mDelegate.mPostResults.g
et(0).intValue()); |
281 assertEquals(1, mDelegate.mGenerateAndPostRequestResults.size()); | 289 Assert.assertEquals(1, mDelegate.mGenerateAndPostRequestResults.size()); |
282 assertTrue(mDelegate.mGenerateAndPostRequestResults.get(0)); | 290 Assert.assertTrue(mDelegate.mGenerateAndPostRequestResults.get(0)); |
283 | 291 |
284 // Successful requests mean that the next scheduled event should be chec
king for when the | 292 // Successful requests mean that the next scheduled event should be chec
king for when the |
285 // user is active. | 293 // user is active. |
286 assertEquals(now + OmahaBase.MS_BETWEEN_REQUESTS, mDelegate.mNextSchedul
edTimestamp); | 294 Assert.assertEquals(now + OmahaBase.MS_BETWEEN_REQUESTS, mDelegate.mNext
ScheduledTimestamp); |
287 checkTimestamps(now + OmahaBase.MS_BETWEEN_REQUESTS, now + OmahaBase.MS_
POST_BASE_DELAY, | 295 checkTimestamps(now + OmahaBase.MS_BETWEEN_REQUESTS, now + OmahaBase.MS_
POST_BASE_DELAY, |
288 mDelegate.mTimestampsOnSaveState); | 296 mDelegate.mTimestampsOnSaveState); |
289 } | 297 } |
290 | 298 |
| 299 @Test |
291 @SmallTest | 300 @SmallTest |
292 @Feature({"Omaha"}) | 301 @Feature({"Omaha"}) |
293 public void testTooEarlyToPing() { | 302 public void testTooEarlyToPing() { |
294 final long now = 0; | 303 final long now = 0; |
295 final long later = 10000; | 304 final long later = 10000; |
296 | 305 |
297 mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallS
ource.ORGANIC); | 306 mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallS
ource.ORGANIC); |
298 mDelegate.getScheduler().setCurrentTime(now); | 307 mDelegate.getScheduler().setCurrentTime(now); |
299 | 308 |
300 // Put the time for the next request in the future. | 309 // Put the time for the next request in the future. |
301 SharedPreferences prefs = OmahaBase.getSharedPreferences(mContext); | 310 SharedPreferences prefs = OmahaBase.getSharedPreferences(mContext); |
302 prefs.edit().putLong(OmahaBase.PREF_TIMESTAMP_FOR_NEW_REQUEST, later).ap
ply(); | 311 prefs.edit().putLong(OmahaBase.PREF_TIMESTAMP_FOR_NEW_REQUEST, later).ap
ply(); |
303 | 312 |
304 // Trigger Omaha. | 313 // Trigger Omaha. |
305 mOmahaBase = createOmahaBase(); | 314 mOmahaBase = createOmahaBase(); |
306 mOmahaBase.run(); | 315 mOmahaBase.run(); |
307 | 316 |
308 // Nothing should have been POSTed. | 317 // Nothing should have been POSTed. |
309 assertEquals(0, mDelegate.mPostResults.size()); | 318 Assert.assertEquals(0, mDelegate.mPostResults.size()); |
310 assertEquals(0, mDelegate.mGenerateAndPostRequestResults.size()); | 319 Assert.assertEquals(0, mDelegate.mGenerateAndPostRequestResults.size()); |
311 | 320 |
312 // The next scheduled event is the request generation. Because there wa
s nothing to POST, | 321 // The next scheduled event is the request generation. Because there wa
s nothing to POST, |
313 // its timestamp should have remained unchanged and shouldn't have been
considered when the | 322 // its timestamp should have remained unchanged and shouldn't have been
considered when the |
314 // new alarm was scheduled. | 323 // new alarm was scheduled. |
315 assertEquals(later, mDelegate.mNextScheduledTimestamp); | 324 Assert.assertEquals(later, mDelegate.mNextScheduledTimestamp); |
316 checkTimestamps(later, now, mDelegate.mTimestampsOnSaveState); | 325 checkTimestamps(later, now, mDelegate.mTimestampsOnSaveState); |
317 } | 326 } |
318 | 327 |
| 328 @Test |
319 @SmallTest | 329 @SmallTest |
320 @Feature({"Omaha"}) | 330 @Feature({"Omaha"}) |
321 public void testTooEarlyToPostExistingRequest() { | 331 public void testTooEarlyToPostExistingRequest() { |
322 final long timeGeneratedRequest = 0L; | 332 final long timeGeneratedRequest = 0L; |
323 final long now = 10000L; | 333 final long now = 10000L; |
324 final long timeSendNewPost = 20000L; | 334 final long timeSendNewPost = 20000L; |
325 final long timeSendNewRequest = 50000L; | 335 final long timeSendNewRequest = 50000L; |
326 | 336 |
327 mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallS
ource.ORGANIC); | 337 mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallS
ource.ORGANIC); |
328 mDelegate.getScheduler().setCurrentTime(now); | 338 mDelegate.getScheduler().setCurrentTime(now); |
329 | 339 |
330 SharedPreferences prefs = OmahaBase.getSharedPreferences(mContext); | 340 SharedPreferences prefs = OmahaBase.getSharedPreferences(mContext); |
331 SharedPreferences.Editor editor = prefs.edit(); | 341 SharedPreferences.Editor editor = prefs.edit(); |
332 | 342 |
333 // Make it so that a request was generated and is just waiting to be sen
t. | 343 // Make it so that a request was generated and is just waiting to be sen
t. |
334 editor.putLong(OmahaBase.PREF_TIMESTAMP_FOR_NEW_REQUEST, timeSendNewRequ
est); | 344 editor.putLong(OmahaBase.PREF_TIMESTAMP_FOR_NEW_REQUEST, timeSendNewRequ
est); |
335 editor.putLong(OmahaBase.PREF_TIMESTAMP_OF_REQUEST, timeGeneratedRequest
); | 345 editor.putLong(OmahaBase.PREF_TIMESTAMP_OF_REQUEST, timeGeneratedRequest
); |
336 editor.putString(OmahaBase.PREF_PERSISTED_REQUEST_ID, "persisted_id"); | 346 editor.putString(OmahaBase.PREF_PERSISTED_REQUEST_ID, "persisted_id"); |
337 | 347 |
338 // Put the time for the next post in the future. | 348 // Put the time for the next post in the future. |
339 editor.putLong(OmahaBase.PREF_TIMESTAMP_FOR_NEXT_POST_ATTEMPT, timeSendN
ewPost); | 349 editor.putLong(OmahaBase.PREF_TIMESTAMP_FOR_NEXT_POST_ATTEMPT, timeSendN
ewPost); |
340 editor.apply(); | 350 editor.apply(); |
341 | 351 |
342 // Trigger Omaha. | 352 // Trigger Omaha. |
343 mOmahaBase = createOmahaBase(); | 353 mOmahaBase = createOmahaBase(); |
344 mOmahaBase.run(); | 354 mOmahaBase.run(); |
345 | 355 |
346 // Request generation code should be skipped. | 356 // Request generation code should be skipped. |
347 assertNull(mDelegate.mTimestampsOnRegisterNewRequest); | 357 Assert.assertNull(mDelegate.mTimestampsOnRegisterNewRequest); |
348 | 358 |
349 // Should be too early to post, causing it to be rescheduled. | 359 // Should be too early to post, causing it to be rescheduled. |
350 assertEquals(1, mDelegate.mPostResults.size()); | 360 Assert.assertEquals(1, mDelegate.mPostResults.size()); |
351 assertEquals(OmahaBase.POST_RESULT_SCHEDULED, mDelegate.mPostResults.get
(0).intValue()); | 361 Assert.assertEquals( |
352 assertEquals(0, mDelegate.mGenerateAndPostRequestResults.size()); | 362 OmahaBase.POST_RESULT_SCHEDULED, mDelegate.mPostResults.get(0).i
ntValue()); |
| 363 Assert.assertEquals(0, mDelegate.mGenerateAndPostRequestResults.size()); |
353 | 364 |
354 // The next scheduled event is the POST. Because request generation cod
e wasn't run, the | 365 // The next scheduled event is the POST. Because request generation cod
e wasn't run, the |
355 // timestamp for it shouldn't have changed. | 366 // timestamp for it shouldn't have changed. |
356 assertEquals(timeSendNewPost, mDelegate.mNextScheduledTimestamp); | 367 Assert.assertEquals(timeSendNewPost, mDelegate.mNextScheduledTimestamp); |
357 checkTimestamps(timeSendNewRequest, timeSendNewPost, mDelegate.mTimestam
psOnSaveState); | 368 checkTimestamps(timeSendNewRequest, timeSendNewPost, mDelegate.mTimestam
psOnSaveState); |
358 } | 369 } |
359 | 370 |
| 371 @Test |
360 @SmallTest | 372 @SmallTest |
361 @Feature({"Omaha"}) | 373 @Feature({"Omaha"}) |
362 public void testPostExistingRequestSuccessfully() { | 374 public void testPostExistingRequestSuccessfully() { |
363 final long timeGeneratedRequest = 0L; | 375 final long timeGeneratedRequest = 0L; |
364 final long now = 10000L; | 376 final long now = 10000L; |
365 final long timeSendNewPost = now; | 377 final long timeSendNewPost = now; |
366 final long timeRegisterNewRequest = 20000L; | 378 final long timeRegisterNewRequest = 20000L; |
367 | 379 |
368 mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallS
ource.ORGANIC); | 380 mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallS
ource.ORGANIC); |
369 mDelegate.getScheduler().setCurrentTime(now); | 381 mDelegate.getScheduler().setCurrentTime(now); |
370 | 382 |
371 SharedPreferences prefs = OmahaBase.getSharedPreferences(mContext); | 383 SharedPreferences prefs = OmahaBase.getSharedPreferences(mContext); |
372 SharedPreferences.Editor editor = prefs.edit(); | 384 SharedPreferences.Editor editor = prefs.edit(); |
373 | 385 |
374 // Make it so that a regular <ping> was generated and is just waiting to
be sent. | 386 // Make it so that a regular <ping> was generated and is just waiting to
be sent. |
375 editor.putBoolean(OmahaBase.PREF_SEND_INSTALL_EVENT, false); | 387 editor.putBoolean(OmahaBase.PREF_SEND_INSTALL_EVENT, false); |
376 editor.putLong(OmahaBase.PREF_TIMESTAMP_FOR_NEW_REQUEST, timeRegisterNew
Request); | 388 editor.putLong(OmahaBase.PREF_TIMESTAMP_FOR_NEW_REQUEST, timeRegisterNew
Request); |
377 editor.putLong(OmahaBase.PREF_TIMESTAMP_OF_REQUEST, timeGeneratedRequest
); | 389 editor.putLong(OmahaBase.PREF_TIMESTAMP_OF_REQUEST, timeGeneratedRequest
); |
378 editor.putString(OmahaBase.PREF_PERSISTED_REQUEST_ID, "persisted_id"); | 390 editor.putString(OmahaBase.PREF_PERSISTED_REQUEST_ID, "persisted_id"); |
379 | 391 |
380 // Send the POST now. | 392 // Send the POST now. |
381 editor.putLong(OmahaBase.PREF_TIMESTAMP_FOR_NEXT_POST_ATTEMPT, timeSendN
ewPost); | 393 editor.putLong(OmahaBase.PREF_TIMESTAMP_FOR_NEXT_POST_ATTEMPT, timeSendN
ewPost); |
382 editor.apply(); | 394 editor.apply(); |
383 | 395 |
384 // Trigger Omaha. | 396 // Trigger Omaha. |
385 mOmahaBase = createOmahaBase(); | 397 mOmahaBase = createOmahaBase(); |
386 mOmahaBase.run(); | 398 mOmahaBase.run(); |
387 | 399 |
388 // Registering code shouldn't have fired. | 400 // Registering code shouldn't have fired. |
389 assertNull(mDelegate.mTimestampsOnRegisterNewRequest); | 401 Assert.assertNull(mDelegate.mTimestampsOnRegisterNewRequest); |
390 | 402 |
391 // Because we didn't send an install event, only one POST should have oc
curred. | 403 // Because we didn't send an install event, only one POST should have oc
curred. |
392 assertEquals(1, mDelegate.mPostResults.size()); | 404 Assert.assertEquals(1, mDelegate.mPostResults.size()); |
393 assertEquals(OmahaBase.POST_RESULT_SENT, mDelegate.mPostResults.get(0).i
ntValue()); | 405 Assert.assertEquals(OmahaBase.POST_RESULT_SENT, mDelegate.mPostResults.g
et(0).intValue()); |
394 assertEquals(1, mDelegate.mGenerateAndPostRequestResults.size()); | 406 Assert.assertEquals(1, mDelegate.mGenerateAndPostRequestResults.size()); |
395 assertTrue(mDelegate.mGenerateAndPostRequestResults.get(0)); | 407 Assert.assertTrue(mDelegate.mGenerateAndPostRequestResults.get(0)); |
396 | 408 |
397 // The next scheduled event is the request generation because there is n
othing to POST. | 409 // The next scheduled event is the request generation because there is n
othing to POST. |
398 // A successful POST adjusts all timestamps for the current time. | 410 // A successful POST adjusts all timestamps for the current time. |
399 assertEquals(timeRegisterNewRequest, mDelegate.mNextScheduledTimestamp); | 411 Assert.assertEquals(timeRegisterNewRequest, mDelegate.mNextScheduledTime
stamp); |
400 checkTimestamps(now + OmahaBase.MS_BETWEEN_REQUESTS, now + OmahaBase.MS_
POST_BASE_DELAY, | 412 checkTimestamps(now + OmahaBase.MS_BETWEEN_REQUESTS, now + OmahaBase.MS_
POST_BASE_DELAY, |
401 mDelegate.mTimestampsOnSaveState); | 413 mDelegate.mTimestampsOnSaveState); |
402 } | 414 } |
403 | 415 |
| 416 @Test |
404 @SmallTest | 417 @SmallTest |
405 @Feature({"Omaha"}) | 418 @Feature({"Omaha"}) |
406 public void testPostExistingButFails() { | 419 public void testPostExistingButFails() { |
407 final long timeGeneratedRequest = 0L; | 420 final long timeGeneratedRequest = 0L; |
408 final long now = 10000L; | 421 final long now = 10000L; |
409 final long timeSendNewPost = now; | 422 final long timeSendNewPost = now; |
410 final long timeRegisterNewRequest = timeGeneratedRequest + OmahaBase.MS_
BETWEEN_REQUESTS; | 423 final long timeRegisterNewRequest = timeGeneratedRequest + OmahaBase.MS_
BETWEEN_REQUESTS; |
411 | 424 |
412 mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallS
ource.ORGANIC); | 425 mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallS
ource.ORGANIC); |
413 mDelegate.getScheduler().setCurrentTime(now); | 426 mDelegate.getScheduler().setCurrentTime(now); |
(...skipping 10 matching lines...) Expand all Loading... |
424 // Send the POST now. | 437 // Send the POST now. |
425 editor.putLong(OmahaBase.PREF_TIMESTAMP_FOR_NEXT_POST_ATTEMPT, timeSendN
ewPost); | 438 editor.putLong(OmahaBase.PREF_TIMESTAMP_FOR_NEXT_POST_ATTEMPT, timeSendN
ewPost); |
426 editor.apply(); | 439 editor.apply(); |
427 | 440 |
428 // Trigger Omaha. | 441 // Trigger Omaha. |
429 mOmahaBase = createOmahaBase( | 442 mOmahaBase = createOmahaBase( |
430 ServerResponse.FAILURE, ConnectionStatus.RESPONDS, DeviceType.HA
NDSET); | 443 ServerResponse.FAILURE, ConnectionStatus.RESPONDS, DeviceType.HA
NDSET); |
431 mOmahaBase.run(); | 444 mOmahaBase.run(); |
432 | 445 |
433 // Registering code shouldn't have fired. | 446 // Registering code shouldn't have fired. |
434 assertNull(mDelegate.mTimestampsOnRegisterNewRequest); | 447 Assert.assertNull(mDelegate.mTimestampsOnRegisterNewRequest); |
435 | 448 |
436 // Because we didn't send an install event, only one POST should have oc
curred. | 449 // Because we didn't send an install event, only one POST should have oc
curred. |
437 assertEquals(1, mDelegate.mPostResults.size()); | 450 Assert.assertEquals(1, mDelegate.mPostResults.size()); |
438 assertEquals(OmahaBase.POST_RESULT_FAILED, mDelegate.mPostResults.get(0)
.intValue()); | 451 Assert.assertEquals(OmahaBase.POST_RESULT_FAILED, mDelegate.mPostResults
.get(0).intValue()); |
439 assertEquals(1, mDelegate.mGenerateAndPostRequestResults.size()); | 452 Assert.assertEquals(1, mDelegate.mGenerateAndPostRequestResults.size()); |
440 assertFalse(mDelegate.mGenerateAndPostRequestResults.get(0)); | 453 Assert.assertFalse(mDelegate.mGenerateAndPostRequestResults.get(0)); |
441 | 454 |
442 // The next scheduled event should be the POST event, which is delayed b
y the base delay | 455 // The next scheduled event should be the POST event, which is delayed b
y the base delay |
443 // because no failures have happened yet. | 456 // because no failures have happened yet. |
444 assertEquals(mDelegate.mTimestampsOnSaveState.timestampNextPost, | 457 Assert.assertEquals(mDelegate.mTimestampsOnSaveState.timestampNextPost, |
445 mDelegate.mNextScheduledTimestamp); | 458 mDelegate.mNextScheduledTimestamp); |
446 checkTimestamps(timeRegisterNewRequest, now + OmahaBase.MS_POST_BASE_DEL
AY, | 459 checkTimestamps(timeRegisterNewRequest, now + OmahaBase.MS_POST_BASE_DEL
AY, |
447 mDelegate.mTimestampsOnSaveState); | 460 mDelegate.mTimestampsOnSaveState); |
448 } | 461 } |
449 | 462 |
| 463 @Test |
450 @SmallTest | 464 @SmallTest |
451 @Feature({"Omaha"}) | 465 @Feature({"Omaha"}) |
452 public void testTimestampWithinBounds() { | 466 public void testTimestampWithinBounds() { |
453 final long now = 0L; | 467 final long now = 0L; |
454 final long timeRegisterNewRequest = OmahaBase.MS_BETWEEN_REQUESTS + 1; | 468 final long timeRegisterNewRequest = OmahaBase.MS_BETWEEN_REQUESTS + 1; |
455 | 469 |
456 mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallS
ource.ORGANIC); | 470 mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallS
ource.ORGANIC); |
457 mDelegate.getScheduler().setCurrentTime(now); | 471 mDelegate.getScheduler().setCurrentTime(now); |
458 | 472 |
459 SharedPreferences prefs = OmahaBase.getSharedPreferences(mContext); | 473 SharedPreferences prefs = OmahaBase.getSharedPreferences(mContext); |
460 SharedPreferences.Editor editor = prefs.edit(); | 474 SharedPreferences.Editor editor = prefs.edit(); |
461 | 475 |
462 // Indicate that the next request should be generated way past an expect
ed timeframe. | 476 // Indicate that the next request should be generated way past an expect
ed timeframe. |
463 editor.putBoolean(OmahaBase.PREF_SEND_INSTALL_EVENT, false); | 477 editor.putBoolean(OmahaBase.PREF_SEND_INSTALL_EVENT, false); |
464 editor.putLong(OmahaBase.PREF_TIMESTAMP_FOR_NEW_REQUEST, timeRegisterNew
Request); | 478 editor.putLong(OmahaBase.PREF_TIMESTAMP_FOR_NEW_REQUEST, timeRegisterNew
Request); |
465 editor.apply(); | 479 editor.apply(); |
466 | 480 |
467 // Trigger Omaha. | 481 // Trigger Omaha. |
468 mOmahaBase = createOmahaBase(); | 482 mOmahaBase = createOmahaBase(); |
469 mOmahaBase.run(); | 483 mOmahaBase.run(); |
470 | 484 |
471 // Request generation code should fire. | 485 // Request generation code should fire. |
472 assertNotNull(mDelegate.mTimestampsOnRegisterNewRequest); | 486 Assert.assertNotNull(mDelegate.mTimestampsOnRegisterNewRequest); |
473 | 487 |
474 // Because we didn't send an install event, only one POST should have oc
curred. | 488 // Because we didn't send an install event, only one POST should have oc
curred. |
475 assertEquals(1, mDelegate.mPostResults.size()); | 489 Assert.assertEquals(1, mDelegate.mPostResults.size()); |
476 assertEquals(OmahaBase.POST_RESULT_SENT, mDelegate.mPostResults.get(0).i
ntValue()); | 490 Assert.assertEquals(OmahaBase.POST_RESULT_SENT, mDelegate.mPostResults.g
et(0).intValue()); |
477 assertEquals(1, mDelegate.mGenerateAndPostRequestResults.size()); | 491 Assert.assertEquals(1, mDelegate.mGenerateAndPostRequestResults.size()); |
478 assertTrue(mDelegate.mGenerateAndPostRequestResults.get(0)); | 492 Assert.assertTrue(mDelegate.mGenerateAndPostRequestResults.get(0)); |
479 | 493 |
480 // The next scheduled event should be the timestamp for a new request ge
neration. | 494 // The next scheduled event should be the timestamp for a new request ge
neration. |
481 assertEquals(mDelegate.mTimestampsOnSaveState.timestampNextRequest, | 495 Assert.assertEquals(mDelegate.mTimestampsOnSaveState.timestampNextReques
t, |
482 mDelegate.mNextScheduledTimestamp); | 496 mDelegate.mNextScheduledTimestamp); |
483 checkTimestamps(now + OmahaBase.MS_BETWEEN_REQUESTS, now + OmahaBase.MS_
POST_BASE_DELAY, | 497 checkTimestamps(now + OmahaBase.MS_BETWEEN_REQUESTS, now + OmahaBase.MS_
POST_BASE_DELAY, |
484 mDelegate.mTimestampsOnSaveState); | 498 mDelegate.mTimestampsOnSaveState); |
485 } | 499 } |
486 | 500 |
| 501 @Test |
487 @SmallTest | 502 @SmallTest |
488 @Feature({"Omaha"}) | 503 @Feature({"Omaha"}) |
489 public void testOverdueRequestCausesNewRegistration() { | 504 public void testOverdueRequestCausesNewRegistration() { |
490 final long timeGeneratedRequest = 0L; | 505 final long timeGeneratedRequest = 0L; |
491 final long now = 10000L; | 506 final long now = 10000L; |
492 final long timeSendNewPost = now; | 507 final long timeSendNewPost = now; |
493 final long timeRegisterNewRequest = | 508 final long timeRegisterNewRequest = |
494 timeGeneratedRequest + OmahaBase.MS_BETWEEN_REQUESTS * 5; | 509 timeGeneratedRequest + OmahaBase.MS_BETWEEN_REQUESTS * 5; |
495 | 510 |
496 mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallS
ource.ORGANIC); | 511 mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallS
ource.ORGANIC); |
(...skipping 12 matching lines...) Expand all Loading... |
509 | 524 |
510 // Trigger Omaha. | 525 // Trigger Omaha. |
511 mOmahaBase = createOmahaBase(); | 526 mOmahaBase = createOmahaBase(); |
512 mOmahaBase.run(); | 527 mOmahaBase.run(); |
513 | 528 |
514 // Registering code shouldn't have fired. | 529 // Registering code shouldn't have fired. |
515 checkTimestamps(now + OmahaBase.MS_BETWEEN_REQUESTS, now, | 530 checkTimestamps(now + OmahaBase.MS_BETWEEN_REQUESTS, now, |
516 mDelegate.mTimestampsOnRegisterNewRequest); | 531 mDelegate.mTimestampsOnRegisterNewRequest); |
517 | 532 |
518 // Because we didn't send an install event, only one POST should have oc
curred. | 533 // Because we didn't send an install event, only one POST should have oc
curred. |
519 assertEquals(1, mDelegate.mPostResults.size()); | 534 Assert.assertEquals(1, mDelegate.mPostResults.size()); |
520 assertEquals(OmahaBase.POST_RESULT_SENT, mDelegate.mPostResults.get(0).i
ntValue()); | 535 Assert.assertEquals(OmahaBase.POST_RESULT_SENT, mDelegate.mPostResults.g
et(0).intValue()); |
521 assertEquals(1, mDelegate.mGenerateAndPostRequestResults.size()); | 536 Assert.assertEquals(1, mDelegate.mGenerateAndPostRequestResults.size()); |
522 assertTrue(mDelegate.mGenerateAndPostRequestResults.get(0)); | 537 Assert.assertTrue(mDelegate.mGenerateAndPostRequestResults.get(0)); |
523 | 538 |
524 // The next scheduled event should be the registration event. | 539 // The next scheduled event should be the registration event. |
525 assertEquals(mDelegate.mTimestampsOnSaveState.timestampNextRequest, | 540 Assert.assertEquals(mDelegate.mTimestampsOnSaveState.timestampNextReques
t, |
526 mDelegate.mNextScheduledTimestamp); | 541 mDelegate.mNextScheduledTimestamp); |
527 checkTimestamps(now + OmahaBase.MS_BETWEEN_REQUESTS, now + OmahaBase.MS_
POST_BASE_DELAY, | 542 checkTimestamps(now + OmahaBase.MS_BETWEEN_REQUESTS, now + OmahaBase.MS_
POST_BASE_DELAY, |
528 mDelegate.mTimestampsOnSaveState); | 543 mDelegate.mTimestampsOnSaveState); |
529 } | 544 } |
530 | 545 |
531 private void checkTimestamps( | 546 private void checkTimestamps( |
532 long expectedRequestTimestamp, long expectedPostTimestamp, Timestamp
Pair timestamps) { | 547 long expectedRequestTimestamp, long expectedPostTimestamp, Timestamp
Pair timestamps) { |
533 assertEquals(expectedRequestTimestamp, timestamps.timestampNextRequest); | 548 Assert.assertEquals(expectedRequestTimestamp, timestamps.timestampNextRe
quest); |
534 assertEquals(expectedPostTimestamp, timestamps.timestampNextPost); | 549 Assert.assertEquals(expectedPostTimestamp, timestamps.timestampNextPost)
; |
535 } | 550 } |
536 | 551 |
537 /** | 552 /** |
538 * Simulates communication with the actual Omaha server. | 553 * Simulates communication with the actual Omaha server. |
539 */ | 554 */ |
540 private static class MockConnection extends HttpURLConnection { | 555 private static class MockConnection extends HttpURLConnection { |
541 // Omaha appends a "/" to the URL. | 556 // Omaha appends a "/" to the URL. |
542 private static final String STRIPPED_MARKET_URL = | 557 private static final String STRIPPED_MARKET_URL = |
543 "https://market.android.com/details?id=com.google.android.apps.c
hrome"; | 558 "https://market.android.com/details?id=com.google.android.apps.c
hrome"; |
544 private static final String MARKET_URL = STRIPPED_MARKET_URL + "/"; | 559 private static final String MARKET_URL = STRIPPED_MARKET_URL + "/"; |
(...skipping 10 matching lines...) Expand all Loading... |
555 private int mContentLength; | 570 private int mContentLength; |
556 private int mNumTimesResponseCodeRetrieved; | 571 private int mNumTimesResponseCodeRetrieved; |
557 private boolean mSentRequest; | 572 private boolean mSentRequest; |
558 private boolean mGotInputStream; | 573 private boolean mGotInputStream; |
559 private String mRequestPropertyField; | 574 private String mRequestPropertyField; |
560 private String mRequestPropertyValue; | 575 private String mRequestPropertyValue; |
561 | 576 |
562 MockConnection(URL url, boolean usingTablet, boolean sendValidResponse, | 577 MockConnection(URL url, boolean usingTablet, boolean sendValidResponse, |
563 boolean sendInstallEvent, boolean connectionTimesOut) { | 578 boolean sendInstallEvent, boolean connectionTimesOut) { |
564 super(url); | 579 super(url); |
565 assertEquals(MockRequestGenerator.SERVER_URL, url.toString()); | 580 Assert.assertEquals(MockRequestGenerator.SERVER_URL, url.toString())
; |
566 | 581 |
567 String mockResponse = buildServerResponseString(usingTablet, sendIns
tallEvent); | 582 String mockResponse = buildServerResponseString(usingTablet, sendIns
tallEvent); |
568 mOutputStream = new ByteArrayOutputStream(); | 583 mOutputStream = new ByteArrayOutputStream(); |
569 mServerResponse = new ByteArrayInputStream(mockResponse.getBytes()); | 584 mServerResponse = new ByteArrayInputStream(mockResponse.getBytes()); |
570 mConnectionTimesOut = connectionTimesOut; | 585 mConnectionTimesOut = connectionTimesOut; |
571 | 586 |
572 if (sendValidResponse) { | 587 if (sendValidResponse) { |
573 mHTTPResponseCode = 200; | 588 mHTTPResponseCode = 200; |
574 } else { | 589 } else { |
575 mHTTPResponseCode = 404; | 590 mHTTPResponseCode = 404; |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
621 if (mConnectionTimesOut) { | 636 if (mConnectionTimesOut) { |
622 throw new SocketTimeoutException("Connection timed out."); | 637 throw new SocketTimeoutException("Connection timed out."); |
623 } | 638 } |
624 } | 639 } |
625 | 640 |
626 @Override | 641 @Override |
627 public void disconnect() {} | 642 public void disconnect() {} |
628 | 643 |
629 @Override | 644 @Override |
630 public void setDoOutput(boolean value) throws IllegalAccessError { | 645 public void setDoOutput(boolean value) throws IllegalAccessError { |
631 assertTrue("Told the HTTPUrlConnection to send no request.", value); | 646 Assert.assertTrue("Told the HTTPUrlConnection to send no request.",
value); |
632 } | 647 } |
633 | 648 |
634 @Override | 649 @Override |
635 public void setFixedLengthStreamingMode(int contentLength) { | 650 public void setFixedLengthStreamingMode(int contentLength) { |
636 mContentLength = contentLength; | 651 mContentLength = contentLength; |
637 } | 652 } |
638 | 653 |
639 @Override | 654 @Override |
640 public int getResponseCode() { | 655 public int getResponseCode() { |
641 if (mNumTimesResponseCodeRetrieved == 0) { | 656 if (mNumTimesResponseCodeRetrieved == 0) { |
642 // The output stream should now have the generated XML for the r
equest. | 657 // The output stream should now have the generated XML for the r
equest. |
643 // Check if its length is correct. | 658 // Check if its length is correct. |
644 assertEquals("Expected OmahaBase to write out certain number of
bytes", | 659 Assert.assertEquals("Expected OmahaBase to write out certain num
ber of bytes", |
645 mContentLength, mOutputStream.toByteArray().length); | 660 mContentLength, mOutputStream.toByteArray().length); |
646 } | 661 } |
647 assertTrue("Tried to retrieve response code more than twice", | 662 Assert.assertTrue("Tried to retrieve response code more than twice", |
648 mNumTimesResponseCodeRetrieved < 2); | 663 mNumTimesResponseCodeRetrieved < 2); |
649 mNumTimesResponseCodeRetrieved++; | 664 mNumTimesResponseCodeRetrieved++; |
650 return mHTTPResponseCode; | 665 return mHTTPResponseCode; |
651 } | 666 } |
652 | 667 |
653 @Override | 668 @Override |
654 public OutputStream getOutputStream() throws IOException { | 669 public OutputStream getOutputStream() throws IOException { |
655 mSentRequest = true; | 670 mSentRequest = true; |
656 connect(); | 671 connect(); |
657 return mOutputStream; | 672 return mOutputStream; |
658 } | 673 } |
659 | 674 |
660 public String getOutputStreamContents() { | 675 public String getOutputStreamContents() { |
661 return mOutputStream.toString(); | 676 return mOutputStream.toString(); |
662 } | 677 } |
663 | 678 |
664 @Override | 679 @Override |
665 public InputStream getInputStream() { | 680 public InputStream getInputStream() { |
666 assertTrue("Tried to read server response without sending request.",
mSentRequest); | 681 Assert.assertTrue( |
| 682 "Tried to read server response without sending request.", mS
entRequest); |
667 mGotInputStream = true; | 683 mGotInputStream = true; |
668 return mServerResponse; | 684 return mServerResponse; |
669 } | 685 } |
670 | 686 |
671 @Override | 687 @Override |
672 public void addRequestProperty(String field, String newValue) { | 688 public void addRequestProperty(String field, String newValue) { |
673 mRequestPropertyField = field; | 689 mRequestPropertyField = field; |
674 mRequestPropertyValue = newValue; | 690 mRequestPropertyValue = newValue; |
675 } | 691 } |
676 | 692 |
(...skipping 11 matching lines...) Expand all Loading... |
688 | 704 |
689 public String getRequestPropertyField() { | 705 public String getRequestPropertyField() { |
690 return mRequestPropertyField; | 706 return mRequestPropertyField; |
691 } | 707 } |
692 | 708 |
693 public String getRequestPropertyValue() { | 709 public String getRequestPropertyValue() { |
694 return mRequestPropertyValue; | 710 return mRequestPropertyValue; |
695 } | 711 } |
696 } | 712 } |
697 } | 713 } |
OLD | NEW |