168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller/* 268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * Copyright (C) 2017 The Android Open Source Project 368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * 468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * Licensed under the Apache License, Version 2.0 (the "License"); 568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * you may not use this file except in compliance with the License. 668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * You may obtain a copy of the License at 768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * 868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * http://www.apache.org/licenses/LICENSE-2.0 968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * 1068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * Unless required by applicable law or agreed to in writing, software 1168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * distributed under the License is distributed on an "AS IS" BASIS, 1268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * See the License for the specific language governing permissions and 1468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * limitations under the License. 1568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller */ 1668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 1768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fullerpackage com.android.server.timezone; 1868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 1968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fullerimport org.hamcrest.BaseMatcher; 2068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fullerimport org.hamcrest.Description; 2168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fullerimport org.hamcrest.Matcher; 2268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fullerimport org.junit.After; 2368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fullerimport org.junit.Before; 2468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fullerimport org.junit.Test; 2568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 2668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fullerimport android.app.timezone.RulesUpdaterContract; 2768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fullerimport android.content.Context; 2868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fullerimport android.content.Intent; 2968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fullerimport android.provider.TimeZoneRulesDataContract; 3068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fullerimport android.support.test.InstrumentationRegistry; 3168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fullerimport android.support.test.filters.SmallTest; 3268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 333582259c72476c55b60f49da1c7f1338b6683249Neil Fullerimport java.io.File; 3487b1128ddc44afeafb946a32d63abef68d8b3dc1Neil Fullerimport java.io.PrintWriter; 3587b1128ddc44afeafb946a32d63abef68d8b3dc1Neil Fullerimport java.io.StringWriter; 36a7d21f8c321ae7149b68625a5c8502abe005ed7bNeil Fullerimport java.time.Clock; 37a7d21f8c321ae7149b68625a5c8502abe005ed7bNeil Fullerimport java.time.Instant; 38a7d21f8c321ae7149b68625a5c8502abe005ed7bNeil Fullerimport java.time.ZoneId; 3987b1128ddc44afeafb946a32d63abef68d8b3dc1Neil Fuller 4068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fullerimport static org.junit.Assert.assertEquals; 4168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fullerimport static org.junit.Assert.assertFalse; 4268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fullerimport static org.junit.Assert.assertNotNull; 4368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fullerimport static org.junit.Assert.assertNull; 4468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fullerimport static org.junit.Assert.assertTrue; 4568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fullerimport static org.junit.Assert.fail; 4668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fullerimport static org.mockito.Mockito.eq; 4768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fullerimport static org.mockito.Mockito.mock; 4868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fullerimport static org.mockito.Mockito.when; 4968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fullerimport static org.mockito.hamcrest.MockitoHamcrest.argThat; 5068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 5168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller/** 5268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * White box interaction / unit testing of the {@link PackageTracker}. 5368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller */ 5468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller@SmallTest 5568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fullerpublic class PackageTrackerTest { 5668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private static final String UPDATE_APP_PACKAGE_NAME = "updateAppPackageName"; 5768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private static final String DATA_APP_PACKAGE_NAME = "dataAppPackageName"; 5868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private static final PackageVersions INITIAL_APP_PACKAGE_VERSIONS = 5968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller new PackageVersions(2 /* updateAppVersion */, 2 /* dataAppVersion */); 6068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 6168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private ConfigHelper mMockConfigHelper; 6268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private PackageManagerHelper mMockPackageManagerHelper; 6368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 64a7d21f8c321ae7149b68625a5c8502abe005ed7bNeil Fuller private FakeClock mFakeClock; 6568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private FakeIntentHelper mFakeIntentHelper; 6668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private PackageStatusStorage mPackageStatusStorage; 6768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private PackageTracker mPackageTracker; 6868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 6968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Before 7068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void setUp() throws Exception { 7168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller Context context = InstrumentationRegistry.getContext(); 7268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 73a7d21f8c321ae7149b68625a5c8502abe005ed7bNeil Fuller mFakeClock = new FakeClock(); 7468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 7568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Read-only interfaces so are easy to mock. 7668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mMockConfigHelper = mock(ConfigHelper.class); 7768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mMockPackageManagerHelper = mock(PackageManagerHelper.class); 7868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 7968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Using the instrumentation context means the database is created in a test app-specific 8068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // directory. We can use the real thing for this test. 815f6750f9d16d579635f15c0edf507ba42c9d1118Neil Fuller mPackageStatusStorage = new PackageStatusStorage(context.getFilesDir()); 8268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 8368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // For other interactions with the Android framework we create a fake object. 8468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mFakeIntentHelper = new FakeIntentHelper(); 8568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 8668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Create the PackageTracker to use in tests. 8768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageTracker = new PackageTracker( 8868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mFakeClock, 8968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mMockConfigHelper, 9068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mMockPackageManagerHelper, 9168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageStatusStorage, 9268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mFakeIntentHelper); 9368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 9468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 9568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @After 9668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void tearDown() throws Exception { 9768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller if (mPackageStatusStorage != null) { 985f6750f9d16d579635f15c0edf507ba42c9d1118Neil Fuller mPackageStatusStorage.deleteFileForTests(); 9968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 10068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 10168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 10268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Test 10368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void trackingDisabled_intentHelperNotUsed() { 10468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Set up device configuration. 10568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureTrackingDisabled(); 10668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 10768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Initialize the tracker. 1083582259c72476c55b60f49da1c7f1338b6683249Neil Fuller assertFalse(mPackageTracker.start()); 10968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 11068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the IntentHelper was not initialized. 11168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mFakeIntentHelper.assertNotInitialized(); 11268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 11368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check reliability triggering state. 114cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mFakeIntentHelper.assertReliabilityTriggerNotScheduled(); 11568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 11668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 11768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Test 11868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void trackingDisabled_triggerUpdateIfNeededNotAllowed() { 11968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Set up device configuration. 12068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureTrackingDisabled(); 12168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 12268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Initialize the tracker. 1233582259c72476c55b60f49da1c7f1338b6683249Neil Fuller assertFalse(mPackageTracker.start()); 12468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 12568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check reliability triggering state. 126cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mFakeIntentHelper.assertReliabilityTriggerNotScheduled(); 12768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 12868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller try { 12968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // This call should also not be allowed and will throw an exception if tracking is 13068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // disabled. 13168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageTracker.triggerUpdateIfNeeded(true); 13268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller fail(); 13368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } catch (IllegalStateException expected) {} 13468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 13568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check reliability triggering state. 136cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mFakeIntentHelper.assertReliabilityTriggerNotScheduled(); 13768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 13868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 13968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Test 14068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void trackingDisabled_unsolicitedResultsIgnored_withoutToken() { 14168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Set up device configuration. 14268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureTrackingDisabled(); 14368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 14468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Initialize the tracker. 1453582259c72476c55b60f49da1c7f1338b6683249Neil Fuller assertFalse(mPackageTracker.start()); 14668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 14768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check reliability triggering state. 148cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mFakeIntentHelper.assertReliabilityTriggerNotScheduled(); 14968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 15068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Receiving a check result when tracking is disabled should cause the storage to be 15168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // reset. 15268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageTracker.recordCheckResult(null /* checkToken */, true /* success */); 15368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 15468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check reliability triggering state. 155cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mFakeIntentHelper.assertReliabilityTriggerNotScheduled(); 15668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 15768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Assert the storage was reset. 15868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkPackageStorageStatusIsInitialOrReset(); 15968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 16068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 16168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Test 16268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void trackingDisabled_unsolicitedResultsIgnored_withToken() { 16368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Set up device configuration. 16468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureTrackingDisabled(); 16568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 16668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Set the storage into an arbitrary state so we can detect a reset. 16768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageStatusStorage.generateCheckToken(INITIAL_APP_PACKAGE_VERSIONS); 16868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 16968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Initialize the tracker. 1703582259c72476c55b60f49da1c7f1338b6683249Neil Fuller assertFalse(mPackageTracker.start()); 17168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 17268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check reliability triggering state. 173cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mFakeIntentHelper.assertReliabilityTriggerNotScheduled(); 17468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 17568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Receiving a check result when tracking is disabled should cause the storage to be reset. 17668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageTracker.recordCheckResult(createArbitraryCheckToken(), true /* success */); 17768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 17868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check reliability triggering state. 179cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mFakeIntentHelper.assertReliabilityTriggerNotScheduled(); 18068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 18168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Assert the storage was reset. 18268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkPackageStorageStatusIsInitialOrReset(); 18368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 18468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 18568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Test 18668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void trackingEnabled_updateAppConfigMissing() throws Exception { 18768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Set up device configuration. 18868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureTrackingEnabled(); 18968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureReliabilityConfigSettingsOk(); 19068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureUpdateAppPackageNameMissing(); 19168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureDataAppPackageOk(DATA_APP_PACKAGE_NAME); 19268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 19368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller try { 19468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Initialize the tracker. 19568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageTracker.start(); 19668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller fail(); 19768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } catch (RuntimeException expected) {} 19868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 19968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mFakeIntentHelper.assertNotInitialized(); 20068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 20168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check reliability triggering state. 202cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mFakeIntentHelper.assertReliabilityTriggerNotScheduled(); 20368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 20468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 20529ff71baa481a687a71276d2683774a0281aff43Neil Fuller @Test 20629ff71baa481a687a71276d2683774a0281aff43Neil Fuller public void trackingEnabled_updateAppNotPrivileged() throws Exception { 20729ff71baa481a687a71276d2683774a0281aff43Neil Fuller // Set up device configuration. 20829ff71baa481a687a71276d2683774a0281aff43Neil Fuller configureTrackingEnabled(); 20929ff71baa481a687a71276d2683774a0281aff43Neil Fuller configureReliabilityConfigSettingsOk(); 21029ff71baa481a687a71276d2683774a0281aff43Neil Fuller configureUpdateAppPackageNotPrivileged(UPDATE_APP_PACKAGE_NAME); 21129ff71baa481a687a71276d2683774a0281aff43Neil Fuller configureDataAppPackageOk(DATA_APP_PACKAGE_NAME); 21229ff71baa481a687a71276d2683774a0281aff43Neil Fuller 21329ff71baa481a687a71276d2683774a0281aff43Neil Fuller try { 21429ff71baa481a687a71276d2683774a0281aff43Neil Fuller // Initialize the tracker. 21529ff71baa481a687a71276d2683774a0281aff43Neil Fuller mPackageTracker.start(); 21629ff71baa481a687a71276d2683774a0281aff43Neil Fuller fail(); 21729ff71baa481a687a71276d2683774a0281aff43Neil Fuller } catch (RuntimeException expected) {} 21829ff71baa481a687a71276d2683774a0281aff43Neil Fuller 21929ff71baa481a687a71276d2683774a0281aff43Neil Fuller mFakeIntentHelper.assertNotInitialized(); 22029ff71baa481a687a71276d2683774a0281aff43Neil Fuller 22129ff71baa481a687a71276d2683774a0281aff43Neil Fuller // Check reliability triggering state. 222cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mFakeIntentHelper.assertReliabilityTriggerNotScheduled(); 22329ff71baa481a687a71276d2683774a0281aff43Neil Fuller } 22468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 22568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Test 22668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void trackingEnabled_dataAppConfigMissing() throws Exception { 22768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Set up device configuration. 22868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureTrackingEnabled(); 22968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureReliabilityConfigSettingsOk(); 23068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureUpdateAppPackageOk(UPDATE_APP_PACKAGE_NAME); 23168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureDataAppPackageNameMissing(); 23268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 23368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller try { 23468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Initialize the tracker. 23568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageTracker.start(); 23668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller fail(); 23768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } catch (RuntimeException expected) {} 23868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 23968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mFakeIntentHelper.assertNotInitialized(); 24068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 24168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check reliability triggering state. 242cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mFakeIntentHelper.assertReliabilityTriggerNotScheduled(); 24368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 24468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 24529ff71baa481a687a71276d2683774a0281aff43Neil Fuller @Test 24629ff71baa481a687a71276d2683774a0281aff43Neil Fuller public void trackingEnabled_dataAppNotPrivileged() throws Exception { 24729ff71baa481a687a71276d2683774a0281aff43Neil Fuller // Set up device configuration. 24829ff71baa481a687a71276d2683774a0281aff43Neil Fuller configureTrackingEnabled(); 24929ff71baa481a687a71276d2683774a0281aff43Neil Fuller configureReliabilityConfigSettingsOk(); 25029ff71baa481a687a71276d2683774a0281aff43Neil Fuller configureUpdateAppPackageOk(UPDATE_APP_PACKAGE_NAME); 25129ff71baa481a687a71276d2683774a0281aff43Neil Fuller configureDataAppPackageNotPrivileged(DATA_APP_PACKAGE_NAME); 25229ff71baa481a687a71276d2683774a0281aff43Neil Fuller 25329ff71baa481a687a71276d2683774a0281aff43Neil Fuller try { 25429ff71baa481a687a71276d2683774a0281aff43Neil Fuller // Initialize the tracker. 25529ff71baa481a687a71276d2683774a0281aff43Neil Fuller mPackageTracker.start(); 25629ff71baa481a687a71276d2683774a0281aff43Neil Fuller fail(); 25729ff71baa481a687a71276d2683774a0281aff43Neil Fuller } catch (RuntimeException expected) {} 25829ff71baa481a687a71276d2683774a0281aff43Neil Fuller 25929ff71baa481a687a71276d2683774a0281aff43Neil Fuller mFakeIntentHelper.assertNotInitialized(); 26029ff71baa481a687a71276d2683774a0281aff43Neil Fuller 26129ff71baa481a687a71276d2683774a0281aff43Neil Fuller // Check reliability triggering state. 262cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mFakeIntentHelper.assertReliabilityTriggerNotScheduled(); 26329ff71baa481a687a71276d2683774a0281aff43Neil Fuller } 26468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 26568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Test 2663582259c72476c55b60f49da1c7f1338b6683249Neil Fuller public void trackingEnabled_storageInitializationFails() throws Exception { 2673582259c72476c55b60f49da1c7f1338b6683249Neil Fuller // Create a PackageStateStorage that will fail to initialize. 2683582259c72476c55b60f49da1c7f1338b6683249Neil Fuller PackageStatusStorage packageStatusStorage = 2693582259c72476c55b60f49da1c7f1338b6683249Neil Fuller new PackageStatusStorage(new File("/system/does/not/exist")); 2703582259c72476c55b60f49da1c7f1338b6683249Neil Fuller 2713582259c72476c55b60f49da1c7f1338b6683249Neil Fuller // Create a new PackageTracker to use the bad storage. 2723582259c72476c55b60f49da1c7f1338b6683249Neil Fuller mPackageTracker = new PackageTracker( 2733582259c72476c55b60f49da1c7f1338b6683249Neil Fuller mFakeClock, 2743582259c72476c55b60f49da1c7f1338b6683249Neil Fuller mMockConfigHelper, 2753582259c72476c55b60f49da1c7f1338b6683249Neil Fuller mMockPackageManagerHelper, 2763582259c72476c55b60f49da1c7f1338b6683249Neil Fuller packageStatusStorage, 2773582259c72476c55b60f49da1c7f1338b6683249Neil Fuller mFakeIntentHelper); 2783582259c72476c55b60f49da1c7f1338b6683249Neil Fuller 2793582259c72476c55b60f49da1c7f1338b6683249Neil Fuller // Set up device configuration. 2803582259c72476c55b60f49da1c7f1338b6683249Neil Fuller configureTrackingEnabled(); 2813582259c72476c55b60f49da1c7f1338b6683249Neil Fuller configureReliabilityConfigSettingsOk(); 2823582259c72476c55b60f49da1c7f1338b6683249Neil Fuller configureValidApplications(); 2833582259c72476c55b60f49da1c7f1338b6683249Neil Fuller 2843582259c72476c55b60f49da1c7f1338b6683249Neil Fuller // Initialize the tracker. 2853582259c72476c55b60f49da1c7f1338b6683249Neil Fuller assertFalse(mPackageTracker.start()); 2863582259c72476c55b60f49da1c7f1338b6683249Neil Fuller 2873582259c72476c55b60f49da1c7f1338b6683249Neil Fuller // Check the IntentHelper was not initialized. 2883582259c72476c55b60f49da1c7f1338b6683249Neil Fuller mFakeIntentHelper.assertNotInitialized(); 2893582259c72476c55b60f49da1c7f1338b6683249Neil Fuller 2903582259c72476c55b60f49da1c7f1338b6683249Neil Fuller // Check reliability triggering state. 2913582259c72476c55b60f49da1c7f1338b6683249Neil Fuller mFakeIntentHelper.assertReliabilityTriggerNotScheduled(); 2923582259c72476c55b60f49da1c7f1338b6683249Neil Fuller } 2933582259c72476c55b60f49da1c7f1338b6683249Neil Fuller 2943582259c72476c55b60f49da1c7f1338b6683249Neil Fuller @Test 29568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void trackingEnabled_packageUpdate_badUpdateAppManifestEntry() throws Exception { 29668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Set up device configuration. 29768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureTrackingEnabled(); 29868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureReliabilityConfigSettingsOk(); 29968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureValidApplications(); 30068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 30168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Initialize the tracker. 3023582259c72476c55b60f49da1c7f1338b6683249Neil Fuller assertTrue(mPackageTracker.start()); 30368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 30468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the intent helper is properly configured. 30568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkIntentHelperInitializedAndReliabilityTrackingEnabled(); 30668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 30768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the initial storage state. 30868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkPackageStorageStatusIsInitialOrReset(); 30968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 31068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Configure a bad manifest for the update app. Should effectively turn off tracking. 31168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageVersions packageVersions = 31268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller new PackageVersions(2 /* updateAppPackageVersion */, 3 /* dataAppPackageVersion */); 31368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureUpdateAppManifestBad(UPDATE_APP_PACKAGE_NAME); 31468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureDataAppManifestOk(DATA_APP_PACKAGE_NAME); 31568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureUpdateAppPackageVersion( 31668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller UPDATE_APP_PACKAGE_NAME, packageVersions.mUpdateAppVersion); 31768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureDataAppPackageVersion(DATA_APP_PACKAGE_NAME, packageVersions.mDataAppVersion); 31868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate a tracked package being updated. 31968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mFakeIntentHelper.simulatePackageUpdatedEvent(); 32068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 32168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Assert the PackageTracker did not attempt to trigger an update. 32268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mFakeIntentHelper.assertUpdateNotTriggered(); 32368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 32468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check reliability triggering state. 325cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mFakeIntentHelper.assertReliabilityTriggerNotScheduled(); 32668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 32768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Assert the storage was not touched. 32868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkPackageStorageStatusIsInitialOrReset(); 32968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 33068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 33168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Test 33268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void trackingEnabled_packageUpdate_badDataAppManifestEntry() throws Exception { 33368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Set up device configuration. 33468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureTrackingEnabled(); 33568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureReliabilityConfigSettingsOk(); 33668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureValidApplications(); 33768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 33868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Initialize the tracker. 3393582259c72476c55b60f49da1c7f1338b6683249Neil Fuller assertTrue(mPackageTracker.start()); 34068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 34168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the intent helper is properly configured. 34268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkIntentHelperInitializedAndReliabilityTrackingEnabled(); 34368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 34468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the initial storage state. 34568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkPackageStorageStatusIsInitialOrReset(); 34668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 34768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Configure a bad manifest for the data app. Should effectively turn off tracking. 34868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageVersions packageVersions = 34968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller new PackageVersions(2 /* updateAppPackageVersion */, 3 /* dataAppPackageVersion */); 35068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureUpdateAppManifestOk(UPDATE_APP_PACKAGE_NAME); 35168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureDataAppManifestBad(DATA_APP_PACKAGE_NAME); 35268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureUpdateAppPackageVersion( 35368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller UPDATE_APP_PACKAGE_NAME, packageVersions.mUpdateAppVersion); 35468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureDataAppPackageVersion(DATA_APP_PACKAGE_NAME, packageVersions.mDataAppVersion); 35568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mFakeIntentHelper.simulatePackageUpdatedEvent(); 35668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 35768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Assert the PackageTracker did not attempt to trigger an update. 35868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mFakeIntentHelper.assertUpdateNotTriggered(); 35968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 36068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check reliability triggering state. 361cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mFakeIntentHelper.assertReliabilityTriggerNotScheduled(); 36268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 36368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Assert the storage was not touched. 36468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkPackageStorageStatusIsInitialOrReset(); 36568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 36668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 36768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Test 36868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void trackingEnabled_packageUpdate_responseWithToken_success() throws Exception { 36968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller trackingEnabled_packageUpdate_responseWithToken(true); 37068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 37168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 37268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Test 37368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void trackingEnabled_packageUpdate_responseWithToken_failed() throws Exception { 37468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller trackingEnabled_packageUpdate_responseWithToken(false); 37568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 37668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 37768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private void trackingEnabled_packageUpdate_responseWithToken(boolean success) throws Exception { 37868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Set up device configuration. 37968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureTrackingEnabled(); 38068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureReliabilityConfigSettingsOk(); 38168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureValidApplications(); 38268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 38368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Initialize the tracker. 3843582259c72476c55b60f49da1c7f1338b6683249Neil Fuller assertTrue(mPackageTracker.start()); 38568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 38668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the intent helper is properly configured. 38768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkIntentHelperInitializedAndReliabilityTrackingEnabled(); 38868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 38968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the initial storage state. 39068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkPackageStorageStatusIsInitialOrReset(); 39168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 39268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate a tracked package being updated. 39368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageVersions packageVersions = 39468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller new PackageVersions(2 /* updateAppPackageVersion */, 3 /* dataAppPackageVersion */); 39568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller simulatePackageInstallation(packageVersions); 39668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 39768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Confirm an update was triggered. 39868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckTriggered(packageVersions); 39968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 40068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Get the token that was passed to the intent helper, and pass it back. 40168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller CheckToken token = mFakeIntentHelper.captureAndResetLastToken(); 40268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageTracker.recordCheckResult(token, success); 40368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 40468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check storage and reliability triggering state. 40568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller if (success) { 40668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckSuccessful(packageVersions); 40768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } else { 40868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckFailed(packageVersions); 40968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 41068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 41168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 41268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Test 41368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void trackingEnabled_packageUpdate_responseWithoutTokenCausesStorageReset_success() 41468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller throws Exception { 41568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller trackingEnabled_packageUpdate_responseWithoutTokenCausesStorageReset(true); 41668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 41768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 41868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Test 41968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void trackingEnabled_packageUpdate_responseWithoutTokenCausesStorageReset_failed() 42068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller throws Exception { 42168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller trackingEnabled_packageUpdate_responseWithoutTokenCausesStorageReset(false); 42268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 42368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 42468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private void trackingEnabled_packageUpdate_responseWithoutTokenCausesStorageReset( 42568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller boolean success) throws Exception { 42668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Set up device configuration. 42768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureTrackingEnabled(); 42868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureReliabilityConfigSettingsOk(); 42968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureValidApplications(); 43068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 43168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Initialize the tracker. 4323582259c72476c55b60f49da1c7f1338b6683249Neil Fuller assertTrue(mPackageTracker.start()); 43368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 43468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the intent helper is properly configured. 43568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkIntentHelperInitializedAndReliabilityTrackingEnabled(); 43668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 43768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the initial storage state. 43868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkPackageStorageStatusIsInitialOrReset(); 43968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 44068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Set up installed app versions / manifests. 44168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageVersions packageVersions = 44268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller new PackageVersions(2 /* updateAppPackageVersion */, 3 /* dataAppPackageVersion */); 44368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller simulatePackageInstallation(packageVersions); 44468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 44568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Confirm an update was triggered. 44668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckTriggered(packageVersions); 44768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 44868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Ignore the token that was given to the intent helper, just pass null. 44968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageTracker.recordCheckResult(null /* checkToken */, success); 45068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 45168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check reliability triggering state. 452cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mFakeIntentHelper.assertReliabilityTriggerScheduled(); 45368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 45468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Assert the storage was reset. 45568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkPackageStorageStatusIsInitialOrReset(); 45668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 45768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 45868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller /** 45968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * Two package updates triggered for the same package versions. The second is triggered while 46068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * the first is still happening. 46168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller */ 46268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Test 46368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void trackingEnabled_packageUpdate_twoChecksNoPackageChange_secondWhileFirstInProgress() 46468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller throws Exception { 46568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Set up device configuration. 46668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureTrackingEnabled(); 46768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureReliabilityConfigSettingsOk(); 46868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureValidApplications(); 46968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 47068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Initialize the tracker. 4713582259c72476c55b60f49da1c7f1338b6683249Neil Fuller assertTrue(mPackageTracker.start()); 47268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 47368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the intent helper is properly configured. 47468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkIntentHelperInitializedAndReliabilityTrackingEnabled(); 47568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 47668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the initial storage state. 47768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkPackageStorageStatusIsInitialOrReset(); 47868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 47968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate package installation. 48068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageVersions packageVersions = 48168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller new PackageVersions(2 /* updateAppPackageVersion */, 3 /* dataAppPackageVersion */); 48268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller simulatePackageInstallation(packageVersions); 48368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 48468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Confirm an update was triggered. 48568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckTriggered(packageVersions); 48668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 48768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Get the first token. 48868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller CheckToken token1 = mFakeIntentHelper.captureAndResetLastToken(); 48968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertEquals(packageVersions, token1.mPackageVersions); 49068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 49168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Now attempt to generate another check while the first is in progress and without having 49268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // updated the package versions. The PackageTracker should trigger again for safety. 49368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller simulatePackageInstallation(packageVersions); 49468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 49568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Confirm an update was triggered. 49668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckTriggered(packageVersions); 49768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 49868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller CheckToken token2 = mFakeIntentHelper.captureAndResetLastToken(); 49968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertEquals(packageVersions, token2.mPackageVersions); 50068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertEquals(token1.mPackageVersions, token2.mPackageVersions); 50168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertTrue(token1.mOptimisticLockId != token2.mOptimisticLockId); 50268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 50368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 50468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller /** 50568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * Two package updates triggered for the same package versions. The second happens after 50668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * the first has succeeded. 50768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller */ 50868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Test 50968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void trackingEnabled_packageUpdate_twoChecksNoPackageChange_sequential() 51068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller throws Exception { 51168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Set up device configuration. 51268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureTrackingEnabled(); 51368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureReliabilityConfigSettingsOk(); 51468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureValidApplications(); 51568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 51668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Initialize the tracker. 5173582259c72476c55b60f49da1c7f1338b6683249Neil Fuller assertTrue(mPackageTracker.start()); 51868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 51968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the intent helper is properly configured. 52068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkIntentHelperInitializedAndReliabilityTrackingEnabled(); 52168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 52268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the initial storage state. 52368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkPackageStorageStatusIsInitialOrReset(); 52468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 52568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate package installation. 52668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageVersions packageVersions = 52768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller new PackageVersions(2 /* updateAppPackageVersion */, 3 /* dataAppPackageVersion */); 52868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller simulatePackageInstallation(packageVersions); 52968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 53068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Confirm an update was triggered. 53168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckTriggered(packageVersions); 53268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 53368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Get the token. 53468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller CheckToken token = mFakeIntentHelper.captureAndResetLastToken(); 53568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertEquals(packageVersions, token.mPackageVersions); 53668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 53768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate a successful check. 53868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageTracker.recordCheckResult(token, true /* success */); 53968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 54068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check storage and reliability triggering state. 54168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckSuccessful(packageVersions); 54268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 54368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Now attempt to generate another check, but without having updated the package. The 54468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // PackageTracker should be smart enough to recognize there's nothing to do here. 54568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller simulatePackageInstallation(packageVersions); 54668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 54768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Assert the PackageTracker did not attempt to trigger an update. 54868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mFakeIntentHelper.assertUpdateNotTriggered(); 54968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 55068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check storage and reliability triggering state. 55168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckSuccessful(packageVersions); 55268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 55368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 55468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller /** 55568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * Two package updates triggered for the same package versions. The second is triggered after 55668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * the first has failed. 55768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller */ 55868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Test 55968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void trackingEnabled_packageUpdate_afterFailure() throws Exception { 56068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Set up device configuration. 56168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureTrackingEnabled(); 56268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureReliabilityConfigSettingsOk(); 56368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureValidApplications(); 56468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 56568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Initialize the tracker. 5663582259c72476c55b60f49da1c7f1338b6683249Neil Fuller assertTrue(mPackageTracker.start()); 56768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 56868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the intent helper is properly configured. 56968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkIntentHelperInitializedAndReliabilityTrackingEnabled(); 57068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 57168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the initial storage state. 57268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkPackageStorageStatusIsInitialOrReset(); 57368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 57468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate package installation. 57568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageVersions packageVersions = 57668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller new PackageVersions(2 /* updateAppPackageVersion */, 3 /* dataAppPackageVersion */); 57768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller simulatePackageInstallation(packageVersions); 57868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 57968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Confirm an update was triggered. 58068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckTriggered(packageVersions); 58168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 58268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Get the first token. 58368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller CheckToken token1 = mFakeIntentHelper.captureAndResetLastToken(); 58468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertEquals(packageVersions, token1.mPackageVersions); 58568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 58668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate an *unsuccessful* check. 58768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageTracker.recordCheckResult(token1, false /* success */); 58868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 58968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check storage and reliability triggering state. 59068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckFailed(packageVersions); 59168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 59268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Now generate another check, but without having updated the package. The 59368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // PackageTracker should recognize the last check failed and trigger again. 59468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller simulatePackageInstallation(packageVersions); 59568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 59668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Confirm an update was triggered. 59768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckTriggered(packageVersions); 59868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 59968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Get the second token. 60068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller CheckToken token2 = mFakeIntentHelper.captureAndResetLastToken(); 60168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 60268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Assert some things about the tokens. 60368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertEquals(packageVersions, token2.mPackageVersions); 60468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertTrue(token1.mOptimisticLockId != token2.mOptimisticLockId); 60568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 60668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // For completeness, now simulate this check was successful. 60768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageTracker.recordCheckResult(token2, true /* success */); 60868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 60968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check storage and reliability triggering state. 61068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckSuccessful(packageVersions); 61168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 61268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 61368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller /** 61468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * Two package updates triggered for different package versions. The second is triggered while 61568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * the first is still happening. 61668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller */ 61768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Test 61868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void trackingEnabled_packageUpdate_twoChecksWithPackageChange_firstCheckInProcess() 61968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller throws Exception { 62068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Set up device configuration. 62168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureTrackingEnabled(); 62268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureReliabilityConfigSettingsOk(); 62368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureValidApplications(); 62468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 62568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Initialize the package tracker. 6263582259c72476c55b60f49da1c7f1338b6683249Neil Fuller assertTrue(mPackageTracker.start()); 62768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 62868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the intent helper is properly configured. 62968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkIntentHelperInitializedAndReliabilityTrackingEnabled(); 63068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 63168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the initial storage state. 63268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkPackageStorageStatusIsInitialOrReset(); 63368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 63468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate package installation. 63568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageVersions packageVersions1 = 63668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller new PackageVersions(2 /* updateAppPackageVersion */, 3 /* dataAppPackageVersion */); 63768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller simulatePackageInstallation(packageVersions1); 63868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 63968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Confirm an update was triggered. 64068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckTriggered(packageVersions1); 64168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 64268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Get the first token. 64368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller CheckToken token1 = mFakeIntentHelper.captureAndResetLastToken(); 64468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertEquals(packageVersions1, token1.mPackageVersions); 64568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 64668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate a tracked package being updated a second time (before the response for the 64768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // first has been received). 64868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageVersions packageVersions2 = 64968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller new PackageVersions(3 /* updateAppPackageVersion */, 4 /* dataAppPackageVersion */); 65068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller simulatePackageInstallation(packageVersions2); 65168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 65268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Confirm an update was triggered. 65368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckTriggered(packageVersions2); 65468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 65568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Get the second token. 65668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller CheckToken token2 = mFakeIntentHelper.captureAndResetLastToken(); 65768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertEquals(packageVersions2, token2.mPackageVersions); 65868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 65968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // token1 should be invalid because the token2 was generated. 66068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageTracker.recordCheckResult(token1, true /* success */); 66168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 66268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Reliability triggering should still be enabled. 663cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mFakeIntentHelper.assertReliabilityTriggerScheduled(); 66468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 66568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the expected storage state. 66668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkPackageStorageStatus(PackageStatus.CHECK_STARTED, packageVersions2); 66768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 66868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // token2 should still be accepted. 66968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageTracker.recordCheckResult(token2, true /* success */); 67068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 67168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check storage and reliability triggering state. 67268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckSuccessful(packageVersions2); 67368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 67468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 67568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller /** 67668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * Two package updates triggered for different package versions. The second is triggered after 67768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * the first has completed successfully. 67868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller */ 67968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Test 68068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void trackingEnabled_packageUpdate_twoChecksWithPackageChange_sequential() 68168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller throws Exception { 68268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Set up device configuration. 68368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureTrackingEnabled(); 68468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureReliabilityConfigSettingsOk(); 68568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureValidApplications(); 68668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 68768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Initialize the package tracker. 6883582259c72476c55b60f49da1c7f1338b6683249Neil Fuller assertTrue(mPackageTracker.start()); 68968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 69068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the intent helper is properly configured. 69168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkIntentHelperInitializedAndReliabilityTrackingEnabled(); 69268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 69368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the initial storage state. 69468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkPackageStorageStatusIsInitialOrReset(); 69568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 69668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate package installation. 69768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageVersions packageVersions1 = 69868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller new PackageVersions(2 /* updateAppPackageVersion */, 3 /* dataAppPackageVersion */); 69968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller simulatePackageInstallation(packageVersions1); 70068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 70168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Confirm an update was triggered. 70268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckTriggered(packageVersions1); 70368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 70468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Get the first token. 70568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller CheckToken token1 = mFakeIntentHelper.captureAndResetLastToken(); 70668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertEquals(packageVersions1, token1.mPackageVersions); 70768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 70868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // token1 should be accepted. 70968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageTracker.recordCheckResult(token1, true /* success */); 71068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 71168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check storage and reliability triggering state. 71268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckSuccessful(packageVersions1); 71368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 71468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate a tracked package being updated a second time. 71568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageVersions packageVersions2 = 71668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller new PackageVersions(3 /* updateAppPackageVersion */, 4 /* dataAppPackageVersion */); 71768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller simulatePackageInstallation(packageVersions2); 71868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 71968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Confirm an update was triggered. 72068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckTriggered(packageVersions2); 72168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 72268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Get the second token. 72368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller CheckToken token2 = mFakeIntentHelper.captureAndResetLastToken(); 72468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertEquals(packageVersions2, token2.mPackageVersions); 72568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 72668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // token2 should still be accepted. 72768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageTracker.recordCheckResult(token2, true /* success */); 72868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 72968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check storage and reliability triggering state. 73068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckSuccessful(packageVersions2); 73168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 73268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 73368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller /** 73468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * Replaying the same token twice. 73568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller */ 73668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Test 73768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void trackingEnabled_packageUpdate_sameTokenReplayFails() throws Exception { 73868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Set up device configuration. 73968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureTrackingEnabled(); 74068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureReliabilityConfigSettingsOk(); 74168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureValidApplications(); 74268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 74368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Initialize the package tracker. 7443582259c72476c55b60f49da1c7f1338b6683249Neil Fuller assertTrue(mPackageTracker.start()); 74568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 74668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the intent helper is properly configured. 74768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkIntentHelperInitializedAndReliabilityTrackingEnabled(); 74868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 74968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the initial storage state. 75068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkPackageStorageStatusIsInitialOrReset(); 75168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 75268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate package installation. 75368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageVersions packageVersions1 = 75468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller new PackageVersions(2 /* updateAppPackageVersion */, 3 /* dataAppPackageVersion */); 75568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller simulatePackageInstallation(packageVersions1); 75668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 75768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Confirm an update was triggered. 75868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckTriggered(packageVersions1); 75968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 76068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Get the first token. 76168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller CheckToken token1 = mFakeIntentHelper.captureAndResetLastToken(); 76268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertEquals(packageVersions1, token1.mPackageVersions); 76368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 76468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // token1 should be accepted. 76568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageTracker.recordCheckResult(token1, true /* success */); 76668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 76768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check storage and reliability triggering state. 76868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckSuccessful(packageVersions1); 76968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 77068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Apply token1 again. 77168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageTracker.recordCheckResult(token1, true /* success */); 77268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 77368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the expected storage state. No real way to tell if it has been updated, but 77468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // we can check the final state is still what it should be. 77568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkPackageStorageStatus(PackageStatus.CHECK_COMPLETED_SUCCESS, packageVersions1); 77668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 77768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Under the covers we expect it to fail to update because the storage should recognize that 77868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // the token is no longer valid. 779cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mFakeIntentHelper.assertReliabilityTriggerScheduled(); 78068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 78168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Peek inside the package tracker to make sure it is tracking failure counts properly. 78268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertEquals(1, mPackageTracker.getCheckFailureCountForTests()); 78368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 78468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 78568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Test 78668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void trackingEnabled_reliabilityTrigger_firstTime_initialStorage() throws Exception { 78768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Set up device configuration. 78868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureTrackingEnabled(); 78968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureReliabilityConfigSettingsOk(); 79068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageVersions packageVersions = configureValidApplications(); 79168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 79268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Initialize the package tracker. 7933582259c72476c55b60f49da1c7f1338b6683249Neil Fuller assertTrue(mPackageTracker.start()); 79468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 79568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the intent helper is properly configured. 79668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkIntentHelperInitializedAndReliabilityTrackingEnabled(); 79768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 79868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the initial storage state. 79968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkPackageStorageStatusIsInitialOrReset(); 80068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 80168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate a reliability trigger. 802cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mPackageTracker.triggerUpdateIfNeeded(false /* packageChanged */); 80368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 80468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Assert the PackageTracker did trigger an update. 80568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckTriggered(packageVersions); 80668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 80768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Confirm the token was correct. 80868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller CheckToken token1 = mFakeIntentHelper.captureAndResetLastToken(); 80968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertEquals(packageVersions, token1.mPackageVersions); 81068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 81168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // token1 should be accepted. 81268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageTracker.recordCheckResult(token1, true /* success */); 81368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 81468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check storage and reliability triggering state. 81568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckSuccessful(packageVersions); 81668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 81768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 81868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Test 81968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void trackingEnabled_reliabilityTrigger_afterRebootNoTriggerNeeded() throws Exception { 82068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Set up device configuration. 82168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureTrackingEnabled(); 82268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureReliabilityConfigSettingsOk(); 82368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageVersions packageVersions = configureValidApplications(); 82468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 82568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Force the storage into a state we want. 82668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageStatusStorage.forceCheckStateForTests( 82768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageStatus.CHECK_COMPLETED_SUCCESS, packageVersions); 82868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 82968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Initialize the package tracker. 8303582259c72476c55b60f49da1c7f1338b6683249Neil Fuller assertTrue(mPackageTracker.start()); 83168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 83268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the intent helper is properly configured. 83368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkIntentHelperInitializedAndReliabilityTrackingEnabled(); 83468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 83568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the initial storage state. 83668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkPackageStorageStatus(PackageStatus.CHECK_COMPLETED_SUCCESS, packageVersions); 83768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 83868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate a reliability trigger. 839cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mPackageTracker.triggerUpdateIfNeeded(false /* packageChanged */); 84068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 84168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Assert the PackageTracker did not attempt to trigger an update. 84268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mFakeIntentHelper.assertUpdateNotTriggered(); 84368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 84468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check storage and reliability triggering state. 84568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckSuccessful(packageVersions); 84668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 84768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 84868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller /** 84968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * Simulates the device starting where the storage records do not match the installed app 85068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * versions. The reliability trigger should cause the package tracker to perform a check. 85168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller */ 85268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Test 85368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void trackingEnabled_reliabilityTrigger_afterRebootTriggerNeededBecausePreviousFailed() 85468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller throws Exception { 85568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Set up device configuration. 85668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureTrackingEnabled(); 85768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureReliabilityConfigSettingsOk(); 85868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 85968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageVersions oldPackageVersions = new PackageVersions(1, 1); 86068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageVersions currentPackageVersions = new PackageVersions(2, 2); 86168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 86268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate there being a newer version installed than the one recorded in storage. 86368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureValidApplications(currentPackageVersions); 86468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 86568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Force the storage into a state we want. 86668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageStatusStorage.forceCheckStateForTests( 86768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageStatus.CHECK_COMPLETED_FAILURE, oldPackageVersions); 86868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 86968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Initialize the package tracker. 8703582259c72476c55b60f49da1c7f1338b6683249Neil Fuller assertTrue(mPackageTracker.start()); 87168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 87268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the intent helper is properly configured. 87368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkIntentHelperInitializedAndReliabilityTrackingEnabled(); 87468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 87568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the initial storage state. 87668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkPackageStorageStatus(PackageStatus.CHECK_COMPLETED_FAILURE, oldPackageVersions); 87768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 87868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate a reliability trigger. 879cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mPackageTracker.triggerUpdateIfNeeded(false /* packageChanged */); 88068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 88168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Assert the PackageTracker did trigger an update. 88268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckTriggered(currentPackageVersions); 88368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 88468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate the update check completing successfully. 88568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller CheckToken checkToken = mFakeIntentHelper.captureAndResetLastToken(); 88668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageTracker.recordCheckResult(checkToken, true /* success */); 88768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 88868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check storage and reliability triggering state. 88968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckSuccessful(currentPackageVersions); 89068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 89168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 89268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller /** 89368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * Simulates persistent failures of the reliability check. It should stop after the configured 89468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * number of checks. 89568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller */ 89668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Test 89768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void trackingEnabled_reliabilityTrigger_repeatedFailures() throws Exception { 89868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Set up device configuration. 89968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureTrackingEnabled(); 90068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 90168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller int retriesAllowed = 3; 90268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller int checkDelayMillis = 5 * 60 * 1000; 90368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureReliabilityConfigSettings(retriesAllowed, checkDelayMillis); 90468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 90568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageVersions oldPackageVersions = new PackageVersions(1, 1); 90668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageVersions currentPackageVersions = new PackageVersions(2, 2); 90768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 90868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate there being a newer version installed than the one recorded in storage. 90968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureValidApplications(currentPackageVersions); 91068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 91168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Force the storage into a state we want. 91268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageStatusStorage.forceCheckStateForTests( 91368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageStatus.CHECK_COMPLETED_FAILURE, oldPackageVersions); 91468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 91568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Initialize the package tracker. 9163582259c72476c55b60f49da1c7f1338b6683249Neil Fuller assertTrue(mPackageTracker.start()); 91768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 91868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the intent helper is properly configured. 91968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkIntentHelperInitializedAndReliabilityTrackingEnabled(); 92068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 92168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the initial storage state. 92268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkPackageStorageStatus(PackageStatus.CHECK_COMPLETED_FAILURE, oldPackageVersions); 92368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 92468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller for (int i = 0; i < retriesAllowed + 1; i++) { 92568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate a reliability trigger. 926cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mPackageTracker.triggerUpdateIfNeeded(false /* packageChanged */); 92768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 92868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Assert the PackageTracker did trigger an update. 92968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckTriggered(currentPackageVersions); 93068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 93168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the PackageTracker failure count before calling recordCheckResult. 93268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertEquals(i, mPackageTracker.getCheckFailureCountForTests()); 93368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 93468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate a check failure. 93568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller CheckToken checkToken = mFakeIntentHelper.captureAndResetLastToken(); 93668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageTracker.recordCheckResult(checkToken, false /* success */); 93768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 93868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Peek inside the package tracker to make sure it is tracking failure counts properly. 93968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertEquals(i + 1, mPackageTracker.getCheckFailureCountForTests()); 94068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 94168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Confirm nothing has changed. 94268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mFakeIntentHelper.assertUpdateNotTriggered(); 94368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkPackageStorageStatus(PackageStatus.CHECK_COMPLETED_FAILURE, 94468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller currentPackageVersions); 94568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 94668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check reliability triggering is in the correct state. 94768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller if (i <= retriesAllowed) { 948cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mFakeIntentHelper.assertReliabilityTriggerScheduled(); 94968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } else { 950cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mFakeIntentHelper.assertReliabilityTriggerNotScheduled(); 95168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 95268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 95368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 95468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 95568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Test 95668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void trackingEnabled_reliabilityTrigger_failureCountIsReset() throws Exception { 95768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Set up device configuration. 95868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureTrackingEnabled(); 95968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 96068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller int retriesAllowed = 3; 96168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller int checkDelayMillis = 5 * 60 * 1000; 96268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureReliabilityConfigSettings(retriesAllowed, checkDelayMillis); 96368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 96468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageVersions oldPackageVersions = new PackageVersions(1, 1); 96568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageVersions currentPackageVersions = new PackageVersions(2, 2); 96668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 96768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate there being a newer version installed than the one recorded in storage. 96868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureValidApplications(currentPackageVersions); 96968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 97068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Force the storage into a state we want. 97168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageStatusStorage.forceCheckStateForTests( 97268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageStatus.CHECK_COMPLETED_FAILURE, oldPackageVersions); 97368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 97468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Initialize the package tracker. 9753582259c72476c55b60f49da1c7f1338b6683249Neil Fuller assertTrue(mPackageTracker.start()); 97668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 97768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the intent helper is properly configured. 97868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkIntentHelperInitializedAndReliabilityTrackingEnabled(); 97968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 98068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the initial storage state. 98168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkPackageStorageStatus(PackageStatus.CHECK_COMPLETED_FAILURE, oldPackageVersions); 98268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 98368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Fail (retries - 1) times. 98468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller for (int i = 0; i < retriesAllowed - 1; i++) { 98568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate a reliability trigger. 986cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mPackageTracker.triggerUpdateIfNeeded(false /* packageChanged */); 98768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 98868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Assert the PackageTracker did trigger an update. 98968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckTriggered(currentPackageVersions); 99068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 99168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the PackageTracker failure count before calling recordCheckResult. 99268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertEquals(i, mPackageTracker.getCheckFailureCountForTests()); 99368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 99468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate a check failure. 99568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller CheckToken checkToken = mFakeIntentHelper.captureAndResetLastToken(); 99668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageTracker.recordCheckResult(checkToken, false /* success */); 99768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 99868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Peek inside the package tracker to make sure it is tracking failure counts properly. 99968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertEquals(i + 1, mPackageTracker.getCheckFailureCountForTests()); 100068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 100168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Confirm nothing has changed. 100268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mFakeIntentHelper.assertUpdateNotTriggered(); 100368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkPackageStorageStatus(PackageStatus.CHECK_COMPLETED_FAILURE, 100468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller currentPackageVersions); 100568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 100668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check reliability triggering is still enabled. 1007cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mFakeIntentHelper.assertReliabilityTriggerScheduled(); 100868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 100968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 101068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate a reliability trigger. 1011cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mPackageTracker.triggerUpdateIfNeeded(false /* packageChanged */); 101268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 101368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Assert the PackageTracker did trigger an update. 101468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckTriggered(currentPackageVersions); 101568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 101668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the PackageTracker failure count before calling recordCheckResult. 101768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertEquals(retriesAllowed - 1, mPackageTracker.getCheckFailureCountForTests()); 101868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 101968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // On the last possible try, succeed. 102068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller CheckToken checkToken = mFakeIntentHelper.captureAndResetLastToken(); 102168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageTracker.recordCheckResult(checkToken, true /* success */); 102268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 102368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckSuccessful(currentPackageVersions); 102468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 102568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 102668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller /** 102768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * Simulates reliability triggers happening too close together. Package tracker should ignore 102868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * the ones it doesn't need. 102968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller */ 103068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Test 103168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void trackingEnabled_reliabilityTrigger_tooSoon() throws Exception { 103268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Set up device configuration. 103368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureTrackingEnabled(); 103468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 103568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller int retriesAllowed = 5; 103668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller int checkDelayMillis = 5 * 60 * 1000; 103768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureReliabilityConfigSettings(retriesAllowed, checkDelayMillis); 103868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 103968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageVersions oldPackageVersions = new PackageVersions(1, 1); 104068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageVersions currentPackageVersions = new PackageVersions(2, 2); 104168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 104268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate there being a newer version installed than the one recorded in storage. 104368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureValidApplications(currentPackageVersions); 104468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 104568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Force the storage into a state we want. 104668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageStatusStorage.forceCheckStateForTests( 104768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageStatus.CHECK_COMPLETED_FAILURE, oldPackageVersions); 104868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 104968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Initialize the package tracker. 10503582259c72476c55b60f49da1c7f1338b6683249Neil Fuller assertTrue(mPackageTracker.start()); 105168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 105268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the intent helper is properly configured. 105368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkIntentHelperInitializedAndReliabilityTrackingEnabled(); 105468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 105568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the initial storage state. 105668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkPackageStorageStatus(PackageStatus.CHECK_COMPLETED_FAILURE, oldPackageVersions); 105768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 105868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate a reliability trigger. 1059cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mPackageTracker.triggerUpdateIfNeeded(false /* packageChanged */); 106068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 106168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Assert the PackageTracker did trigger an update. 106268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckTriggered(currentPackageVersions); 106368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller CheckToken token1 = mFakeIntentHelper.captureAndResetLastToken(); 106468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 106568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Increment the clock, but not enough. 106668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mFakeClock.incrementClock(checkDelayMillis - 1); 106768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 106868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate a reliability trigger. 1069cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mPackageTracker.triggerUpdateIfNeeded(false /* packageChanged */); 107068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 107168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Assert the PackageTracker did not trigger an update. 107268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mFakeIntentHelper.assertUpdateNotTriggered(); 107368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkPackageStorageStatus(PackageStatus.CHECK_STARTED, currentPackageVersions); 1074cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mFakeIntentHelper.assertReliabilityTriggerScheduled(); 107568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 107668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Increment the clock slightly more. Should now consider the response overdue. 107768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mFakeClock.incrementClock(2); 107868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 107968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate a reliability trigger. 1080cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mPackageTracker.triggerUpdateIfNeeded(false /* packageChanged */); 108168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 108268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Triggering should have happened. 108368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckTriggered(currentPackageVersions); 108468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller CheckToken token2 = mFakeIntentHelper.captureAndResetLastToken(); 108568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 108668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check a new token was generated. 108768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertFalse(token1.equals(token2)); 108868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 108968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 109068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller /** 109168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * Tests what happens when a package update doesn't complete and a reliability trigger cleans 109268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * up for it. 109368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller */ 109468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Test 109568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void trackingEnabled_reliabilityTrigger_afterPackageUpdateDidNotComplete() 109668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller throws Exception { 109768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 109868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Set up device configuration. 109968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureTrackingEnabled(); 110068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 110168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller int retriesAllowed = 5; 110268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller int checkDelayMillis = 5 * 60 * 1000; 110368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureReliabilityConfigSettings(retriesAllowed, checkDelayMillis); 110468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 110568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageVersions currentPackageVersions = new PackageVersions(1, 1); 110668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageVersions newPackageVersions = new PackageVersions(2, 2); 110768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 110868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate there being a newer version installed than the one recorded in storage. 110968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureValidApplications(currentPackageVersions); 111068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 111168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Force the storage into a state we want. 111268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageStatusStorage.forceCheckStateForTests( 111368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageStatus.CHECK_COMPLETED_SUCCESS, currentPackageVersions); 111468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 111568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Initialize the package tracker. 11163582259c72476c55b60f49da1c7f1338b6683249Neil Fuller assertTrue(mPackageTracker.start()); 111768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 111868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the intent helper is properly configured. 111968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkIntentHelperInitializedAndReliabilityTrackingEnabled(); 112068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 112168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate a reliability trigger. 112268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller simulatePackageInstallation(newPackageVersions); 112368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 112468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Assert the PackageTracker did trigger an update. 112568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckTriggered(newPackageVersions); 112668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller CheckToken token1 = mFakeIntentHelper.captureAndResetLastToken(); 112768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 112868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Increment the clock, but not enough. 112968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mFakeClock.incrementClock(checkDelayMillis + 1); 113068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 113168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate a reliability trigger. 1132cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mPackageTracker.triggerUpdateIfNeeded(false /* packageChanged */); 113368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 113468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Assert the PackageTracker triggered an update. 113568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckTriggered(newPackageVersions); 113668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller CheckToken token2 = mFakeIntentHelper.captureAndResetLastToken(); 113768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 113868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check a new token was generated. 113968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertFalse(token1.equals(token2)); 114068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 114168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate the reliability check completing. 114268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageTracker.recordCheckResult(token2, true /* success */); 114368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 114468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check everything is now as it should be. 114568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckSuccessful(newPackageVersions); 114668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 114768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 114868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller /** 114968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * Simulates a reliability trigger happening too soon after a package update trigger occurred. 115068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller */ 115168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Test 115268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void trackingEnabled_reliabilityTriggerAfterUpdate_tooSoon() throws Exception { 115368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Set up device configuration. 115468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureTrackingEnabled(); 115568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 115668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller int retriesAllowed = 5; 115768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller int checkDelayMillis = 5 * 60 * 1000; 115868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureReliabilityConfigSettings(retriesAllowed, checkDelayMillis); 115968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 116068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageVersions currentPackageVersions = new PackageVersions(1, 1); 116168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageVersions newPackageVersions = new PackageVersions(2, 2); 116268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 116368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate there being a newer version installed than the one recorded in storage. 116468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureValidApplications(currentPackageVersions); 116568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 116668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Force the storage into a state we want. 116768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mPackageStatusStorage.forceCheckStateForTests( 116868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageStatus.CHECK_COMPLETED_SUCCESS, currentPackageVersions); 116968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 117068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Initialize the package tracker. 11713582259c72476c55b60f49da1c7f1338b6683249Neil Fuller assertTrue(mPackageTracker.start()); 117268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 117368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the intent helper is properly configured. 117468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkIntentHelperInitializedAndReliabilityTrackingEnabled(); 117568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 117668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the initial storage state. 117768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkPackageStorageStatus(PackageStatus.CHECK_COMPLETED_SUCCESS, currentPackageVersions); 117868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 117968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate a package update trigger. 118068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller simulatePackageInstallation(newPackageVersions); 118168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 118268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Assert the PackageTracker did trigger an update. 118368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckTriggered(newPackageVersions); 118468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller CheckToken token1 = mFakeIntentHelper.captureAndResetLastToken(); 118568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 118668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Increment the clock, but not enough. 118768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mFakeClock.incrementClock(checkDelayMillis - 1); 118868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 118968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate a reliability trigger. 1190cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mPackageTracker.triggerUpdateIfNeeded(false /* packageChanged */); 119168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 119268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Assert the PackageTracker did not trigger an update. 119368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mFakeIntentHelper.assertUpdateNotTriggered(); 119468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkPackageStorageStatus(PackageStatus.CHECK_STARTED, newPackageVersions); 1195cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mFakeIntentHelper.assertReliabilityTriggerScheduled(); 119668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 119768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Increment the clock slightly more. Should now consider the response overdue. 119868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mFakeClock.incrementClock(2); 119968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 120068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate a reliability trigger. 1201cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mPackageTracker.triggerUpdateIfNeeded(false /* packageChanged */); 120268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 120368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Triggering should have happened. 120468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkUpdateCheckTriggered(newPackageVersions); 120568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller CheckToken token2 = mFakeIntentHelper.captureAndResetLastToken(); 120668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 120768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check a new token was generated. 120868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertFalse(token1.equals(token2)); 120968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 121068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 121187b1128ddc44afeafb946a32d63abef68d8b3dc1Neil Fuller @Test 121287b1128ddc44afeafb946a32d63abef68d8b3dc1Neil Fuller public void dump() { 121387b1128ddc44afeafb946a32d63abef68d8b3dc1Neil Fuller StringWriter stringWriter = new StringWriter(); 121487b1128ddc44afeafb946a32d63abef68d8b3dc1Neil Fuller PrintWriter printWriter = new PrintWriter(stringWriter); 121587b1128ddc44afeafb946a32d63abef68d8b3dc1Neil Fuller 121687b1128ddc44afeafb946a32d63abef68d8b3dc1Neil Fuller mPackageTracker.dump(printWriter); 121787b1128ddc44afeafb946a32d63abef68d8b3dc1Neil Fuller 121887b1128ddc44afeafb946a32d63abef68d8b3dc1Neil Fuller assertFalse(stringWriter.toString().isEmpty()); 121987b1128ddc44afeafb946a32d63abef68d8b3dc1Neil Fuller } 122087b1128ddc44afeafb946a32d63abef68d8b3dc1Neil Fuller 122168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private void simulatePackageInstallation(PackageVersions packageVersions) throws Exception { 122268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureApplicationsValidManifests(packageVersions); 122368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 122468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate a tracked package being updated. 122568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mFakeIntentHelper.simulatePackageUpdatedEvent(); 122668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 122768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 122868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller /** 122968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * Checks an update check was triggered, reliability triggering is therefore enabled and the 123068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * storage state reflects that there is a check in progress. 123168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller */ 123268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private void checkUpdateCheckTriggered(PackageVersions packageVersions) { 123368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Assert the PackageTracker attempted to trigger an update. 123468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mFakeIntentHelper.assertUpdateTriggered(); 123568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 123668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // If an update check was triggered reliability triggering should always be enabled to 123768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // ensure that it can be completed if it fails. 1238cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mFakeIntentHelper.assertReliabilityTriggerScheduled(); 123968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 124068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check the expected storage state. 124168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkPackageStorageStatus(PackageStatus.CHECK_STARTED, packageVersions); 124268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 124368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 124468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private void checkUpdateCheckFailed(PackageVersions packageVersions) { 124568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check reliability triggering state. 1246cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mFakeIntentHelper.assertReliabilityTriggerScheduled(); 124768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 124868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Assert the storage was updated. 124968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkPackageStorageStatus(PackageStatus.CHECK_COMPLETED_FAILURE, packageVersions); 125068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 125168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 125268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private void checkUpdateCheckSuccessful(PackageVersions packageVersions) { 125368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Check reliability triggering state. 1254cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mFakeIntentHelper.assertReliabilityTriggerNotScheduled(); 125568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 125668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Assert the storage was updated. 125768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller checkPackageStorageStatus(PackageStatus.CHECK_COMPLETED_SUCCESS, packageVersions); 125868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 125968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Peek inside the package tracker to make sure it is tracking failure counts properly. 126068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertEquals(0, mPackageTracker.getCheckFailureCountForTests()); 126168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 126268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 126368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private PackageVersions configureValidApplications() throws Exception { 126468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureValidApplications(INITIAL_APP_PACKAGE_VERSIONS); 126568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller return INITIAL_APP_PACKAGE_VERSIONS; 126668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 126768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 126868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private void configureValidApplications(PackageVersions versions) throws Exception { 126968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureUpdateAppPackageOk(UPDATE_APP_PACKAGE_NAME); 127068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureDataAppPackageOk(DATA_APP_PACKAGE_NAME); 127168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureApplicationsValidManifests(versions); 127268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 127368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 127468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private void configureApplicationsValidManifests(PackageVersions versions) throws Exception { 127568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureUpdateAppManifestOk(UPDATE_APP_PACKAGE_NAME); 127668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureDataAppManifestOk(DATA_APP_PACKAGE_NAME); 127768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureUpdateAppPackageVersion(UPDATE_APP_PACKAGE_NAME, versions.mUpdateAppVersion); 127868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureDataAppPackageVersion(DATA_APP_PACKAGE_NAME, versions.mDataAppVersion); 127968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 128068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 128168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private void configureUpdateAppPackageVersion(String updateAppPackageName, 12823accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn long updataAppPackageVersion) throws Exception { 128368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller when(mMockPackageManagerHelper.getInstalledPackageVersion(updateAppPackageName)) 128468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller .thenReturn(updataAppPackageVersion); 128568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 128668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 128768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private void configureDataAppPackageVersion(String dataAppPackageName, 12883accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn long dataAppPackageVersion) throws Exception { 128968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller when(mMockPackageManagerHelper.getInstalledPackageVersion(dataAppPackageName)) 129068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller .thenReturn(dataAppPackageVersion); 129168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 129268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 129368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private void configureUpdateAppManifestOk(String updateAppPackageName) throws Exception { 129468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller Intent expectedIntent = RulesUpdaterContract.createUpdaterIntent(updateAppPackageName); 129568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller when(mMockPackageManagerHelper.receiverRegistered( 129668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller filterEquals(expectedIntent), 129768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller eq(RulesUpdaterContract.TRIGGER_TIME_ZONE_RULES_CHECK_PERMISSION))) 129868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller .thenReturn(true); 129968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller when(mMockPackageManagerHelper.usesPermission( 130068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller updateAppPackageName, RulesUpdaterContract.UPDATE_TIME_ZONE_RULES_PERMISSION)) 130168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller .thenReturn(true); 130268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 130368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 130468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private void configureUpdateAppManifestBad(String updateAppPackageName) throws Exception { 130568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller Intent expectedIntent = RulesUpdaterContract.createUpdaterIntent(updateAppPackageName); 130668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller when(mMockPackageManagerHelper.receiverRegistered( 130768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller filterEquals(expectedIntent), 130868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller eq(RulesUpdaterContract.TRIGGER_TIME_ZONE_RULES_CHECK_PERMISSION))) 130968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller .thenReturn(false); 131068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Has permission, but that shouldn't matter if the check above is false. 131168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller when(mMockPackageManagerHelper.usesPermission( 131268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller updateAppPackageName, RulesUpdaterContract.UPDATE_TIME_ZONE_RULES_PERMISSION)) 131368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller .thenReturn(true); 131468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 131568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 131668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private void configureDataAppManifestOk(String dataAppPackageName) throws Exception { 131768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller when(mMockPackageManagerHelper.contentProviderRegistered( 131868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller TimeZoneRulesDataContract.AUTHORITY, dataAppPackageName)) 131968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller .thenReturn(true); 132068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 132168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 132268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private void configureDataAppManifestBad(String dataAppPackageName) throws Exception { 132368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Simulate the data app not exposing the content provider we require. 132468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller when(mMockPackageManagerHelper.contentProviderRegistered( 132568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller TimeZoneRulesDataContract.AUTHORITY, dataAppPackageName)) 132668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller .thenReturn(false); 132768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 132868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 132968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private void configureTrackingEnabled() { 133068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller when(mMockConfigHelper.isTrackingEnabled()).thenReturn(true); 133168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 133268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 133368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private void configureTrackingDisabled() { 133468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller when(mMockConfigHelper.isTrackingEnabled()).thenReturn(false); 133568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 133668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 133768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private void configureReliabilityConfigSettings(int retriesAllowed, int checkDelayMillis) { 133868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller when(mMockConfigHelper.getFailedCheckRetryCount()).thenReturn(retriesAllowed); 133968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller when(mMockConfigHelper.getCheckTimeAllowedMillis()).thenReturn(checkDelayMillis); 134068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 134168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 134268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private void configureReliabilityConfigSettingsOk() { 134368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller configureReliabilityConfigSettings(5, 5 * 60 * 1000); 134468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 134568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 134668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private void configureUpdateAppPackageOk(String updateAppPackageName) throws Exception { 134768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller when(mMockConfigHelper.getUpdateAppPackageName()).thenReturn(updateAppPackageName); 134868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller when(mMockPackageManagerHelper.isPrivilegedApp(updateAppPackageName)).thenReturn(true); 134968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 135068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 135168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private void configureUpdateAppPackageNotPrivileged(String updateAppPackageName) 135268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller throws Exception { 135368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller when(mMockConfigHelper.getUpdateAppPackageName()).thenReturn(updateAppPackageName); 135468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller when(mMockPackageManagerHelper.isPrivilegedApp(updateAppPackageName)).thenReturn(false); 135568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 135668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 135768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private void configureUpdateAppPackageNameMissing() { 135868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller when(mMockConfigHelper.getUpdateAppPackageName()).thenReturn(null); 135968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 136068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 136168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private void configureDataAppPackageOk(String dataAppPackageName) throws Exception { 136268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller when(mMockConfigHelper.getDataAppPackageName()).thenReturn(dataAppPackageName); 136368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller when(mMockPackageManagerHelper.isPrivilegedApp(dataAppPackageName)).thenReturn(true); 136468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 136568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 136668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private void configureDataAppPackageNotPrivileged(String dataAppPackageName) 136768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller throws Exception { 136868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller when(mMockConfigHelper.getUpdateAppPackageName()).thenReturn(dataAppPackageName); 136968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller when(mMockPackageManagerHelper.isPrivilegedApp(dataAppPackageName)).thenReturn(false); 137068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 137168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 137268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private void configureDataAppPackageNameMissing() { 137368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller when(mMockConfigHelper.getDataAppPackageName()).thenThrow(new RuntimeException()); 137468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 137568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 137668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private void checkIntentHelperInitializedAndReliabilityTrackingEnabled() { 137768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Verify that calling start initialized the IntentHelper as well. 137868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mFakeIntentHelper.assertInitialized(UPDATE_APP_PACKAGE_NAME, DATA_APP_PACKAGE_NAME); 137968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 138068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller // Assert that reliability tracking is always enabled after initialization. 1381cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mFakeIntentHelper.assertReliabilityTriggerScheduled(); 138268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 138368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 138468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private void checkPackageStorageStatus( 138568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller int expectedCheckStatus, PackageVersions expectedPackageVersions) { 138668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller PackageStatus packageStatus = mPackageStatusStorage.getPackageStatus(); 138768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertEquals(expectedCheckStatus, packageStatus.mCheckStatus); 138868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertEquals(expectedPackageVersions, packageStatus.mVersions); 138968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 139068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 139168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private void checkPackageStorageStatusIsInitialOrReset() { 139268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertNull(mPackageStatusStorage.getPackageStatus()); 139368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 139468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 139568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private static CheckToken createArbitraryCheckToken() { 139668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller return new CheckToken(1, INITIAL_APP_PACKAGE_VERSIONS); 139768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 139868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 139968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller /** 140068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * A fake IntentHelper implementation for use in tests. 140168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller */ 1402b144227742ada7fd693684a5bd2d53abd8e7c499Neil Fuller private static class FakeIntentHelper implements PackageTrackerIntentHelper { 140368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 1404cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller private PackageTracker mPackageTracker; 140568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private String mUpdateAppPackageName; 140668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private String mDataAppPackageName; 140768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 140868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private CheckToken mLastToken; 140968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 1410cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller private boolean mReliabilityTriggerScheduled; 141168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 141268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Override 141368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void initialize(String updateAppPackageName, String dataAppPackageName, 1414cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller PackageTracker packageTracker) { 141568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertNotNull(updateAppPackageName); 141668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertNotNull(dataAppPackageName); 1417cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller assertNotNull(packageTracker); 1418cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mPackageTracker = packageTracker; 141968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mUpdateAppPackageName = updateAppPackageName; 142068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mDataAppPackageName = dataAppPackageName; 142168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 142268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 142368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void assertInitialized( 142468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller String expectedUpdateAppPackageName, String expectedDataAppPackageName) { 1425cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller assertNotNull(mPackageTracker); 142668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertEquals(expectedUpdateAppPackageName, mUpdateAppPackageName); 142768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertEquals(expectedDataAppPackageName, mDataAppPackageName); 142868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 142968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 143068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void assertNotInitialized() { 1431cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller assertNull(mPackageTracker); 143268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 143368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 143468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Override 143568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void sendTriggerUpdateCheck(CheckToken checkToken) { 143668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller if (mLastToken != null) { 143768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller fail("lastToken already set"); 143868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 143968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mLastToken = checkToken; 144068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 144168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 144268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Override 1443cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller public void scheduleReliabilityTrigger(long minimumDelayMillis) { 1444cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mReliabilityTriggerScheduled = true; 144568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 144668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 144768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Override 1448cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller public void unscheduleReliabilityTrigger() { 1449cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mReliabilityTriggerScheduled = false; 145068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 145168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 1452cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller public void assertReliabilityTriggerScheduled() { 1453cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller assertTrue(mReliabilityTriggerScheduled); 145468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 145568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 1456cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller public void assertReliabilityTriggerNotScheduled() { 1457cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller assertFalse(mReliabilityTriggerScheduled); 145868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 145968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 146068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void assertUpdateTriggered() { 146168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertNotNull(mLastToken); 146268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 146368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 146468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void assertUpdateNotTriggered() { 146568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertNull(mLastToken); 146668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 146768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 146868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public CheckToken captureAndResetLastToken() { 146968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller CheckToken toReturn = mLastToken; 147068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller assertNotNull("No update triggered", toReturn); 147168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller mLastToken = null; 147268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller return toReturn; 147368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 147468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 147568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void simulatePackageUpdatedEvent() { 1476cd1a109b872f58f5baa0ce8438bf3ddd69eec9fcNeil Fuller mPackageTracker.triggerUpdateIfNeeded(true /* packageChanged */); 147768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 147868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 147968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 1480a7d21f8c321ae7149b68625a5c8502abe005ed7bNeil Fuller private static class FakeClock extends Clock { 148168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 148268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private long currentTime = 1000; 148368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 148468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Override 1485a7d21f8c321ae7149b68625a5c8502abe005ed7bNeil Fuller public long millis() { 148668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller return currentTime; 148768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 148868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 148968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void incrementClock(long millis) { 149068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller currentTime += millis; 149168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 1492a7d21f8c321ae7149b68625a5c8502abe005ed7bNeil Fuller 1493a7d21f8c321ae7149b68625a5c8502abe005ed7bNeil Fuller @Override 1494a7d21f8c321ae7149b68625a5c8502abe005ed7bNeil Fuller public ZoneId getZone() { 1495a7d21f8c321ae7149b68625a5c8502abe005ed7bNeil Fuller throw new UnsupportedOperationException(); 1496a7d21f8c321ae7149b68625a5c8502abe005ed7bNeil Fuller } 1497a7d21f8c321ae7149b68625a5c8502abe005ed7bNeil Fuller 1498a7d21f8c321ae7149b68625a5c8502abe005ed7bNeil Fuller @Override 1499a7d21f8c321ae7149b68625a5c8502abe005ed7bNeil Fuller public Clock withZone(ZoneId zone) { 1500a7d21f8c321ae7149b68625a5c8502abe005ed7bNeil Fuller throw new UnsupportedOperationException(); 1501a7d21f8c321ae7149b68625a5c8502abe005ed7bNeil Fuller } 1502a7d21f8c321ae7149b68625a5c8502abe005ed7bNeil Fuller 1503a7d21f8c321ae7149b68625a5c8502abe005ed7bNeil Fuller @Override 1504a7d21f8c321ae7149b68625a5c8502abe005ed7bNeil Fuller public Instant instant() { 1505a7d21f8c321ae7149b68625a5c8502abe005ed7bNeil Fuller throw new UnsupportedOperationException(); 1506a7d21f8c321ae7149b68625a5c8502abe005ed7bNeil Fuller } 150768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 150868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller 150968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller /** 151068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * Registers a mockito parameter matcher that uses {@link Intent#filterEquals(Intent)}. to 151168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller * check the parameter against the intent supplied. 151268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller */ 151368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller private static Intent filterEquals(final Intent expected) { 151468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller final Matcher<Intent> m = new BaseMatcher<Intent>() { 151568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Override 151668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public boolean matches(Object actual) { 151768f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller return actual != null && expected.filterEquals((Intent) actual); 151868f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 151968f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller @Override 152068f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller public void describeTo(Description description) { 152168f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller description.appendText(expected.toString()); 152268f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 152368f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller }; 152468f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller return argThat(m); 152568f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller } 152668f666693a465eb8a66d9252b7b7ac035b9f0b7bNeil Fuller} 1527