117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root/* 217eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root * Copyright (C) 2010 The Android Open Source Project 317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root * 417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root * Licensed under the Apache License, Version 2.0 (the "License"); 517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root * you may not use this file except in compliance with the License. 617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root * You may obtain a copy of the License at 717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root * 817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root * http://www.apache.org/licenses/LICENSE-2.0 917eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root * 1017eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root * Unless required by applicable law or agreed to in writing, software 1117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root * distributed under the License is distributed on an "AS IS" BASIS, 1217eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root * See the License for the specific language governing permissions and 1417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root * limitations under the License. 1517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root */ 1617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 1717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Rootpackage com.android.server; 1817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 1917eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Rootimport com.android.frameworks.coretests.R; 2017eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 2117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Rootimport android.content.Context; 2217eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Rootimport android.content.res.Resources; 2317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Rootimport android.content.res.Resources.NotFoundException; 2417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Rootimport android.os.FileUtils; 2517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Rootimport android.os.storage.OnObbStateChangeListener; 2617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Rootimport android.os.storage.StorageManager; 2717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Rootimport android.test.AndroidTestCase; 2817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Rootimport android.test.ComparisonFailure; 2917eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Rootimport android.test.suitebuilder.annotation.LargeTest; 3017eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Rootimport android.util.Log; 3117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 3217eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Rootimport java.io.File; 3317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Rootimport java.io.InputStream; 3417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 3517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Rootpublic class MountServiceTests extends AndroidTestCase { 3617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root private static final String TAG = "MountServiceTests"; 3717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 3817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root private static final long MAX_WAIT_TIME = 25*1000; 3917eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root private static final long WAIT_TIME_INCR = 5*1000; 4017eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 4117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root private static final String OBB_MOUNT_PREFIX = "/mnt/obb/"; 4217eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 4317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root @Override 4417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root protected void setUp() throws Exception { 4517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root super.setUp(); 4617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 4717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 4817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root @Override 4917eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root protected void tearDown() throws Exception { 5017eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root super.tearDown(); 5117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 5217eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 5317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root private static void assertStartsWith(String message, String prefix, String actual) { 5417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root if (!actual.startsWith(prefix)) { 5517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root throw new ComparisonFailure(message, prefix, actual); 5617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 5717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 5817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 59af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root private static class ObbObserver extends OnObbStateChangeListener { 60af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root private String path; 6117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 62af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root public int state = -1; 6317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root boolean done = false; 6417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 6517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root @Override 66af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root public void onObbStateChange(String path, int state) { 67af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root Log.d(TAG, "Received message. path=" + path + ", state=" + state); 6817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root synchronized (this) { 6917eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root this.path = path; 7017eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root this.state = state; 7117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root done = true; 7217eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root notifyAll(); 7317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 7417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 7517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 76af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root public String getPath() { 77af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root assertTrue("Expected ObbObserver to have received a state change.", done); 78af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root return path; 79af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root } 80af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 81af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root public int getState() { 82af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root assertTrue("Expected ObbObserver to have received a state change.", done); 83af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root return state; 84af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root } 85af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 8617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root public void reset() { 8717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root this.path = null; 88af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root this.state = -1; 8917eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root done = false; 9017eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 9117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 9217eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root public boolean isDone() { 9317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root return done; 9417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 9517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 96af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root public boolean waitForCompletion() { 97af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root long waitTime = 0; 98af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root synchronized (this) { 99af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root while (!isDone() && waitTime < MAX_WAIT_TIME) { 100af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root try { 101af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root wait(WAIT_TIME_INCR); 102af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root waitTime += WAIT_TIME_INCR; 103af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root } catch (InterruptedException e) { 104af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root Log.i(TAG, "Interrupted during sleep", e); 105af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root } 10617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 10717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 10817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 109af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root return isDone(); 110af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root } 11117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 112af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 11317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root private File getFilePath(String name) { 11417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root final File filesDir = mContext.getFilesDir(); 11517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root final File outFile = new File(filesDir, name); 11617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root return outFile; 11717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 11817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 11917eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root private void copyRawToFile(int rawResId, File outFile) { 12017eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root Resources res = mContext.getResources(); 12117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root InputStream is = null; 12217eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root try { 12317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root is = res.openRawResource(rawResId); 12417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } catch (NotFoundException e) { 12517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root fail("Failed to load resource with id: " + rawResId); 12617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 12717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root FileUtils.setPermissions(outFile.getPath(), FileUtils.S_IRWXU | FileUtils.S_IRWXG 12817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root | FileUtils.S_IRWXO, -1, -1); 12917eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root assertTrue(FileUtils.copyToFile(is, outFile)); 13017eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root FileUtils.setPermissions(outFile.getPath(), FileUtils.S_IRWXU | FileUtils.S_IRWXG 13117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root | FileUtils.S_IRWXO, -1, -1); 13217eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 13317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 13417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root private StorageManager getStorageManager() { 13517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root return (StorageManager) getContext().getSystemService(Context.STORAGE_SERVICE); 13617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 13717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 13817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root private void mountObb(StorageManager sm, final int resource, final File file, 139af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root int expectedState) { 14017eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root copyRawToFile(resource, file); 14117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 142af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root final ObbObserver observer = new ObbObserver(); 14317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root assertTrue("mountObb call on " + file.getPath() + " should succeed", 14417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root sm.mountObb(file.getPath(), null, observer)); 14517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 14617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root assertTrue("Mount should have completed", 147af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root observer.waitForCompletion()); 148af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 149af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root if (expectedState == OnObbStateChangeListener.MOUNTED) { 150af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root assertTrue("OBB should be mounted", sm.isObbMounted(file.getPath())); 151af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root } 15217eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 15317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root assertEquals("Actual file and resolved file should be the same", 154af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root file.getPath(), observer.getPath()); 155af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 156af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root assertEquals(expectedState, observer.getState()); 157af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root } 158af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 159af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root private ObbObserver mountObbWithoutWait(final StorageManager sm, final int resource, 160af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root final File file) { 161af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root copyRawToFile(resource, file); 162af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 163af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root final ObbObserver observer = new ObbObserver(); 164af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root assertTrue("mountObb call on " + file.getPath() + " should succeed", sm.mountObb(file 165af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root .getPath(), null, observer)); 166af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 167af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root return observer; 168af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root } 16917eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 170af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root private void waitForObbActionCompletion(final StorageManager sm, final File file, 171af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root final ObbObserver observer, int expectedState, boolean checkPath) { 172af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root assertTrue("Mount should have completed", observer.waitForCompletion()); 173af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 174af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root assertTrue("OBB should be mounted", sm.isObbMounted(file.getPath())); 175af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 176af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root if (checkPath) { 177af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root assertEquals("Actual file and resolved file should be the same", file.getPath(), 178af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root observer.getPath()); 179af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root } 180af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 181af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root assertEquals(expectedState, observer.getState()); 18217eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 18317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 184af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root private String checkMountedPath(final StorageManager sm, final File file) { 18517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root final String mountPath = sm.getMountedObbPath(file.getPath()); 18617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root assertStartsWith("Path should be in " + OBB_MOUNT_PREFIX, 18717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root OBB_MOUNT_PREFIX, 18817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root mountPath); 18917eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root return mountPath; 19017eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 19117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 192af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root private void unmountObb(final StorageManager sm, final File file, int expectedState) { 193af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root final ObbObserver observer = new ObbObserver(); 194af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 19517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root assertTrue("unmountObb call on test1.obb should succeed", 196af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root sm.unmountObb(file.getPath(), 197af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root false, observer)); 19817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 19917eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root assertTrue("Unmount should have completed", 200af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root observer.waitForCompletion()); 201af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 202af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root assertEquals(expectedState, observer.getState()); 203af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 204af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root if (expectedState == OnObbStateChangeListener.UNMOUNTED) { 205af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root assertFalse("OBB should not be mounted", sm.isObbMounted(file.getPath())); 206af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root } 20717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 20817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 20917eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root @LargeTest 21017eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root public void testMountAndUnmountObbNormal() { 21117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root StorageManager sm = getStorageManager(); 21217eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 21317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root final File outFile = getFilePath("test1.obb"); 21417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 215af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root mountObb(sm, R.raw.test1, outFile, OnObbStateChangeListener.MOUNTED); 216af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 217af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root mountObb(sm, R.raw.test1, outFile, OnObbStateChangeListener.ERROR_ALREADY_MOUNTED); 21817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 21917eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root final String mountPath = checkMountedPath(sm, outFile); 22017eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root final File mountDir = new File(mountPath); 22117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 22217eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root assertTrue("OBB mounted path should be a directory", 22317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root mountDir.isDirectory()); 22417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 225af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root unmountObb(sm, outFile, OnObbStateChangeListener.UNMOUNTED); 22617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 22717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 22817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root @LargeTest 22917eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root public void testAttemptMountNonObb() { 23017eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root StorageManager sm = getStorageManager(); 23117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 23217eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root final File outFile = getFilePath("test1_nosig.obb"); 23317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 234af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root mountObb(sm, R.raw.test1_nosig, outFile, OnObbStateChangeListener.ERROR_INTERNAL); 23517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 23617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root assertFalse("OBB should not be mounted", 23717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root sm.isObbMounted(outFile.getPath())); 23817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 23917eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root assertNull("OBB's mounted path should be null", 24017eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root sm.getMountedObbPath(outFile.getPath())); 24117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 24217eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 24317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root @LargeTest 24417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root public void testAttemptMountObbWrongPackage() { 24517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root StorageManager sm = getStorageManager(); 24617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 24717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root final File outFile = getFilePath("test1_wrongpackage.obb"); 24817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 249af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root mountObb(sm, R.raw.test1_wrongpackage, outFile, 250af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root OnObbStateChangeListener.ERROR_PERMISSION_DENIED); 25117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 25217eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root assertFalse("OBB should not be mounted", 25317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root sm.isObbMounted(outFile.getPath())); 25417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 25517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root assertNull("OBB's mounted path should be null", 25617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root sm.getMountedObbPath(outFile.getPath())); 25717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 258af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 259af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root @LargeTest 260af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root public void testMountAndUnmountTwoObbs() { 261af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root StorageManager sm = getStorageManager(); 262af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 263af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root final File file1 = getFilePath("test1.obb"); 264af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root final File file2 = getFilePath("test2.obb"); 265af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 266af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root ObbObserver oo1 = mountObbWithoutWait(sm, R.raw.test1, file1); 267af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root ObbObserver oo2 = mountObbWithoutWait(sm, R.raw.test1, file2); 268af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 269af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root Log.d(TAG, "Waiting for OBB #1 to complete mount"); 270af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root waitForObbActionCompletion(sm, file1, oo1, OnObbStateChangeListener.MOUNTED, false); 271af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root Log.d(TAG, "Waiting for OBB #2 to complete mount"); 272af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root waitForObbActionCompletion(sm, file2, oo2, OnObbStateChangeListener.MOUNTED, false); 273af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 274af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root final String mountPath1 = checkMountedPath(sm, file1); 275af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root final File mountDir1 = new File(mountPath1); 276af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root assertTrue("OBB mounted path should be a directory", mountDir1.isDirectory()); 277af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 278af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root final String mountPath2 = checkMountedPath(sm, file2); 279af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root final File mountDir2 = new File(mountPath2); 280af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root assertTrue("OBB mounted path should be a directory", mountDir2.isDirectory()); 281af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 282af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root unmountObb(sm, file1, OnObbStateChangeListener.UNMOUNTED); 283af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root unmountObb(sm, file2, OnObbStateChangeListener.UNMOUNTED); 284af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root } 28517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root} 286