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