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}