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