DiskStatsLoggingServiceTest.java revision bd441caaf6fb268b2756bc51304efa038bf58376
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.Matchers.anyLong; 24import static org.mockito.Matchers.anyString; 25import static org.mockito.Matchers.isNull; 26import static org.mockito.Mockito.when; 27 28import android.app.job.JobService; 29import android.app.usage.ExternalStorageStats; 30import android.app.usage.StorageStatsManager; 31import android.content.pm.PackageStats; 32import android.os.UserHandle; 33import android.test.AndroidTestCase; 34import android.util.Log; 35 36import com.android.server.storage.DiskStatsLoggingService.LogRunnable; 37 38import libcore.io.IoUtils; 39 40import org.json.JSONObject; 41import org.junit.Before; 42import org.junit.Rule; 43import org.junit.Test; 44import org.junit.rules.TemporaryFolder; 45import org.junit.runner.RunWith; 46import org.junit.runners.JUnit4; 47import org.mockito.Mock; 48import org.mockito.MockitoAnnotations; 49 50import java.io.File; 51import java.io.PrintStream; 52import java.util.ArrayList; 53 54@RunWith(JUnit4.class) 55public class DiskStatsLoggingServiceTest extends AndroidTestCase { 56 @Rule public TemporaryFolder mTemporaryFolder; 57 @Rule public TemporaryFolder mDownloads; 58 @Mock private AppCollector mCollector; 59 @Mock private JobService mJobService; 60 @Mock private StorageStatsManager mSsm; 61 private ExternalStorageStats mStorageStats; 62 private File mInputFile; 63 64 65 @Before 66 public void setUp() throws Exception { 67 super.setUp(); 68 MockitoAnnotations.initMocks(this); 69 mTemporaryFolder = new TemporaryFolder(); 70 mTemporaryFolder.create(); 71 mInputFile = mTemporaryFolder.newFile(); 72 mDownloads = new TemporaryFolder(); 73 mDownloads.create(); 74 mStorageStats = new ExternalStorageStats(); 75 when(mSsm.queryExternalStatsForUser(isNull(String.class), any(UserHandle.class))) 76 .thenReturn(mStorageStats); 77 when(mJobService.getSystemService(anyString())).thenReturn(mSsm); 78 } 79 80 @Test 81 public void testEmptyLog() throws Exception { 82 LogRunnable task = new LogRunnable(); 83 task.setAppCollector(mCollector); 84 task.setDownloadsDirectory(mDownloads.getRoot()); 85 task.setLogOutputFile(mInputFile); 86 task.setSystemSize(0L); 87 task.setContext(mJobService); 88 task.run(); 89 90 JSONObject json = getJsonOutput(); 91 assertThat(json.getLong(DiskStatsFileLogger.PHOTOS_KEY)).isEqualTo(0L); 92 assertThat(json.getLong(DiskStatsFileLogger.VIDEOS_KEY)).isEqualTo(0L); 93 assertThat(json.getLong(DiskStatsFileLogger.AUDIO_KEY)).isEqualTo(0L); 94 assertThat(json.getLong(DiskStatsFileLogger.DOWNLOADS_KEY)).isEqualTo(0L); 95 assertThat(json.getLong(DiskStatsFileLogger.SYSTEM_KEY)).isEqualTo(0L); 96 assertThat(json.getLong(DiskStatsFileLogger.MISC_KEY)).isEqualTo(0L); 97 assertThat(json.getLong(DiskStatsFileLogger.APP_SIZE_AGG_KEY)).isEqualTo(0L); 98 assertThat(json.getLong(DiskStatsFileLogger.APP_CACHE_AGG_KEY)).isEqualTo(0L); 99 assertThat( 100 json.getJSONArray(DiskStatsFileLogger.PACKAGE_NAMES_KEY).length()).isEqualTo(0L); 101 assertThat(json.getJSONArray(DiskStatsFileLogger.APP_SIZES_KEY).length()).isEqualTo(0L); 102 assertThat(json.getJSONArray(DiskStatsFileLogger.APP_CACHES_KEY).length()).isEqualTo(0L); 103 } 104 105 @Test 106 public void testPopulatedLogTask() throws Exception { 107 // Write data to directories. 108 writeDataToFile(mDownloads.newFile(), "lol"); 109 mStorageStats.audioBytes = 6L; 110 mStorageStats.imageBytes = 4L; 111 mStorageStats.videoBytes = 5L; 112 mStorageStats.totalBytes = 22L; 113 114 // Write apps. 115 ArrayList<PackageStats> apps = new ArrayList<>(); 116 PackageStats testApp = new PackageStats("com.test.app"); 117 testApp.dataSize = 5L; 118 testApp.cacheSize = 55L; 119 testApp.codeSize = 10L; 120 testApp.userHandle = UserHandle.USER_SYSTEM; 121 apps.add(testApp); 122 when(mCollector.getPackageStats(anyLong())).thenReturn(apps); 123 124 LogRunnable task = new LogRunnable(); 125 task.setAppCollector(mCollector); 126 task.setDownloadsDirectory(mDownloads.getRoot()); 127 task.setLogOutputFile(mInputFile); 128 task.setSystemSize(10L); 129 task.setContext(mJobService); 130 task.run(); 131 132 JSONObject json = getJsonOutput(); 133 assertThat(json.getLong(DiskStatsFileLogger.PHOTOS_KEY)).isEqualTo(4L); 134 assertThat(json.getLong(DiskStatsFileLogger.VIDEOS_KEY)).isEqualTo(5L); 135 assertThat(json.getLong(DiskStatsFileLogger.AUDIO_KEY)).isEqualTo(6L); 136 assertThat(json.getLong(DiskStatsFileLogger.DOWNLOADS_KEY)).isEqualTo(3L); 137 assertThat(json.getLong(DiskStatsFileLogger.SYSTEM_KEY)).isEqualTo(10L); 138 assertThat(json.getLong(DiskStatsFileLogger.MISC_KEY)).isEqualTo(7L); 139 assertThat(json.getLong(DiskStatsFileLogger.APP_SIZE_AGG_KEY)).isEqualTo(15L); 140 assertThat(json.getLong(DiskStatsFileLogger.APP_CACHE_AGG_KEY)).isEqualTo(55L); 141 assertThat( 142 json.getJSONArray(DiskStatsFileLogger.PACKAGE_NAMES_KEY).length()).isEqualTo(1L); 143 assertThat(json.getJSONArray(DiskStatsFileLogger.APP_SIZES_KEY).length()).isEqualTo(1L); 144 assertThat(json.getJSONArray(DiskStatsFileLogger.APP_CACHES_KEY).length()).isEqualTo(1L); 145 } 146 147 @Test 148 public void testDontCrashOnPackageStatsTimeout() throws Exception { 149 when(mCollector.getPackageStats(anyInt())).thenReturn(null); 150 151 LogRunnable task = new LogRunnable(); 152 task.setAppCollector(mCollector); 153 task.setDownloadsDirectory(mDownloads.getRoot()); 154 task.setLogOutputFile(mInputFile); 155 task.setSystemSize(10L); 156 task.setContext(mJobService); 157 task.run(); 158 159 // No exception should be thrown. 160 } 161 162 private void writeDataToFile(File f, String data) throws Exception{ 163 PrintStream out = new PrintStream(f); 164 out.print(data); 165 out.close(); 166 } 167 168 private JSONObject getJsonOutput() throws Exception { 169 return new JSONObject(IoUtils.readFileAsString(mInputFile.getAbsolutePath())); 170 } 171} 172