1 package com.android.systemui.qs.tiles.dialog;
2 
3 import static com.android.systemui.qs.tiles.dialog.InternetDialogController.MAX_WIFI_ENTRY_COUNT;
4 
5 import static com.google.common.truth.Truth.assertThat;
6 
7 import static org.mockito.ArgumentMatchers.any;
8 import static org.mockito.Mockito.anyString;
9 import static org.mockito.Mockito.doNothing;
10 import static org.mockito.Mockito.mock;
11 import static org.mockito.Mockito.verify;
12 import static org.mockito.Mockito.when;
13 
14 import android.content.Context;
15 import android.graphics.drawable.Drawable;
16 import android.testing.TestableResources;
17 import android.view.View;
18 import android.widget.LinearLayout;
19 
20 import androidx.test.ext.junit.runners.AndroidJUnit4;
21 import androidx.test.filters.SmallTest;
22 
23 import com.android.systemui.SysuiTestCase;
24 import com.android.systemui.res.R;
25 import com.android.wifitrackerlib.WifiEntry;
26 
27 import kotlinx.coroutines.CoroutineScope;
28 
29 import org.junit.Before;
30 import org.junit.Rule;
31 import org.junit.Test;
32 import org.junit.runner.RunWith;
33 import org.mockito.Mock;
34 import org.mockito.Spy;
35 import org.mockito.junit.MockitoJUnit;
36 import org.mockito.junit.MockitoRule;
37 
38 import java.util.Arrays;
39 import java.util.List;
40 
41 @SmallTest
42 @RunWith(AndroidJUnit4.class)
43 public class InternetAdapterTest extends SysuiTestCase {
44 
45     private static final String WIFI_KEY = "Wi-Fi_Key";
46     private static final String WIFI_TITLE = "Wi-Fi Title";
47     private static final String WIFI_SUMMARY = "Wi-Fi Summary";
48     private static final int GEAR_ICON_RES_ID = R.drawable.ic_settings_24dp;
49     private static final int LOCK_ICON_RES_ID = R.drawable.ic_friction_lock_closed;
50 
51     @Rule
52     public MockitoRule mRule = MockitoJUnit.rule();
53     @Spy
54     private Context mSpyContext = mContext;
55     @Mock
56     CoroutineScope mScope;
57 
58     @Mock
59     private WifiEntry mInternetWifiEntry;
60     @Mock
61     private List<WifiEntry> mWifiEntries;
62     @Mock
63     private WifiEntry mWifiEntry;
64     @Mock
65     private InternetDialogController mInternetDialogController;
66     @Mock
67     private Drawable mWifiDrawable;
68     @Mock
69     private Drawable mGearIcon;
70     @Mock
71     private Drawable mLockIcon;
72 
73     private TestableResources mTestableResources;
74     private InternetAdapter mInternetAdapter;
75     private InternetAdapter.InternetViewHolder mViewHolder;
76 
77     @Before
setUp()78     public void setUp() {
79         mTestableResources = mContext.getOrCreateTestableResources();
80         when(mInternetWifiEntry.getTitle()).thenReturn(WIFI_TITLE);
81         when(mInternetWifiEntry.getSummary(false)).thenReturn(WIFI_SUMMARY);
82         when(mInternetWifiEntry.isDefaultNetwork()).thenReturn(true);
83         when(mInternetWifiEntry.hasInternetAccess()).thenReturn(true);
84         when(mWifiEntry.getKey()).thenReturn(WIFI_KEY);
85         when(mWifiEntry.getTitle()).thenReturn(WIFI_TITLE);
86         when(mWifiEntry.getSummary(false)).thenReturn(WIFI_SUMMARY);
87 
88         mInternetAdapter = new InternetAdapter(mInternetDialogController, mScope);
89         mViewHolder = mInternetAdapter.onCreateViewHolder(new LinearLayout(mContext), 0);
90         mInternetAdapter.setWifiEntries(Arrays.asList(mWifiEntry), 1 /* wifiEntriesCount */);
91     }
92 
93     @Test
getItemCount_returnWifiEntriesCount()94     public void getItemCount_returnWifiEntriesCount() {
95         for (int i = 0; i < MAX_WIFI_ENTRY_COUNT; i++) {
96             mInternetAdapter.setWifiEntries(mWifiEntries, i /* wifiEntriesCount */);
97 
98             assertThat(mInternetAdapter.getItemCount()).isEqualTo(i);
99         }
100     }
101 
102     @Test
onBindViewHolder_bindWithOpenWifiNetwork_verifyView()103     public void onBindViewHolder_bindWithOpenWifiNetwork_verifyView() {
104         when(mWifiEntry.getSecurity()).thenReturn(WifiEntry.SECURITY_NONE);
105         mInternetAdapter.onBindViewHolder(mViewHolder, 0);
106 
107         assertThat(mViewHolder.mWifiTitleText.getVisibility()).isEqualTo(View.VISIBLE);
108         assertThat(mViewHolder.mWifiSummaryText.getVisibility()).isEqualTo(View.VISIBLE);
109         assertThat(mViewHolder.mWifiIcon.getVisibility()).isEqualTo(View.VISIBLE);
110         assertThat(mViewHolder.mWifiEndIcon.getVisibility()).isEqualTo(View.GONE);
111     }
112 
113     @Test
onBindViewHolder_bindWithSecurityWifiNetwork_verifyView()114     public void onBindViewHolder_bindWithSecurityWifiNetwork_verifyView() {
115         when(mWifiEntry.getSecurity()).thenReturn(WifiEntry.SECURITY_PSK);
116         mInternetAdapter.onBindViewHolder(mViewHolder, 0);
117 
118         assertThat(mViewHolder.mWifiTitleText.getVisibility()).isEqualTo(View.VISIBLE);
119         assertThat(mViewHolder.mWifiSummaryText.getVisibility()).isEqualTo(View.VISIBLE);
120         assertThat(mViewHolder.mWifiIcon.getVisibility()).isEqualTo(View.VISIBLE);
121         assertThat(mViewHolder.mWifiEndIcon.getVisibility()).isEqualTo(View.VISIBLE);
122     }
123 
124     @Test
onBindViewHolder_getWifiDrawableNull_noCrash()125     public void onBindViewHolder_getWifiDrawableNull_noCrash() {
126         when(mInternetDialogController.getWifiDrawable(any())).thenReturn(null);
127 
128         mInternetAdapter.onBindViewHolder(mViewHolder, 0);
129 
130         assertThat(mViewHolder.mWifiIcon.getDrawable()).isNull();
131     }
132 
133     @Test
onBindViewHolder_getWifiDrawableNotNull_setWifiIconDrawable()134     public void onBindViewHolder_getWifiDrawableNotNull_setWifiIconDrawable() {
135         when(mInternetDialogController.getWifiDrawable(any())).thenReturn(mWifiDrawable);
136 
137         mInternetAdapter.onBindViewHolder(mViewHolder, 0);
138 
139         assertThat(mViewHolder.mWifiIcon.getDrawable()).isEqualTo(mWifiDrawable);
140     }
141 
142     @Test
setWifiEntries_wifiCountLessThenMaxCount_setWifiCount()143     public void setWifiEntries_wifiCountLessThenMaxCount_setWifiCount() {
144         final int wifiCount = MAX_WIFI_ENTRY_COUNT - 1;
145         mInternetAdapter.mMaxEntriesCount = MAX_WIFI_ENTRY_COUNT;
146 
147         mInternetAdapter.setWifiEntries(mWifiEntries, wifiCount);
148 
149         assertThat(mInternetAdapter.mWifiEntriesCount).isEqualTo(wifiCount);
150     }
151 
152     @Test
setWifiEntries_wifiCountGreaterThenMaxCount_setMaxCount()153     public void setWifiEntries_wifiCountGreaterThenMaxCount_setMaxCount() {
154         final int wifiCount = MAX_WIFI_ENTRY_COUNT;
155         mInternetAdapter.mMaxEntriesCount = MAX_WIFI_ENTRY_COUNT - 1;
156 
157         mInternetAdapter.setWifiEntries(mWifiEntries, wifiCount);
158 
159         assertThat(mInternetAdapter.mWifiEntriesCount).isEqualTo(mInternetAdapter.mMaxEntriesCount);
160     }
161 
162     @Test
setMaxEntriesCount_maxCountLessThenZero_doNothing()163     public void setMaxEntriesCount_maxCountLessThenZero_doNothing() {
164         mInternetAdapter.mMaxEntriesCount = MAX_WIFI_ENTRY_COUNT;
165         final int maxCount = -1;
166 
167         mInternetAdapter.setMaxEntriesCount(maxCount);
168 
169         assertThat(mInternetAdapter.mMaxEntriesCount).isEqualTo(MAX_WIFI_ENTRY_COUNT);
170     }
171 
172     @Test
setMaxEntriesCount_maxCountGreaterThenWifiCount_updateMaxCount()173     public void setMaxEntriesCount_maxCountGreaterThenWifiCount_updateMaxCount() {
174         mInternetAdapter.mWifiEntriesCount = MAX_WIFI_ENTRY_COUNT - 2;
175         mInternetAdapter.mMaxEntriesCount = MAX_WIFI_ENTRY_COUNT;
176         final int maxCount = MAX_WIFI_ENTRY_COUNT - 1;
177 
178         mInternetAdapter.setMaxEntriesCount(maxCount);
179 
180         assertThat(mInternetAdapter.mWifiEntriesCount).isEqualTo(MAX_WIFI_ENTRY_COUNT - 2);
181         assertThat(mInternetAdapter.mMaxEntriesCount).isEqualTo(maxCount);
182     }
183 
184     @Test
setMaxEntriesCount_maxCountLessThenWifiCount_updateBothCount()185     public void setMaxEntriesCount_maxCountLessThenWifiCount_updateBothCount() {
186         mInternetAdapter.mWifiEntriesCount = MAX_WIFI_ENTRY_COUNT;
187         mInternetAdapter.mMaxEntriesCount = MAX_WIFI_ENTRY_COUNT;
188         final int maxCount = MAX_WIFI_ENTRY_COUNT - 1;
189 
190         mInternetAdapter.setMaxEntriesCount(maxCount);
191 
192         assertThat(mInternetAdapter.mWifiEntriesCount).isEqualTo(maxCount);
193         assertThat(mInternetAdapter.mMaxEntriesCount).isEqualTo(maxCount);
194     }
195 
196     @Test
viewHolderShouldEnabled_wifiCanConnect_returnTrue()197     public void viewHolderShouldEnabled_wifiCanConnect_returnTrue() {
198         when(mWifiEntry.canConnect()).thenReturn(true);
199 
200         assertThat(mViewHolder.shouldEnabled(mWifiEntry)).isTrue();
201     }
202 
203     @Test
viewHolderShouldEnabled_wifiCanNotConnect_returnFalse()204     public void viewHolderShouldEnabled_wifiCanNotConnect_returnFalse() {
205         when(mWifiEntry.canConnect()).thenReturn(false);
206 
207         assertThat(mViewHolder.shouldEnabled(mWifiEntry)).isFalse();
208     }
209 
210     @Test
viewHolderShouldEnabled_wifiCanNotConnectButCanDisconnect_returnTrue()211     public void viewHolderShouldEnabled_wifiCanNotConnectButCanDisconnect_returnTrue() {
212         when(mWifiEntry.canConnect()).thenReturn(false);
213         when(mWifiEntry.canConnect()).thenReturn(true);
214 
215         assertThat(mViewHolder.shouldEnabled(mWifiEntry)).isTrue();
216     }
217 
218     @Test
viewHolderShouldEnabled_wifiCanNotConnectButIsSaved_returnTrue()219     public void viewHolderShouldEnabled_wifiCanNotConnectButIsSaved_returnTrue() {
220         when(mWifiEntry.canConnect()).thenReturn(false);
221         when(mWifiEntry.isSaved()).thenReturn(true);
222 
223         assertThat(mViewHolder.shouldEnabled(mWifiEntry)).isTrue();
224     }
225 
226     @Test
viewHolderOnWifiClick_wifiShouldEditBeforeConnect_startActivity()227     public void viewHolderOnWifiClick_wifiShouldEditBeforeConnect_startActivity() {
228         when(mWifiEntry.shouldEditBeforeConnect()).thenReturn(true);
229         mViewHolder = mInternetAdapter.onCreateViewHolder(new LinearLayout(mSpyContext), 0);
230         doNothing().when(mSpyContext).startActivity(any());
231 
232         mViewHolder.onWifiClick(mWifiEntry, mock(View.class));
233 
234         verify(mSpyContext).startActivity(any());
235     }
236 
237     @Test
viewHolderOnWifiClick_wifiCanConnect_connectWifi()238     public void viewHolderOnWifiClick_wifiCanConnect_connectWifi() {
239         when(mWifiEntry.canConnect()).thenReturn(true);
240 
241         mViewHolder.onWifiClick(mWifiEntry, mock(View.class));
242 
243         verify(mInternetDialogController).connect(mWifiEntry);
244     }
245 
246     @Test
viewHolderOnWifiClick_wifiCanNotConnectButIsSaved_launchWifiDetailsSetting()247     public void viewHolderOnWifiClick_wifiCanNotConnectButIsSaved_launchWifiDetailsSetting() {
248         when(mWifiEntry.canConnect()).thenReturn(false);
249         when(mWifiEntry.isSaved()).thenReturn(true);
250 
251         mViewHolder.onWifiClick(mWifiEntry, mock(View.class));
252 
253         verify(mInternetDialogController).launchWifiDetailsSetting(anyString(), any());
254     }
255 
256     @Test
viewHolderUpdateEndIcon_wifiConnected_updateGearIcon()257     public void viewHolderUpdateEndIcon_wifiConnected_updateGearIcon() {
258         mTestableResources.addOverride(GEAR_ICON_RES_ID, mGearIcon);
259 
260         mViewHolder.updateEndIcon(WifiEntry.CONNECTED_STATE_CONNECTED, WifiEntry.SECURITY_PSK);
261 
262         assertThat(mViewHolder.mWifiEndIcon.getDrawable()).isEqualTo(mGearIcon);
263     }
264 
265     @Test
viewHolderUpdateEndIcon_wifiDisconnectedAndSecurityPsk_updateLockIcon()266     public void viewHolderUpdateEndIcon_wifiDisconnectedAndSecurityPsk_updateLockIcon() {
267         mTestableResources.addOverride(LOCK_ICON_RES_ID, mLockIcon);
268 
269         mViewHolder.updateEndIcon(WifiEntry.CONNECTED_STATE_DISCONNECTED, WifiEntry.SECURITY_PSK);
270 
271         assertThat(mViewHolder.mWifiEndIcon.getDrawable()).isEqualTo(mLockIcon);
272     }
273 
274     @Test
viewHolderUpdateEndIcon_wifiDisconnectedAndSecurityNone_hideIcon()275     public void viewHolderUpdateEndIcon_wifiDisconnectedAndSecurityNone_hideIcon() {
276         mViewHolder.updateEndIcon(WifiEntry.CONNECTED_STATE_DISCONNECTED, WifiEntry.SECURITY_NONE);
277 
278         assertThat(mViewHolder.mWifiEndIcon.getVisibility()).isEqualTo(View.GONE);
279     }
280 }
281