1/*
2 * Copyright (C) 2017 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.settings.deviceinfo.storage;
18
19import static com.android.settings.TestUtils.GIGABYTE;
20import static com.android.settings.TestUtils.KILOBYTE;
21import static com.google.common.truth.Truth.assertThat;
22import static org.mockito.Matchers.any;
23import static org.mockito.Matchers.eq;
24import static org.mockito.Mockito.spy;
25import static org.mockito.Mockito.times;
26import static org.mockito.Mockito.verify;
27import static org.mockito.Mockito.when;
28
29import android.content.Context;
30import android.os.storage.VolumeInfo;
31import android.support.v7.preference.PreferenceViewHolder;
32import android.text.format.Formatter;
33import android.view.LayoutInflater;
34import android.view.View;
35import android.widget.Button;
36import android.widget.LinearLayout;
37
38import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
39import com.android.settings.R;
40import com.android.settings.testutils.FakeFeatureFactory;
41import com.android.settings.testutils.SettingsRobolectricTestRunner;
42import com.android.settings.testutils.shadow.SettingsShadowResources;
43import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
44import com.android.settingslib.deviceinfo.StorageVolumeProvider;
45
46import org.junit.After;
47import org.junit.Before;
48import org.junit.Test;
49import org.junit.runner.RunWith;
50import org.mockito.Mockito;
51import org.robolectric.RuntimeEnvironment;
52import org.robolectric.annotation.Config;
53
54import java.io.File;
55
56@RunWith(SettingsRobolectricTestRunner.class)
57@Config(shadows = {
58    SettingsShadowResources.class,
59    SettingsShadowResources.SettingsShadowTheme.class
60})
61public class StorageSummaryDonutPreferenceControllerTest {
62
63    private Context mContext;
64    private StorageSummaryDonutPreferenceController mController;
65    private StorageSummaryDonutPreference mPreference;
66    private PreferenceViewHolder mHolder;
67    private FakeFeatureFactory mFakeFeatureFactory;
68    private MetricsFeatureProvider mMetricsFeatureProvider;
69
70    @Before
71    public void setUp() throws Exception {
72        SettingsShadowResources.overrideResource(
73                com.android.internal.R.string.config_headlineFontFamily, "");
74        mContext = spy(RuntimeEnvironment.application.getApplicationContext());
75        mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
76        mMetricsFeatureProvider = mFakeFeatureFactory.getMetricsFeatureProvider();
77        mController = new StorageSummaryDonutPreferenceController(mContext);
78        mPreference = new StorageSummaryDonutPreference(mContext);
79
80        LayoutInflater inflater = LayoutInflater.from(mContext);
81        final View view =
82            inflater.inflate(mPreference.getLayoutResource(), new LinearLayout(mContext), false);
83        mHolder = PreferenceViewHolder.createInstanceForTests(view);
84    }
85
86    @After
87    public void tearDown() {
88        SettingsShadowResources.reset();
89    }
90
91    @Test
92    public void testEmpty() throws Exception {
93        final long totalSpace = 32 * GIGABYTE;
94        final long usedSpace = 0;
95        mController.updateBytes(0, 32 * GIGABYTE);
96        mController.updateState(mPreference);
97
98        final Formatter.BytesResult usedSpaceResults =
99            Formatter.formatBytes(mContext.getResources(), usedSpace, 0 /* flags */);
100        assertThat(mPreference.getTitle().toString())
101            .isEqualTo(usedSpaceResults.value + " " + usedSpaceResults.units);
102        assertThat(mPreference.getSummary().toString())
103            .isEqualTo("Used of " + Formatter.formatShortFileSize(mContext, totalSpace));
104    }
105
106    @Test
107    public void testTotalStorage() throws Exception {
108        final long totalSpace = KILOBYTE * 10;
109        final long usedSpace = KILOBYTE;
110        mController.updateBytes(KILOBYTE, totalSpace);
111        mController.updateState(mPreference);
112
113        final Formatter.BytesResult usedSpaceResults =
114            Formatter.formatBytes(mContext.getResources(), usedSpace, 0 /* flags */);
115        assertThat(mPreference.getTitle().toString())
116            .isEqualTo(usedSpaceResults.value + " " + usedSpaceResults.units);
117        assertThat(mPreference.getSummary().toString())
118            .isEqualTo("Used of " + Formatter.formatShortFileSize(mContext, totalSpace));
119    }
120
121    @Test
122    public void testPopulateWithVolume() throws Exception {
123        final long totalSpace = KILOBYTE * 10;
124        final long freeSpace = KILOBYTE;
125        final long usedSpace = totalSpace - freeSpace;
126        final VolumeInfo volume = Mockito.mock(VolumeInfo.class);
127        final File file = Mockito.mock(File.class);
128        final StorageVolumeProvider svp = Mockito.mock(StorageVolumeProvider.class);
129        when(volume.getPath()).thenReturn(file);
130        when(file.getTotalSpace()).thenReturn(totalSpace);
131        when(file.getFreeSpace()).thenReturn(freeSpace);
132        when(svp.getPrimaryStorageSize()).thenReturn(totalSpace);
133
134        mController.updateSizes(svp, volume);
135        mController.updateState(mPreference);
136
137        final Formatter.BytesResult usedSpaceResults =
138            Formatter.formatBytes(mContext.getResources(), usedSpace, 0 /* flags */);
139        assertThat(mPreference.getTitle().toString())
140            .isEqualTo(usedSpaceResults.value + " " + usedSpaceResults.units);
141        assertThat(mPreference.getSummary().toString())
142            .isEqualTo("Used of " + Formatter.formatShortFileSize(mContext, totalSpace));
143    }
144
145    @Test
146    public void testFreeUpSpaceMetricIsTriggered() throws Exception {
147        mPreference.onBindViewHolder(mHolder);
148        final Button button = (Button) mHolder.findViewById(R.id.deletion_helper_button);
149
150        mPreference.onClick(button);
151
152        verify(mMetricsFeatureProvider, times(1))
153            .action(any(Context.class), eq(MetricsEvent.STORAGE_FREE_UP_SPACE_NOW));
154    }
155}
156