From 732cdb42b2a9e263ccdb88a324cd373b2c8bcdfc Mon Sep 17 00:00:00 2001 From: Weng Su Date: Fri, 11 Dec 2020 13:46:59 +0000 Subject: [PATCH] [Provider Model] Refactor AirplaneSafeNetworksSliceTest - The AirplaneSafeNetworksSliceTest should restore Airplane Mode state after tear down - Create AirplaneModeRule to backup/restore Airplane Mode state automaticlly - Plan to reuse the AirplaneModeRule for other test case Bug: 173413889 Test: atest -c AirplaneSafeNetworksSliceTest Change-Id: Id142cf6302a188e6d82b44fcf29a395dc21f6013 --- .../AirplaneSafeNetworksSliceTest.java | 19 +++-- .../settings/testutils/AirplaneModeRule.java | 76 +++++++++++++++++++ 2 files changed, 85 insertions(+), 10 deletions(-) create mode 100644 tests/unit/src/com/android/settings/testutils/AirplaneModeRule.java diff --git a/tests/unit/src/com/android/settings/network/AirplaneSafeNetworksSliceTest.java b/tests/unit/src/com/android/settings/network/AirplaneSafeNetworksSliceTest.java index ce47eb7d6dd..c479c2520c0 100644 --- a/tests/unit/src/com/android/settings/network/AirplaneSafeNetworksSliceTest.java +++ b/tests/unit/src/com/android/settings/network/AirplaneSafeNetworksSliceTest.java @@ -34,7 +34,7 @@ import androidx.slice.widget.SliceLiveData; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; -import com.android.settings.AirplaneModeEnabler; +import com.android.settings.testutils.AirplaneModeRule; import org.junit.Before; import org.junit.Rule; @@ -52,19 +52,18 @@ public class AirplaneSafeNetworksSliceTest { @Rule public MockitoRule mMocks = MockitoJUnit.rule(); + @Rule + public AirplaneModeRule mAirplaneModeRule = new AirplaneModeRule(); @Mock private WifiManager mWifiManager; private Context mContext; - private AirplaneModeEnabler mAirplaneModeEnabler; private AirplaneSafeNetworksSlice mAirplaneSafeNetworksSlice; @Before public void setUp() { mContext = spy(ApplicationProvider.getApplicationContext()); when(mContext.getSystemService(Context.WIFI_SERVICE)).thenReturn(mWifiManager); - mAirplaneModeEnabler = - new AirplaneModeEnabler(mContext, null /* OnAirplaneModeChangedListener */); // Set-up specs for SliceMetadata. SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS); @@ -74,14 +73,14 @@ public class AirplaneSafeNetworksSliceTest { @Test public void getSlice_airplaneModeOff_shouldBeNull() { - mAirplaneModeEnabler.setAirplaneMode(false); + mAirplaneModeRule.setAirplaneMode(false); assertThat(mAirplaneSafeNetworksSlice.getSlice()).isNull(); } @Test public void getSlice_wifiDisabled_shouldShowViewAirplaneSafeNetworks() { - mAirplaneModeEnabler.setAirplaneMode(true); + mAirplaneModeRule.setAirplaneMode(true); when(mWifiManager.isWifiEnabled()).thenReturn(false); final Slice slice = mAirplaneSafeNetworksSlice.getSlice(); @@ -94,7 +93,7 @@ public class AirplaneSafeNetworksSliceTest { @Test public void getSlice_wifiEnabled_shouldShowTurnOffAirplaneMode() { - mAirplaneModeEnabler.setAirplaneMode(true); + mAirplaneModeRule.setAirplaneMode(true); when(mWifiManager.isWifiEnabled()).thenReturn(true); final Slice slice = mAirplaneSafeNetworksSlice.getSlice(); @@ -107,7 +106,7 @@ public class AirplaneSafeNetworksSliceTest { @Test public void onNotifyChange_viewAirplaneSafeNetworks_shouldSetWifiEnabled() { - mAirplaneModeEnabler.setAirplaneMode(true); + mAirplaneModeRule.setAirplaneMode(true); when(mWifiManager.isWifiEnabled()).thenReturn(false); Intent intent = mAirplaneSafeNetworksSlice.getIntent(); @@ -118,12 +117,12 @@ public class AirplaneSafeNetworksSliceTest { @Test public void onNotifyChange_turnOffAirplaneMode_shouldSetAirplaneModeOff() { - mAirplaneModeEnabler.setAirplaneMode(true); + mAirplaneModeRule.setAirplaneMode(true); when(mWifiManager.isWifiEnabled()).thenReturn(true); Intent intent = mAirplaneSafeNetworksSlice.getIntent(); mAirplaneSafeNetworksSlice.onNotifyChange(intent); - assertThat(mAirplaneModeEnabler.isAirplaneModeOn()).isFalse(); + assertThat(mAirplaneModeRule.isAirplaneModeOn()).isFalse(); } } diff --git a/tests/unit/src/com/android/settings/testutils/AirplaneModeRule.java b/tests/unit/src/com/android/settings/testutils/AirplaneModeRule.java new file mode 100644 index 00000000000..545f6ad89b8 --- /dev/null +++ b/tests/unit/src/com/android/settings/testutils/AirplaneModeRule.java @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.testutils; + +import android.content.Context; +import android.content.Intent; +import android.os.UserHandle; +import android.provider.Settings; +import android.util.Log; + +import androidx.test.core.app.ApplicationProvider; + +import org.junit.rules.ExternalResource; + +/** A test rule that is used to manager the Airplane Mode resource for testing. */ +public final class AirplaneModeRule extends ExternalResource { + + private static final String TAG = "AirplaneModeRule"; + + private Context mContext; + private boolean mBackupValue; + private boolean mShouldRestore; + + @Override + protected void before() throws Throwable { + mContext = ApplicationProvider.getApplicationContext(); + } + + @Override + protected void after() { + if (mShouldRestore) { + Log.d(TAG, "Restore Airplane Mode value:" + mBackupValue); + setAirplaneMode(mContext, mBackupValue); + } + } + + public void setAirplaneMode(boolean enable) { + if (!mShouldRestore && isAirplaneModeOn() != enable) { + mShouldRestore = true; + mBackupValue = isAirplaneModeOn(); + Log.d(TAG, "Backup Airplane Mode value:" + mBackupValue); + } + Log.d(TAG, "Set Airplane Mode enable:" + enable); + setAirplaneMode(mContext, enable); + } + + public boolean isAirplaneModeOn() { + return Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.AIRPLANE_MODE_ON, 0) != 0; + } + + private static void setAirplaneMode(Context context, boolean enable) { + // Change the system setting + Settings.Global.putInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, + enable ? 1 : 0); + + // Post the intent + final Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); + intent.putExtra("state", enable); + context.sendBroadcastAsUser(intent, UserHandle.ALL); + } +}