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.net.NetworkPolicyManager;
33 import android.telephony.SubscriptionManager;
34 import android.telephony.TelephonyManager;
35 
36 import androidx.fragment.app.FragmentActivity;
37 
38 import com.android.settings.testutils.shadow.ShadowDashboardFragment;
39 import com.android.settings.testutils.shadow.ShadowDataUsageUtils;
40 import com.android.settings.testutils.shadow.ShadowUserManager;
41 import com.android.settings.testutils.shadow.ShadowUtils;
42 
43 import org.junit.Before;
44 import org.junit.Ignore;
45 import org.junit.Test;
46 import org.junit.runner.RunWith;
47 import org.mockito.Mock;
48 import org.mockito.MockitoAnnotations;
49 import org.robolectric.Robolectric;
50 import org.robolectric.RobolectricTestRunner;
51 import org.robolectric.RuntimeEnvironment;
52 import org.robolectric.Shadows;
53 import org.robolectric.annotation.Config;
54 import org.robolectric.shadows.ShadowApplication;
55 import org.robolectric.shadows.ShadowSubscriptionManager;
56 import org.robolectric.shadows.ShadowTelephonyManager;
57 
58 @Config(shadows = {
59         ShadowUtils.class,
60         ShadowDataUsageUtils.class,
61         ShadowDashboardFragment.class,
62         ShadowUserManager.class,
63 })
64 @RunWith(RobolectricTestRunner.class)
65 public class DataUsageSummaryTest {
66 
67     @Mock
68     private NetworkPolicyManager mNetworkPolicyManager;
69     @Mock
70     private NetworkStatsManager mNetworkStatsManager;
71     private TelephonyManager mTelephonyManager;
72     private Context mContext;
73     private FragmentActivity mActivity;
74 
75     /**
76      * This set up is contrived to get a passing test so that the build doesn't block without tests.
77      * These tests should be updated as code gets refactored to improve testability.
78      */
79 
80     @Before
setUp()81     public void setUp() {
82         MockitoAnnotations.initMocks(this);
83         ShadowApplication shadowContext = ShadowApplication.getInstance();
84         ShadowUserManager.getShadow().setIsAdminUser(true);
85         shadowContext.setSystemService(Context.NETWORK_POLICY_SERVICE, mNetworkPolicyManager);
86 
87         mContext = RuntimeEnvironment.application;
88         mTelephonyManager = mContext.getSystemService(TelephonyManager.class);
89         final ShadowTelephonyManager shadowTelephonyManager = Shadows.shadowOf(mTelephonyManager);
90         shadowTelephonyManager.setTelephonyManagerForSubscriptionId(
91                 SubscriptionManager.INVALID_SUBSCRIPTION_ID, mTelephonyManager);
92         shadowTelephonyManager.setTelephonyManagerForSubscriptionId(1, mTelephonyManager);
93         mActivity = spy(Robolectric.buildActivity(FragmentActivity.class).get());
94         doReturn(mNetworkStatsManager).when(mActivity).getSystemService(NetworkStatsManager.class);
95     }
96 
97     @Test
formatUsage_shouldLookLikeFormatFileSize()98     public void formatUsage_shouldLookLikeFormatFileSize() {
99         final long usage = 2147483648L; // 2GB
100         final String formattedUsage =
101                 DataUsageSummary.formatUsage(mContext, "^1", usage).toString();
102         final CharSequence formattedInIECUnit = DataUsageUtils.formatDataUsage(mContext, usage);
103         assertThat(formattedUsage).isEqualTo(formattedInIECUnit);
104     }
105 
106     @Test
107     @Config(shadows = ShadowSubscriptionManager.class)
108     @Ignore
configuration_withSim_shouldShowMobileAndWifi()109     public void configuration_withSim_shouldShowMobileAndWifi() {
110         ShadowDataUsageUtils.IS_MOBILE_DATA_SUPPORTED = true;
111         ShadowDataUsageUtils.IS_WIFI_SUPPORTED = true;
112         ShadowSubscriptionManager.setDefaultDataSubscriptionId(1);
113         ShadowDataUsageUtils.HAS_SIM = true;
114 
115         final DataUsageSummary dataUsageSummary = spy(new DataUsageSummary());
116         doNothing().when(dataUsageSummary).enableProxySubscriptionManager(any());
117         doReturn(true).when(dataUsageSummary).hasActiveSubscription();
118         doReturn(mContext).when(dataUsageSummary).getContext();
119 
120         doReturn(true).when(dataUsageSummary).removePreference(anyString());
121         doNothing().when(dataUsageSummary).addWifiSection();
122         doNothing().when(dataUsageSummary).addMobileSection(1);
123 
124         dataUsageSummary.onCreate(null);
125 
126         verify(dataUsageSummary).addWifiSection();
127         verify(dataUsageSummary).addMobileSection(anyInt());
128     }
129 
130     @Test
configuration_withoutSim_shouldShowWifiSectionOnly()131     public void configuration_withoutSim_shouldShowWifiSectionOnly() {
132         ShadowDataUsageUtils.IS_MOBILE_DATA_SUPPORTED = true;
133         ShadowDataUsageUtils.IS_WIFI_SUPPORTED = true;
134         ShadowDataUsageUtils.HAS_SIM = false;
135 
136         final DataUsageSummary dataUsageSummary = spy(new DataUsageSummary());
137         doNothing().when(dataUsageSummary).enableProxySubscriptionManager(any());
138         doReturn(false).when(dataUsageSummary).hasActiveSubscription();
139         doReturn(mContext).when(dataUsageSummary).getContext();
140 
141         doReturn(true).when(dataUsageSummary).removePreference(anyString());
142         doNothing().when(dataUsageSummary).addWifiSection();
143         doNothing().when(dataUsageSummary).addMobileSection(1);
144 
145         dataUsageSummary.onCreate(null);
146 
147         verify(dataUsageSummary).addWifiSection();
148         verify(dataUsageSummary, never()).addMobileSection(anyInt());
149     }
150 
151     @Test
configuration_withoutMobile_shouldShowWifiSectionOnly()152     public void configuration_withoutMobile_shouldShowWifiSectionOnly() {
153         ShadowDataUsageUtils.IS_MOBILE_DATA_SUPPORTED = false;
154         ShadowDataUsageUtils.IS_WIFI_SUPPORTED = true;
155         ShadowDataUsageUtils.HAS_SIM = false;
156 
157         final DataUsageSummary dataUsageSummary = spy(new DataUsageSummary());
158         doNothing().when(dataUsageSummary).enableProxySubscriptionManager(any());
159         doReturn(false).when(dataUsageSummary).hasActiveSubscription();
160         doReturn(mContext).when(dataUsageSummary).getContext();
161 
162         doReturn(true).when(dataUsageSummary).removePreference(anyString());
163         doNothing().when(dataUsageSummary).addWifiSection();
164         doNothing().when(dataUsageSummary).addMobileSection(1);
165 
166         dataUsageSummary.onCreate(null);
167 
168         verify(dataUsageSummary).addWifiSection();
169         verify(dataUsageSummary, never()).addMobileSection(anyInt());
170     }
171 
172     @Test
173     @Config(shadows = ShadowSubscriptionManager.class)
configuration_invalidDataSusbscription_shouldShowWifiSectionOnly()174     public void configuration_invalidDataSusbscription_shouldShowWifiSectionOnly() {
175         ShadowDataUsageUtils.IS_MOBILE_DATA_SUPPORTED = true;
176         ShadowDataUsageUtils.IS_WIFI_SUPPORTED = true;
177         ShadowDataUsageUtils.HAS_SIM = false;
178         ShadowSubscriptionManager.setDefaultDataSubscriptionId(
179                 SubscriptionManager.INVALID_SUBSCRIPTION_ID);
180 
181         final DataUsageSummary dataUsageSummary = spy(new DataUsageSummary());
182         doNothing().when(dataUsageSummary).enableProxySubscriptionManager(any());
183         doReturn(false).when(dataUsageSummary).hasActiveSubscription();
184         doReturn(mContext).when(dataUsageSummary).getContext();
185 
186         doReturn(true).when(dataUsageSummary).removePreference(anyString());
187         doNothing().when(dataUsageSummary).addWifiSection();
188         doNothing().when(dataUsageSummary).addMobileSection(1);
189 
190         dataUsageSummary.onCreate(null);
191 
192         verify(dataUsageSummary).addWifiSection();
193         verify(dataUsageSummary, never()).addMobileSection(anyInt());
194     }
195 }
196