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