1 /*
2  * Copyright (C) 2020 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.development;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 
21 import static org.mockito.Mockito.spy;
22 import static org.mockito.Mockito.verify;
23 
24 import android.content.Context;
25 import android.database.ContentObserver;
26 import android.provider.Settings.Global;
27 
28 import androidx.lifecycle.LifecycleOwner;
29 
30 import com.android.settings.testutils.shadow.ShadowUtils;
31 import com.android.settings.testutils.shadow.ShadowWirelessDebuggingPreferenceController;
32 import com.android.settings.widget.SwitchWidgetController;
33 import com.android.settingslib.core.lifecycle.Lifecycle;
34 
35 import org.junit.After;
36 import org.junit.Before;
37 import org.junit.Test;
38 import org.junit.runner.RunWith;
39 import org.mockito.Mock;
40 import org.mockito.MockitoAnnotations;
41 import org.robolectric.RobolectricTestRunner;
42 import org.robolectric.RuntimeEnvironment;
43 import org.robolectric.annotation.Config;
44 import org.robolectric.util.ReflectionHelpers;
45 
46 @RunWith(RobolectricTestRunner.class)
47 @Config(shadows = {ShadowUtils.class, ShadowWirelessDebuggingPreferenceController.class})
48 public class WirelessDebuggingEnablerTest {
49 
50     @Mock
51     private SwitchWidgetController mSwitchWidgetController;
52     @Mock
53     private WirelessDebuggingEnabler.OnEnabledListener mListener;
54 
55     private WirelessDebuggingEnabler mWirelessDebuggingEnabler;
56     private Context mContext;
57     private Lifecycle mLifecycle;
58 
59     @Before
setUp()60     public void setUp() {
61         MockitoAnnotations.initMocks(this);
62         mContext = RuntimeEnvironment.application;
63         LifecycleOwner mLifecycleOwner = () -> mLifecycle;
64         mLifecycle = new Lifecycle(mLifecycleOwner);
65         mWirelessDebuggingEnabler = spy(new WirelessDebuggingEnabler(
66                 mContext, mSwitchWidgetController, mListener, mLifecycle));
67     }
68 
69     @After
tearDown()70     public void tearDown() {
71         ShadowWirelessDebuggingPreferenceController.reset();
72     }
73 
74     @Test
onCreation_shouldShowSwitchBar()75     public void onCreation_shouldShowSwitchBar() {
76         verify(mSwitchWidgetController).setupView();
77     }
78 
79     @Test
teardownSwitchController_shouldHideSwitchBar()80     public void teardownSwitchController_shouldHideSwitchBar() {
81         mWirelessDebuggingEnabler.teardownSwitchController();
82 
83         verify(mSwitchWidgetController).teardownView();
84     }
85 
86     @Test
adbWifiEnabled_switchBarShouldBeChecked()87     public void adbWifiEnabled_switchBarShouldBeChecked() {
88         // Set to disabled first otherwise we won't get the onChange() event
89         Global.putInt(mContext.getContentResolver(),
90                 Global.ADB_WIFI_ENABLED, 0 /* setting disabled */);
91         mWirelessDebuggingEnabler.onResume();
92 
93         verify(mSwitchWidgetController).setChecked(false);
94         verify(mListener).onEnabled(false);
95 
96         Global.putInt(mContext.getContentResolver(),
97                 Global.ADB_WIFI_ENABLED, 1 /* setting enabled */);
98         final ContentObserver observer =
99                 ReflectionHelpers.getField(mWirelessDebuggingEnabler, "mSettingsObserver");
100         observer.onChange(true, Global.getUriFor(Global.ADB_WIFI_ENABLED));
101 
102         verify(mSwitchWidgetController).setChecked(true);
103         // Should also get a callback
104         verify(mListener).onEnabled(true);
105     }
106 
107     @Test
adbWifiEnabled_switchBarShouldNotBeChecked()108     public void adbWifiEnabled_switchBarShouldNotBeChecked() {
109         Global.putInt(mContext.getContentResolver(),
110                 Global.ADB_WIFI_ENABLED, 1 /* setting enabled */);
111         mWirelessDebuggingEnabler.onResume();
112 
113         verify(mSwitchWidgetController).setChecked(true);
114         verify(mListener).onEnabled(true);
115 
116         Global.putInt(mContext.getContentResolver(),
117                 Global.ADB_WIFI_ENABLED, 0 /* setting disabled */);
118         final ContentObserver observer =
119                 ReflectionHelpers.getField(mWirelessDebuggingEnabler, "mSettingsObserver");
120         observer.onChange(true, Global.getUriFor(Global.ADB_WIFI_ENABLED));
121 
122         verify(mSwitchWidgetController).setChecked(false);
123         // Should also get a callback
124         verify(mListener).onEnabled(false);
125     }
126 
127     @Test
onSwitchToggled_true_wifiConnected_shouldSetAdbWifiEnabledTrue()128     public void onSwitchToggled_true_wifiConnected_shouldSetAdbWifiEnabledTrue() {
129         ShadowWirelessDebuggingPreferenceController.setIsWifiConnected(true);
130         Global.putInt(mContext.getContentResolver(),
131                 Global.ADB_WIFI_ENABLED, 0 /* setting disabled */);
132         mWirelessDebuggingEnabler.onResume();
133 
134         verify(mSwitchWidgetController).setChecked(false);
135         verify(mListener).onEnabled(false);
136 
137         mWirelessDebuggingEnabler.onSwitchToggled(true);
138 
139         assertThat(Global.getInt(mContext.getContentResolver(),
140                 Global.ADB_WIFI_ENABLED, -1)).isEqualTo(1);
141     }
142 
143     @Test
onSwitchToggled_true_wifiNotConnected_shouldSetAdbWifiEnabledFalse()144     public void onSwitchToggled_true_wifiNotConnected_shouldSetAdbWifiEnabledFalse() {
145         ShadowWirelessDebuggingPreferenceController.setIsWifiConnected(false);
146         Global.putInt(mContext.getContentResolver(),
147                 Global.ADB_WIFI_ENABLED, 0 /* setting disabled */);
148         mWirelessDebuggingEnabler.onResume();
149 
150         verify(mSwitchWidgetController).setChecked(false);
151         verify(mListener).onEnabled(false);
152 
153         mWirelessDebuggingEnabler.onSwitchToggled(true);
154 
155         assertThat(Global.getInt(mContext.getContentResolver(),
156                 Global.ADB_WIFI_ENABLED, -1)).isEqualTo(0);
157     }
158 
159     @Test
onSwitchToggled_false_wifiConnected_shouldSetAdbWifiEnabledFalse()160     public void onSwitchToggled_false_wifiConnected_shouldSetAdbWifiEnabledFalse() {
161         ShadowWirelessDebuggingPreferenceController.setIsWifiConnected(true);
162         Global.putInt(mContext.getContentResolver(),
163                 Global.ADB_WIFI_ENABLED, 1 /* setting disabled */);
164         mWirelessDebuggingEnabler.onResume();
165 
166         verify(mSwitchWidgetController).setChecked(true);
167         verify(mListener).onEnabled(true);
168 
169         mWirelessDebuggingEnabler.onSwitchToggled(false);
170 
171         assertThat(Global.getInt(mContext.getContentResolver(),
172                 Global.ADB_WIFI_ENABLED, -1)).isEqualTo(0);
173     }
174 
175     @Test
onSwitchToggled_false_wifiNotConnected_shouldSetAdbWifiEnabledFalse()176     public void onSwitchToggled_false_wifiNotConnected_shouldSetAdbWifiEnabledFalse() {
177         ShadowWirelessDebuggingPreferenceController.setIsWifiConnected(false);
178         Global.putInt(mContext.getContentResolver(),
179                 Global.ADB_WIFI_ENABLED, 1 /* setting disabled */);
180         mWirelessDebuggingEnabler.onResume();
181 
182         verify(mSwitchWidgetController).setChecked(true);
183         verify(mListener).onEnabled(true);
184 
185         mWirelessDebuggingEnabler.onSwitchToggled(false);
186 
187         assertThat(Global.getInt(mContext.getContentResolver(),
188                 Global.ADB_WIFI_ENABLED, -1)).isEqualTo(0);
189     }
190 }
191