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