1 /* 2 * Copyright (C) 2022 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 17 package com.android.settings.spa.app.appinfo 18 19 import android.app.usage.StorageStats 20 import android.app.usage.StorageStatsManager 21 import android.content.Context 22 import android.content.pm.ApplicationInfo 23 import androidx.compose.runtime.CompositionLocalProvider 24 import androidx.compose.ui.platform.LocalContext 25 import androidx.compose.ui.test.assertIsDisplayed 26 import androidx.compose.ui.test.assertIsNotDisplayed 27 import androidx.compose.ui.test.hasText 28 import androidx.compose.ui.test.junit4.createComposeRule 29 import androidx.compose.ui.test.onNodeWithText 30 import androidx.compose.ui.test.onRoot 31 import androidx.test.core.app.ApplicationProvider 32 import androidx.test.ext.junit.runners.AndroidJUnit4 33 import com.android.settings.R 34 import com.android.settingslib.spa.testutils.waitUntilExists 35 import com.android.settingslib.spaprivileged.framework.common.storageStatsManager 36 import java.util.UUID 37 import org.junit.Before 38 import org.junit.Rule 39 import org.junit.Test 40 import org.junit.runner.RunWith 41 import org.mockito.Mock 42 import org.mockito.Spy 43 import org.mockito.junit.MockitoJUnit 44 import org.mockito.junit.MockitoRule 45 import org.mockito.Mockito.any 46 import org.mockito.Mockito.eq 47 import org.mockito.Mockito.`when` as whenever 48 49 @RunWith(AndroidJUnit4::class) 50 class AppStoragePreferenceTest { 51 @get:Rule 52 val mockito: MockitoRule = MockitoJUnit.rule() 53 54 @get:Rule 55 val composeTestRule = createComposeRule() 56 57 @Spy 58 private val context: Context = ApplicationProvider.getApplicationContext() 59 60 @Mock 61 private lateinit var storageStatsManager: StorageStatsManager 62 63 @Before setUpnull64 fun setUp() { 65 whenever(context.storageStatsManager).thenReturn(storageStatsManager) 66 whenever( 67 storageStatsManager.queryStatsForPackage(eq(STORAGE_UUID), eq(PACKAGE_NAME), any()) 68 ).thenReturn(STATS) 69 } 70 71 @Test notInstalledApp_notDisplayednull72 fun notInstalledApp_notDisplayed() { 73 val notInstalledApp = ApplicationInfo() 74 75 setContent(notInstalledApp) 76 77 composeTestRule.onRoot().assertIsNotDisplayed() 78 } 79 80 @Test internalApp_displayednull81 fun internalApp_displayed() { 82 val internalApp = ApplicationInfo().apply { 83 packageName = PACKAGE_NAME 84 flags = ApplicationInfo.FLAG_INSTALLED 85 storageUuid = STORAGE_UUID 86 } 87 88 setContent(internalApp) 89 90 composeTestRule.onNodeWithText(context.getString(R.string.storage_settings_for_app)) 91 .assertIsDisplayed() 92 composeTestRule.waitUntilExists(hasText("120 B used in internal storage")) 93 } 94 95 @Test externalApp_displayednull96 fun externalApp_displayed() { 97 val externalApp = ApplicationInfo().apply { 98 packageName = PACKAGE_NAME 99 flags = ApplicationInfo.FLAG_INSTALLED or ApplicationInfo.FLAG_EXTERNAL_STORAGE 100 storageUuid = STORAGE_UUID 101 } 102 103 setContent(externalApp) 104 105 composeTestRule.onNodeWithText(context.getString(R.string.storage_settings_for_app)) 106 .assertIsDisplayed() 107 composeTestRule.waitUntilExists(hasText("120 B used in external storage")) 108 } 109 setContentnull110 private fun setContent(app: ApplicationInfo) { 111 composeTestRule.setContent { 112 CompositionLocalProvider(LocalContext provides context) { 113 AppStoragePreference(app) 114 } 115 } 116 } 117 118 companion object { 119 private const val PACKAGE_NAME = "package name" 120 private val STORAGE_UUID = UUID.randomUUID() 121 <lambda>null122 private val STATS = StorageStats().apply { 123 codeBytes = 100 124 dataBytes = 20 125 cacheBytes = 3 126 } 127 } 128 } 129