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