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