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