1fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat/*
2fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat * Copyright (C) 2006 The Android Open Source Project
3fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat *
4fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat * Licensed under the Apache License, Version 2.0 (the "License");
5fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat * you may not use this file except in compliance with the License.
6fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat * You may obtain a copy of the License at
7fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat *
8fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat *      http://www.apache.org/licenses/LICENSE-2.0
9fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat *
10fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat * Unless required by applicable law or agreed to in writing, software
11fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat * distributed under the License is distributed on an "AS IS" BASIS,
12fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat * See the License for the specific language governing permissions and
14fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat * limitations under the License.
15fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat */
16fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat
17a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabotpackage android.os.storage;
18fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat
19fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehatimport android.content.Context;
20fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehatimport android.os.Environment;
21fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehatimport android.os.IBinder;
22fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehatimport android.os.RemoteException;
23fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehatimport android.os.ServiceManager;
24a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabotimport android.test.AndroidTestCase;
25a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabotimport android.util.Log;
26a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabot
27a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabotimport java.io.File;
28a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabotimport java.io.FileOutputStream;
29a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabot
30fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehatpublic class AsecTests extends AndroidTestCase {
316dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    private static final String SECURE_CONTAINER_PREFIX = "com.android.unittests.AsecTests.";
32fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat    private static final boolean localLOGV = true;
33fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat    public static final String TAG="AsecTests";
34fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat
356dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    private static final String FS_FAT = "fat";
366dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    private static final String FS_EXT4 = "ext4";
37fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat
38fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat    @Override
39fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat    protected void setUp() throws Exception {
40fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat        super.setUp();
41fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat        if (localLOGV) Log.i(TAG, "Cleaning out old test containers");
42fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat        cleanupContainers();
43fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat    }
44fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat
457db3e5e287087d9665ffa84ecbe87603001fc55fSan Mehat    @Override
467db3e5e287087d9665ffa84ecbe87603001fc55fSan Mehat    protected void tearDown() throws Exception {
477db3e5e287087d9665ffa84ecbe87603001fc55fSan Mehat        super.tearDown();
487db3e5e287087d9665ffa84ecbe87603001fc55fSan Mehat        if (localLOGV) Log.i(TAG, "Cleaning out old test containers");
497db3e5e287087d9665ffa84ecbe87603001fc55fSan Mehat        cleanupContainers();
507db3e5e287087d9665ffa84ecbe87603001fc55fSan Mehat    }
517db3e5e287087d9665ffa84ecbe87603001fc55fSan Mehat
52fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat    private void cleanupContainers() throws RemoteException {
53fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat        IMountService ms = getMs();
54fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat        String[] containers = ms.getSecureContainerList();
55fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat
56fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat        for (int i = 0; i < containers.length; i++) {
576dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            if (containers[i].startsWith(SECURE_CONTAINER_PREFIX)) {
586dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                if (localLOGV)
596dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    Log.i(TAG, "Cleaning: " + containers[i]);
60d970998b0d489774ad1c5b94b47d233912f00214San Mehat                ms.destroySecureContainer(containers[i], true);
61fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat            }
62fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat        }
63fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat    }
64fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat
65da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat    private boolean containerExists(String localId) throws RemoteException {
66da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat        IMountService ms = getMs();
67da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat        String[] containers = ms.getSecureContainerList();
686dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        String fullId = SECURE_CONTAINER_PREFIX + localId;
69da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat
70da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat        for (int i = 0; i < containers.length; i++) {
71da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat            if (containers[i].equals(fullId)) {
72da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat                return true;
73da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat            }
74da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat        }
75da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat        return false;
76da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat    }
77da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat
786dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    private int createContainer(String localId, int size, String key, String filesystem,
796dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            boolean isExternal) throws Exception {
806dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertTrue("Media should be mounted", isMediaMounted());
816dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        String fullId = SECURE_CONTAINER_PREFIX + localId;
82da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat
83da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat        IMountService ms = getMs();
846dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        return ms.createSecureContainer(fullId, size, filesystem, key, android.os.Process.myUid(),
856dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                isExternal);
86da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat    }
87da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat
886dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    private int mountContainer(String localId, String key) throws Exception {
896dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertTrue("Media should be mounted", isMediaMounted());
906dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        String fullId = SECURE_CONTAINER_PREFIX + localId;
91da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat
92da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat        IMountService ms = getMs();
93da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat        return ms.mountSecureContainer(fullId, key, android.os.Process.myUid());
94da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat    }
95da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat
966dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    private int renameContainer(String localId1, String localId2) throws Exception {
976dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertTrue("Media should be mounted", isMediaMounted());
986dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        String fullId1 = SECURE_CONTAINER_PREFIX + localId1;
996dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        String fullId2 = SECURE_CONTAINER_PREFIX + localId2;
100da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat
101da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat        IMountService ms = getMs();
102da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat        return ms.renameSecureContainer(fullId1, fullId2);
103da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat    }
104da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat
1056dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    private int unmountContainer(String localId, boolean force) throws Exception {
1066dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertTrue("Media should be mounted", isMediaMounted());
1076dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        String fullId = SECURE_CONTAINER_PREFIX + localId;
108da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat
109da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat        IMountService ms = getMs();
110da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat        return ms.unmountSecureContainer(fullId, force);
111da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat    }
112da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat
1136dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    private int destroyContainer(String localId, boolean force) throws Exception {
1146dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertTrue("Media should be mounted", isMediaMounted());
1156dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        String fullId = SECURE_CONTAINER_PREFIX + localId;
116da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat
117da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat        IMountService ms = getMs();
118da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat        return ms.destroySecureContainer(fullId, force);
119da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat    }
120da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat
1216dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    private boolean isContainerMounted(String localId) throws Exception {
1226dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertTrue("Media should be mounted", isMediaMounted());
1236dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        String fullId = SECURE_CONTAINER_PREFIX + localId;
124cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu
125cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu        IMountService ms = getMs();
126cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu        return ms.isSecureContainerMounted(fullId);
127cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu    }
128cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu
129fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat    private IMountService getMs() {
130fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat        IBinder service = ServiceManager.getService("mount");
131fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat        if (service != null) {
132fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat            return IMountService.Stub.asInterface(service);
133fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat        } else {
134fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat            Log.e(TAG, "Can't get mount service");
135fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat        }
136fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat        return null;
137fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat    }
138fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat
1396dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    private boolean isMediaMounted() throws Exception {
140fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat        String mPath = Environment.getExternalStorageDirectory().toString();
141fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat        String state = getMs().getVolumeState(mPath);
142fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat        return Environment.MEDIA_MOUNTED.equals(state);
143fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat    }
144fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat
1456dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
1466dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    /*
1476dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root     * CREATE
1486dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root     */
1496dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
1506dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void test_Fat_External_Create_Success() throws Exception {
1516dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        if (Environment.isExternalStorageEmulated()) {
1526dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            return;
153da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat        }
1546dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
1556dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
1566dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testCreateContainer", 4, "none", FS_FAT, true));
1576dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertTrue(containerExists("testCreateContainer"));
158da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat    }
159da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat
1606dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void test_Ext4_External_Create_Success() throws Exception {
1616dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        if (Environment.isExternalStorageEmulated()) {
1626dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            return;
163d970998b0d489774ad1c5b94b47d233912f00214San Mehat        }
1646dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
1656dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
1666dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testCreateContainer", 4, "none", FS_EXT4, true));
1676dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertTrue(containerExists("testCreateContainer"));
168d970998b0d489774ad1c5b94b47d233912f00214San Mehat    }
169d970998b0d489774ad1c5b94b47d233912f00214San Mehat
1706dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void test_Fat_Internal_Create_Success() throws Exception {
1716dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
1726dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testCreateContainer", 4, "none", FS_FAT, false));
1736dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertTrue(containerExists("testCreateContainer"));
174d970998b0d489774ad1c5b94b47d233912f00214San Mehat    }
175d970998b0d489774ad1c5b94b47d233912f00214San Mehat
1766dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void test_Ext4_Internal_Create_Success() throws Exception {
1776dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
1786dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testCreateContainer", 4, "none", FS_EXT4, false));
1796dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertTrue(containerExists("testCreateContainer"));
1806dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    }
181da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat
1826dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
1836dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    /*
1846dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root     * CREATE MIN SIZE
1856dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root     */
1866dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
1876dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void test_Fat_External_CreateMinSize_Success() throws Exception {
1886dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        if (Environment.isExternalStorageEmulated()) {
1896dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            return;
190fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat        }
1916dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
1926dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
1936dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testCreateContainer", 1, "none", FS_FAT, true));
1946dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertTrue(containerExists("testCreateContainer"));
195fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat    }
196fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat
1976dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void test_Ext4_External_CreateMinSize_Success() throws Exception {
1986dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        if (Environment.isExternalStorageEmulated()) {
1996dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            return;
200fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat        }
2016dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
2026dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
2036dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testCreateContainer", 1, "none", FS_EXT4, true));
2046dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertTrue(containerExists("testCreateContainer"));
205fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat    }
206fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat
2076dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void test_Fat_Internal_CreateMinSize_Success() throws Exception {
2086dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
2096dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testCreateContainer", 1, "none", FS_FAT, false));
2106dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertTrue(containerExists("testCreateContainer"));
2116dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    }
212fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat
2136dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void test_Ext4_Internal_CreateMinSize_Success() throws Exception {
2146dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
2156dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testCreateContainer", 1, "none", FS_EXT4, false));
2166dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertTrue(containerExists("testCreateContainer"));
2176dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    }
2186dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
2196dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
2206dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    /*
2216dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root     * CREATE ZERO SIZE - FAIL CASE
2226dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root     */
223fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat
2246dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void test_Fat_External_CreateZeroSize_Failure() throws Exception {
2256dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        if (Environment.isExternalStorageEmulated()) {
2266dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            return;
227fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat        }
2286dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
2296dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationFailedInternalError,
2306dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testCreateZeroContainer", 0, "none", FS_FAT, true));
231fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat    }
232fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat
2336dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void test_Ext4_External_CreateZeroSize_Failure() throws Exception {
2346dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        if (Environment.isExternalStorageEmulated()) {
2356dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            return;
2366dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        }
2376dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
2386dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationFailedInternalError,
2396dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testCreateZeroContainer", 0, "none", FS_EXT4, true));
2406dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    }
241da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat
2426dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void test_Fat_Internal_CreateZeroSize_Failure() throws Exception {
2436dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationFailedInternalError,
2446dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testCreateZeroContainer", 0, "none", FS_FAT, false));
2456dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    }
246da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat
2476dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void test_Ext4_Internal_CreateZeroSize_Failure() throws Exception {
2486dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationFailedInternalError,
2496dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testCreateZeroContainer", 0, "none", FS_EXT4, false));
2506dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    }
251da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat
2526dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
2536dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    /*
2546dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root     * CREATE DUPLICATE - FAIL CASE
2556dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root     */
2566dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
2576dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void test_Fat_External_CreateDuplicate_Failure() throws Exception {
2586dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        if (Environment.isExternalStorageEmulated()) {
2596dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            return;
2602d66cef77e450ec4a4d725b89ae68c5e6b167beeSan Mehat        }
2616dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
2626dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
2636dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testCreateDupContainer", 4, "none", FS_FAT, true));
2646dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
2656dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationFailedInternalError,
2666dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testCreateDupContainer", 4, "none", FS_FAT, true));
2672d66cef77e450ec4a4d725b89ae68c5e6b167beeSan Mehat    }
2682d66cef77e450ec4a4d725b89ae68c5e6b167beeSan Mehat
2696dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void test_Ext4_External_CreateDuplicate_Failure() throws Exception {
2706dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        if (Environment.isExternalStorageEmulated()) {
2716dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            return;
272fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat        }
2736dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
2746dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
2756dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testCreateDupContainer", 4, "none", FS_EXT4, true));
2766dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
2776dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationFailedInternalError,
2786dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testCreateDupContainer", 4, "none", FS_EXT4, true));
279fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat    }
280d970998b0d489774ad1c5b94b47d233912f00214San Mehat
2816dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void test_Fat_Internal_CreateDuplicate_Failure() throws Exception {
2826dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
2836dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testCreateDupContainer", 4, "none", FS_FAT, false));
2846dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
2856dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationFailedInternalError,
2866dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testCreateDupContainer", 4, "none", FS_FAT, false));
2876dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    }
2886dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
2896dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void test_Ext4_Internal_CreateDuplicate_Failure() throws Exception {
2906dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
2916dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testCreateDupContainer", 4, "none", FS_EXT4, false));
292d970998b0d489774ad1c5b94b47d233912f00214San Mehat
2936dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationFailedInternalError,
2946dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testCreateDupContainer", 4, "none", FS_EXT4, false));
2956dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    }
296d970998b0d489774ad1c5b94b47d233912f00214San Mehat
297d970998b0d489774ad1c5b94b47d233912f00214San Mehat
2986dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    /*
2996dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root     * DESTROY
3006dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root     */
301da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat
3026dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void test_Fat_External_Destroy_Success() throws Exception {
3036dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        if (Environment.isExternalStorageEmulated()) {
3046dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            return;
305d970998b0d489774ad1c5b94b47d233912f00214San Mehat        }
3066dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
3076dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
3086dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testDestroyContainer", 4, "none", FS_FAT, true));
3096dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
3106dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                destroyContainer("testDestroyContainer", false));
311d970998b0d489774ad1c5b94b47d233912f00214San Mehat    }
312d970998b0d489774ad1c5b94b47d233912f00214San Mehat
3136dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void test_Ext4_External_Destroy_Success() throws Exception {
3146dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        if (Environment.isExternalStorageEmulated()) {
3156dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            return;
3166dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        }
3176dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
3186dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
3196dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testDestroyContainer", 4, "none", FS_EXT4, true));
3206dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
3216dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                destroyContainer("testDestroyContainer", false));
3226dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    }
323d970998b0d489774ad1c5b94b47d233912f00214San Mehat
3246dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void test_Fat_Internal_Destroy_Success() throws Exception {
3256dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
3266dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testDestroyContainer", 4, "none", FS_FAT, false));
3276dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
3286dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                destroyContainer("testDestroyContainer", false));
3296dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    }
3306dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
3316dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void test_Ext4_Internal_Destroy_Success() throws Exception {
3326dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
3336dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testDestroyContainer", 4, "none", FS_EXT4, false));
3346dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
3356dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                destroyContainer("testDestroyContainer", false));
3366dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    }
337d970998b0d489774ad1c5b94b47d233912f00214San Mehat
338da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat
3396dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    /*
3406dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root     * MOUNT
3416dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root     */
342da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat
3436dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void test_Fat_External_Mount() throws Exception {
3446dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        if (Environment.isExternalStorageEmulated()) {
3456dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            return;
346da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat        }
3476dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
3486dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
3496dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testMountContainer", 4, "none", FS_FAT, true));
3506dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
3516dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
3526dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                unmountContainer("testMountContainer", false));
3536dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
3546dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
3556dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                mountContainer("testMountContainer", "none"));
356da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat    }
357da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat
358da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat
3596dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    /*
3606dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root     * MOUNT BAD KEY - FAIL CASE
3616dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root     */
3626dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
3636dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void test_Fat_External_MountBadKey_Failure() throws Exception {
3646dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        if (Environment.isExternalStorageEmulated()) {
3656dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            return;
3666dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        }
3676dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
3686dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
3696dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testMountBadKey", 4, "00000000000000000000000000000000", FS_FAT,
3706dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                        true));
3716dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
3726dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
3736dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                unmountContainer("testMountBadKey", false));
3746dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
3756dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationFailedInternalError,
3766dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                mountContainer("testMountContainer", "000000000000000000000000000000001"));
3776dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
3786dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationFailedInternalError,
3796dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                mountContainer("testMountContainer", "none"));
3806dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    }
381da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat
382da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat
3836dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void test_Fat_External_UnmountBusy_Success() throws Exception {
3846dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        if (Environment.isExternalStorageEmulated()) {
3856dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            return;
386da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat        }
3876dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
3886dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        IMountService ms = getMs();
3896dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
3906dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testUnmountBusyContainer", 4, "none", FS_FAT, true));
3916dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
3926dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        String path = ms.getSecureContainerPath(SECURE_CONTAINER_PREFIX
3936dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                + "testUnmountBusyContainer");
3946dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
3956dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        File f = new File(path, "reference");
3966dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        FileOutputStream fos = new FileOutputStream(f);
3976dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
3986dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationFailedStorageBusy,
3996dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                unmountContainer("testUnmountBusyContainer", false));
4006dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
4016dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        fos.close();
4026dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
4036dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                unmountContainer("testUnmountBusyContainer", false));
404da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat    }
405da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat
4066dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void test_Fat_External_DestroyBusy() throws Exception {
4076dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        if (Environment.isExternalStorageEmulated()) {
4086dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            return;
4096dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        }
4106dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
4116dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        IMountService ms = getMs();
4126dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
4136dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
4146dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testDestroyBusyContainer", 4, "none", FS_FAT, true));
4156dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
4166dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        String path = ms.getSecureContainerPath(SECURE_CONTAINER_PREFIX
4176dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                + "testDestroyBusyContainer");
4186dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
4196dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        File f = new File(path, "reference");
4206dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        FileOutputStream fos = new FileOutputStream(f);
4216dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
4226dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationFailedStorageBusy,
4236dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                destroyContainer("testDestroyBusyContainer", false));
424da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat
4256dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        fos.close();
4266dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
4276dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                destroyContainer("testDestroyBusyContainer", false));
4286dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    }
4296dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
4306dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void test_Fat_External_Rename_Success() throws Exception {
4316dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        if (Environment.isExternalStorageEmulated()) {
4326dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            return;
433da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat        }
4346dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
4356dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
4366dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testRenameContainer.1", 4, "none", FS_FAT, true));
4376dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
4386dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
4396dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                unmountContainer("testRenameContainer.1", false));
4406dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
4416dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
4426dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                renameContainer("testRenameContainer.1", "testRenameContainer.2"));
4436dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
4446dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertFalse(containerExists("testRenameContainer.1"));
4456dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertTrue(containerExists("testRenameContainer.2"));
446da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat    }
447da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat
4486dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void test_Fat_External_RenameSrcMounted_Failure() throws Exception {
4496dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        if (Environment.isExternalStorageEmulated()) {
4506dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            return;
4516dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        }
452da2ca7a5b863d2cef9650cc9cb776a20693d9bb6San Mehat
4536dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
4546dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testRenameContainer.1", 4, "none", FS_FAT, true));
45585451ee15fdf6cae371dc3005441988c7d426401San Mehat
4566dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationFailedStorageMounted,
4576dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                renameContainer("testRenameContainer.1", "testRenameContainer.2"));
4586dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    }
459d970998b0d489774ad1c5b94b47d233912f00214San Mehat
4606dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void test_Fat_External_RenameDstMounted_Failure() throws Exception {
4616dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        if (Environment.isExternalStorageEmulated()) {
4626dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            return;
463d970998b0d489774ad1c5b94b47d233912f00214San Mehat        }
4646dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
4656dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
4666dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testRenameContainer.1", 4, "none", FS_FAT, true));
4676dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
4686dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
4696dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                unmountContainer("testRenameContainer.1", false));
4706dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
4716dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
4726dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testRenameContainer.2", 4, "none", FS_FAT, true));
4736dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
4746dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationFailedStorageMounted,
4756dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                renameContainer("testRenameContainer.1", "testRenameContainer.2"));
476d970998b0d489774ad1c5b94b47d233912f00214San Mehat    }
477cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu
4786dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void test_Fat_External_Size_Success() throws Exception {
4796dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        if (Environment.isExternalStorageEmulated()) {
4806dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            return;
4816dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        }
4826dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
4839d05a18490dfac7ea705a6166f06af77a63c5534San Mehat        IMountService ms = getMs();
4846dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertEquals(StorageResultCode.OperationSucceeded,
4856dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                createContainer("testContainerSize", 1, "none", FS_FAT, true));
4866dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        String path = ms.getSecureContainerPath(SECURE_CONTAINER_PREFIX + "testContainerSize");
4876dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
4886dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        byte[] buf = new byte[4096];
4896dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        File f = new File(path, "reference");
4906dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        FileOutputStream fos = new FileOutputStream(f);
4916dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        for (int i = 0; i < (1024 * 1024); i += buf.length) {
4926dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            fos.write(buf);
493cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu        }
4946dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        fos.close();
4956dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    }
4966dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
4976dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void testGetSecureContainerPath_NonExistPath_Failure() throws Exception {
4986dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        IMountService ms = getMs();
4996dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        assertNull("Getting the path for an invalid container should return null",
5006dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                ms.getSecureContainerPath("jparks.broke.it"));
501cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu    }
502cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu
5036ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu    /*------------ Tests for unmounting volume ---*/
5046ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu    public final long MAX_WAIT_TIME=120*1000;
5056ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu    public final long WAIT_TIME_INCR=20*1000;
5066dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
5076dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    boolean getMediaState() throws Exception {
5086ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        String mPath = Environment.getExternalStorageDirectory().toString();
5096ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        String state = getMs().getVolumeState(mPath);
5106ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        return Environment.MEDIA_MOUNTED.equals(state);
5116ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu    }
5126ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu
5136dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    boolean mountMedia() throws Exception {
5146dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        if (Environment.isExternalStorageEmulated()) {
5156dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            return true;
5166dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        }
5176dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
5186ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        if (getMediaState()) {
5196ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            return true;
5206ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        }
5216dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
5226ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        String mPath = Environment.getExternalStorageDirectory().toString();
5236ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        int ret = getMs().mountVolume(mPath);
5246ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        return ret == StorageResultCode.OperationSucceeded;
5256ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu    }
5266ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu
5276ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu    class StorageListener extends StorageEventListener {
5286ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        String oldState;
5296ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        String newState;
5306ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        String path;
5316ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        private boolean doneFlag = false;
5326ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu
5336ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        public void action() {
5346ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            synchronized (this) {
5356ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                doneFlag = true;
5366ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                notifyAll();
5376ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            }
5386ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        }
5396ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu
5406ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        public boolean isDone() {
5416ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            return doneFlag;
5426ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        }
5436ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu
5446ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        @Override
5456ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        public void onStorageStateChanged(String path, String oldState, String newState) {
5466ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            if (localLOGV) Log.i(TAG, "Storage state changed from " + oldState + " to " + newState);
5476ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            this.oldState = oldState;
5486ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            this.newState = newState;
5496ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            this.path = path;
5506ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            action();
5516ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        }
5526ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu    }
5536ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu
5546dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    private void unmountMedia() throws Exception {
5556dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        if (Environment.isExternalStorageEmulated()) {
5566dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            return;
5576dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        }
5586dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
5596ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        if (!getMediaState()) {
5606dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            return;
5616ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        }
5626dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
5636ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        String path = Environment.getExternalStorageDirectory().toString();
5646ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        StorageListener observer = new StorageListener();
5656ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        StorageManager sm = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE);
5666ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        sm.registerListener(observer);
5676ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        try {
5686ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            // Wait on observer
5696ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            synchronized(observer) {
57013c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo                getMs().unmountVolume(path, false, false);
5716ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                long waitTime = 0;
5726ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
5736ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                    observer.wait(WAIT_TIME_INCR);
5746ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                    waitTime += WAIT_TIME_INCR;
5756ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                }
5766ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                if(!observer.isDone()) {
5776dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    fail("Timed out waiting for packageInstalled callback");
5786ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                }
5796ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            }
5806ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        } finally {
5816ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            sm.unregisterListener(observer);
5826ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        }
5836ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu    }
5846dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
5856dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void testUnmount() throws Exception {
5866ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        boolean oldStatus = getMediaState();
5876ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        Log.i(TAG, "oldStatus="+oldStatus);
5886ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        try {
5896ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            // Mount media firsts
5906ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            if (!getMediaState()) {
5916ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                mountMedia();
5926ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            }
5936dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            unmountMedia();
5946ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        } finally {
5956ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            // Restore old status
5966ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            boolean currStatus = getMediaState();
5976ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            if (oldStatus != currStatus) {
5986ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                if (oldStatus) {
5996ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                    // Mount media
6006ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                    mountMedia();
6016ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                } else {
6026ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                    unmountMedia();
6036ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                }
6046ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            }
6056ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        }
6066ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu    }
6076ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu
6086ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu    class MultipleStorageLis extends StorageListener {
6096ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        int count = 0;
6106ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        public void onStorageStateChanged(String path, String oldState, String newState) {
6116ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            count++;
6126ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            super.action();
6136ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        }
6146ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu    }
6156ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu    /*
6166ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu     * This test invokes unmount multiple time and expects the call back
6176ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu     * to be invoked just once.
6186ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu     */
6196dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void testUnmountMultiple() throws Exception {
6206dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        if (Environment.isExternalStorageEmulated()) {
6216dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            return;
6226dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        }
6236dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
6246ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        boolean oldStatus = getMediaState();
6256ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        StorageManager sm = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE);
6266ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        MultipleStorageLis observer = new MultipleStorageLis();
6276ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        try {
6286ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            // Mount media firsts
6296ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            if (!getMediaState()) {
6306ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                mountMedia();
6316ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            }
6326ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            String path = Environment.getExternalStorageDirectory().toString();
6336ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            sm.registerListener(observer);
6346ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            // Wait on observer
6356ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            synchronized(observer) {
6366ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                for (int i = 0; i < 5; i++) {
63713c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo                    getMs().unmountVolume(path, false, false);
6386ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                }
6396ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                long waitTime = 0;
6406ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
6416ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                    observer.wait(WAIT_TIME_INCR);
6426ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                    waitTime += WAIT_TIME_INCR;
6436ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                }
6446ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                if(!observer.isDone()) {
6456dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    fail("Timed out waiting for packageInstalled callback");
6466ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                }
6476ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            }
6486ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            assertEquals(observer.count, 1);
6496ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        } finally {
6506ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            sm.unregisterListener(observer);
6516ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            // Restore old status
6526ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            boolean currStatus = getMediaState();
6536ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            if (oldStatus != currStatus) {
6546ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                if (oldStatus) {
6556ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                    // Mount media
6566ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                    mountMedia();
6576ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                } else {
6586ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                    unmountMedia();
6596ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                }
6606ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            }
6616ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        }
6626ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu    }
6636dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
6646ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu    class ShutdownObserver extends  IMountShutdownObserver.Stub{
6656ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        private boolean doneFlag = false;
6666ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        int statusCode;
6676ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu
6686ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        public void action() {
6696ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            synchronized (this) {
6706ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                doneFlag = true;
6716ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                notifyAll();
6726ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            }
6736ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        }
6746ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu
6756ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        public boolean isDone() {
6766ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            return doneFlag;
6776ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        }
6786ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        public void onShutDownComplete(int statusCode) throws RemoteException {
6796ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            this.statusCode = statusCode;
6806ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            action();
6816ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        }
6826ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu
6836ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu    }
6846ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu
6856dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    void invokeShutdown() throws Exception {
6866ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        IMountService ms = getMs();
6876ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        ShutdownObserver observer = new ShutdownObserver();
6886ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        synchronized (observer) {
6896dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            ms.shutdown(observer);
6906ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        }
6916ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu    }
6926ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu
6936dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void testShutdown() throws Exception {
6946dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        if (Environment.isExternalStorageEmulated()) {
6956dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            return;
6966dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        }
6976dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
6986ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        boolean oldStatus = getMediaState();
6996ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        try {
7006ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            // Mount media firsts
7016ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            if (!getMediaState()) {
7026ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                mountMedia();
7036ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            }
7046dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            invokeShutdown();
7056ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        } finally {
7066ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            // Restore old status
7076ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            boolean currStatus = getMediaState();
7086ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            if (oldStatus != currStatus) {
7096ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                if (oldStatus) {
7106ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                    // Mount media
7116ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                    mountMedia();
7126ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                } else {
7136ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                    unmountMedia();
7146ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                }
7156ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            }
7166ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        }
7176ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu    }
7186ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu
7196ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu    /*
7206ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu     * This test invokes unmount multiple time and expects the call back
7216ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu     * to be invoked just once.
7226ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu     */
7236dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public void testShutdownMultiple() throws Exception {
7246dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        if (Environment.isExternalStorageEmulated()) {
7256dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            return;
7266dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        }
7276dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
7286ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        boolean oldStatus = getMediaState();
7296ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        try {
7306ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            // Mount media firsts
7316ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            if (!getMediaState()) {
7326ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                mountMedia();
7336ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            }
7346ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            IMountService ms = getMs();
7356ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            ShutdownObserver observer = new ShutdownObserver();
7366ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            synchronized (observer) {
7376dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                ms.shutdown(observer);
7386dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                for (int i = 0; i < 4; i++) {
7396dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    ms.shutdown(null);
7406ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                }
7416ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            }
7426ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        } finally {
7436ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            // Restore old status
7446ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            boolean currStatus = getMediaState();
7456ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            if (oldStatus != currStatus) {
7466ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                if (oldStatus) {
7476ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                    // Mount media
7486ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                    mountMedia();
7496ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                } else {
7506ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                    unmountMedia();
7516ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu                }
7526ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu            }
7536ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu        }
7546ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu    }
7556ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu
756fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat}
757