1 /*
2  * Copyright (C) 2021 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.wifi;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 
21 import static org.mockito.ArgumentMatchers.any;
22 import static org.mockito.ArgumentMatchers.anyLong;
23 import static org.mockito.Mockito.doReturn;
24 import static org.mockito.Mockito.mock;
25 import static org.mockito.Mockito.never;
26 import static org.mockito.Mockito.spy;
27 import static org.mockito.Mockito.verify;
28 import static org.mockito.Mockito.when;
29 
30 import android.content.Context;
31 import android.net.wifi.WifiManager;
32 import android.os.HandlerThread;
33 import android.os.PersistableBundle;
34 import android.telephony.CarrierConfigManager;
35 
36 import androidx.lifecycle.Lifecycle;
37 import androidx.test.core.app.ApplicationProvider;
38 import androidx.test.ext.junit.runners.AndroidJUnit4;
39 
40 import com.android.settings.testutils.FakeFeatureFactory;
41 import com.android.wifitrackerlib.MergedCarrierEntry;
42 import com.android.wifitrackerlib.WifiEntry;
43 import com.android.wifitrackerlib.WifiPickerTracker;
44 
45 import org.junit.Before;
46 import org.junit.Rule;
47 import org.junit.Test;
48 import org.junit.runner.RunWith;
49 import org.mockito.Mock;
50 import org.mockito.junit.MockitoJUnit;
51 import org.mockito.junit.MockitoRule;
52 
53 @RunWith(AndroidJUnit4.class)
54 public class WifiPickerTrackerHelperTest {
55 
56     private static final int SUB_ID = 2;
57 
58     @Rule
59     public final MockitoRule mMockitoRule = MockitoJUnit.rule();
60     @Mock
61     public WifiManager mWifiManager;
62     @Mock
63     public CarrierConfigManager mCarrierConfigManager;
64     @Mock
65     public WifiPickerTracker mWifiPickerTracker;
66     @Mock
67     public MergedCarrierEntry mMergedCarrierEntry;
68     @Mock
69     public WifiEntry.ConnectCallback mConnectCallback;
70 
71     private WifiPickerTrackerHelper mWifiPickerTrackerHelper;
72 
73     private FakeFeatureFactory mFeatureFactory;
74     private PersistableBundle mCarrierConfig;
75 
76     @Before
setUp()77     public void setUp() {
78         final Context context = spy(ApplicationProvider.getApplicationContext());
79         when(context.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
80         when(context.getSystemService(CarrierConfigManager.class))
81                 .thenReturn(mCarrierConfigManager);
82         mCarrierConfig = new PersistableBundle();
83         doReturn(mCarrierConfig).when(mCarrierConfigManager).getConfigForSubId(SUB_ID);
84 
85         mFeatureFactory = FakeFeatureFactory.setupForTest();
86         when(mFeatureFactory.wifiTrackerLibProvider
87                 .createWifiPickerTracker(
88                         any(), any(), any(), any(), any(), anyLong(), anyLong(), any()))
89                 .thenReturn(mWifiPickerTracker);
90         mWifiPickerTrackerHelper = new WifiPickerTrackerHelper(mock(Lifecycle.class),
91                 context, null);
92     }
93 
94     @Test
getWifiPickerTracker_returnNonNull()95     public void getWifiPickerTracker_returnNonNull() {
96         assertThat(mWifiPickerTrackerHelper.getWifiPickerTracker()).isNotNull();
97     }
98 
99     @Test
onDestroy_workerThreadQuit()100     public void onDestroy_workerThreadQuit() {
101         final HandlerThread workerThread = mock(HandlerThread.class);
102         mWifiPickerTrackerHelper.setWorkerThread(workerThread);
103 
104         mWifiPickerTrackerHelper.onDestroy();
105 
106         verify(workerThread).quit();
107     }
108 
109     @Test
isCarrierNetworkProvisionEnabled_getNullConfig_returnFalse()110     public void isCarrierNetworkProvisionEnabled_getNullConfig_returnFalse() {
111         doReturn(null).when(mCarrierConfigManager).getConfigForSubId(SUB_ID);
112 
113         assertThat(mWifiPickerTrackerHelper.isCarrierNetworkProvisionEnabled(SUB_ID)).isFalse();
114     }
115 
116     @Test
isCarrierNetworkProvisionEnabled_returnCorrect()117     public void isCarrierNetworkProvisionEnabled_returnCorrect() {
118         mCarrierConfig.putBoolean(
119                 CarrierConfigManager.KEY_CARRIER_PROVISIONS_WIFI_MERGED_NETWORKS_BOOL, true);
120 
121         assertThat(mWifiPickerTrackerHelper.isCarrierNetworkProvisionEnabled(SUB_ID)).isTrue();
122 
123         mCarrierConfig.putBoolean(
124                 CarrierConfigManager.KEY_CARRIER_PROVISIONS_WIFI_MERGED_NETWORKS_BOOL, false);
125 
126         assertThat(mWifiPickerTrackerHelper.isCarrierNetworkProvisionEnabled(SUB_ID)).isFalse();
127     }
128 
129     @Test
isCarrierNetworkEnabled_returnCorrect()130     public void isCarrierNetworkEnabled_returnCorrect() {
131         doReturn(true).when(mWifiManager).isCarrierNetworkOffloadEnabled(SUB_ID, true /* merged */);
132 
133         assertThat(mWifiPickerTrackerHelper.isCarrierNetworkEnabled(SUB_ID)).isTrue();
134 
135         doReturn(false).when(mWifiManager)
136                 .isCarrierNetworkOffloadEnabled(SUB_ID, true /* merged */);
137 
138         assertThat(mWifiPickerTrackerHelper.isCarrierNetworkEnabled(SUB_ID)).isFalse();
139     }
140 
141     @Test
setCarrierNetworkEnabled_shouldSetCorrect()142     public void setCarrierNetworkEnabled_shouldSetCorrect() {
143         mWifiPickerTrackerHelper.setWifiPickerTracker(mWifiPickerTracker);
144         when(mWifiPickerTracker.getMergedCarrierEntry()).thenReturn(mMergedCarrierEntry);
145 
146         mWifiPickerTrackerHelper.setCarrierNetworkEnabled(true);
147 
148         verify(mMergedCarrierEntry).setEnabled(true);
149 
150         mWifiPickerTrackerHelper.setCarrierNetworkEnabled(false);
151 
152         verify(mMergedCarrierEntry).setEnabled(false);
153     }
154 
155     @Test
setCarrierNetworkEnabled_mergedCarrierEntryIsNull_shouldNotSet()156     public void setCarrierNetworkEnabled_mergedCarrierEntryIsNull_shouldNotSet() {
157         mWifiPickerTrackerHelper.setWifiPickerTracker(mWifiPickerTracker);
158         when(mWifiPickerTracker.getMergedCarrierEntry()).thenReturn(null);
159 
160         mWifiPickerTrackerHelper.setCarrierNetworkEnabled(true);
161 
162         verify(mMergedCarrierEntry, never()).setEnabled(true);
163 
164         mWifiPickerTrackerHelper.setCarrierNetworkEnabled(false);
165 
166         verify(mMergedCarrierEntry, never()).setEnabled(true);
167     }
168 
169     @Test
connectCarrierNetwork_returnTrueAndConnect()170     public void connectCarrierNetwork_returnTrueAndConnect() {
171         mWifiPickerTrackerHelper.setWifiPickerTracker(mWifiPickerTracker);
172         when(mWifiPickerTracker.getMergedCarrierEntry()).thenReturn(mMergedCarrierEntry);
173         when(mMergedCarrierEntry.canConnect()).thenReturn(true);
174 
175         assertThat(mWifiPickerTrackerHelper.connectCarrierNetwork(mConnectCallback)).isTrue();
176         verify(mMergedCarrierEntry).connect(mConnectCallback);
177     }
178 
179     @Test
connectCarrierNetwork_mergedCarrierEntryIsNull_returnFalse()180     public void connectCarrierNetwork_mergedCarrierEntryIsNull_returnFalse() {
181         mWifiPickerTrackerHelper.setWifiPickerTracker(mWifiPickerTracker);
182         when(mWifiPickerTracker.getMergedCarrierEntry()).thenReturn(null);
183 
184         assertThat(mWifiPickerTrackerHelper.connectCarrierNetwork(mConnectCallback)).isFalse();
185     }
186 
187     @Test
connectCarrierNetwork_canConnectIsFalse_returnFalseAndNeverConnect()188     public void connectCarrierNetwork_canConnectIsFalse_returnFalseAndNeverConnect() {
189         mWifiPickerTrackerHelper.setWifiPickerTracker(mWifiPickerTracker);
190         when(mWifiPickerTracker.getMergedCarrierEntry()).thenReturn(mMergedCarrierEntry);
191         when(mMergedCarrierEntry.canConnect()).thenReturn(false);
192 
193         assertThat(mWifiPickerTrackerHelper.connectCarrierNetwork(mConnectCallback)).isFalse();
194         verify(mMergedCarrierEntry, never()).connect(mConnectCallback);
195     }
196 }
197