1a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer/* 2a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer * Copyright (C) 2011 The Android Open Source Project 3a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer * 4a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer * Licensed under the Apache License, Version 2.0 (the "License"); 5a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer * you may not use this file except in compliance with the License. 6a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer * You may obtain a copy of the License at 7a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer * 8a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer * http://www.apache.org/licenses/LICENSE-2.0 9a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer * 10a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer * Unless required by applicable law or agreed to in writing, software 11a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer * distributed under the License is distributed on an "AS IS" BASIS, 12a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer * See the License for the specific language governing permissions and 14a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer * limitations under the License. 15a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer */ 16a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer 17a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmerpackage android.content.pm; 18a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer 19941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkeyimport static android.net.TrafficStats.MB_IN_BYTES; 20a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer 21a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmerimport android.os.IBinder; 22a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmerimport android.os.RemoteException; 23a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmerimport android.os.ServiceManager; 24a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmerimport android.os.storage.IMountService; 25a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmerimport android.test.AndroidTestCase; 26a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmerimport android.util.Log; 27a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer 28941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkeyimport com.android.internal.content.PackageHelper; 29941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey 30a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmerpublic class PackageHelperTests extends AndroidTestCase { 31a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer private static final boolean localLOGV = true; 32a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer public static final String TAG = "PackageHelperTests"; 33a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer protected final String PREFIX = "android.content.pm"; 34a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer private IMountService mMs; 35a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer private String fullId; 36a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer private String fullId2; 37a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer 38a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer private IMountService getMs() { 39a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer IBinder service = ServiceManager.getService("mount"); 40a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer if (service != null) { 41a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer return IMountService.Stub.asInterface(service); 42a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } else { 43a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Log.e(TAG, "Can't get mount service"); 44a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 45a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer return null; 46a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 47a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer 48a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer private void cleanupContainers() throws RemoteException { 49a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Log.d(TAG,"cleanUp"); 50a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer IMountService ms = getMs(); 51a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer String[] containers = ms.getSecureContainerList(); 52a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer for (int i = 0; i < containers.length; i++) { 53a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer if (containers[i].startsWith(PREFIX)) { 54a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Log.d(TAG,"cleaing up "+containers[i]); 55a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer ms.destroySecureContainer(containers[i], true); 56a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 57a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 58a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 59a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer 60a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer void failStr(String errMsg) { 61a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Log.w(TAG, "errMsg=" + errMsg); 62a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer fail(errMsg); 63a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 64a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer 65a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer void failStr(Exception e) { 66a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer failStr(e.getMessage()); 67a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 68a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer 69a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer @Override 70a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer protected void setUp() throws Exception { 71a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer super.setUp(); 72a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer if (localLOGV) Log.i(TAG, "Cleaning out old test containers"); 73a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer cleanupContainers(); 74a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 75a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer 76a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer @Override 77a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer protected void tearDown() throws Exception { 78a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer super.tearDown(); 79a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer if (localLOGV) Log.i(TAG, "Cleaning out old test containers"); 80a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer cleanupContainers(); 81a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 82a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer 83a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer public void testMountAndPullSdCard() { 84a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer try { 85a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer fullId = PREFIX; 86941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey fullId2 = PackageHelper.createSdDir(1024 * MB_IN_BYTES, fullId, "none", 87941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey android.os.Process.myUid(), true); 88a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer 89a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Log.d(TAG,PackageHelper.getSdDir(fullId)); 90a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer PackageHelper.unMountSdDir(fullId); 91a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer 92a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Runnable r1 = getMountRunnable(); 93a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Runnable r2 = getDestroyRunnable(); 94a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Thread thread = new Thread(r1); 95a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Thread thread2 = new Thread(r2); 96a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer thread2.start(); 97a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer thread.start(); 98a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } catch (Exception e) { 99a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer failStr(e); 100a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 101a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 102a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer 103a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer public Runnable getMountRunnable() { 104a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Runnable r = new Runnable () { 105a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer public void run () { 106a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer try { 107a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Thread.sleep(5); 108a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer String path = PackageHelper.mountSdDir(fullId, "none", 109a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer android.os.Process.myUid()); 110a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Log.e(TAG, "mount done " + path); 111a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } catch (IllegalArgumentException iae) { 112a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer throw iae; 113a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } catch (Throwable t) { 114a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Log.e(TAG, "mount failed", t); 115a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 116a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 117a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer }; 118a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer return r; 119a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 120a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer 121a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer public Runnable getDestroyRunnable() { 122a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Runnable r = new Runnable () { 123a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer public void run () { 124a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer try { 125a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer PackageHelper.destroySdDir(fullId); 126a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Log.e(TAG, "destroy done: " + fullId); 127a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } catch (Throwable t) { 128a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Log.e(TAG, "destroy failed", t); 129a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 130a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 131a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer }; 132a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer return r; 133a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 134a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer} 135