Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8e712c15 authored by Jeremy Goldman's avatar Jeremy Goldman Committed by Yanting Yang
Browse files

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 899eb728)
parent 80daf4fc
Loading
Loading
Loading
Loading
+15 −2
Original line number Diff line number Diff line
@@ -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;
    }
}
+29 −14
Original line number Diff line number Diff line
@@ -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