Home | History | Annotate | Download | only in network
      1 /*
      2  * Copyright (C) 2017 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.network;
     18 
     19 import static com.google.common.truth.Truth.assertThat;
     20 import static org.mockito.Mockito.doReturn;
     21 import static org.mockito.Mockito.spy;
     22 import static org.mockito.Mockito.when;
     23 
     24 import android.arch.lifecycle.LifecycleOwner;
     25 import android.content.ContentResolver;
     26 import android.content.Context;
     27 import android.content.pm.PackageManager;
     28 import android.provider.Settings;
     29 import android.provider.SettingsSlicesContract;
     30 import android.support.v7.preference.PreferenceManager;
     31 import android.support.v7.preference.PreferenceScreen;
     32 
     33 import com.android.settings.core.BasePreferenceController;
     34 import com.android.settings.testutils.FakeFeatureFactory;
     35 import com.android.settings.testutils.SettingsRobolectricTestRunner;
     36 import com.android.settingslib.core.lifecycle.Lifecycle;
     37 import com.android.settingslib.RestrictedSwitchPreference;
     38 
     39 import org.junit.Before;
     40 import org.junit.Test;
     41 import org.junit.runner.RunWith;
     42 import org.mockito.Mock;
     43 import org.mockito.MockitoAnnotations;
     44 import org.robolectric.RuntimeEnvironment;
     45 import org.robolectric.annotation.Config;
     46 
     47 @RunWith(SettingsRobolectricTestRunner.class)
     48 public class AirplaneModePreferenceControllerTest {
     49 
     50     private static final int ON = 1;
     51     private static final int OFF = 0;
     52 
     53     @Mock
     54     private PackageManager mPackageManager;
     55 
     56     private Context mContext;
     57     private ContentResolver mResolver;
     58     private PreferenceManager mPreferenceManager;
     59     private PreferenceScreen mScreen;
     60     private RestrictedSwitchPreference mPreference;
     61     private AirplaneModePreferenceController mController;
     62     private LifecycleOwner mLifecycleOwner;
     63     private Lifecycle mLifecycle;
     64 
     65     @Before
     66     public void setUp() {
     67         MockitoAnnotations.initMocks(this);
     68         FakeFeatureFactory.setupForTest();
     69         mContext = spy(RuntimeEnvironment.application);
     70         mResolver = RuntimeEnvironment.application.getContentResolver();
     71         doReturn(mPackageManager).when(mContext).getPackageManager();
     72         mController = new AirplaneModePreferenceController(mContext,
     73                 SettingsSlicesContract.KEY_AIRPLANE_MODE);
     74 
     75         mPreferenceManager = new PreferenceManager(mContext);
     76         mScreen = mPreferenceManager.createPreferenceScreen(mContext);
     77         mPreference = new RestrictedSwitchPreference(mContext);
     78         mPreference.setKey(SettingsSlicesContract.KEY_AIRPLANE_MODE);
     79         mScreen.addPreference(mPreference);
     80         mController.setFragment(null);
     81         mLifecycleOwner = () -> mLifecycle;
     82         mLifecycle = new Lifecycle(mLifecycleOwner);
     83         mLifecycle.addObserver(mController);
     84     }
     85 
     86     @Test
     87     @Config(qualifiers = "mcc999")
     88     public void airplaneModePreference_shouldNotBeAvailable_ifSetToNotVisible() {
     89         assertThat(mController.getAvailabilityStatus())
     90                 .isNotEqualTo(BasePreferenceController.AVAILABLE);
     91 
     92         mController.displayPreference(mScreen);
     93 
     94         // This should not crash
     95         mController.onResume();
     96         mController.onPause();
     97     }
     98 
     99     @Test
    100     public void airplaneModePreference_shouldNotBeAvailable_ifHasLeanbackFeature() {
    101         when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK)).thenReturn(true);
    102         assertThat(mController.getAvailabilityStatus())
    103                 .isNotEqualTo(BasePreferenceController.AVAILABLE);
    104 
    105         mController.displayPreference(mScreen);
    106 
    107         // This should not crash
    108         mController.onResume();
    109         mController.onPause();
    110     }
    111 
    112     @Test
    113     public void airplaneModePreference_shouldBeAvailable_ifNoLeanbackFeature() {
    114         when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK)).thenReturn(false);
    115         assertThat(mController.getAvailabilityStatus())
    116                 .isEqualTo(BasePreferenceController.AVAILABLE);
    117     }
    118 
    119     @Test
    120     public void airplaneModePreference_testSetValue_updatesCorrectly() {
    121         // Airplane mode default off
    122         Settings.Global.putInt(mResolver, Settings.Global.AIRPLANE_MODE_ON, OFF);
    123 
    124         mController.displayPreference(mScreen);
    125         mController.onResume();
    126 
    127         assertThat(mPreference.isChecked()).isFalse();
    128 
    129         assertThat(mController.isChecked()).isFalse();
    130 
    131         // Set airplane mode ON by setChecked
    132         boolean updated = mController.setChecked(true);
    133         assertThat(updated).isTrue();
    134 
    135         // Check return value if set same status.
    136         updated = mController.setChecked(true);
    137         assertThat(updated).isFalse();
    138 
    139         // UI is updated
    140         assertThat(mPreference.isChecked()).isTrue();
    141 
    142         // Settings status changed.
    143         int updatedValue = Settings.Global.getInt(mResolver, Settings.Global.AIRPLANE_MODE_ON, OFF);
    144         assertThat(updatedValue).isEqualTo(ON);
    145 
    146         // Set to OFF
    147         assertThat(mController.setChecked(false)).isTrue();
    148         assertThat(mPreference.isChecked()).isFalse();
    149         updatedValue = Settings.Global.getInt(mResolver, Settings.Global.AIRPLANE_MODE_ON, OFF);
    150         assertThat(updatedValue).isEqualTo(OFF);
    151     }
    152 
    153     @Test
    154     public void airplaneModePreference_testGetValue_correctValueReturned() {
    155         // Set airplane mode ON
    156         Settings.Global.putInt(mResolver, Settings.Global.AIRPLANE_MODE_ON, ON);
    157 
    158         mController.displayPreference(mScreen);
    159         mController.onResume();
    160 
    161         assertThat(mController.isChecked()).isTrue();
    162 
    163         Settings.Global.putInt(mResolver, Settings.Global.AIRPLANE_MODE_ON, OFF);
    164         assertThat(mController.isChecked()).isFalse();
    165     }
    166 
    167     @Test
    168     public void airplaneModePreference_testPreferenceUI_updatesCorrectly() {
    169         // Airplane mode default off
    170         Settings.Global.putInt(mResolver, Settings.Global.AIRPLANE_MODE_ON, OFF);
    171 
    172         mController.displayPreference(mScreen);
    173         mController.onResume();
    174 
    175         assertThat(mPreference.isChecked()).isFalse();
    176 
    177         mController.onAirplaneModeChanged(true);
    178 
    179         assertThat(mPreference.isChecked()).isTrue();
    180     }
    181 
    182     @Test
    183     public void isSliceableCorrectKey_returnsTrue() {
    184         final AirplaneModePreferenceController controller =
    185                 new AirplaneModePreferenceController(mContext,"toggle_airplane");
    186         assertThat(controller.isSliceable()).isTrue();
    187     }
    188 
    189     @Test
    190     public void isSliceableIncorrectKey_returnsFalse() {
    191         final AirplaneModePreferenceController controller =
    192                 new AirplaneModePreferenceController(mContext, "bad_key");
    193         assertThat(controller.isSliceable()).isFalse();
    194     }
    195 }
    196