15dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen/*
25dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen * Copyright (C) 2010 The Android Open Source Project
35dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen *
45dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen * Licensed under the Apache License, Version 2.0 (the "License");
55dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen * you may not use this file except in compliance with the License.
65dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen * You may obtain a copy of the License at
75dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen *
85dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen *      http://www.apache.org/licenses/LICENSE-2.0
95dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen *
105dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen * Unless required by applicable law or agreed to in writing, software
115dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen * distributed under the License is distributed on an "AS IS" BASIS,
125dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen * See the License for the specific language governing permissions and
145dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen * limitations under the License.
155dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen */
165dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen
175dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyenpackage android.os.storage;
185dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen
195dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyenimport android.content.Context;
205dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyenimport android.os.Environment;
215dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyenimport android.test.InstrumentationTestCase;
225dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyenimport android.test.suitebuilder.annotation.LargeTest;
235dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyenimport android.util.Log;
245dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen
255dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyenimport com.android.frameworks.coretests.R;
265dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen
275dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyenimport java.io.DataInputStream;
285dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyenimport java.io.IOException;
295dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyenimport java.io.File;
305dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyenimport java.io.FileInputStream;
315dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen
325dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyenimport junit.framework.AssertionFailedError;
335dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen
345dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyenpublic class StorageManagerIntegrationTest extends StorageManagerBaseTest {
355dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen
365dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    private static String LOG_TAG = "StorageManagerBaseTest.StorageManagerIntegrationTest";
375dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    protected File mFile = null;
385dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen
395dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    /**
405dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen     * {@inheritDoc}
415dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen     */
425dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    @Override
435dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    public void setUp() throws Exception {
445dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        super.setUp();
455dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        mContext = getInstrumentation().getContext();
465dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        mFile = null;
475dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    }
485dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen
495dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    /**
505dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen     * {@inheritDoc}
515dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen     */
525dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    @Override
535dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    protected void tearDown() throws Exception {
545dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        if (mFile != null) {
555dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            mFile.delete();
565dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            mFile = null;
575dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        }
585dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        super.tearDown();
595dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    }
605dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen
615dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    /**
625dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen     * Tests mounting a single OBB file and verifies its contents.
635dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen     */
645dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    @LargeTest
655dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    public void testMountSingleObb() {
665dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        mFile = createObbFile(OBB_FILE_1, R.raw.obb_file1);
675dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        String filePath = mFile.getAbsolutePath();
685dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        mountObb(filePath);
695dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        verifyObb1Contents(filePath);
705dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        unmountObb(filePath, DONT_FORCE);
715dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    }
725dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen
735dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    /**
745dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen     * Tests mounting several OBB files and verifies its contents.
755dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen     */
765dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    @LargeTest
775dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    public void testMountMultipleObb() {
785dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        File file1 = null;
795dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        File file2 = null;
805dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        File file3 = null;
815dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        try {
825dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            file1 = createObbFile(OBB_FILE_1, R.raw.obb_file1);
835dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            String filePath1 = file1.getAbsolutePath();
845dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            mountObb(filePath1);
855dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            verifyObb1Contents(filePath1);
865dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen
875dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            file2 = createObbFile(OBB_FILE_2, R.raw.obb_file2);
885dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            String filePath2 = file2.getAbsolutePath();
895dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            mountObb(filePath2);
905dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            verifyObb2Contents(filePath2);
915dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen
925dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            file3 = createObbFile(OBB_FILE_3, R.raw.obb_file3);
935dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            String filePath3 = file3.getAbsolutePath();
945dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            mountObb(filePath3);
955dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            verifyObb3Contents(filePath3);
965dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen
975dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            unmountObb(filePath1, DONT_FORCE);
985dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            unmountObb(filePath2, DONT_FORCE);
995dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            unmountObb(filePath3, DONT_FORCE);
1005dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        } finally {
1015dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            if (file1 != null) {
1025dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen                file1.delete();
1035dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            }
1045dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            if (file2 != null) {
1055dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen                file2.delete();
1065dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            }
1075dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            if (file3 != null) {
1085dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen                file3.delete();
1095dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            }
1105dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        }
1115dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    }
1125dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen
1135dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    /**
1145dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen     * Tests mounting a single encrypted OBB file and verifies its contents.
1155dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen     */
1165dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    @LargeTest
1175dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    public void testMountSingleEncryptedObb() {
1185dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        mFile = createObbFile(OBB_FILE_3_ENCRYPTED, R.raw.obb_enc_file100_orig3);
1195dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        String filePath = mFile.getAbsolutePath();
1205dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        mountObb(filePath, OBB_FILE_3_PASSWORD, OnObbStateChangeListener.MOUNTED);
1215dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        verifyObb3Contents(filePath);
1225dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        unmountObb(filePath, DONT_FORCE);
1235dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    }
1245dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen
1255dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    /**
1265dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen     * Tests mounting a single encrypted OBB file using an invalid password.
1275dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen     */
1285dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    @LargeTest
1295dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    public void testMountSingleEncryptedObbInvalidPassword() {
1305dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        mFile = createObbFile("bad password@$%#@^*(!&)", R.raw.obb_enc_file100_orig3);
1315dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        String filePath = mFile.getAbsolutePath();
1325dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        mountObb(filePath, OBB_FILE_3_PASSWORD, OnObbStateChangeListener.ERROR_COULD_NOT_MOUNT);
1335dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        unmountObb(filePath, DONT_FORCE);
1345dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    }
1355dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen
1365dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    /**
1375dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen     * Tests simultaneously mounting 2 encrypted OBBs with different keys and verifies contents.
1385dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen     */
1395dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    @LargeTest
1405dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    public void testMountTwoEncryptedObb() {
1415dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        File file3 = null;
1425dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        File file1 = null;
1435dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        try {
1445dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            file3 = createObbFile(OBB_FILE_3_ENCRYPTED, R.raw.obb_enc_file100_orig3);
1455dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            String filePath3 = file3.getAbsolutePath();
1465dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            mountObb(filePath3, OBB_FILE_3_PASSWORD, OnObbStateChangeListener.MOUNTED);
1475dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            verifyObb3Contents(filePath3);
1485dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen
1495dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            file1 = createObbFile(OBB_FILE_1_ENCRYPTED, R.raw.obb_enc_file100_orig1);
1505dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            String filePath1 = file1.getAbsolutePath();
1515dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            mountObb(filePath1, OBB_FILE_1_PASSWORD, OnObbStateChangeListener.MOUNTED);
1525dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            verifyObb1Contents(filePath1);
1535dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen
1545dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            unmountObb(filePath3, DONT_FORCE);
1555dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            unmountObb(filePath1, DONT_FORCE);
1565dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        } finally {
1575dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            if (file3 != null) {
1585dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen                file3.delete();
1595dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            }
1605dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            if (file1 != null) {
1615dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen                file1.delete();
1625dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            }
1635dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        }
1645dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    }
1655dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen
1665dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    /**
1675dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen     * Tests that we can not force unmount when a file is currently open on the OBB.
1685dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen     */
1695dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    @LargeTest
1705dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    public void testUnmount_DontForce() {
1715dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        mFile = createObbFile(OBB_FILE_1, R.raw.obb_file1);
1725dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        String obbFilePath = mFile.getAbsolutePath();
1735dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen
1745dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        MountingObbThread mountingThread = new MountingObbThread(obbFilePath,
1755dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen                OBB_FILE_1_CONTENTS_1);
1765dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen
1775dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        try {
1785dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            mountingThread.start();
1795dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen
1805dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            long waitTime = 0;
1815dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            while (!mountingThread.isFileOpenOnObb()) {
1825dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen                synchronized (mountingThread) {
1835dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen                    Log.i(LOG_TAG, "Waiting for file to be opened on OBB...");
1845dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen                    mountingThread.wait(WAIT_TIME_INCR);
1855dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen                    waitTime += WAIT_TIME_INCR;
1865dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen                    if (waitTime > MAX_WAIT_TIME) {
1875dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen                        fail("Timed out waiting for file file to be opened on OBB!");
1885dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen                    }
1895dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen                }
1905dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            }
1915dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen
1925dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            unmountObb(obbFilePath, DONT_FORCE);
1935dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen
1945dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            // verify still mounted
1955dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            assertTrue("mounted path should not be null!", obbFilePath != null);
1965dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            assertTrue("mounted path should still be mounted!", mSm.isObbMounted(obbFilePath));
1975dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen
1985dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            // close the opened file
1995dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            mountingThread.doStop();
2005dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen
2015dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            // try unmounting again (should succeed this time)
2025dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            unmountObb(obbFilePath, DONT_FORCE);
2035dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            assertFalse("mounted path should no longer be mounted!",
2045dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen                    mSm.isObbMounted(obbFilePath));
2055dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        } catch (InterruptedException e) {
2065dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen            fail("Timed out waiting for file on OBB to be opened...");
2075dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        }
2085dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    }
2095dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen
2105dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    /**
2115dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen     * Tests mounting a single OBB that isn't signed.
2125dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen     */
2135dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    @LargeTest
2145dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    public void testMountUnsignedObb() {
2155dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        mFile = createObbFile(OBB_FILE_2_UNSIGNED, R.raw.obb_file2_nosign);
2165dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        String filePath = mFile.getAbsolutePath();
2175dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        mountObb(filePath, OBB_FILE_2_UNSIGNED, OnObbStateChangeListener.ERROR_INTERNAL);
2185dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    }
2195dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen
2205dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    /**
2215dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen     * Tests mounting a single OBB that is signed with a different package.
2225dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen     */
2235dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    @LargeTest
2245dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    public void testMountBadPackageNameObb() {
2255dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        mFile = createObbFile(OBB_FILE_3_BAD_PACKAGENAME, R.raw.obb_file3_bad_packagename);
2265dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        String filePath = mFile.getAbsolutePath();
2275dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        mountObb(filePath, OBB_FILE_3_BAD_PACKAGENAME,
2285dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen                OnObbStateChangeListener.ERROR_PERMISSION_DENIED);
2295dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    }
2305dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen
2315dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    /**
2325dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen     * Tests remounting a single OBB that has already been mounted.
2335dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen     */
2345dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    @LargeTest
2355dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    public void testRemountObb() {
2365dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        mFile = createObbFile(OBB_FILE_1, R.raw.obb_file1);
2375dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        String filePath = mFile.getAbsolutePath();
2385dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        mountObb(filePath);
2395dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        verifyObb1Contents(filePath);
2405dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        mountObb(filePath, null, OnObbStateChangeListener.ERROR_ALREADY_MOUNTED);
2415dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        verifyObb1Contents(filePath);
2425dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen        unmountObb(filePath, DONT_FORCE);
2435dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen    }
2445dda76a72e8bb4630fb5fd38a42e7bceb5b9c954Neal Nguyen}