1ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler/*
2ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler * Copyright (C) 2017 The Android Open Source Project
3ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler *
4ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler * Licensed under the Apache License, Version 2.0 (the "License");
5ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler * you may not use this file except in compliance with the License.
6ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler * You may obtain a copy of the License at
7ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler *
8ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler *      http://www.apache.org/licenses/LICENSE-2.0
9ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler *
10ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler * Unless required by applicable law or agreed to in writing, software
11ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler * distributed under the License is distributed on an "AS IS" BASIS,
12ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler * See the License for the specific language governing permissions and
14ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler * limitations under the License.
15ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler */
16ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler
17ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantlerpackage com.android.settingslib.development;
18ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler
19ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantlerimport static com.google.common.truth.Truth.assertThat;
20ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantlerimport static org.mockito.Answers.RETURNS_DEEP_STUBS;
214ac34c4a87ab1387d759f90812eee89680bf2154jeffreyhuangimport static org.mockito.Mockito.doReturn;
22ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantlerimport static org.mockito.Mockito.spy;
23ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantlerimport static org.mockito.Mockito.when;
24ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler
25ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantlerimport android.content.Context;
26ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantlerimport android.content.pm.PackageManager;
27ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantlerimport android.os.UserManager;
28ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantlerimport android.provider.Settings;
29ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantlerimport android.support.v14.preference.SwitchPreference;
30ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantlerimport android.support.v7.preference.Preference;
31ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantlerimport android.support.v7.preference.PreferenceScreen;
32ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler
334ca9ebd5d355b72eb6076b5cce68968ea9d794c3Tony Mantlerimport com.android.settingslib.SettingsLibRobolectricTestRunner;
34ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler
35ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantlerimport org.junit.Before;
36ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantlerimport org.junit.Test;
37ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantlerimport org.junit.runner.RunWith;
38ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantlerimport org.mockito.Mock;
39ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantlerimport org.mockito.MockitoAnnotations;
40ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantlerimport org.robolectric.shadows.ShadowApplication;
41ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler
424ca9ebd5d355b72eb6076b5cce68968ea9d794c3Tony Mantler@RunWith(SettingsLibRobolectricTestRunner.class)
43ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantlerpublic class EnableAdbPreferenceControllerTest {
44ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    @Mock(answer = RETURNS_DEEP_STUBS)
45ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    private PreferenceScreen mScreen;
46ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    @Mock
47ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    private UserManager mUserManager;
48ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    @Mock
49ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    private PackageManager mPackageManager;
50ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler
51ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    private Context mContext;
52ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    private SwitchPreference mPreference;
53ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    private ConcreteEnableAdbPreferenceController mController;
54ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler
55ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    @Before
56ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    public void setUp() {
57ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        MockitoAnnotations.initMocks(this);
58ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        ShadowApplication shadowContext = ShadowApplication.getInstance();
59ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        shadowContext.setSystemService(Context.USER_SERVICE, mUserManager);
60ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        mContext = spy(shadowContext.getApplicationContext());
61ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        when(mContext.getPackageManager()).thenReturn(mPackageManager);
62ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        mController = new ConcreteEnableAdbPreferenceController(mContext);
637293cf44ba3a2cb7be4a47790d31aa294d86609fFan Zhang        mPreference = new SwitchPreference(mContext);
64ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        mPreference.setKey(mController.getPreferenceKey());
657293cf44ba3a2cb7be4a47790d31aa294d86609fFan Zhang        when(mScreen.findPreference(mPreference.getKey())).thenReturn(mPreference);
66ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    }
67ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler
68ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    @Test
69ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    public void displayPreference_isNotAdmin_shouldRemovePreference() {
70ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        when(mUserManager.isAdminUser()).thenReturn(false);
71ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler
72ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        mController.displayPreference(mScreen);
73ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler
747293cf44ba3a2cb7be4a47790d31aa294d86609fFan Zhang        assertThat(mPreference.isVisible()).isFalse();
75ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    }
76ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler
77ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    @Test
78ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    public void displayPreference_isAdmin_shouldNotRemovePreference() {
79ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        when(mUserManager.isAdminUser()).thenReturn(true);
80ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler
81ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        mController.displayPreference(mScreen);
82ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler
837293cf44ba3a2cb7be4a47790d31aa294d86609fFan Zhang        assertThat(mPreference.isVisible()).isTrue();
84ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    }
85ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler
86ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler
87ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    @Test
88ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    public void resetPreference_shouldUncheck() {
89ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        when(mUserManager.isAdminUser()).thenReturn(true);
90ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        mController.displayPreference(mScreen);
91ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        mPreference.setChecked(true);
92ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler
93ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        mController.resetPreference();
94ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler
95ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        assertThat(mPreference.isChecked()).isFalse();
96ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    }
97ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler
98ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    @Test
99ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    public void handlePreferenceTreeClick_shouldUpdateSettings() {
100ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        when(mUserManager.isAdminUser()).thenReturn(true);
101ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        Settings.Secure.putInt(mContext.getContentResolver(),
102ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler                Settings.Global.ADB_ENABLED, 1);
103ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        mPreference.setChecked(true);
104ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        mController.displayPreference(mScreen);
105ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler
106ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        mController.handlePreferenceTreeClick(mPreference);
107ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler
108ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
109ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler                Settings.Global.ADB_ENABLED, 0)).isEqualTo(0);
110ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    }
111ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler
112ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    @Test
1134ac34c4a87ab1387d759f90812eee89680bf2154jeffreyhuang    public void handlePreferenceTreeClick_isMonkeyUser_shouldBeFalse() {
1144ac34c4a87ab1387d759f90812eee89680bf2154jeffreyhuang        mController = spy(mController);
1154ac34c4a87ab1387d759f90812eee89680bf2154jeffreyhuang        doReturn(true).when(mController).isUserAMonkey();
1164ac34c4a87ab1387d759f90812eee89680bf2154jeffreyhuang        when(mUserManager.isAdminUser()).thenReturn(true);
1174ac34c4a87ab1387d759f90812eee89680bf2154jeffreyhuang        mController.displayPreference(mScreen);
1184ac34c4a87ab1387d759f90812eee89680bf2154jeffreyhuang
1194ac34c4a87ab1387d759f90812eee89680bf2154jeffreyhuang        final boolean handled = mController.handlePreferenceTreeClick(mPreference);
1204ac34c4a87ab1387d759f90812eee89680bf2154jeffreyhuang
1214ac34c4a87ab1387d759f90812eee89680bf2154jeffreyhuang        assertThat(handled).isFalse();
1224ac34c4a87ab1387d759f90812eee89680bf2154jeffreyhuang    }
1234ac34c4a87ab1387d759f90812eee89680bf2154jeffreyhuang
1244ac34c4a87ab1387d759f90812eee89680bf2154jeffreyhuang    @Test
125ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    public void updateState_settingsOn_shouldCheck() {
126ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        when(mUserManager.isAdminUser()).thenReturn(true);
127ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        Settings.Secure.putInt(mContext.getContentResolver(),
128ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler                Settings.Global.ADB_ENABLED, 1);
129ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        mPreference.setChecked(false);
130ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        mController.displayPreference(mScreen);
131ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler
132ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        mController.updateState(mPreference);
133ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler
134ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        assertThat(mPreference.isChecked()).isTrue();
135ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    }
136ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler
137ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    @Test
138ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    public void updateState_settingsOff_shouldUncheck() {
139ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        when(mUserManager.isAdminUser()).thenReturn(true);
140ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        Settings.Secure.putInt(mContext.getContentResolver(),
141ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler                Settings.Global.ADB_ENABLED, 0);
142ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        mPreference.setChecked(true);
143ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        mController.displayPreference(mScreen);
144ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler
145ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        mController.updateState(mPreference);
146ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler
147ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        assertThat(mPreference.isChecked()).isFalse();
148ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    }
149ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler
150ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    class ConcreteEnableAdbPreferenceController extends AbstractEnableAdbPreferenceController {
151ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        public ConcreteEnableAdbPreferenceController(Context context) {
152ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler            super(context);
153ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        }
154ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler
155ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        @Override
156265e7fbcc30d507fa1670353f5c7ca24c60cf1c7Tony Mantler        public void showConfirmationDialog(Preference preference) {
157ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler            // Don't show a dialog, just set setting.
158ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler            writeAdbSetting(true);
159ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler        }
160265e7fbcc30d507fa1670353f5c7ca24c60cf1c7Tony Mantler
161265e7fbcc30d507fa1670353f5c7ca24c60cf1c7Tony Mantler        @Override
162265e7fbcc30d507fa1670353f5c7ca24c60cf1c7Tony Mantler        public boolean isConfirmationDialogShowing() {
163265e7fbcc30d507fa1670353f5c7ca24c60cf1c7Tony Mantler            return false;
164265e7fbcc30d507fa1670353f5c7ca24c60cf1c7Tony Mantler        }
165265e7fbcc30d507fa1670353f5c7ca24c60cf1c7Tony Mantler
166265e7fbcc30d507fa1670353f5c7ca24c60cf1c7Tony Mantler        @Override
1674ac34c4a87ab1387d759f90812eee89680bf2154jeffreyhuang        public void dismissConfirmationDialog() {
1684ac34c4a87ab1387d759f90812eee89680bf2154jeffreyhuang        }
169ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler    }
170ec4bae9d862b07493e19b2bc82ecfa7d5cb6f4e1Tony Mantler}
171