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