14f9e8d4a14be35caa551236c207f48c6855172edFan Zhang/*
24f9e8d4a14be35caa551236c207f48c6855172edFan Zhang * Copyright (C) 2017 The Android Open Source Project
34f9e8d4a14be35caa551236c207f48c6855172edFan Zhang *
44f9e8d4a14be35caa551236c207f48c6855172edFan Zhang * Licensed under the Apache License, Version 2.0 (the "License");
54f9e8d4a14be35caa551236c207f48c6855172edFan Zhang * you may not use this file except in compliance with the License.
64f9e8d4a14be35caa551236c207f48c6855172edFan Zhang * You may obtain a copy of the License at
74f9e8d4a14be35caa551236c207f48c6855172edFan Zhang *
84f9e8d4a14be35caa551236c207f48c6855172edFan Zhang *      http://www.apache.org/licenses/LICENSE-2.0
94f9e8d4a14be35caa551236c207f48c6855172edFan Zhang *
104f9e8d4a14be35caa551236c207f48c6855172edFan Zhang * Unless required by applicable law or agreed to in writing, software
114f9e8d4a14be35caa551236c207f48c6855172edFan Zhang * distributed under the License is distributed on an "AS IS" BASIS,
124f9e8d4a14be35caa551236c207f48c6855172edFan Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134f9e8d4a14be35caa551236c207f48c6855172edFan Zhang * See the License for the specific language governing permissions and
144f9e8d4a14be35caa551236c207f48c6855172edFan Zhang * limitations under the License.
154f9e8d4a14be35caa551236c207f48c6855172edFan Zhang */
164f9e8d4a14be35caa551236c207f48c6855172edFan Zhang
174f9e8d4a14be35caa551236c207f48c6855172edFan Zhangpackage com.android.settings.deviceinfo;
184f9e8d4a14be35caa551236c207f48c6855172edFan Zhang
194f9e8d4a14be35caa551236c207f48c6855172edFan Zhang
204f9e8d4a14be35caa551236c207f48c6855172edFan Zhangimport android.app.Activity;
2138a2a5f425d31916427550ec038dcff569d339e4Daniel Nishiimport android.app.usage.StorageStatsManager;
224f9e8d4a14be35caa551236c207f48c6855172edFan Zhangimport android.icu.text.NumberFormat;
234f9e8d4a14be35caa551236c207f48c6855172edFan Zhangimport android.os.storage.VolumeInfo;
244f9e8d4a14be35caa551236c207f48c6855172edFan Zhangimport android.text.format.Formatter;
254f9e8d4a14be35caa551236c207f48c6855172edFan Zhang
264f9e8d4a14be35caa551236c207f48c6855172edFan Zhangimport com.android.settings.R;
274f9e8d4a14be35caa551236c207f48c6855172edFan Zhangimport com.android.settings.SettingsRobolectricTestRunner;
284f9e8d4a14be35caa551236c207f48c6855172edFan Zhangimport com.android.settings.TestConfig;
294f9e8d4a14be35caa551236c207f48c6855172edFan Zhangimport com.android.settings.dashboard.SummaryLoader;
304f9e8d4a14be35caa551236c207f48c6855172edFan Zhangimport com.android.settingslib.deviceinfo.StorageManagerVolumeProvider;
314f9e8d4a14be35caa551236c207f48c6855172edFan Zhang
324f9e8d4a14be35caa551236c207f48c6855172edFan Zhangimport org.junit.Before;
334f9e8d4a14be35caa551236c207f48c6855172edFan Zhangimport org.junit.Test;
344f9e8d4a14be35caa551236c207f48c6855172edFan Zhangimport org.junit.runner.RunWith;
354f9e8d4a14be35caa551236c207f48c6855172edFan Zhangimport org.mockito.Mock;
364f9e8d4a14be35caa551236c207f48c6855172edFan Zhangimport org.mockito.MockitoAnnotations;
374f9e8d4a14be35caa551236c207f48c6855172edFan Zhangimport org.robolectric.RuntimeEnvironment;
384f9e8d4a14be35caa551236c207f48c6855172edFan Zhangimport org.robolectric.annotation.Config;
394f9e8d4a14be35caa551236c207f48c6855172edFan Zhangimport org.robolectric.util.ReflectionHelpers;
404f9e8d4a14be35caa551236c207f48c6855172edFan Zhang
414f9e8d4a14be35caa551236c207f48c6855172edFan Zhangimport java.util.ArrayList;
424f9e8d4a14be35caa551236c207f48c6855172edFan Zhangimport java.util.List;
434f9e8d4a14be35caa551236c207f48c6855172edFan Zhang
4438a2a5f425d31916427550ec038dcff569d339e4Daniel Nishiimport static org.mockito.Matchers.any;
454f9e8d4a14be35caa551236c207f48c6855172edFan Zhangimport static org.mockito.Mockito.RETURNS_DEEP_STUBS;
464f9e8d4a14be35caa551236c207f48c6855172edFan Zhangimport static org.mockito.Mockito.mock;
474f9e8d4a14be35caa551236c207f48c6855172edFan Zhangimport static org.mockito.Mockito.verify;
484f9e8d4a14be35caa551236c207f48c6855172edFan Zhangimport static org.mockito.Mockito.when;
494f9e8d4a14be35caa551236c207f48c6855172edFan Zhang
504f9e8d4a14be35caa551236c207f48c6855172edFan Zhang@RunWith(SettingsRobolectricTestRunner.class)
514f9e8d4a14be35caa551236c207f48c6855172edFan Zhang@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
524f9e8d4a14be35caa551236c207f48c6855172edFan Zhangpublic class StorageSettingsTest {
534f9e8d4a14be35caa551236c207f48c6855172edFan Zhang
544f9e8d4a14be35caa551236c207f48c6855172edFan Zhang    @Mock
554f9e8d4a14be35caa551236c207f48c6855172edFan Zhang    private StorageManagerVolumeProvider mStorageManagerVolumeProvider;
564f9e8d4a14be35caa551236c207f48c6855172edFan Zhang    @Mock
574f9e8d4a14be35caa551236c207f48c6855172edFan Zhang    private Activity mActivity;
584f9e8d4a14be35caa551236c207f48c6855172edFan Zhang
594f9e8d4a14be35caa551236c207f48c6855172edFan Zhang    private List<VolumeInfo> mVolumes;
604f9e8d4a14be35caa551236c207f48c6855172edFan Zhang
614f9e8d4a14be35caa551236c207f48c6855172edFan Zhang    private StorageSettings mSettings;
624f9e8d4a14be35caa551236c207f48c6855172edFan Zhang
634f9e8d4a14be35caa551236c207f48c6855172edFan Zhang    @Before
644f9e8d4a14be35caa551236c207f48c6855172edFan Zhang    public void setUp() {
654f9e8d4a14be35caa551236c207f48c6855172edFan Zhang        MockitoAnnotations.initMocks(this);
664f9e8d4a14be35caa551236c207f48c6855172edFan Zhang        mVolumes = new ArrayList<>();
674f9e8d4a14be35caa551236c207f48c6855172edFan Zhang        mVolumes.add(mock(VolumeInfo.class, RETURNS_DEEP_STUBS));
684f9e8d4a14be35caa551236c207f48c6855172edFan Zhang        mSettings = new StorageSettings();
694f9e8d4a14be35caa551236c207f48c6855172edFan Zhang        when(mStorageManagerVolumeProvider.getVolumes()).thenReturn(mVolumes);
704f9e8d4a14be35caa551236c207f48c6855172edFan Zhang    }
714f9e8d4a14be35caa551236c207f48c6855172edFan Zhang
724f9e8d4a14be35caa551236c207f48c6855172edFan Zhang    @Test
73b80f1ddaf04d07d47cead4de2422c4627573ea50Jeff Sharkey    public void updateSummary_shouldDisplayUsedPercentAndFreeSpace() throws Exception {
744f9e8d4a14be35caa551236c207f48c6855172edFan Zhang        final SummaryLoader loader = mock(SummaryLoader.class);
754f9e8d4a14be35caa551236c207f48c6855172edFan Zhang        final SummaryLoader.SummaryProvider provider =
764f9e8d4a14be35caa551236c207f48c6855172edFan Zhang                StorageSettings.SUMMARY_PROVIDER_FACTORY.createSummaryProvider(mActivity, loader);
774f9e8d4a14be35caa551236c207f48c6855172edFan Zhang        final VolumeInfo volumeInfo = mVolumes.get(0);
7838a2a5f425d31916427550ec038dcff569d339e4Daniel Nishi        when(volumeInfo.isMountedReadable()).thenReturn(true);
794f9e8d4a14be35caa551236c207f48c6855172edFan Zhang        when(volumeInfo.getType()).thenReturn(VolumeInfo.TYPE_PRIVATE);
8038a2a5f425d31916427550ec038dcff569d339e4Daniel Nishi        when(mStorageManagerVolumeProvider.getTotalBytes(
8138a2a5f425d31916427550ec038dcff569d339e4Daniel Nishi                        any(StorageStatsManager.class), any(VolumeInfo.class)))
8238a2a5f425d31916427550ec038dcff569d339e4Daniel Nishi                .thenReturn(500L);
8338a2a5f425d31916427550ec038dcff569d339e4Daniel Nishi        when(mStorageManagerVolumeProvider.getFreeBytes(
8438a2a5f425d31916427550ec038dcff569d339e4Daniel Nishi                        any(StorageStatsManager.class), any(VolumeInfo.class)))
8538a2a5f425d31916427550ec038dcff569d339e4Daniel Nishi                .thenReturn(0L);
864f9e8d4a14be35caa551236c207f48c6855172edFan Zhang
874f9e8d4a14be35caa551236c207f48c6855172edFan Zhang        ReflectionHelpers.setField(
884f9e8d4a14be35caa551236c207f48c6855172edFan Zhang                provider, "mStorageManagerVolumeProvider", mStorageManagerVolumeProvider);
894f9e8d4a14be35caa551236c207f48c6855172edFan Zhang        ReflectionHelpers.setField(provider, "mContext", RuntimeEnvironment.application);
904f9e8d4a14be35caa551236c207f48c6855172edFan Zhang
914f9e8d4a14be35caa551236c207f48c6855172edFan Zhang        provider.setListening(true);
924f9e8d4a14be35caa551236c207f48c6855172edFan Zhang
934f9e8d4a14be35caa551236c207f48c6855172edFan Zhang        final String percentage = NumberFormat.getPercentInstance().format(1);
944f9e8d4a14be35caa551236c207f48c6855172edFan Zhang        final String freeSpace = Formatter.formatFileSize(RuntimeEnvironment.application, 0);
954f9e8d4a14be35caa551236c207f48c6855172edFan Zhang        verify(loader).setSummary(provider,
964f9e8d4a14be35caa551236c207f48c6855172edFan Zhang                RuntimeEnvironment.application.getString(
974f9e8d4a14be35caa551236c207f48c6855172edFan Zhang                        R.string.storage_summary, percentage, freeSpace));
984f9e8d4a14be35caa551236c207f48c6855172edFan Zhang    }
994f9e8d4a14be35caa551236c207f48c6855172edFan Zhang}
100