177a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi/* 277a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi * Copyright (C) 2016 The Android Open Source Project 377a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi * 477a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi * Licensed under the Apache License, Version 2.0 (the "License"); 577a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi * you may not use this file except in compliance with the License. 677a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi * You may obtain a copy of the License at 777a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi * 877a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi * http://www.apache.org/licenses/LICENSE-2.0 977a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi * 1077a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi * Unless required by applicable law or agreed to in writing, software 1177a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi * distributed under the License is distributed on an "AS IS" BASIS, 1277a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1377a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi * See the License for the specific language governing permissions and 1477a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi * limitations under the License. 1577a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi */ 1677a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 1777a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishipackage com.android.server.storage; 1877a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 1977a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishiimport android.content.pm.PackageStats; 2077a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishiimport android.test.AndroidTestCase; 2177a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishiimport android.util.ArraySet; 2277a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishiimport libcore.io.IoUtils; 2377a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishiimport org.json.JSONArray; 2477a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishiimport org.json.JSONObject; 2577a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishiimport org.junit.Before; 2677a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishiimport org.junit.Rule; 2777a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishiimport org.junit.Test; 2877a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishiimport org.junit.rules.TemporaryFolder; 2977a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishiimport org.junit.runner.RunWith; 3077a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishiimport org.junit.runners.JUnit4; 3177a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 3277a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishiimport java.io.File; 3377a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishiimport java.util.ArrayList; 3477a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 3577a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishiimport static com.google.common.truth.Truth.assertThat; 3677a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 3777a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi@RunWith(JUnit4.class) 3877a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishipublic class DiskStatsFileLoggerTest extends AndroidTestCase { 3977a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi @Rule public TemporaryFolder temporaryFolder; 4077a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi public FileCollector.MeasurementResult mMainResult; 4177a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi public FileCollector.MeasurementResult mDownloadsResult; 4277a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi private ArrayList<PackageStats> mPackages; 4377a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi private File mOutputFile; 4477a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 4577a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi @Before 4677a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi public void setUp() throws Exception { 4777a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi super.setUp(); 4877a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi temporaryFolder = new TemporaryFolder(); 4977a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi temporaryFolder.create(); 5077a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi mOutputFile = temporaryFolder.newFile(); 5177a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi mMainResult = new FileCollector.MeasurementResult(); 5277a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi mDownloadsResult = new FileCollector.MeasurementResult(); 5377a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi mPackages = new ArrayList<>(); 5477a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi } 5577a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 5677a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi @Test 5777a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi public void testEmptyStorage() throws Exception { 5877a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi DiskStatsFileLogger logger = new DiskStatsFileLogger( 5977a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi mMainResult, mDownloadsResult,mPackages, 0L); 6077a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 6177a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi logger.dumpToFile(mOutputFile); 6277a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 6377a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi JSONObject output = getOutputFileAsJson(); 6477a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi assertThat(output.getLong(DiskStatsFileLogger.PHOTOS_KEY)).isEqualTo(0L); 6577a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi assertThat(output.getLong(DiskStatsFileLogger.VIDEOS_KEY)).isEqualTo(0L); 6677a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi assertThat(output.getLong(DiskStatsFileLogger.AUDIO_KEY)).isEqualTo(0L); 6777a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi assertThat(output.getLong(DiskStatsFileLogger.DOWNLOADS_KEY)).isEqualTo(0L); 6877a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi assertThat(output.getLong(DiskStatsFileLogger.SYSTEM_KEY)).isEqualTo(0L); 6977a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi assertThat(output.getLong(DiskStatsFileLogger.MISC_KEY)).isEqualTo(0L); 7077a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi assertThat(output.getLong(DiskStatsFileLogger.APP_SIZE_AGG_KEY)).isEqualTo(0L); 7177a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi assertThat(output.getLong(DiskStatsFileLogger.APP_CACHE_AGG_KEY)).isEqualTo(0L); 7277a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi assertThat( 7377a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi output.getJSONArray(DiskStatsFileLogger.PACKAGE_NAMES_KEY).length()).isEqualTo(0L); 7477a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi assertThat(output.getJSONArray(DiskStatsFileLogger.APP_SIZES_KEY).length()).isEqualTo(0L); 7577a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi assertThat(output.getJSONArray(DiskStatsFileLogger.APP_CACHES_KEY).length()).isEqualTo(0L); 7677a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi } 7777a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 7877a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi @Test 7977a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi public void testMeasurementResultsReported() throws Exception { 8077a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi mMainResult.audioSize = 1; 8177a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi mMainResult.imagesSize = 10; 8277a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi mMainResult.miscSize = 100; 8377a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi mDownloadsResult.miscSize = 1000; 8477a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi DiskStatsFileLogger logger = new DiskStatsFileLogger( 8577a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi mMainResult, mDownloadsResult,mPackages, 3L); 8677a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 8777a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi logger.dumpToFile(mOutputFile); 8877a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 8977a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi JSONObject output = getOutputFileAsJson(); 9077a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi assertThat(output.getLong(DiskStatsFileLogger.AUDIO_KEY)).isEqualTo(1L); 9177a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi assertThat(output.getLong(DiskStatsFileLogger.PHOTOS_KEY)).isEqualTo(10L); 9277a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi assertThat(output.getLong(DiskStatsFileLogger.MISC_KEY)).isEqualTo(100L); 9377a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi assertThat(output.getLong(DiskStatsFileLogger.DOWNLOADS_KEY)).isEqualTo(1000L); 9477a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi assertThat(output.getLong(DiskStatsFileLogger.SYSTEM_KEY)).isEqualTo(3L); 9577a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi } 9677a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 9777a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi @Test 9877a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi public void testAppsReported() throws Exception { 9977a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi PackageStats firstPackage = new PackageStats("com.test.app"); 10077a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi firstPackage.codeSize = 100; 10177a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi firstPackage.dataSize = 1000; 10277a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi firstPackage.cacheSize = 20; 10377a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi mPackages.add(firstPackage); 10477a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 10577a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi PackageStats secondPackage = new PackageStats("com.test.app2"); 10677a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi secondPackage.codeSize = 10; 10777a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi secondPackage.dataSize = 1; 10877a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi secondPackage.cacheSize = 2; 10977a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi mPackages.add(secondPackage); 11077a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 11177a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi DiskStatsFileLogger logger = new DiskStatsFileLogger( 11277a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi mMainResult, mDownloadsResult, mPackages, 0L); 11377a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi logger.dumpToFile(mOutputFile); 11477a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 11577a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi JSONObject output = getOutputFileAsJson(); 11677a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi assertThat(output.getLong(DiskStatsFileLogger.APP_SIZE_AGG_KEY)).isEqualTo(1111); 11777a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi assertThat(output.getLong(DiskStatsFileLogger.APP_CACHE_AGG_KEY)).isEqualTo(22); 11877a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 11977a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi JSONArray packageNames = output.getJSONArray(DiskStatsFileLogger.PACKAGE_NAMES_KEY); 12077a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi assertThat(packageNames.length()).isEqualTo(2); 12177a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi JSONArray appSizes = output.getJSONArray(DiskStatsFileLogger.APP_SIZES_KEY); 12277a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi assertThat(appSizes.length()).isEqualTo(2); 12377a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi JSONArray cacheSizes = output.getJSONArray(DiskStatsFileLogger.APP_CACHES_KEY); 12477a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi assertThat(cacheSizes.length()).isEqualTo(2); 12577a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 12677a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi // We need to do this crazy Set over this because the DiskStatsFileLogger provides no 12777a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi // guarantee of the ordering of the apps in its output. By using a set, we avoid any order 12877a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi // problems. 12977a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi ArraySet<AppSizeGrouping> apps = new ArraySet<>(); 13077a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi for (int i = 0; i < packageNames.length(); i++) { 13177a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi AppSizeGrouping app = new AppSizeGrouping(packageNames.getString(i), 13277a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi appSizes.getLong(i), cacheSizes.getLong(i)); 13377a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi apps.add(app); 13477a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi } 13577a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi assertThat(apps).containsAllOf(new AppSizeGrouping("com.test.app", 1100, 20), 13677a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi new AppSizeGrouping("com.test.app2", 11, 2)); 13777a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi } 13877a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 13977a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi @Test 14077a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi public void testEmulatedExternalStorageCounted() throws Exception { 14177a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi PackageStats app = new PackageStats("com.test.app"); 14277a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi app.dataSize = 1000; 14377a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi app.externalDataSize = 1000; 14477a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi app.cacheSize = 20; 14577a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi mPackages.add(app); 14677a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 14777a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi DiskStatsFileLogger logger = new DiskStatsFileLogger( 14877a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi mMainResult, mDownloadsResult, mPackages, 0L); 14977a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi logger.dumpToFile(mOutputFile); 15077a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 15177a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi JSONObject output = getOutputFileAsJson(); 15277a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi JSONArray appSizes = output.getJSONArray(DiskStatsFileLogger.APP_SIZES_KEY); 15377a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi assertThat(appSizes.length()).isEqualTo(1); 15477a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi assertThat(appSizes.getLong(0)).isEqualTo(2000); 15577a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi } 15677a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 15777a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi @Test 158e47eac74f7c80738017734342f66b615189e7596Daniel Nishi public void testDuplicatePackageNameIsNotMergedAcrossMultipleUsers() throws Exception { 15977a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi PackageStats app = new PackageStats("com.test.app"); 16077a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi app.dataSize = 1000; 16177a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi app.externalDataSize = 1000; 16277a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi app.cacheSize = 20; 16377a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi app.userHandle = 0; 16477a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi mPackages.add(app); 16577a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 16677a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi PackageStats secondApp = new PackageStats("com.test.app"); 16777a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi secondApp.dataSize = 100; 16877a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi secondApp.externalDataSize = 100; 16977a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi secondApp.cacheSize = 2; 17077a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi secondApp.userHandle = 1; 17177a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi mPackages.add(secondApp); 17277a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 17377a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi DiskStatsFileLogger logger = new DiskStatsFileLogger( 17477a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi mMainResult, mDownloadsResult, mPackages, 0L); 17577a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi logger.dumpToFile(mOutputFile); 17677a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 17777a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi JSONObject output = getOutputFileAsJson(); 178e47eac74f7c80738017734342f66b615189e7596Daniel Nishi assertThat(output.getLong(DiskStatsFileLogger.APP_SIZE_AGG_KEY)).isEqualTo(2000); 179e47eac74f7c80738017734342f66b615189e7596Daniel Nishi assertThat(output.getLong(DiskStatsFileLogger.APP_CACHE_AGG_KEY)).isEqualTo(20); 18077a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi JSONArray packageNames = output.getJSONArray(DiskStatsFileLogger.PACKAGE_NAMES_KEY); 18177a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi assertThat(packageNames.length()).isEqualTo(1); 18277a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi assertThat(packageNames.getString(0)).isEqualTo("com.test.app"); 18377a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 18477a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi JSONArray appSizes = output.getJSONArray(DiskStatsFileLogger.APP_SIZES_KEY); 18577a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi assertThat(appSizes.length()).isEqualTo(1); 186e47eac74f7c80738017734342f66b615189e7596Daniel Nishi assertThat(appSizes.getLong(0)).isEqualTo(2000); 18777a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 18877a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi JSONArray cacheSizes = output.getJSONArray(DiskStatsFileLogger.APP_CACHES_KEY); 18977a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi assertThat(cacheSizes.length()).isEqualTo(1); 190e47eac74f7c80738017734342f66b615189e7596Daniel Nishi assertThat(cacheSizes.getLong(0)).isEqualTo(20); 19177a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi } 19277a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 19377a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi private JSONObject getOutputFileAsJson() throws Exception { 19477a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi return new JSONObject(IoUtils.readFileAsString(mOutputFile.getAbsolutePath())); 19577a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi } 19677a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 19777a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi /** 19877a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi * This class exists for putting zipped app size information arrays into a set for comparison 19977a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi * purposes. 20077a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi */ 20177a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi private class AppSizeGrouping { 20277a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi public String packageName; 20377a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi public long appSize; 20477a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi public long cacheSize; 20577a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 20677a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi public AppSizeGrouping(String packageName, long appSize, long cacheSize) { 20777a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi this.packageName = packageName; 20877a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi this.appSize = appSize; 20977a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi this.cacheSize = cacheSize; 21077a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi } 21177a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 21277a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi @Override 21377a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi public int hashCode() { 21477a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi int result = 17; 21577a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi result = 37 * result + (int)(appSize ^ (appSize >>> 32)); 21677a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi result = 37 * result + (int)(cacheSize ^ (cacheSize >>> 32)); 21777a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi result = 37 * result + packageName.hashCode(); 21877a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi return result; 21977a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi } 22077a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 22177a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi @Override 22277a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi public boolean equals(Object o) { 22377a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi if (!(o instanceof AppSizeGrouping)) { 22477a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi return false; 22577a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi } 22677a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi if (this == o) { 22777a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi return true; 22877a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi } 22977a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi AppSizeGrouping grouping = (AppSizeGrouping) o; 23077a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi return packageName.equals(grouping.packageName) && appSize == grouping.appSize && 23177a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi cacheSize == grouping.cacheSize; 23277a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi } 23377a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi 23477a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi @Override 23577a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi public String toString() { 23677a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi return packageName + " " + appSize + " " + cacheSize; 23777a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi } 23877a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi } 23977a78c6f4412dccc58075685ad77f3e41d85f2e4Daniel Nishi}