• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 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.datausage;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 
21 import static org.mockito.ArgumentMatchers.any;
22 import static org.mockito.ArgumentMatchers.anyInt;
23 import static org.mockito.ArgumentMatchers.anyString;
24 import static org.mockito.Mockito.doNothing;
25 import static org.mockito.Mockito.doReturn;
26 import static org.mockito.Mockito.never;
27 import static org.mockito.Mockito.spy;
28 import static org.mockito.Mockito.verify;
29 
30 import android.app.usage.NetworkStatsManager;
31 import android.content.Context;
32 import android.content.res.Resources;
33 import android.net.NetworkPolicyManager;
34 import android.os.UserManager;
35 import android.telephony.SubscriptionManager;
36 import android.telephony.TelephonyManager;
37 
38 import androidx.fragment.app.FragmentActivity;
39 import androidx.test.core.app.ApplicationProvider;
40 
41 import com.android.settings.R;
42 import com.android.settings.testutils.shadow.ShadowDashboardFragment;
43 import com.android.settings.testutils.shadow.ShadowDataUsageUtils;
44 import com.android.settings.testutils.shadow.ShadowUserManager;
45 import com.android.settings.testutils.shadow.ShadowUtils;
46 
47 import org.junit.Before;
48 import org.junit.Ignore;
49 import org.junit.Rule;
50 import org.junit.Test;
51 import org.junit.runner.RunWith;
52 import org.mockito.Mock;
53 import org.mockito.Spy;
54 import org.mockito.junit.MockitoJUnit;
55 import org.mockito.junit.MockitoRule;
56 import org.robolectric.Robolectric;
57 import org.robolectric.RobolectricTestRunner;
58 import org.robolectric.Shadows;
59 import org.robolectric.annotation.Config;
60 import org.robolectric.shadows.ShadowApplication;
61 import org.robolectric.shadows.ShadowSubscriptionManager;
62 import org.robolectric.shadows.ShadowTelephonyManager;
63 
64 @Config(shadows = {
65         ShadowUtils.class,
66         ShadowDataUsageUtils.class,
67         ShadowDashboardFragment.class,
68         ShadowUserManager.class,
69 })
70 @RunWith(RobolectricTestRunner.class)
71 public class DataUsageSummaryTest {
72     @Rule
73     public final MockitoRule mMockitoRule = MockitoJUnit.rule();
74     @Spy
75     Context mContext = ApplicationProvider.getApplicationContext();
76     @Mock
77     private UserManager mUserManager;
78     @Mock
79     private NetworkPolicyManager mNetworkPolicyManager;
80     @Mock
81     private NetworkStatsManager mNetworkStatsManager;
82     private TelephonyManager mTelephonyManager;
83     private Resources mResources;
84     private FragmentActivity mActivity;
85 
86     private DataUsageSummary mDataUsageSummary;
87 
88     /**
89      * This set up is contrived to get a passing test so that the build doesn't block without tests.
90      * These tests should be updated as code gets refactored to improve testability.
91      */
92 
93     @Before
setUp()94     public void setUp() {
95         doReturn(mUserManager).when(mContext).getSystemService(UserManager.class);
96         doReturn(false).when(mUserManager).isGuestUser();
97 
98         ShadowApplication shadowContext = ShadowApplication.getInstance();
99         ShadowUserManager.getShadow().setIsAdminUser(true);
100         shadowContext.setSystemService(Context.NETWORK_POLICY_SERVICE, mNetworkPolicyManager);
101 
102         mTelephonyManager = mContext.getSystemService(TelephonyManager.class);
103         final ShadowTelephonyManager shadowTelephonyManager = Shadows.shadowOf(mTelephonyManager);
104         shadowTelephonyManager.setTelephonyManagerForSubscriptionId(
105                 SubscriptionManager.INVALID_SUBSCRIPTION_ID, mTelephonyManager);
106         shadowTelephonyManager.setTelephonyManagerForSubscriptionId(1, mTelephonyManager);
107         mActivity = spy(Robolectric.buildActivity(FragmentActivity.class).get());
108 
109         mResources = spy(mContext.getResources());
110         doReturn(mResources).when(mContext).getResources();
111         doReturn(true).when(mResources).getBoolean(R.bool.config_show_sim_info);
112 
113         doReturn(mNetworkStatsManager).when(mActivity).getSystemService(NetworkStatsManager.class);
114 
115         mDataUsageSummary = spy(new DataUsageSummary());
116         doReturn(mContext).when(mDataUsageSummary).getContext();
117         doNothing().when(mDataUsageSummary).enableProxySubscriptionManager(any());
118         doReturn(true).when(mDataUsageSummary).removePreference(anyString());
119         doNothing().when(mDataUsageSummary).addWifiSection();
120     }
121 
122     @Test
formatUsage_shouldLookLikeFormatFileSize()123     public void formatUsage_shouldLookLikeFormatFileSize() {
124         final long usage = 2147483648L; // 2GB
125         final String formattedUsage =
126                 DataUsageSummary.formatUsage(mContext, "^1", usage).toString();
127         final CharSequence formattedInIECUnit = DataUsageUtils.formatDataUsage(mContext, usage);
128         assertThat(formattedUsage).isEqualTo(formattedInIECUnit);
129     }
130 
131     @Test
132     @Config(shadows = ShadowSubscriptionManager.class)
133     @Ignore
configuration_withSim_shouldShowMobileAndWifi()134     public void configuration_withSim_shouldShowMobileAndWifi() {
135         ShadowDataUsageUtils.IS_MOBILE_DATA_SUPPORTED = true;
136         ShadowDataUsageUtils.IS_WIFI_SUPPORTED = true;
137         ShadowSubscriptionManager.setDefaultDataSubscriptionId(1);
138         ShadowDataUsageUtils.HAS_SIM = true;
139 
140         final DataUsageSummary dataUsageSummary = spy(new DataUsageSummary());
141         doNothing().when(dataUsageSummary).enableProxySubscriptionManager(any());
142         doReturn(true).when(dataUsageSummary).hasActiveSubscription();
143         doReturn(mContext).when(dataUsageSummary).getContext();
144 
145         doReturn(true).when(dataUsageSummary).removePreference(anyString());
146         doNothing().when(dataUsageSummary).addWifiSection();
147         doNothing().when(dataUsageSummary).addMobileSection(1);
148 
149         dataUsageSummary.onCreate(null);
150 
151         verify(dataUsageSummary).addWifiSection();
152         verify(dataUsageSummary).addMobileSection(anyInt());
153     }
154 
155     @Test
configuration_withoutSim_shouldShowWifiSectionOnly()156     public void configuration_withoutSim_shouldShowWifiSectionOnly() {
157         ShadowDataUsageUtils.IS_MOBILE_DATA_SUPPORTED = true;
158         ShadowDataUsageUtils.IS_WIFI_SUPPORTED = true;
159         ShadowDataUsageUtils.HAS_SIM = false;
160 
161         final DataUsageSummary dataUsageSummary = spy(new DataUsageSummary());
162         doNothing().when(dataUsageSummary).enableProxySubscriptionManager(any());
163         doReturn(false).when(dataUsageSummary).hasActiveSubscription();
164         doReturn(mContext).when(dataUsageSummary).getContext();
165 
166         doReturn(true).when(dataUsageSummary).removePreference(anyString());
167         doNothing().when(dataUsageSummary).addWifiSection();
168         doNothing().when(dataUsageSummary).addMobileSection(1);
169 
170         dataUsageSummary.onCreate(null);
171 
172         verify(dataUsageSummary).addWifiSection();
173         verify(dataUsageSummary, never()).addMobileSection(anyInt());
174     }
175 
176     @Test
configuration_withoutMobile_shouldShowWifiSectionOnly()177     public void configuration_withoutMobile_shouldShowWifiSectionOnly() {
178         ShadowDataUsageUtils.IS_MOBILE_DATA_SUPPORTED = false;
179         ShadowDataUsageUtils.IS_WIFI_SUPPORTED = true;
180         ShadowDataUsageUtils.HAS_SIM = false;
181 
182         final DataUsageSummary dataUsageSummary = spy(new DataUsageSummary());
183         doNothing().when(dataUsageSummary).enableProxySubscriptionManager(any());
184         doReturn(false).when(dataUsageSummary).hasActiveSubscription();
185         doReturn(mContext).when(dataUsageSummary).getContext();
186 
187         doReturn(true).when(dataUsageSummary).removePreference(anyString());
188         doNothing().when(dataUsageSummary).addWifiSection();
189         doNothing().when(dataUsageSummary).addMobileSection(1);
190 
191         dataUsageSummary.onCreate(null);
192 
193         verify(dataUsageSummary).addWifiSection();
194         verify(dataUsageSummary, never()).addMobileSection(anyInt());
195     }
196 
197     @Test
198     @Config(shadows = ShadowSubscriptionManager.class)
configuration_invalidDataSusbscription_shouldShowWifiSectionOnly()199     public void configuration_invalidDataSusbscription_shouldShowWifiSectionOnly() {
200         ShadowDataUsageUtils.IS_MOBILE_DATA_SUPPORTED = true;
201         ShadowDataUsageUtils.IS_WIFI_SUPPORTED = true;
202         ShadowDataUsageUtils.HAS_SIM = false;
203         ShadowSubscriptionManager.setDefaultDataSubscriptionId(
204                 SubscriptionManager.INVALID_SUBSCRIPTION_ID);
205 
206         final DataUsageSummary dataUsageSummary = spy(new DataUsageSummary());
207         doNothing().when(dataUsageSummary).enableProxySubscriptionManager(any());
208         doReturn(false).when(dataUsageSummary).hasActiveSubscription();
209         doReturn(mContext).when(dataUsageSummary).getContext();
210 
211         doReturn(true).when(dataUsageSummary).removePreference(anyString());
212         doNothing().when(dataUsageSummary).addWifiSection();
213         doNothing().when(dataUsageSummary).addMobileSection(1);
214 
215         dataUsageSummary.onCreate(null);
216 
217         verify(dataUsageSummary).addWifiSection();
218         verify(dataUsageSummary, never()).addMobileSection(anyInt());
219     }
220 
221     @Test
onCreate_isNotGuestUser_shouldNotFinish()222     public void onCreate_isNotGuestUser_shouldNotFinish() {
223         doReturn(false).when(mUserManager).isGuestUser();
224 
225         mDataUsageSummary.onCreate(null);
226 
227         verify(mDataUsageSummary, never()).finish();
228     }
229 
230     @Test
onCreate_isGuestUser_shouldFinish()231     public void onCreate_isGuestUser_shouldFinish() {
232         doReturn(true).when(mUserManager).isGuestUser();
233 
234         mDataUsageSummary.onCreate(null);
235 
236         verify(mDataUsageSummary).finish();
237     }
238 }
239