10b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei/* 20b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei * Copyright (C) 2016 The Android Open Source Project 30b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei * 40b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei * Licensed under the Apache License, Version 2.0 (the "License"); 50b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei * you may not use this file except in compliance with the License. 60b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei * You may obtain a copy of the License at 70b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei * 80b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei * http://www.apache.org/licenses/LICENSE-2.0 90b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei * 100b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei * Unless required by applicable law or agreed to in writing, software 110b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei * distributed under the License is distributed on an "AS IS" BASIS, 120b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei * See the License for the specific language governing permissions and 140b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei * limitations under the License 150b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei */ 160b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei 170b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyuleipackage com.android.settings; 180b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei 190b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyuleiimport static com.google.common.truth.Truth.assertThat; 20f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidson 21f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidsonimport static org.mockito.Mockito.any; 22f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidsonimport static org.mockito.Mockito.doReturn; 23072f28661d067c16499a0dd02987918d924613f9qingxiimport static org.mockito.Mockito.spy; 240b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyuleiimport static org.mockito.Mockito.when; 25072f28661d067c16499a0dd02987918d924613f9qingxiimport static org.robolectric.Shadows.shadowOf; 260b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei 27072f28661d067c16499a0dd02987918d924613f9qingxiimport android.app.Activity; 28072f28661d067c16499a0dd02987918d924613f9qingxiimport android.app.Fragment; 293025727e16c8d283373b2362bb67d5679f238288Justin Klaassenimport android.content.ComponentName; 30f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidsonimport android.content.ContentResolver; 31a09eb383d90bb0b313518de22d5c1ca19e1b7b8cChristine Franksimport android.content.Intent; 32072f28661d067c16499a0dd02987918d924613f9qingxiimport android.os.Bundle; 33f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidsonimport android.provider.Settings; 34072f28661d067c16499a0dd02987918d924613f9qingxiimport android.view.LayoutInflater; 35072f28661d067c16499a0dd02987918d924613f9qingxiimport android.view.View; 360b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyuleiimport android.widget.LinearLayout; 370b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyuleiimport android.widget.ScrollView; 38072f28661d067c16499a0dd02987918d924613f9qingxi 399f1e911759dc6fedaac9fa65afb79f6a93022bf4Andrew Sappersteinimport com.android.settings.testutils.SettingsRobolectricTestRunner; 40a09eb383d90bb0b313518de22d5c1ca19e1b7b8cChristine Franksimport com.android.settings.testutils.shadow.ShadowUtils; 419f1e911759dc6fedaac9fa65afb79f6a93022bf4Andrew Sapperstein 420b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyuleiimport org.junit.Before; 430b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyuleiimport org.junit.Test; 440b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyuleiimport org.junit.runner.RunWith; 450b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyuleiimport org.mockito.Mock; 460b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyuleiimport org.mockito.MockitoAnnotations; 47072f28661d067c16499a0dd02987918d924613f9qingxiimport org.robolectric.Robolectric; 480b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyuleiimport org.robolectric.annotation.Config; 49072f28661d067c16499a0dd02987918d924613f9qingxiimport org.robolectric.shadows.ShadowActivity; 50072f28661d067c16499a0dd02987918d924613f9qingxi 510b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei@RunWith(SettingsRobolectricTestRunner.class) 52739b0eef10b9701282712f905a4904cad54ad2c8Daniel Nishi@Config( 53739b0eef10b9701282712f905a4904cad54ad2c8Daniel Nishi manifest = TestConfig.MANIFEST_PATH, 54739b0eef10b9701282712f905a4904cad54ad2c8Daniel Nishi sdk = TestConfig.SDK_VERSION, 55739b0eef10b9701282712f905a4904cad54ad2c8Daniel Nishi shadows = {ShadowUtils.class} 56739b0eef10b9701282712f905a4904cad54ad2c8Daniel Nishi) 570b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyuleipublic class MasterClearTest { 58072f28661d067c16499a0dd02987918d924613f9qingxi 59072f28661d067c16499a0dd02987918d924613f9qingxi @Mock 600b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei private MasterClear mMasterClear; 610b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei @Mock 620b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei private ScrollView mScrollView; 630b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei @Mock 640b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei private LinearLayout mLinearLayout; 65072f28661d067c16499a0dd02987918d924613f9qingxi private ShadowActivity mShadowActivity; 66072f28661d067c16499a0dd02987918d924613f9qingxi private Activity mActivity; 67072f28661d067c16499a0dd02987918d924613f9qingxi private View mContentView; 68072f28661d067c16499a0dd02987918d924613f9qingxi 69072f28661d067c16499a0dd02987918d924613f9qingxi private class ActivityForTest extends SettingsActivity { 70072f28661d067c16499a0dd02987918d924613f9qingxi private Bundle mArgs; 71072f28661d067c16499a0dd02987918d924613f9qingxi 72072f28661d067c16499a0dd02987918d924613f9qingxi @Override 73072f28661d067c16499a0dd02987918d924613f9qingxi public void startPreferencePanel(Fragment caller, String fragmentClass, Bundle args, 74072f28661d067c16499a0dd02987918d924613f9qingxi int titleRes, CharSequence titleText, Fragment resultTo, int resultRequestCode) { 75072f28661d067c16499a0dd02987918d924613f9qingxi mArgs = args; 76072f28661d067c16499a0dd02987918d924613f9qingxi } 77072f28661d067c16499a0dd02987918d924613f9qingxi 78072f28661d067c16499a0dd02987918d924613f9qingxi public Bundle getArgs() { 79072f28661d067c16499a0dd02987918d924613f9qingxi return mArgs; 80072f28661d067c16499a0dd02987918d924613f9qingxi } 81072f28661d067c16499a0dd02987918d924613f9qingxi } 820b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei 830b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei @Before 840b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei public void setUp() { 850b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei MockitoAnnotations.initMocks(this); 86072f28661d067c16499a0dd02987918d924613f9qingxi mMasterClear = spy(new MasterClear()); 87072f28661d067c16499a0dd02987918d924613f9qingxi mActivity = Robolectric.setupActivity(Activity.class); 88072f28661d067c16499a0dd02987918d924613f9qingxi mShadowActivity = shadowOf(mActivity); 89072f28661d067c16499a0dd02987918d924613f9qingxi mContentView = LayoutInflater.from(mActivity).inflate(R.layout.master_clear, null); 900b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei 910b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei // Make scrollView only have one child 920b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei when(mScrollView.getChildAt(0)).thenReturn(mLinearLayout); 930b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei when(mScrollView.getChildCount()).thenReturn(1); 940b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei } 950b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei 960b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei @Test 97f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidson public void testShowWipeEuicc_euiccDisabled() { 98f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidson prepareEuiccState( 994ba7478fdf4942a1c3698c6e2b77c28a9cc7c40cJeff Davidson false /* isEuiccEnabled */, true /* isEuiccProvisioned */); 100f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidson assertThat(mMasterClear.showWipeEuicc()).isFalse(); 101f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidson } 102f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidson 103f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidson @Test 104f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidson public void testShowWipeEuicc_euiccEnabled_unprovisioned() { 105f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidson prepareEuiccState( 1064ba7478fdf4942a1c3698c6e2b77c28a9cc7c40cJeff Davidson true /* isEuiccEnabled */, false /* isEuiccProvisioned */); 107f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidson assertThat(mMasterClear.showWipeEuicc()).isFalse(); 108f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidson } 109f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidson 110f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidson @Test 111f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidson public void testShowWipeEuicc_euiccEnabled_provisioned() { 112f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidson prepareEuiccState( 1134ba7478fdf4942a1c3698c6e2b77c28a9cc7c40cJeff Davidson true /* isEuiccEnabled */, true /* isEuiccProvisioned */); 114f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidson assertThat(mMasterClear.showWipeEuicc()).isTrue(); 115f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidson } 116f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidson 117f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidson private void prepareEuiccState( 118f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidson boolean isEuiccEnabled, 1194ba7478fdf4942a1c3698c6e2b77c28a9cc7c40cJeff Davidson boolean isEuiccProvisioned) { 120f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidson doReturn(mActivity).when(mMasterClear).getContext(); 121f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidson doReturn(isEuiccEnabled).when(mMasterClear).isEuiccEnabled(any()); 122f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidson ContentResolver cr = mActivity.getContentResolver(); 123f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidson Settings.Global.putInt( 124f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidson cr, android.provider.Settings.Global.EUICC_PROVISIONED, isEuiccProvisioned ? 1 : 0); 125f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidson } 126f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidson 127f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7Jeff Davidson @Test 1280b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei public void testHasReachedBottom_NotScrollDown_returnFalse() { 1290b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei initScrollView(100, 0, 200); 1300b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei 1310b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei assertThat(mMasterClear.hasReachedBottom(mScrollView)).isFalse(); 1320b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei } 1330b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei 1340b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei @Test 1350b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei public void testHasReachedBottom_CanNotScroll_returnTrue() { 1360b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei initScrollView(100, 0, 80); 1370b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei 1380b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei assertThat(mMasterClear.hasReachedBottom(mScrollView)).isTrue(); 1390b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei } 1400b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei 1410b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei @Test 1420b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei public void testHasReachedBottom_ScrollToBottom_returnTrue() { 1430b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei initScrollView(100, 100, 200); 1440b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei 1450b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei assertThat(mMasterClear.hasReachedBottom(mScrollView)).isTrue(); 1460b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei } 1470b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei 148a09eb383d90bb0b313518de22d5c1ca19e1b7b8cChristine Franks @Test 149a09eb383d90bb0b313518de22d5c1ca19e1b7b8cChristine Franks public void testInitiateMasterClear_inDemoMode_sendsIntent() { 150a09eb383d90bb0b313518de22d5c1ca19e1b7b8cChristine Franks ShadowUtils.setIsDemoUser(true); 151a09eb383d90bb0b313518de22d5c1ca19e1b7b8cChristine Franks 1523025727e16c8d283373b2362bb67d5679f238288Justin Klaassen final ComponentName componentName = ComponentName.unflattenFromString( 1533025727e16c8d283373b2362bb67d5679f238288Justin Klaassen "com.android.retaildemo/.DeviceAdminReceiver"); 1543025727e16c8d283373b2362bb67d5679f238288Justin Klaassen ShadowUtils.setDeviceOwnerComponent(componentName); 1553025727e16c8d283373b2362bb67d5679f238288Justin Klaassen 156a09eb383d90bb0b313518de22d5c1ca19e1b7b8cChristine Franks mMasterClear.mInitiateListener.onClick( 157a09eb383d90bb0b313518de22d5c1ca19e1b7b8cChristine Franks mContentView.findViewById(R.id.initiate_master_clear)); 158a09eb383d90bb0b313518de22d5c1ca19e1b7b8cChristine Franks final Intent intent = mShadowActivity.getNextStartedActivity(); 159a09eb383d90bb0b313518de22d5c1ca19e1b7b8cChristine Franks assertThat(Intent.ACTION_FACTORY_RESET).isEqualTo(intent.getAction()); 1603025727e16c8d283373b2362bb67d5679f238288Justin Klaassen assertThat(componentName.getPackageName()).isEqualTo(intent.getPackage()); 161a09eb383d90bb0b313518de22d5c1ca19e1b7b8cChristine Franks } 162a09eb383d90bb0b313518de22d5c1ca19e1b7b8cChristine Franks 1630b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei private void initScrollView(int height, int scrollY, int childBottom) { 1640b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei when(mScrollView.getHeight()).thenReturn(height); 1650b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei when(mScrollView.getScrollY()).thenReturn(scrollY); 1660b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei when(mLinearLayout.getBottom()).thenReturn(childBottom); 1670b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei } 1680b3edc728ec46a6f293ec78598c0b4cde7257725jackqdyulei} 169