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 19a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmerimport com.android.internal.content.PackageHelper; 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 28a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmerpublic class PackageHelperTests extends AndroidTestCase { 29a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer private static final boolean localLOGV = true; 30a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer public static final String TAG = "PackageHelperTests"; 31a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer protected final String PREFIX = "android.content.pm"; 32a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer private IMountService mMs; 33a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer private String fullId; 34a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer private String fullId2; 35a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer 36a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer private IMountService getMs() { 37a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer IBinder service = ServiceManager.getService("mount"); 38a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer if (service != null) { 39a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer return IMountService.Stub.asInterface(service); 40a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } else { 41a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Log.e(TAG, "Can't get mount service"); 42a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 43a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer return null; 44a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 45a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer 46a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer private void cleanupContainers() throws RemoteException { 47a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Log.d(TAG,"cleanUp"); 48a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer IMountService ms = getMs(); 49a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer String[] containers = ms.getSecureContainerList(); 50a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer for (int i = 0; i < containers.length; i++) { 51a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer if (containers[i].startsWith(PREFIX)) { 52a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Log.d(TAG,"cleaing up "+containers[i]); 53a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer ms.destroySecureContainer(containers[i], true); 54a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 55a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 56a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 57a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer 58a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer void failStr(String errMsg) { 59a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Log.w(TAG, "errMsg=" + errMsg); 60a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer fail(errMsg); 61a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 62a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer 63a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer void failStr(Exception e) { 64a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer failStr(e.getMessage()); 65a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 66a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer 67a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer @Override 68a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer protected void setUp() throws Exception { 69a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer super.setUp(); 70a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer if (localLOGV) Log.i(TAG, "Cleaning out old test containers"); 71a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer cleanupContainers(); 72a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 73a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer 74a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer @Override 75a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer protected void tearDown() throws Exception { 76a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer super.tearDown(); 77a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer if (localLOGV) Log.i(TAG, "Cleaning out old test containers"); 78a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer cleanupContainers(); 79a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 80a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer 81a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer public void testMountAndPullSdCard() { 82a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer try { 83a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer fullId = PREFIX; 846dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root fullId2 = PackageHelper.createSdDir(1024, fullId, "none", android.os.Process.myUid(), 856dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root true); 86a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer 87a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Log.d(TAG,PackageHelper.getSdDir(fullId)); 88a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer PackageHelper.unMountSdDir(fullId); 89a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer 90a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Runnable r1 = getMountRunnable(); 91a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Runnable r2 = getDestroyRunnable(); 92a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Thread thread = new Thread(r1); 93a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Thread thread2 = new Thread(r2); 94a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer thread2.start(); 95a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer thread.start(); 96a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } catch (Exception e) { 97a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer failStr(e); 98a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 99a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 100a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer 101a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer public Runnable getMountRunnable() { 102a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Runnable r = new Runnable () { 103a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer public void run () { 104a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer try { 105a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Thread.sleep(5); 106a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer String path = PackageHelper.mountSdDir(fullId, "none", 107a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer android.os.Process.myUid()); 108a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Log.e(TAG, "mount done " + path); 109a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } catch (IllegalArgumentException iae) { 110a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer throw iae; 111a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } catch (Throwable t) { 112a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Log.e(TAG, "mount failed", t); 113a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 114a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 115a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer }; 116a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer return r; 117a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 118a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer 119a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer public Runnable getDestroyRunnable() { 120a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Runnable r = new Runnable () { 121a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer public void run () { 122a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer try { 123a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer PackageHelper.destroySdDir(fullId); 124a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Log.e(TAG, "destroy done: " + fullId); 125a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } catch (Throwable t) { 126a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer Log.e(TAG, "destroy failed", t); 127a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 128a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 129a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer }; 130a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer return r; 131a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer } 132a20c8ef471666cf8b0dca91a8739ff18af1741a5Fredrik Helmer} 133