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