DiskStatsLoggingServiceTest.java revision 3cf3b199e3e120f23f54eb7f9905c8d285cb8a28
1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.server.storage;
18
19import static com.google.common.truth.Truth.assertThat;
20
21import static org.mockito.Matchers.any;
22import static org.mockito.Matchers.anyInt;
23import static org.mockito.Mockito.eq;
24import static org.mockito.Mockito.mock;
25import static org.mockito.Mockito.verify;
26import static org.mockito.Mockito.when;
27
28import android.app.job.JobService;
29import android.app.job.JobParameters;
30import android.content.pm.PackageStats;
31import android.test.AndroidTestCase;
32
33import com.android.server.storage.DiskStatsLoggingService.LogRunnable;
34
35import libcore.io.IoUtils;
36
37import org.json.JSONObject;
38import org.junit.Before;
39import org.junit.Rule;
40import org.junit.Test;
41import org.junit.rules.TemporaryFolder;
42import org.junit.runner.RunWith;
43import org.junit.runners.JUnit4;
44import org.mockito.Mock;
45import org.mockito.MockitoAnnotations;
46
47import java.io.File;
48import java.io.PrintStream;
49import java.util.ArrayList;
50
51@RunWith(JUnit4.class)
52public class DiskStatsLoggingServiceTest extends AndroidTestCase {
53    @Rule public TemporaryFolder mTemporaryFolder;
54    @Rule public TemporaryFolder mDownloads;
55    @Rule public TemporaryFolder mRootDirectory;
56    @Mock private AppCollector mCollector;
57    private File mInputFile;
58
59
60    @Before
61    public void setUp() throws Exception {
62        super.setUp();
63        MockitoAnnotations.initMocks(this);
64        mTemporaryFolder = new TemporaryFolder();
65        mTemporaryFolder.create();
66        mInputFile = mTemporaryFolder.newFile();
67        mDownloads = new TemporaryFolder();
68        mDownloads.create();
69        mRootDirectory = new TemporaryFolder();
70        mRootDirectory.create();
71    }
72
73    @Test
74    public void testEmptyLog() throws Exception {
75        LogRunnable task = new LogRunnable();
76        task.setAppCollector(mCollector);
77        task.setDownloadsDirectory(mDownloads.getRoot());
78        task.setRootDirectory(mRootDirectory.getRoot());
79        task.setLogOutputFile(mInputFile);
80        task.setSystemSize(0L);
81        task.run();
82
83        JSONObject json = getJsonOutput();
84        assertThat(json.getLong(DiskStatsFileLogger.PHOTOS_KEY)).isEqualTo(0L);
85        assertThat(json.getLong(DiskStatsFileLogger.VIDEOS_KEY)).isEqualTo(0L);
86        assertThat(json.getLong(DiskStatsFileLogger.AUDIO_KEY)).isEqualTo(0L);
87        assertThat(json.getLong(DiskStatsFileLogger.DOWNLOADS_KEY)).isEqualTo(0L);
88        assertThat(json.getLong(DiskStatsFileLogger.SYSTEM_KEY)).isEqualTo(0L);
89        assertThat(json.getLong(DiskStatsFileLogger.MISC_KEY)).isEqualTo(0L);
90        assertThat(json.getLong(DiskStatsFileLogger.APP_SIZE_AGG_KEY)).isEqualTo(0L);
91        assertThat(json.getLong(DiskStatsFileLogger.APP_CACHE_AGG_KEY)).isEqualTo(0L);
92        assertThat(
93                json.getJSONArray(DiskStatsFileLogger.PACKAGE_NAMES_KEY).length()).isEqualTo(0L);
94        assertThat(json.getJSONArray(DiskStatsFileLogger.APP_SIZES_KEY).length()).isEqualTo(0L);
95        assertThat(json.getJSONArray(DiskStatsFileLogger.APP_CACHES_KEY).length()).isEqualTo(0L);
96    }
97
98    @Test
99    public void testPopulatedLogTask() throws Exception {
100        // Write data to directories.
101        writeDataToFile(mDownloads.newFile(), "lol");
102        writeDataToFile(mRootDirectory.newFile("test.jpg"), "1234");
103        writeDataToFile(mRootDirectory.newFile("test.mp4"), "12345");
104        writeDataToFile(mRootDirectory.newFile("test.mp3"), "123456");
105        writeDataToFile(mRootDirectory.newFile("test.whatever"), "1234567");
106
107        // Write apps.
108        ArrayList<PackageStats> apps = new ArrayList<>();
109        PackageStats testApp = new PackageStats("com.test.app");
110        testApp.dataSize = 5L;
111        testApp.cacheSize = 55L;
112        testApp.codeSize = 10L;
113        apps.add(testApp);
114        when(mCollector.getPackageStats(anyInt())).thenReturn(apps);
115
116        LogRunnable task = new LogRunnable();
117        task.setAppCollector(mCollector);
118        task.setDownloadsDirectory(mDownloads.getRoot());
119        task.setRootDirectory(mRootDirectory.getRoot());
120        task.setLogOutputFile(mInputFile);
121        task.setSystemSize(10L);
122        task.run();
123
124        JSONObject json = getJsonOutput();
125        assertThat(json.getLong(DiskStatsFileLogger.PHOTOS_KEY)).isEqualTo(4L);
126        assertThat(json.getLong(DiskStatsFileLogger.VIDEOS_KEY)).isEqualTo(5L);
127        assertThat(json.getLong(DiskStatsFileLogger.AUDIO_KEY)).isEqualTo(6L);
128        assertThat(json.getLong(DiskStatsFileLogger.DOWNLOADS_KEY)).isEqualTo(3L);
129        assertThat(json.getLong(DiskStatsFileLogger.SYSTEM_KEY)).isEqualTo(10L);
130        assertThat(json.getLong(DiskStatsFileLogger.MISC_KEY)).isEqualTo(7L);
131        assertThat(json.getLong(DiskStatsFileLogger.APP_SIZE_AGG_KEY)).isEqualTo(15L);
132        assertThat(json.getLong(DiskStatsFileLogger.APP_CACHE_AGG_KEY)).isEqualTo(55L);
133        assertThat(
134                json.getJSONArray(DiskStatsFileLogger.PACKAGE_NAMES_KEY).length()).isEqualTo(1L);
135        assertThat(json.getJSONArray(DiskStatsFileLogger.APP_SIZES_KEY).length()).isEqualTo(1L);
136        assertThat(json.getJSONArray(DiskStatsFileLogger.APP_CACHES_KEY).length()).isEqualTo(1L);
137    }
138
139    @Test
140    public void testDontCrashOnPackageStatsTimeout() throws Exception {
141        when(mCollector.getPackageStats(anyInt())).thenReturn(null);
142
143        LogRunnable task = new LogRunnable();
144        task.setAppCollector(mCollector);
145        task.setDownloadsDirectory(mDownloads.getRoot());
146        task.setRootDirectory(mRootDirectory.getRoot());
147        task.setLogOutputFile(mInputFile);
148        task.setSystemSize(10L);
149        task.run();
150
151        // No exception should be thrown.
152    }
153
154    private void writeDataToFile(File f, String data) throws Exception{
155        PrintStream out = new PrintStream(f);
156        out.print(data);
157        out.close();
158    }
159
160    private JSONObject getJsonOutput() throws Exception {
161        return new JSONObject(IoUtils.readFileAsString(mInputFile.getAbsolutePath()));
162    }
163}
164