From 8e712c15013c615c374b33cf7874e14bc387fd3a Mon Sep 17 00:00:00 2001 From: Jeremy Goldman Date: Wed, 24 Feb 2021 16:21:20 +0800 Subject: [PATCH] TopLevelStoragePreferenceControllerTest converted to JUnit Helper function composed to return thread future, to guarantee concurrent function finishes before test condition is checked. Additionally a @VisibleForTesting helper function is used rather than robolectric reflection helpers to set a class variable. Fixes: 187249674 Test: atest -c TopLevelStoragePreferenceControllerTest Change-Id: Ia22ebac4baec60f72b8516e9e79998cd788266ab Merged-In: Ia22ebac4baec60f72b8516e9e79998cd788266ab (cherry picked from commit 899eb7282d8e6fc234d6061113fc4edd5118525a) --- .../TopLevelStoragePreferenceController.java | 17 +++++++- ...pLevelStoragePreferenceControllerTest.java | 41 +++++++++++++------ 2 files changed, 43 insertions(+), 15 deletions(-) rename tests/{robotests => unit}/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceControllerTest.java (68%) diff --git a/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceController.java b/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceController.java index dcc581c7fb7..89d349f44f4 100644 --- a/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceController.java +++ b/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceController.java @@ -21,6 +21,7 @@ import android.os.storage.StorageManager; import android.text.format.Formatter; import android.util.FeatureFlagUtils; +import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; import com.android.settings.R; @@ -31,6 +32,7 @@ import com.android.settingslib.deviceinfo.StorageManagerVolumeProvider; import com.android.settingslib.utils.ThreadUtils; import java.text.NumberFormat; +import java.util.concurrent.Future; public class TopLevelStoragePreferenceController extends BasePreferenceController { @@ -59,10 +61,15 @@ public class TopLevelStoragePreferenceController extends BasePreferenceControlle return; } - ThreadUtils.postOnBackgroundThread(() -> { + refreshSummaryThread(preference); + } + + @VisibleForTesting + protected Future refreshSummaryThread(Preference preference) { + return ThreadUtils.postOnBackgroundThread(() -> { final NumberFormat percentageFormat = NumberFormat.getPercentInstance(); final PrivateStorageInfo info = PrivateStorageInfo.getPrivateStorageInfo( - mStorageManagerVolumeProvider); + getStorageManagerVolumeProvider()); final double privateUsedBytes = info.totalBytes - info.freeBytes; ThreadUtils.postOnMainThread(() -> { @@ -72,4 +79,10 @@ public class TopLevelStoragePreferenceController extends BasePreferenceControlle }); }); } + + + @VisibleForTesting + protected StorageManagerVolumeProvider getStorageManagerVolumeProvider() { + return mStorageManagerVolumeProvider; + } } diff --git a/tests/robotests/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceControllerTest.java b/tests/unit/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceControllerTest.java similarity index 68% rename from tests/robotests/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceControllerTest.java rename to tests/unit/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceControllerTest.java index 7e6be9ba476..d4157b85d47 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceControllerTest.java +++ b/tests/unit/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceControllerTest.java @@ -18,9 +18,11 @@ package com.android.settings.deviceinfo; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.fail; import static org.mockito.ArgumentMatchers.nullable; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import android.app.usage.StorageStatsManager; @@ -31,9 +33,11 @@ import android.text.format.Formatter; import android.util.FeatureFlagUtils; import androidx.preference.Preference; +import androidx.test.core.app.ApplicationProvider; +import androidx.test.ext.junit.runners.AndroidJUnit4; -import com.android.settings.R; import com.android.settings.core.FeatureFlags; +import com.android.settings.testutils.ResourcesUtils; import com.android.settingslib.deviceinfo.StorageManagerVolumeProvider; import org.junit.Before; @@ -41,14 +45,14 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; -import org.robolectric.util.ReflectionHelpers; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; -@RunWith(RobolectricTestRunner.class) +@RunWith(AndroidJUnit4.class) public class TopLevelStoragePreferenceControllerTest { @Mock @@ -62,12 +66,12 @@ public class TopLevelStoragePreferenceControllerTest { public void setUp() { MockitoAnnotations.initMocks(this); - mContext = RuntimeEnvironment.application; + mContext = ApplicationProvider.getApplicationContext(); mVolumes = new ArrayList<>(); mVolumes.add(mock(VolumeInfo.class, RETURNS_DEEP_STUBS)); when(mStorageManagerVolumeProvider.getVolumes()).thenReturn(mVolumes); - mController = new TopLevelStoragePreferenceController(mContext, "test_key"); + mController = spy(new TopLevelStoragePreferenceController(mContext, "test_key")); FeatureFlagUtils.setEnabled(mContext, FeatureFlags.SILKY_HOME, false); } @@ -82,16 +86,27 @@ public class TopLevelStoragePreferenceControllerTest { when(mStorageManagerVolumeProvider .getFreeBytes(nullable(StorageStatsManager.class), nullable(VolumeInfo.class))) .thenReturn(0L); - ReflectionHelpers.setField(mController, - "mStorageManagerVolumeProvider", mStorageManagerVolumeProvider); + when(mController.getStorageManagerVolumeProvider()) + .thenReturn(mStorageManagerVolumeProvider); final String percentage = NumberFormat.getPercentInstance().format(1); - final String freeSpace = Formatter.formatFileSize(RuntimeEnvironment.application, 0); + final String freeSpace = Formatter.formatFileSize(mContext, 0); final Preference preference = new Preference(mContext); - mController.updateState(preference); + // Wait for asynchronous thread to finish, otherwise test will flake. + Future thread = mController.refreshSummaryThread(preference); + try { + thread.get(); + } catch (ExecutionException | InterruptedException e) { + e.printStackTrace(); + fail("Exception during automatic selection"); + } - assertThat(preference.getSummary()).isEqualTo( - mContext.getString(R.string.storage_summary, percentage, freeSpace)); + + // Sleep for 5 seconds because a function is executed on the main thread from within + // the background thread. + TimeUnit.SECONDS.sleep(5); + assertThat(preference.getSummary()).isEqualTo(ResourcesUtils.getResourcesString( + mContext, "storage_summary", percentage, freeSpace)); } @Test