186af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi/*
286af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi * Copyright (C) 2016 The Android Open Source Project
386af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi *
486af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi * Licensed under the Apache License, Version 2.0 (the "License");
586af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi * you may not use this file except in compliance with the License.
686af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi * You may obtain a copy of the License at
786af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi *
886af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi *      http://www.apache.org/licenses/LICENSE-2.0
986af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi *
1086af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi * Unless required by applicable law or agreed to in writing, software
1186af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi * distributed under the License is distributed on an "AS IS" BASIS,
1286af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1386af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi * See the License for the specific language governing permissions and
1486af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi * limitations under the License.
1586af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi */
1686af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi
1786af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishipackage com.android.storagemanager.deletionhelper;
1886af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi
1986af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishiimport android.test.AndroidTestCase;
2086af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishiimport android.content.pm.IPackageDeleteObserver;
2186af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishiimport android.content.pm.PackageManager;
2286af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishiimport android.os.RemoteException;
2386af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishiimport android.test.mock.MockPackageManager;
2486af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishiimport android.test.suitebuilder.annotation.SmallTest;
2586af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi
2686af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishiimport com.android.storagemanager.deletionhelper.PackageDeletionTask;
2786af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishiimport com.android.storagemanager.deletionhelper.PackageDeletionTask.Callback;
2886af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi
2986af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishiimport java.util.Set;
3086af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishiimport java.util.HashSet;
3186af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi
3286af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishipublic class PackageDeletionTaskTest extends AndroidTestCase {
3386af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi    private FakePackageManager mPackageManager;
3486af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi    private Set<String> mDeletedApps;
3586af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi
3686af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi    @Override
3786af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi    protected void setUp() throws Exception {
3886af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi        mPackageManager = new FakePackageManager();
3986af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi        mDeletedApps = new HashSet<String>();
4086af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi    }
4186af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi
4286af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi    @SmallTest
4386af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi    public void testDeleteNoApps() throws Exception {
4486af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi        runTask(new HashSet<String>(), false);
4586af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi    }
4686af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi
4786af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi    @SmallTest
4886af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi    public void testDeleteOneApp() throws Exception {
4986af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi        HashSet<String> appsToDelete = new HashSet<String>();
5086af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi        appsToDelete.add("app.test1");
5186af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi        runTask(appsToDelete, false);
5286af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi    }
5386af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi
5486af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi    @SmallTest
5586af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi    public void testDeleteManyApps() throws Exception {
5686af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi        HashSet<String> appsToDelete = new HashSet<String>();
5786af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi        appsToDelete.add("app.test1");
5886af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi        appsToDelete.add("app.test2");
5986af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi        runTask(appsToDelete, false);
6086af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi    }
6186af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi
6286af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi    @SmallTest
6386af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi    public void testDeleteFails() throws Exception {
6486af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi        HashSet<String> appsToDelete = new HashSet<String>();
6586af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi        appsToDelete.add("app.test1");
6686af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi        mPackageManager.deletionSucceeds = false;
6786af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi        runTask(appsToDelete, true);
6886af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi    }
6986af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi
7086af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi    private void runTask(HashSet<String> appsToDelete, boolean shouldFail) {
7186af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi        PackageDeletionTask task = new PackageDeletionTask(mPackageManager, appsToDelete,
7286af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi                new VerifierCallback(appsToDelete, shouldFail));
7386af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi        task.run();
7486af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi    }
7586af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi
7686af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi    class FakePackageManager extends MockPackageManager {
7786af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi        public boolean deletionSucceeds = true;
7886af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi
7986af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi        @Override
8086af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi        public void deletePackageAsUser(String packageName, IPackageDeleteObserver observer,
8186af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi                                        int flags, int userId) {
8286af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi            int resultCode;
8386af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi            if (deletionSucceeds) {
8486af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi                resultCode = PackageManager.DELETE_SUCCEEDED;
8586af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi                mDeletedApps.add(packageName);
8686af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi            } else {
8786af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi                resultCode = PackageManager.DELETE_FAILED_INTERNAL_ERROR;
8886af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi            }
8986af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi
9086af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi            try {
9186af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi                observer.packageDeleted(packageName, resultCode);
9286af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi            } catch (RemoteException e) {
9386af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi                fail(e.toString());
9486af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi            }
9586af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi        }
9686af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi    }
9786af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi
9886af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi    class VerifierCallback extends Callback {
9986af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi        private Set<String> mExpectedDeletedApps;
10086af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi        private boolean mShouldFail;
10186af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi
10286af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi        public VerifierCallback(HashSet<String> expectedDeletedApps, boolean shouldFail) {
10386af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi            mExpectedDeletedApps = expectedDeletedApps;
10486af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi            mShouldFail = shouldFail;
10586af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi        }
10686af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi
10786af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi        @Override
10886af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi        public void onSuccess() {
10986af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi            assertFalse(mShouldFail);
11086af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi            assertEquals(mExpectedDeletedApps, mDeletedApps);
11186af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi        }
11286af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi
11386af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi        @Override
11486af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi        public void onError() {
11586af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi            assertTrue(mShouldFail);
11686af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi        }
11786af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi    }
11886af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi
11986af5212026edc3696881b3f1f7aab2f56b15563Daniel Nishi}
120