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