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