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;
286b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikasimport android.support.test.filters.LargeTest;
296b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikasimport android.support.test.filters.MediumTest;
306b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikasimport android.support.test.filters.SmallTest;
316b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikasimport android.support.test.filters.Suppress;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.AndroidTestCase;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
34f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot
35f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabotimport java.io.File;
36f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabotimport java.io.FileInputStream;
37f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabotimport java.io.FileNotFoundException;
38f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabotimport java.io.FileOutputStream;
39f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabotimport java.io.IOException;
406c46760b723cf010a456f71b5d3013bff60f33d8Kenny Rootimport java.util.ArrayList;
416c46760b723cf010a456f71b5d3013bff60f33d8Kenny Rootimport java.util.Arrays;
426c46760b723cf010a456f71b5d3013bff60f33d8Kenny Rootimport java.util.List;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class AppCacheTest extends AndroidTestCase {
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean localLOGV = false;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String TAG="AppCacheTest";
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final long MAX_WAIT_TIME=60*1000;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final long WAIT_TIME_INCR=10*1000;
496c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root    private static final long THRESHOLD=5;
506c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root    private static final long ACTUAL_THRESHOLD=10;
516b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void setUp() throws Exception {
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.setUp();
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(localLOGV) Log.i(TAG, "Cleaning up cache directory first");
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cleanUpCacheDirectory();
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
586b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void cleanUpDirectory(File pDir, String dirName) {
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       File testDir = new File(pDir,  dirName);
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       if(!testDir.exists()) {
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           return;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       }
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String fList[] = testDir.list();
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for(int i = 0; i < fList.length; i++) {
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            File file = new File(testDir, fList[i]);
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if(file.isDirectory()) {
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cleanUpDirectory(testDir, fList[i]);
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                file.delete();
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        testDir.delete();
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
756b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void cleanUpCacheDirectory() {
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File testDir = mContext.getCacheDir();
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(!testDir.exists()) {
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
816b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         String fList[] = testDir.list();
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         if(fList == null) {
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             testDir.delete();
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             return;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         }
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         for(int i = 0; i < fList.length; i++) {
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             File file = new File(testDir, fList[i]);
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             if(file.isDirectory()) {
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 cleanUpDirectory(testDir, fList[i]);
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             } else {
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 file.delete();
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             }
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         }
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     }
966b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SmallTest
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testDeleteAllCacheFiles() {
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String testName="testDeleteAllCacheFiles";
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cleanUpCacheDirectory();
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1026c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void failStr(String errMsg) {
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.w(TAG, "errMsg="+errMsg);
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        fail(errMsg);
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1076c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void failStr(Exception e) {
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.w(TAG, "e.getMessage="+e.getMessage());
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.w(TAG, "e="+e);
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1126c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getFreeStorageBlks(StatFs st) {
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        st.restat("/data");
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return st.getFreeBlocks();
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1176c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getFreeStorageSize(StatFs st) {
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        st.restat("/data");
1206c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root        return (long) st.getFreeBlocks() * (long) st.getBlockSize();
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1226c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @LargeTest
124f90177629a5b69ca3a80466c0ab55abfeb6d26b2Abodunrinwa Toki    @Suppress  // Failing.
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testFreeApplicationCacheAllFiles() throws Exception {
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean TRACKING = true;
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StatFs st = new StatFs("/data");
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long blks1 = getFreeStorageBlks(st);
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long availableMem = getFreeStorageSize(st);
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File cacheDir = mContext.getCacheDir();
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertNotNull(cacheDir);
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        createTestFiles1(cacheDir, "testtmpdir", 5);
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long blks2 = getFreeStorageBlks(st);
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(localLOGV || TRACKING) Log.i(TAG, "blk1="+blks1+", blks2="+blks2);
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //this should free up the test files that were created earlier
1366c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root        if (!invokePMFreeApplicationCache(availableMem)) {
1376c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root            fail("Could not successfully invoke PackageManager free app cache API");
1386c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root        }
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long blks3 = getFreeStorageBlks(st);
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(localLOGV || TRACKING) Log.i(TAG, "blks3="+blks3);
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        verifyTestFiles1(cacheDir, "testtmpdir", 5);
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
143f654a484b2c553400676bd7cbd993604c06c2b57Suchi Amalapurapu
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testFreeApplicationCacheSomeFiles() throws Exception {
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StatFs st = new StatFs("/data");
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long blks1 = getFreeStorageBlks(st);
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File cacheDir = mContext.getCacheDir();
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertNotNull(cacheDir);
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        createTestFiles1(cacheDir, "testtmpdir", 5);
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long blks2 = getFreeStorageBlks(st);
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.i(TAG, "blk1="+blks1+", blks2="+blks2);
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long diff = (blks1-blks2-2);
1536c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root        if (!invokePMFreeApplicationCache(diff * st.getBlockSize())) {
1546c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root            fail("Could not successfully invoke PackageManager free app cache API");
1556c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root        }
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long blks3 = getFreeStorageBlks(st);
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //blks3 should be greater than blks2 and less than blks1
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(!((blks3 <= blks1) && (blks3 >= blks2))) {
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            failStr("Expected "+(blks1-blks2)+" number of blocks to be freed but freed only "
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    +(blks1-blks3));
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1636b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1656b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas     * This method opens an output file writes to it, opens the same file as an input
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * stream, reads the contents and verifies the data that was written earlier can be read
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void openOutFileInAppFilesDir(File pFile, String pFileOut) {
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileOutputStream fos = null;
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fos = new FileOutputStream(pFile);
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (FileNotFoundException e1) {
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            failStr("Error when opening file "+e1);
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fos.write(pFileOut.getBytes());
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fos.close();
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (FileNotFoundException e) {
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            failStr(e.getMessage());
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            failStr(e.getMessage());
1836b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas        }
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int count = pFileOut.getBytes().length;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] buffer = new byte[count];
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileInputStream fis = new FileInputStream(pFile);
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fis.read(buffer, 0, count);
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fis.close();
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (FileNotFoundException e) {
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            failStr("Failed when verifing output opening file "+e.getMessage());
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            failStr("Failed when verifying output, reading from written file "+e);
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str = new String(buffer);
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(str, pFileOut);
1976b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas    }
1986b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This test case verifies that output written to a file
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * using Context.openFileOutput has executed successfully.
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The operation is verified by invoking Context.openFileInput
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testAppFilesCreateFile() {
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String fileName = "testFile1.txt";
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String fileOut = "abcdefghijklmnopqrstuvwxyz";
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Context con = super.getContext();
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileOutputStream fos = con.openFileOutput(fileName, Context.MODE_PRIVATE);
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fos.close();
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (FileNotFoundException e) {
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            failStr(e);
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            failStr(e);
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2186b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SmallTest
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testAppCacheCreateFile() {
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String fileName = "testFile1.txt";
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String fileOut = "abcdefghijklmnopqrstuvwxyz";
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Context con = super.getContext();
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File file = new File(con.getCacheDir(), fileName);
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        openOutFileInAppFilesDir(file, fileOut);
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cleanUpCacheDirectory();
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2286b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testAppCreateCacheFiles() {
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File cacheDir = mContext.getCacheDir();
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String testDirName = "testtmp";
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File testTmpDir = new File(cacheDir, testDirName);
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        testTmpDir.mkdir();
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int numDirs = 3;
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File fileArr[] = new File[numDirs];
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for(int i = 0; i < numDirs; i++) {
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fileArr[i] = new File(testTmpDir, "dir"+(i+1));
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fileArr[i].mkdir();
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte buffer[] = getBuffer();
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.i(TAG, "Size of bufer="+buffer.length);
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for(int i = 0; i < numDirs; i++) {
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for(int j = 1; j <= (i); j++) {
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                File file1 = new File(fileArr[i], "testFile"+j+".txt");
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                FileOutputStream fos = null;
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fos = new FileOutputStream(file1);
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for(int k = 1; k < 10; k++) {
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        fos.write(buffer);
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.i(TAG, "wrote 10K bytes to "+file1);
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fos.close();
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (FileNotFoundException e) {
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.i(TAG, "Excetion ="+e);
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fail("Error when creating outputstream "+e);
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch(IOException e) {
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.i(TAG, "Excetion ="+e);
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fail("Error when writing output "+e);
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2646b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    byte[] getBuffer() {
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String sbuffer = "a";
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for(int i = 0; i < 10; i++) {
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sbuffer += sbuffer;
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sbuffer.getBytes();
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2726c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root
2736c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root    long getFileNumBlocks(long fileSize, long blkSize) {
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long ret = fileSize/blkSize;
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(ret*blkSize < fileSize) {
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ret++;
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ret;
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2806c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //@LargeTest
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testAppCacheClear() {
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String dataDir="/data/data";
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StatFs st = new StatFs(dataDir);
2856c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root        long blkSize = st.getBlockSize();
2866c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root        long totBlks = st.getBlockCount();
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long availableBlks = st.getFreeBlocks();
2886c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root        long thresholdBlks = (totBlks * THRESHOLD) / 100L;
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String testDirName = "testdir";
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //create directory in cache
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File testDir = new File(mContext.getCacheDir(),  testDirName);
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        testDir.mkdirs();
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] buffer = getBuffer();
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i = 1;
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(localLOGV) Log.i(TAG, "availableBlks="+availableBlks+", thresholdBlks="+thresholdBlks);
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long createdFileBlks = 0;
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int imax = 300;
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while((availableBlks > thresholdBlks) &&(i < imax)) {
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            File testFile = new File(testDir, "testFile"+i+".txt");
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if(localLOGV) Log.i(TAG, "Creating "+i+"th test file "+testFile);
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int jmax = i;
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            i++;
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileOutputStream fos;
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fos = new FileOutputStream(testFile);
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (FileNotFoundException e) {
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.i(TAG, "Failed creating test file:"+testFile);
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean err = false;
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for(int j = 1; j <= jmax;j++) {
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fos.write(buffer);
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (IOException e) {
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.i(TAG, "Failed to write to file:"+testFile);
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    err = true;
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fos.close();
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (IOException e) {
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.i(TAG, "Failed closing file:"+testFile);
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if(err) {
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            createdFileBlks += getFileNumBlocks(testFile.length(), blkSize);
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            st.restat(dataDir);
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            availableBlks = st.getFreeBlocks();
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        st.restat(dataDir);
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long availableBytes = st.getFreeBlocks()*blkSize;
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long shouldFree = (ACTUAL_THRESHOLD-THRESHOLD)*totBlks;
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //would have run out of memory
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //wait for some time and confirm cache is deleted
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i(TAG, "Sleeping for 2 minutes...");
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Thread.sleep(2*60*1000);
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (InterruptedException e) {
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fail("Exception when sleeping "+e);
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean removedFlag = false;
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long existingFileBlks = 0;
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for(int k = 1; k <i; k++) {
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            File testFile = new File(testDir, "testFile"+k+".txt");
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if(!testFile.exists()) {
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                removedFlag = true;
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(localLOGV) Log.i(TAG, testFile+" removed");
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }  else {
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                existingFileBlks += getFileNumBlocks(testFile.length(), blkSize);
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(localLOGV) Log.i(TAG, "createdFileBlks="+createdFileBlks+
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ", existingFileBlks="+existingFileBlks);
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long fileSize = createdFileBlks-existingFileBlks;
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //verify fileSize number of bytes have been cleared from cache
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(localLOGV) Log.i(TAG, "deletedFileBlks="+fileSize+" shouldFreeBlks="+shouldFree);
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if((fileSize > (shouldFree-blkSize) && (fileSize < (shouldFree+blkSize)))) {
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i(TAG, "passed");
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3616c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root        assertTrue("Files should have been removed", removedFlag);
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3636b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //createTestFiles(new File(super.getContext().getCacheDir(), "testtmp", "dir", 3)
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void createTestFiles1(File cacheDir, String testFilePrefix, int numTestFiles) {
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte buffer[] = getBuffer();
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for(int i = 0; i < numTestFiles; i++) {
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            File file1 = new File(cacheDir, testFilePrefix+i+".txt");
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileOutputStream fos = null;
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fos = new FileOutputStream(file1);
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for(int k = 1; k < 10; k++) {
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fos.write(buffer);
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               }
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fos.close();
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (FileNotFoundException e) {
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.i(TAG, "Exception ="+e);
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fail("Error when creating outputstream "+e);
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch(IOException e) {
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.i(TAG, "Exception ="+e);
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fail("Error when writing output "+e);
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //introduce sleep for 1 s to avoid common time stamps for files being created
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Thread.sleep(1000);
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (InterruptedException e) {
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fail("Exception when sleeping "+e);
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3916c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void verifyTestFiles1(File cacheDir, String testFilePrefix, int numTestFiles) {
3936c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root        List<String> files = new ArrayList<String>();
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for(int i = 0; i < numTestFiles; i++) {
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            File file1 = new File(cacheDir, testFilePrefix+i+".txt");
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if(file1.exists()) {
3976c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root                files.add(file1.getName());
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4006c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root        if (files.size() > 0) {
4016c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root            fail("Files should have been deleted: "
4026c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root                    + Arrays.toString(files.toArray(new String[files.size()])));
4036c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root        }
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4056c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void createTestFiles2(File cacheDir, String rootTestDirName, String subDirPrefix, int numDirs, String testFilePrefix) {
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Context con = super.getContext();
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File testTmpDir = new File(cacheDir, rootTestDirName);
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        testTmpDir.mkdir();
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File fileArr[] = new File[numDirs];
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for(int i = 0; i < numDirs; i++) {
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fileArr[i] = new File(testTmpDir, subDirPrefix+(i+1));
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fileArr[i].mkdir();
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte buffer[] = getBuffer();
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for(int i = 0; i < numDirs; i++) {
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for(int j = 1; j <= (i); j++) {
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                File file1 = new File(fileArr[i], testFilePrefix+j+".txt");
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                FileOutputStream fos = null;
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fos = new FileOutputStream(file1);
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for(int k = 1; k < 10; k++) {
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        fos.write(buffer);
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fos.close();
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (FileNotFoundException e) {
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.i(TAG, "Exception ="+e);
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fail("Error when creating outputstream "+e);
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch(IOException e) {
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.i(TAG, "Exception ="+e);
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fail("Error when writing output "+e);
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    //introduce sleep for 10 ms to avoid common time stamps for files being created
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Thread.sleep(10);
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (InterruptedException e) {
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fail("Exception when sleeping "+e);
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4426b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class PackageDataObserver extends IPackageDataObserver.Stub {
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean retValue = false;
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean doneFlag = false;
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onRemoveCompleted(String packageName, boolean succeeded)
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throws RemoteException {
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized(this) {
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                retValue = succeeded;
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                doneFlag = true;
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                notifyAll();
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean isDone() {
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return doneFlag;
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4586b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    IPackageManager getPm() {
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return  IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4626b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean invokePMDeleteAppCacheFiles() throws Exception {
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String packageName = mContext.getPackageName();
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            PackageDataObserver observer = new PackageDataObserver();
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //wait on observer
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized(observer) {
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                getPm().deleteApplicationCacheFiles(packageName, observer);
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long waitTime = 0;
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while(!observer.isDone() || (waitTime > MAX_WAIT_TIME)) {
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    observer.wait(WAIT_TIME_INCR);
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    waitTime += WAIT_TIME_INCR;
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(!observer.isDone()) {
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new Exception("timed out waiting for PackageDataObserver.onRemoveCompleted");
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return observer.retValue;
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Failed to get handle for PackageManger Exception: "+e);
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (InterruptedException e) {
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "InterruptedException :"+e);
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4886b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean invokePMFreeApplicationCache(long idealStorageSize) throws Exception {
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String packageName = mContext.getPackageName();
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            PackageDataObserver observer = new PackageDataObserver();
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //wait on observer
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized(observer) {
49527eb8a85c49daee3c360b878be972e1540ad57baJeff Sharkey                getPm().freeStorageAndNotify(null, idealStorageSize, 0, observer);
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long waitTime = 0;
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while(!observer.isDone() || (waitTime > MAX_WAIT_TIME)) {
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    observer.wait(WAIT_TIME_INCR);
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    waitTime += WAIT_TIME_INCR;
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(!observer.isDone()) {
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new Exception("timed out waiting for PackageDataObserver.onRemoveCompleted");
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return observer.retValue;
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Failed to get handle for PackageManger Exception: "+e);
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (InterruptedException e) {
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "InterruptedException :"+e);
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5156b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas    boolean invokePMFreeStorage(long idealStorageSize, FreeStorageReceiver r,
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            PendingIntent pi) throws Exception {
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Spin lock waiting for call back
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized(r) {
52027eb8a85c49daee3c360b878be972e1540ad57baJeff Sharkey                getPm().freeStorage(null, idealStorageSize, 0, pi.getIntentSender());
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long waitTime = 0;
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while(!r.isDone() && (waitTime < MAX_WAIT_TIME)) {
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    r.wait(WAIT_TIME_INCR);
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    waitTime += WAIT_TIME_INCR;
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(!r.isDone()) {
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new Exception("timed out waiting for call back from PendingIntent");
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return r.getResultCode() == 1;
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Failed to get handle for PackageManger Exception: "+e);
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (InterruptedException e) {
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "InterruptedException :"+e);
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5396b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @LargeTest
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testDeleteAppCacheFiles() throws Exception {
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String testName="testDeleteAppCacheFiles";
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File cacheDir = mContext.getCacheDir();
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        createTestFiles1(cacheDir, "testtmpdir", 5);
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue(invokePMDeleteAppCacheFiles());
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //confirm files dont exist
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        verifyTestFiles1(cacheDir, "testtmpdir", 5);
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class PackageStatsObserver extends IPackageStatsObserver.Stub {
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean retValue = false;
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PackageStats stats;
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean doneFlag = false;
5546b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throws RemoteException {
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized(this) {
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                retValue = succeeded;
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                stats = pStats;
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                doneFlag = true;
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                notifyAll();
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean isDone() {
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return doneFlag;
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5686b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PackageStats invokePMGetPackageSizeInfo() throws Exception {
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String packageName = mContext.getPackageName();
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            PackageStatsObserver observer = new PackageStatsObserver();
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //wait on observer
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized(observer) {
5750c3804950236fe170ebf6cc7a5f1e3e305b8f315Dianne Hackborn                getPm().getPackageSizeInfo(packageName, UserHandle.myUserId(), observer);
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long waitTime = 0;
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while((!observer.isDone()) || (waitTime > MAX_WAIT_TIME) ) {
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    observer.wait(WAIT_TIME_INCR);
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    waitTime += WAIT_TIME_INCR;
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(!observer.isDone()) {
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new Exception("Timed out waiting for PackageStatsObserver.onGetStatsCompleted");
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if(localLOGV) Log.i(TAG, "OBSERVER RET VALUES code="+observer.stats.codeSize+
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ", data="+observer.stats.dataSize+", cache="+observer.stats.cacheSize);
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return observer.stats;
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Failed to get handle for PackageManger Exception: "+e);
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (InterruptedException e) {
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "InterruptedException :"+e);
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5966b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SmallTest
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testGetPackageSizeInfo() throws Exception {
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String testName="testGetPackageSizeInfo";
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PackageStats stats = invokePMGetPackageSizeInfo();
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue(stats!=null);
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //confirm result
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(localLOGV) Log.i(TAG, "code="+stats.codeSize+", data="+stats.dataSize+
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ", cache="+stats.cacheSize);
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6066b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SmallTest
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testGetSystemSharedLibraryNames() throws Exception {
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] sharedLibs = getPm().getSystemSharedLibraryNames();
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (localLOGV) {
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (String str : sharedLibs) {
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.i(TAG, str);
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fail("Failed invoking getSystemSharedLibraryNames with exception:" + e);
6186b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas        }
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6206b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class FreeStorageReceiver extends BroadcastReceiver {
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String ACTION_FREE = "com.android.unit_tests.testcallback";
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean doneFlag = false;
6246b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean isDone() {
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return doneFlag;
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6286b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onReceive(Context context, Intent intent) {
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if(intent.getAction().equalsIgnoreCase(ACTION_FREE)) {
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (localLOGV) Log.i(TAG, "Got notification: clear cache succeeded "+getResultCode());
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                synchronized (this) {
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    doneFlag = true;
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    notifyAll();
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6406b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas
641f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot    // TODO: flaky test, omit from LargeTest for now
642f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot    //@LargeTest
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testFreeStorage() throws Exception {
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean TRACKING = true;
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StatFs st = new StatFs("/data");
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long blks1 = getFreeStorageBlks(st);
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(localLOGV || TRACKING) Log.i(TAG, "Available free blocks="+blks1);
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long availableMem = getFreeStorageSize(st);
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File cacheDir = mContext.getCacheDir();
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertNotNull(cacheDir);
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        createTestFiles1(cacheDir, "testtmpdir", 5);
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long blks2 = getFreeStorageBlks(st);
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(localLOGV || TRACKING) Log.i(TAG, "Available blocks after writing test files in application cache="+blks2);
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Create receiver and register it
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FreeStorageReceiver receiver = new FreeStorageReceiver();
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.registerReceiver(receiver, new IntentFilter(FreeStorageReceiver.ACTION_FREE));
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PendingIntent pi = PendingIntent.getBroadcast(mContext,
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0,  new Intent(FreeStorageReceiver.ACTION_FREE), 0);
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Invoke PackageManager api
6606c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root        if (!invokePMFreeStorage(availableMem, receiver, pi)) {
6616c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root            fail("Could not invoke PackageManager free storage API");
6626c46760b723cf010a456f71b5d3013bff60f33d8Kenny Root        }
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long blks3 = getFreeStorageBlks(st);
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(localLOGV || TRACKING) Log.i(TAG, "Available blocks after freeing cache"+blks3);
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(receiver.getResultCode(), 1);
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.unregisterReceiver(receiver);
6676b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas        // Verify result
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        verifyTestFiles1(cacheDir, "testtmpdir", 5);
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6706b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* utility method used to create observer and check async call back from PackageManager.
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ClearApplicationUserData
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean invokePMClearApplicationUserData() throws Exception {
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String packageName = mContext.getPackageName();
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            PackageDataObserver observer = new PackageDataObserver();
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //wait on observer
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized(observer) {
680483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                getPm().clearApplicationUserData(packageName, observer, 0 /* TODO: Other users */);
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long waitTime = 0;
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while(!observer.isDone() || (waitTime > MAX_WAIT_TIME)) {
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    observer.wait(WAIT_TIME_INCR);
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    waitTime += WAIT_TIME_INCR;
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(!observer.isDone()) {
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new Exception("timed out waiting for PackageDataObserver.onRemoveCompleted");
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return observer.retValue;
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Failed to get handle for PackageManger Exception: "+e);
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (InterruptedException e) {
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "InterruptedException :"+e);
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6996b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void verifyUserDataCleared(File pDir) {
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(localLOGV) Log.i(TAG, "Verifying "+pDir);
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(pDir == null) {
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String fileList[] = pDir.list();
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(fileList == null) {
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int imax = fileList.length;
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       //look recursively in user data dir
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for(int i = 0; i < imax; i++) {
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if(localLOGV) Log.i(TAG, "Found entry "+fileList[i]+ "in "+pDir);
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if("lib".equalsIgnoreCase(fileList[i])) {
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(localLOGV) Log.i(TAG, "Ignoring lib directory");
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fail(pDir+" should be empty or contain only lib subdirectory. Found "+fileList[i]);
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7206b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    File getDataDir() {
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
723483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            ApplicationInfo appInfo = getPm().getApplicationInfo(mContext.getPackageName(), 0,
724f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn                    UserHandle.myUserId());
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new File(appInfo.dataDir);
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Pacakge manager dead", e);
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7306b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas
7316b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas    @Suppress
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @LargeTest
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testClearApplicationUserDataWithTestData() throws Exception {
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File cacheDir = mContext.getCacheDir();
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        createTestFiles1(cacheDir, "testtmpdir", 5);
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(localLOGV) {
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i(TAG, "Created test data Waiting for 60seconds before continuing");
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Thread.sleep(60*1000);
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue(invokePMClearApplicationUserData());
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //confirm files dont exist
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        verifyUserDataCleared(getDataDir());
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7446b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas
7456b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas    @Suppress
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SmallTest
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testClearApplicationUserDataWithNoTestData() throws Exception {
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue(invokePMClearApplicationUserData());
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //confirm files dont exist
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        verifyUserDataCleared(getDataDir());
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7526b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas
7536b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas    @Suppress
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @LargeTest
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testClearApplicationUserDataNoObserver() throws Exception {
756f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn        getPm().clearApplicationUserData(mContext.getPackageName(), null, UserHandle.myUserId());
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //sleep for 1 minute
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Thread.sleep(60*1000);
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //confirm files dont exist
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        verifyUserDataCleared(getDataDir());
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7626b771ce3c360a395d618de33d07d2403a0c6764bAurimas Liutikas
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
764