19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
170dc59e78e18493aecd37427531d093e800846c3eBrett Chabotpackage android.content.pm;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.PendingIntent;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.BroadcastReceiver;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter;
24f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabotimport android.os.RemoteException;
25f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabotimport android.os.ServiceManager;
26f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabotimport android.os.StatFs;
27f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackbornimport android.os.UserHandle;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.AndroidTestCase;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.LargeTest;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.MediumTest;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.SmallTest;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
33f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot
34f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabotimport java.io.File;
35f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabotimport java.io.FileInputStream;
36f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabotimport java.io.FileNotFoundException;
37f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabotimport java.io.FileOutputStream;
38f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabotimport java.io.IOException;
396c46760b723cf010a456f71b5d3013bff60f33d8Kenny Rootimport java.util.ArrayList;
406c46760b723cf010a456f71b5d3013bff60f33d8Kenny Rootimport java.util.Arrays;
416c46760b723cf010a456f71b5d3013bff60f33d8Kenny Rootimport java.util.List;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class AppCacheTest extends AndroidTestCase {
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean localLOGV = false;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String TAG="AppCacheTest";
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final long MAX_WAIT_TIME=60*1000;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final long WAIT_TIME_INCR=10*1000;
486c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root    private static final long THRESHOLD=5;
496c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root    private static final long ACTUAL_THRESHOLD=10;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void setUp() throws Exception {
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.setUp();
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(localLOGV) Log.i(TAG, "Cleaning up cache directory first");
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cleanUpCacheDirectory();
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void cleanUpDirectory(File pDir, String dirName) {
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       File testDir = new File(pDir,  dirName);
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       if(!testDir.exists()) {
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           return;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       }
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String fList[] = testDir.list();
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for(int i = 0; i < fList.length; i++) {
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            File file = new File(testDir, fList[i]);
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if(file.isDirectory()) {
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cleanUpDirectory(testDir, fList[i]);
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                file.delete();
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        testDir.delete();
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void cleanUpCacheDirectory() {
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File testDir = mContext.getCacheDir();
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(!testDir.exists()) {
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         String fList[] = testDir.list();
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         if(fList == null) {
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             testDir.delete();
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             return;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         }
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         for(int i = 0; i < fList.length; i++) {
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             File file = new File(testDir, fList[i]);
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             if(file.isDirectory()) {
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 cleanUpDirectory(testDir, fList[i]);
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             } else {
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 file.delete();
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             }
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         }
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     }
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SmallTest
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testDeleteAllCacheFiles() {
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String testName="testDeleteAllCacheFiles";
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cleanUpCacheDirectory();
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1016c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void failStr(String errMsg) {
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.w(TAG, "errMsg="+errMsg);
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        fail(errMsg);
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1066c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void failStr(Exception e) {
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.w(TAG, "e.getMessage="+e.getMessage());
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.w(TAG, "e="+e);
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1116c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getFreeStorageBlks(StatFs st) {
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        st.restat("/data");
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return st.getFreeBlocks();
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1166c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getFreeStorageSize(StatFs st) {
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        st.restat("/data");
1196c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root        return (long) st.getFreeBlocks() * (long) st.getBlockSize();
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1216c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @LargeTest
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testFreeApplicationCacheAllFiles() throws Exception {
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean TRACKING = true;
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StatFs st = new StatFs("/data");
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long blks1 = getFreeStorageBlks(st);
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long availableMem = getFreeStorageSize(st);
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File cacheDir = mContext.getCacheDir();
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertNotNull(cacheDir);
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        createTestFiles1(cacheDir, "testtmpdir", 5);
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long blks2 = getFreeStorageBlks(st);
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(localLOGV || TRACKING) Log.i(TAG, "blk1="+blks1+", blks2="+blks2);
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //this should free up the test files that were created earlier
1346c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root        if (!invokePMFreeApplicationCache(availableMem)) {
1356c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root            fail("Could not successfully invoke PackageManager free app cache API");
1366c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root        }
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long blks3 = getFreeStorageBlks(st);
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(localLOGV || TRACKING) Log.i(TAG, "blks3="+blks3);
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        verifyTestFiles1(cacheDir, "testtmpdir", 5);
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
141f654a484b2c553400676bd7cbd993604c06c2b57Suchi Amalapurapu
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testFreeApplicationCacheSomeFiles() throws Exception {
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StatFs st = new StatFs("/data");
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long blks1 = getFreeStorageBlks(st);
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File cacheDir = mContext.getCacheDir();
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertNotNull(cacheDir);
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        createTestFiles1(cacheDir, "testtmpdir", 5);
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long blks2 = getFreeStorageBlks(st);
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.i(TAG, "blk1="+blks1+", blks2="+blks2);
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long diff = (blks1-blks2-2);
1516c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root        if (!invokePMFreeApplicationCache(diff * st.getBlockSize())) {
1526c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root            fail("Could not successfully invoke PackageManager free app cache API");
1536c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root        }
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long blks3 = getFreeStorageBlks(st);
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //blks3 should be greater than blks2 and less than blks1
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(!((blks3 <= blks1) && (blks3 >= blks2))) {
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            failStr("Expected "+(blks1-blks2)+" number of blocks to be freed but freed only "
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    +(blks1-blks3));
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This method opens an output file writes to it, opens the same file as an input
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * stream, reads the contents and verifies the data that was written earlier can be read
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void openOutFileInAppFilesDir(File pFile, String pFileOut) {
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileOutputStream fos = null;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fos = new FileOutputStream(pFile);
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (FileNotFoundException e1) {
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            failStr("Error when opening file "+e1);
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fos.write(pFileOut.getBytes());
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fos.close();
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (FileNotFoundException e) {
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            failStr(e.getMessage());
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            failStr(e.getMessage());
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int count = pFileOut.getBytes().length;
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] buffer = new byte[count];
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileInputStream fis = new FileInputStream(pFile);
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fis.read(buffer, 0, count);
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fis.close();
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (FileNotFoundException e) {
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            failStr("Failed when verifing output opening file "+e.getMessage());
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            failStr("Failed when verifying output, reading from written file "+e);
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str = new String(buffer);
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(str, pFileOut);
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This test case verifies that output written to a file
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * using Context.openFileOutput has executed successfully.
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The operation is verified by invoking Context.openFileInput
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testAppFilesCreateFile() {
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String fileName = "testFile1.txt";
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String fileOut = "abcdefghijklmnopqrstuvwxyz";
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Context con = super.getContext();
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileOutputStream fos = con.openFileOutput(fileName, Context.MODE_PRIVATE);
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fos.close();
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (FileNotFoundException e) {
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            failStr(e);
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            failStr(e);
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SmallTest
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testAppCacheCreateFile() {
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String fileName = "testFile1.txt";
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String fileOut = "abcdefghijklmnopqrstuvwxyz";
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Context con = super.getContext();
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File file = new File(con.getCacheDir(), fileName);
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        openOutFileInAppFilesDir(file, fileOut);
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cleanUpCacheDirectory();
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testAppCreateCacheFiles() {
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File cacheDir = mContext.getCacheDir();
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String testDirName = "testtmp";
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File testTmpDir = new File(cacheDir, testDirName);
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        testTmpDir.mkdir();
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int numDirs = 3;
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File fileArr[] = new File[numDirs];
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for(int i = 0; i < numDirs; i++) {
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fileArr[i] = new File(testTmpDir, "dir"+(i+1));
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fileArr[i].mkdir();
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte buffer[] = getBuffer();
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.i(TAG, "Size of bufer="+buffer.length);
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for(int i = 0; i < numDirs; i++) {
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for(int j = 1; j <= (i); j++) {
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                File file1 = new File(fileArr[i], "testFile"+j+".txt");
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                FileOutputStream fos = null;
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fos = new FileOutputStream(file1);
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for(int k = 1; k < 10; k++) {
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        fos.write(buffer);
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.i(TAG, "wrote 10K bytes to "+file1);
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fos.close();
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (FileNotFoundException e) {
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.i(TAG, "Excetion ="+e);
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fail("Error when creating outputstream "+e);
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch(IOException e) {
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.i(TAG, "Excetion ="+e);
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fail("Error when writing output "+e);
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    byte[] getBuffer() {
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String sbuffer = "a";
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for(int i = 0; i < 10; i++) {
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sbuffer += sbuffer;
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sbuffer.getBytes();
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2706c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root
2716c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root    long getFileNumBlocks(long fileSize, long blkSize) {
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long ret = fileSize/blkSize;
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(ret*blkSize < fileSize) {
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ret++;
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ret;
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2786c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //@LargeTest
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testAppCacheClear() {
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String dataDir="/data/data";
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StatFs st = new StatFs(dataDir);
2836c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root        long blkSize = st.getBlockSize();
2846c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root        long totBlks = st.getBlockCount();
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long availableBlks = st.getFreeBlocks();
2866c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root        long thresholdBlks = (totBlks * THRESHOLD) / 100L;
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String testDirName = "testdir";
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //create directory in cache
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File testDir = new File(mContext.getCacheDir(),  testDirName);
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        testDir.mkdirs();
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] buffer = getBuffer();
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i = 1;
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(localLOGV) Log.i(TAG, "availableBlks="+availableBlks+", thresholdBlks="+thresholdBlks);
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long createdFileBlks = 0;
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int imax = 300;
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while((availableBlks > thresholdBlks) &&(i < imax)) {
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            File testFile = new File(testDir, "testFile"+i+".txt");
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if(localLOGV) Log.i(TAG, "Creating "+i+"th test file "+testFile);
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int jmax = i;
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            i++;
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileOutputStream fos;
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fos = new FileOutputStream(testFile);
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (FileNotFoundException e) {
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.i(TAG, "Failed creating test file:"+testFile);
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean err = false;
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for(int j = 1; j <= jmax;j++) {
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fos.write(buffer);
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (IOException e) {
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.i(TAG, "Failed to write to file:"+testFile);
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    err = true;
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fos.close();
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (IOException e) {
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.i(TAG, "Failed closing file:"+testFile);
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if(err) {
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            createdFileBlks += getFileNumBlocks(testFile.length(), blkSize);
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            st.restat(dataDir);
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            availableBlks = st.getFreeBlocks();
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        st.restat(dataDir);
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long availableBytes = st.getFreeBlocks()*blkSize;
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long shouldFree = (ACTUAL_THRESHOLD-THRESHOLD)*totBlks;
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //would have run out of memory
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //wait for some time and confirm cache is deleted
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i(TAG, "Sleeping for 2 minutes...");
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Thread.sleep(2*60*1000);
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (InterruptedException e) {
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fail("Exception when sleeping "+e);
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean removedFlag = false;
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long existingFileBlks = 0;
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for(int k = 1; k <i; k++) {
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            File testFile = new File(testDir, "testFile"+k+".txt");
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if(!testFile.exists()) {
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                removedFlag = true;
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(localLOGV) Log.i(TAG, testFile+" removed");
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }  else {
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                existingFileBlks += getFileNumBlocks(testFile.length(), blkSize);
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(localLOGV) Log.i(TAG, "createdFileBlks="+createdFileBlks+
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ", existingFileBlks="+existingFileBlks);
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long fileSize = createdFileBlks-existingFileBlks;
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //verify fileSize number of bytes have been cleared from cache
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(localLOGV) Log.i(TAG, "deletedFileBlks="+fileSize+" shouldFreeBlks="+shouldFree);
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if((fileSize > (shouldFree-blkSize) && (fileSize < (shouldFree+blkSize)))) {
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i(TAG, "passed");
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3596c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root        assertTrue("Files should have been removed", removedFlag);
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //createTestFiles(new File(super.getContext().getCacheDir(), "testtmp", "dir", 3)
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void createTestFiles1(File cacheDir, String testFilePrefix, int numTestFiles) {
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte buffer[] = getBuffer();
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for(int i = 0; i < numTestFiles; i++) {
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            File file1 = new File(cacheDir, testFilePrefix+i+".txt");
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileOutputStream fos = null;
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fos = new FileOutputStream(file1);
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for(int k = 1; k < 10; k++) {
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fos.write(buffer);
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               }
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fos.close();
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (FileNotFoundException e) {
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.i(TAG, "Exception ="+e);
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fail("Error when creating outputstream "+e);
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch(IOException e) {
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.i(TAG, "Exception ="+e);
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fail("Error when writing output "+e);
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //introduce sleep for 1 s to avoid common time stamps for files being created
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Thread.sleep(1000);
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (InterruptedException e) {
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fail("Exception when sleeping "+e);
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3896c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void verifyTestFiles1(File cacheDir, String testFilePrefix, int numTestFiles) {
3916c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root        List<String> files = new ArrayList<String>();
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for(int i = 0; i < numTestFiles; i++) {
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            File file1 = new File(cacheDir, testFilePrefix+i+".txt");
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if(file1.exists()) {
3956c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root                files.add(file1.getName());
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3986c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root        if (files.size() > 0) {
3996c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root            fail("Files should have been deleted: "
4006c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root                    + Arrays.toString(files.toArray(new String[files.size()])));
4016c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root        }
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4036c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void createTestFiles2(File cacheDir, String rootTestDirName, String subDirPrefix, int numDirs, String testFilePrefix) {
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Context con = super.getContext();
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File testTmpDir = new File(cacheDir, rootTestDirName);
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        testTmpDir.mkdir();
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File fileArr[] = new File[numDirs];
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for(int i = 0; i < numDirs; i++) {
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fileArr[i] = new File(testTmpDir, subDirPrefix+(i+1));
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fileArr[i].mkdir();
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte buffer[] = getBuffer();
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for(int i = 0; i < numDirs; i++) {
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for(int j = 1; j <= (i); j++) {
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                File file1 = new File(fileArr[i], testFilePrefix+j+".txt");
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                FileOutputStream fos = null;
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fos = new FileOutputStream(file1);
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for(int k = 1; k < 10; k++) {
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        fos.write(buffer);
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fos.close();
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (FileNotFoundException e) {
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.i(TAG, "Exception ="+e);
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fail("Error when creating outputstream "+e);
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch(IOException e) {
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.i(TAG, "Exception ="+e);
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fail("Error when writing output "+e);
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    //introduce sleep for 10 ms to avoid common time stamps for files being created
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Thread.sleep(10);
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (InterruptedException e) {
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fail("Exception when sleeping "+e);
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class PackageDataObserver extends IPackageDataObserver.Stub {
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean retValue = false;
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean doneFlag = false;
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onRemoveCompleted(String packageName, boolean succeeded)
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throws RemoteException {
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized(this) {
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                retValue = succeeded;
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                doneFlag = true;
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                notifyAll();
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean isDone() {
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return doneFlag;
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    IPackageManager getPm() {
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return  IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean invokePMDeleteAppCacheFiles() throws Exception {
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String packageName = mContext.getPackageName();
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            PackageDataObserver observer = new PackageDataObserver();
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //wait on observer
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized(observer) {
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                getPm().deleteApplicationCacheFiles(packageName, observer);
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long waitTime = 0;
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while(!observer.isDone() || (waitTime > MAX_WAIT_TIME)) {
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    observer.wait(WAIT_TIME_INCR);
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    waitTime += WAIT_TIME_INCR;
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(!observer.isDone()) {
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new Exception("timed out waiting for PackageDataObserver.onRemoveCompleted");
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return observer.retValue;
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Failed to get handle for PackageManger Exception: "+e);
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (InterruptedException e) {
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "InterruptedException :"+e);
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean invokePMFreeApplicationCache(long idealStorageSize) throws Exception {
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String packageName = mContext.getPackageName();
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            PackageDataObserver observer = new PackageDataObserver();
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //wait on observer
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized(observer) {
493529f91fc8e7e884ef19bef8eb3e4e3a1d69336f4Jeff Sharkey                getPm().freeStorageAndNotify(null, idealStorageSize, observer);
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long waitTime = 0;
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while(!observer.isDone() || (waitTime > MAX_WAIT_TIME)) {
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    observer.wait(WAIT_TIME_INCR);
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    waitTime += WAIT_TIME_INCR;
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(!observer.isDone()) {
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new Exception("timed out waiting for PackageDataObserver.onRemoveCompleted");
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return observer.retValue;
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Failed to get handle for PackageManger Exception: "+e);
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (InterruptedException e) {
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "InterruptedException :"+e);
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean invokePMFreeStorage(long idealStorageSize, FreeStorageReceiver r,
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            PendingIntent pi) throws Exception {
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Spin lock waiting for call back
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized(r) {
518529f91fc8e7e884ef19bef8eb3e4e3a1d69336f4Jeff Sharkey                getPm().freeStorage(null, idealStorageSize, pi.getIntentSender());
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long waitTime = 0;
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while(!r.isDone() && (waitTime < MAX_WAIT_TIME)) {
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    r.wait(WAIT_TIME_INCR);
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    waitTime += WAIT_TIME_INCR;
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(!r.isDone()) {
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new Exception("timed out waiting for call back from PendingIntent");
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return r.getResultCode() == 1;
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Failed to get handle for PackageManger Exception: "+e);
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (InterruptedException e) {
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "InterruptedException :"+e);
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @LargeTest
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testDeleteAppCacheFiles() throws Exception {
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String testName="testDeleteAppCacheFiles";
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File cacheDir = mContext.getCacheDir();
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        createTestFiles1(cacheDir, "testtmpdir", 5);
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue(invokePMDeleteAppCacheFiles());
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //confirm files dont exist
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        verifyTestFiles1(cacheDir, "testtmpdir", 5);
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class PackageStatsObserver extends IPackageStatsObserver.Stub {
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean retValue = false;
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PackageStats stats;
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean doneFlag = false;
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throws RemoteException {
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized(this) {
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                retValue = succeeded;
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                stats = pStats;
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                doneFlag = true;
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                notifyAll();
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean isDone() {
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return doneFlag;
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PackageStats invokePMGetPackageSizeInfo() throws Exception {
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String packageName = mContext.getPackageName();
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            PackageStatsObserver observer = new PackageStatsObserver();
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //wait on observer
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized(observer) {
5730c3804950236fe170ebf6cc7a5f1e3e305b8f315Dianne Hackborn                getPm().getPackageSizeInfo(packageName, UserHandle.myUserId(), observer);
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long waitTime = 0;
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while((!observer.isDone()) || (waitTime > MAX_WAIT_TIME) ) {
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    observer.wait(WAIT_TIME_INCR);
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    waitTime += WAIT_TIME_INCR;
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(!observer.isDone()) {
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new Exception("Timed out waiting for PackageStatsObserver.onGetStatsCompleted");
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if(localLOGV) Log.i(TAG, "OBSERVER RET VALUES code="+observer.stats.codeSize+
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ", data="+observer.stats.dataSize+", cache="+observer.stats.cacheSize);
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return observer.stats;
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Failed to get handle for PackageManger Exception: "+e);
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (InterruptedException e) {
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "InterruptedException :"+e);
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SmallTest
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testGetPackageSizeInfo() throws Exception {
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String testName="testGetPackageSizeInfo";
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PackageStats stats = invokePMGetPackageSizeInfo();
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue(stats!=null);
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //confirm result
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(localLOGV) Log.i(TAG, "code="+stats.codeSize+", data="+stats.dataSize+
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ", cache="+stats.cacheSize);
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SmallTest
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testGetSystemSharedLibraryNames() throws Exception {
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] sharedLibs = getPm().getSystemSharedLibraryNames();
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (localLOGV) {
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (String str : sharedLibs) {
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.i(TAG, str);
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fail("Failed invoking getSystemSharedLibraryNames with exception:" + e);
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class FreeStorageReceiver extends BroadcastReceiver {
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String ACTION_FREE = "com.android.unit_tests.testcallback";
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean doneFlag = false;
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean isDone() {
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return doneFlag;
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onReceive(Context context, Intent intent) {
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if(intent.getAction().equalsIgnoreCase(ACTION_FREE)) {
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (localLOGV) Log.i(TAG, "Got notification: clear cache succeeded "+getResultCode());
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                synchronized (this) {
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    doneFlag = true;
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    notifyAll();
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
639f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot    // TODO: flaky test, omit from LargeTest for now
640f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot    //@LargeTest
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testFreeStorage() throws Exception {
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean TRACKING = true;
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StatFs st = new StatFs("/data");
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long blks1 = getFreeStorageBlks(st);
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(localLOGV || TRACKING) Log.i(TAG, "Available free blocks="+blks1);
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long availableMem = getFreeStorageSize(st);
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File cacheDir = mContext.getCacheDir();
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertNotNull(cacheDir);
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        createTestFiles1(cacheDir, "testtmpdir", 5);
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long blks2 = getFreeStorageBlks(st);
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(localLOGV || TRACKING) Log.i(TAG, "Available blocks after writing test files in application cache="+blks2);
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Create receiver and register it
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FreeStorageReceiver receiver = new FreeStorageReceiver();
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.registerReceiver(receiver, new IntentFilter(FreeStorageReceiver.ACTION_FREE));
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PendingIntent pi = PendingIntent.getBroadcast(mContext,
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0,  new Intent(FreeStorageReceiver.ACTION_FREE), 0);
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Invoke PackageManager api
6586c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root        if (!invokePMFreeStorage(availableMem, receiver, pi)) {
6596c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root            fail("Could not invoke PackageManager free storage API");
6606c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root        }
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long blks3 = getFreeStorageBlks(st);
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(localLOGV || TRACKING) Log.i(TAG, "Available blocks after freeing cache"+blks3);
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(receiver.getResultCode(), 1);
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.unregisterReceiver(receiver);
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Verify result
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        verifyTestFiles1(cacheDir, "testtmpdir", 5);
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* utility method used to create observer and check async call back from PackageManager.
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ClearApplicationUserData
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean invokePMClearApplicationUserData() throws Exception {
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String packageName = mContext.getPackageName();
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            PackageDataObserver observer = new PackageDataObserver();
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //wait on observer
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized(observer) {
678483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                getPm().clearApplicationUserData(packageName, observer, 0 /* TODO: Other users */);
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long waitTime = 0;
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while(!observer.isDone() || (waitTime > MAX_WAIT_TIME)) {
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    observer.wait(WAIT_TIME_INCR);
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    waitTime += WAIT_TIME_INCR;
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(!observer.isDone()) {
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new Exception("timed out waiting for PackageDataObserver.onRemoveCompleted");
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return observer.retValue;
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Failed to get handle for PackageManger Exception: "+e);
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (InterruptedException e) {
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "InterruptedException :"+e);
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void verifyUserDataCleared(File pDir) {
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(localLOGV) Log.i(TAG, "Verifying "+pDir);
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(pDir == null) {
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String fileList[] = pDir.list();
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(fileList == null) {
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int imax = fileList.length;
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       //look recursively in user data dir
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for(int i = 0; i < imax; i++) {
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if(localLOGV) Log.i(TAG, "Found entry "+fileList[i]+ "in "+pDir);
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if("lib".equalsIgnoreCase(fileList[i])) {
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(localLOGV) Log.i(TAG, "Ignoring lib directory");
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fail(pDir+" should be empty or contain only lib subdirectory. Found "+fileList[i]);
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    File getDataDir() {
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
721483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            ApplicationInfo appInfo = getPm().getApplicationInfo(mContext.getPackageName(), 0,
722f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn                    UserHandle.myUserId());
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new File(appInfo.dataDir);
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Pacakge manager dead", e);
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @LargeTest
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testClearApplicationUserDataWithTestData() throws Exception {
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File cacheDir = mContext.getCacheDir();
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        createTestFiles1(cacheDir, "testtmpdir", 5);
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(localLOGV) {
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i(TAG, "Created test data Waiting for 60seconds before continuing");
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Thread.sleep(60*1000);
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue(invokePMClearApplicationUserData());
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //confirm files dont exist
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        verifyUserDataCleared(getDataDir());
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SmallTest
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testClearApplicationUserDataWithNoTestData() throws Exception {
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue(invokePMClearApplicationUserData());
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //confirm files dont exist
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        verifyUserDataCleared(getDataDir());
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @LargeTest
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testClearApplicationUserDataNoObserver() throws Exception {
751f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn        getPm().clearApplicationUserData(mContext.getPackageName(), null, UserHandle.myUserId());
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //sleep for 1 minute
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Thread.sleep(60*1000);
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //confirm files dont exist
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        verifyUserDataCleared(getDataDir());
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
759