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