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 android.content.Context; 2017eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Rootimport android.content.res.Resources; 2117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Rootimport android.content.res.Resources.NotFoundException; 2217eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Rootimport android.os.FileUtils; 2317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Rootimport android.os.storage.OnObbStateChangeListener; 2417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Rootimport android.os.storage.StorageManager; 2517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Rootimport android.test.AndroidTestCase; 2617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Rootimport android.test.ComparisonFailure; 2717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Rootimport android.test.suitebuilder.annotation.LargeTest; 2817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Rootimport android.util.Log; 2917eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 304fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkeyimport static com.android.server.MountService.buildObbPath; 314fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey 324fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkeyimport com.android.frameworks.servicestests.R; 334fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey 3417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Rootimport java.io.File; 3517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Rootimport java.io.InputStream; 3617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 3717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Rootpublic class MountServiceTests extends AndroidTestCase { 3817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root private static final String TAG = "MountServiceTests"; 3917eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 4017eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root private static final long MAX_WAIT_TIME = 25*1000; 4117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root private static final long WAIT_TIME_INCR = 5*1000; 4217eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 4317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root private static final String OBB_MOUNT_PREFIX = "/mnt/obb/"; 4417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 4517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root @Override 4617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root protected void setUp() throws Exception { 4717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root super.setUp(); 4817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 4917eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 5017eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root @Override 5117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root protected void tearDown() throws Exception { 5217eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root super.tearDown(); 5317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 5417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 5517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root private static void assertStartsWith(String message, String prefix, String actual) { 5617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root if (!actual.startsWith(prefix)) { 5717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root throw new ComparisonFailure(message, prefix, actual); 5817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 5917eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 6017eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 61af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root private static class ObbObserver extends OnObbStateChangeListener { 62af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root private String path; 6317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 64af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root public int state = -1; 6517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root boolean done = false; 6617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 6717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root @Override 68af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root public void onObbStateChange(String path, int state) { 69af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root Log.d(TAG, "Received message. path=" + path + ", state=" + state); 7017eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root synchronized (this) { 7117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root this.path = path; 7217eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root this.state = state; 7317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root done = true; 7417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root notifyAll(); 7517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 7617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 7717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 78af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root public String getPath() { 79af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root assertTrue("Expected ObbObserver to have received a state change.", done); 80af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root return path; 81af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root } 82af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 83af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root public int getState() { 84af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root assertTrue("Expected ObbObserver to have received a state change.", done); 85af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root return state; 86af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root } 87af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 8817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root public void reset() { 8917eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root this.path = null; 90af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root this.state = -1; 9117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root done = false; 9217eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 9317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 9417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root public boolean isDone() { 9517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root return done; 9617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 9717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 98af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root public boolean waitForCompletion() { 99af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root long waitTime = 0; 100af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root synchronized (this) { 101af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root while (!isDone() && waitTime < MAX_WAIT_TIME) { 102af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root try { 103af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root wait(WAIT_TIME_INCR); 104af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root waitTime += WAIT_TIME_INCR; 105af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root } catch (InterruptedException e) { 106af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root Log.i(TAG, "Interrupted during sleep", e); 107af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root } 10817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 10917eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 11017eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 111af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root return isDone(); 112af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root } 11317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 114af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 11517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root private File getFilePath(String name) { 11617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root final File filesDir = mContext.getFilesDir(); 11717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root final File outFile = new File(filesDir, name); 11817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root return outFile; 11917eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 12017eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 12117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root private void copyRawToFile(int rawResId, File outFile) { 12217eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root Resources res = mContext.getResources(); 12317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root InputStream is = null; 12417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root try { 12517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root is = res.openRawResource(rawResId); 12617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } catch (NotFoundException e) { 12717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root fail("Failed to load resource with id: " + rawResId); 12817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 12917eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root FileUtils.setPermissions(outFile.getPath(), FileUtils.S_IRWXU | FileUtils.S_IRWXG 13017eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root | FileUtils.S_IRWXO, -1, -1); 13117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root assertTrue(FileUtils.copyToFile(is, outFile)); 13217eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root FileUtils.setPermissions(outFile.getPath(), FileUtils.S_IRWXU | FileUtils.S_IRWXG 13317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root | FileUtils.S_IRWXO, -1, -1); 13417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 13517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 13617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root private StorageManager getStorageManager() { 13717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root return (StorageManager) getContext().getSystemService(Context.STORAGE_SERVICE); 13817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 13917eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 14017eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root private void mountObb(StorageManager sm, final int resource, final File file, 141af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root int expectedState) { 14217eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root copyRawToFile(resource, file); 14317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 144af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root final ObbObserver observer = new ObbObserver(); 14517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root assertTrue("mountObb call on " + file.getPath() + " should succeed", 14617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root sm.mountObb(file.getPath(), null, observer)); 14717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 14817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root assertTrue("Mount should have completed", 149af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root observer.waitForCompletion()); 150af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 151af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root if (expectedState == OnObbStateChangeListener.MOUNTED) { 152af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root assertTrue("OBB should be mounted", sm.isObbMounted(file.getPath())); 153af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root } 15417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 15517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root assertEquals("Actual file and resolved file should be the same", 156af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root file.getPath(), observer.getPath()); 157af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 158af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root assertEquals(expectedState, observer.getState()); 159af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root } 160af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 161af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root private ObbObserver mountObbWithoutWait(final StorageManager sm, final int resource, 162af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root final File file) { 163af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root copyRawToFile(resource, file); 164af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 165af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root final ObbObserver observer = new ObbObserver(); 166af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root assertTrue("mountObb call on " + file.getPath() + " should succeed", sm.mountObb(file 167af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root .getPath(), null, observer)); 168af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 169af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root return observer; 170af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root } 17117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 172af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root private void waitForObbActionCompletion(final StorageManager sm, final File file, 173af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root final ObbObserver observer, int expectedState, boolean checkPath) { 174af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root assertTrue("Mount should have completed", observer.waitForCompletion()); 175af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 176af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root assertTrue("OBB should be mounted", sm.isObbMounted(file.getPath())); 177af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 178af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root if (checkPath) { 179af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root assertEquals("Actual file and resolved file should be the same", file.getPath(), 180af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root observer.getPath()); 181af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root } 182af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 183af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root assertEquals(expectedState, observer.getState()); 18417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 18517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 186af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root private String checkMountedPath(final StorageManager sm, final File file) { 18717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root final String mountPath = sm.getMountedObbPath(file.getPath()); 18817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root assertStartsWith("Path should be in " + OBB_MOUNT_PREFIX, 18917eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root OBB_MOUNT_PREFIX, 19017eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root mountPath); 19117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root return mountPath; 19217eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 19317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 194af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root private void unmountObb(final StorageManager sm, final File file, int expectedState) { 195af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root final ObbObserver observer = new ObbObserver(); 196af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 19717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root assertTrue("unmountObb call on test1.obb should succeed", 198af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root sm.unmountObb(file.getPath(), 199af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root false, observer)); 20017eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 20117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root assertTrue("Unmount should have completed", 202af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root observer.waitForCompletion()); 203af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 204af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root assertEquals(expectedState, observer.getState()); 205af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 206af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root if (expectedState == OnObbStateChangeListener.UNMOUNTED) { 207af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root assertFalse("OBB should not be mounted", sm.isObbMounted(file.getPath())); 208af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root } 20917eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 21017eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 21117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root @LargeTest 21217eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root public void testMountAndUnmountObbNormal() { 21317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root StorageManager sm = getStorageManager(); 21417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 21517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root final File outFile = getFilePath("test1.obb"); 21617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 217af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root mountObb(sm, R.raw.test1, outFile, OnObbStateChangeListener.MOUNTED); 218af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 219af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root mountObb(sm, R.raw.test1, outFile, OnObbStateChangeListener.ERROR_ALREADY_MOUNTED); 22017eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 22117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root final String mountPath = checkMountedPath(sm, outFile); 22217eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root final File mountDir = new File(mountPath); 22317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 22417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root assertTrue("OBB mounted path should be a directory", 22517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root mountDir.isDirectory()); 22617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 227af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root unmountObb(sm, outFile, OnObbStateChangeListener.UNMOUNTED); 22817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 22917eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 23017eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root @LargeTest 23117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root public void testAttemptMountNonObb() { 23217eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root StorageManager sm = getStorageManager(); 23317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 23417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root final File outFile = getFilePath("test1_nosig.obb"); 23517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 236af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root mountObb(sm, R.raw.test1_nosig, outFile, OnObbStateChangeListener.ERROR_INTERNAL); 23717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 23817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root assertFalse("OBB should not be mounted", 23917eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root sm.isObbMounted(outFile.getPath())); 24017eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 24117eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root assertNull("OBB's mounted path should be null", 24217eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root sm.getMountedObbPath(outFile.getPath())); 24317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 24417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 24517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root @LargeTest 24617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root public void testAttemptMountObbWrongPackage() { 24717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root StorageManager sm = getStorageManager(); 24817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 24917eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root final File outFile = getFilePath("test1_wrongpackage.obb"); 25017eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 251af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root mountObb(sm, R.raw.test1_wrongpackage, outFile, 252af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root OnObbStateChangeListener.ERROR_PERMISSION_DENIED); 25317eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 25417eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root assertFalse("OBB should not be mounted", 25517eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root sm.isObbMounted(outFile.getPath())); 25617eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root 25717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root assertNull("OBB's mounted path should be null", 25817eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root sm.getMountedObbPath(outFile.getPath())); 25917eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root } 260af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 261af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root @LargeTest 262af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root public void testMountAndUnmountTwoObbs() { 263af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root StorageManager sm = getStorageManager(); 264af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 265af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root final File file1 = getFilePath("test1.obb"); 266af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root final File file2 = getFilePath("test2.obb"); 267af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 268af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root ObbObserver oo1 = mountObbWithoutWait(sm, R.raw.test1, file1); 269af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root ObbObserver oo2 = mountObbWithoutWait(sm, R.raw.test1, file2); 270af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 271af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root Log.d(TAG, "Waiting for OBB #1 to complete mount"); 272af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root waitForObbActionCompletion(sm, file1, oo1, OnObbStateChangeListener.MOUNTED, false); 273af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root Log.d(TAG, "Waiting for OBB #2 to complete mount"); 274af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root waitForObbActionCompletion(sm, file2, oo2, OnObbStateChangeListener.MOUNTED, false); 275af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 276af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root final String mountPath1 = checkMountedPath(sm, file1); 277af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root final File mountDir1 = new File(mountPath1); 278af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root assertTrue("OBB mounted path should be a directory", mountDir1.isDirectory()); 279af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 280af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root final String mountPath2 = checkMountedPath(sm, file2); 281af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root final File mountDir2 = new File(mountPath2); 282af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root assertTrue("OBB mounted path should be a directory", mountDir2.isDirectory()); 283af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 284af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root unmountObb(sm, file1, OnObbStateChangeListener.UNMOUNTED); 285af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root unmountObb(sm, file2, OnObbStateChangeListener.UNMOUNTED); 286af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root } 2874fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey 2884fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey public void testBuildObbPath() { 2894fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey final int userId = 10; 2904fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey 2914fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey // Paths outside external storage should remain untouched 2924fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey assertEquals("/storage/random/foo", 2934fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey buildObbPath("/storage/random/foo", userId, true)); 2944fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey assertEquals("/storage/random/foo", 2954fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey buildObbPath("/storage/random/foo", userId, false)); 2964fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey 2974fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey // Paths on user-specific emulated storage 2984fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey assertEquals("/mnt/shell/emulated/10/foo", 2994fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey buildObbPath("/storage/emulated_legacy/foo", userId, true)); 3004fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey assertEquals("/storage/emulated/10/foo", 3014fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey buildObbPath("/storage/emulated_legacy/foo", userId, false)); 3024fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey assertEquals("/mnt/shell/emulated/10/foo", 3034fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey buildObbPath("/storage/emulated/10/foo", userId, true)); 3044fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey assertEquals("/storage/emulated/10/foo", 3054fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey buildObbPath("/storage/emulated/10/foo", userId, false)); 3064fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey 3074fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey // Paths on shared OBB emulated storage 3084fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey assertEquals("/mnt/shell/emulated/obb/foo", 3094fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey buildObbPath("/storage/emulated_legacy/Android/obb/foo", userId, true)); 3104fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey assertEquals("/storage/emulated/0/Android/obb/foo", 3114fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey buildObbPath("/storage/emulated_legacy/Android/obb/foo", userId, false)); 3124fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey assertEquals("/mnt/shell/emulated/obb/foo", 3134fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey buildObbPath("/storage/emulated/10/Android/obb/foo", userId, true)); 3144fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey assertEquals("/storage/emulated/0/Android/obb/foo", 3154fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey buildObbPath("/storage/emulated/10/Android/obb/foo", userId, false)); 3164fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey } 31717eb6fb07cc6965f09c51adc70b3c291f57a784aKenny Root} 318