149dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz/*
249dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz * Copyright 2016, The Android Open Source Project
349dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz *
449dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz * Licensed under the Apache License, Version 2.0 (the "License");
549dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz * you may not use this file except in compliance with the License.
649dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz * You may obtain a copy of the License at
749dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz *
849dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz *     http://www.apache.org/licenses/LICENSE-2.0
949dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz *
1049dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz * Unless required by applicable law or agreed to in writing, software
1149dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz * distributed under the License is distributed on an "AS IS" BASIS,
1249dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1349dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz * See the License for the specific language governing permissions and
1449dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz * limitations under the License.
1549dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz */
1649dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz
1749dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franzpackage com.android.managedprovisioning.preprovisioning;
1849dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz
1949dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franzimport static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE;
2049dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franzimport static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE;
2149dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franzimport static android.app.admin.DevicePolicyManager.ACTION_START_ENCRYPTION;
2249dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franzimport static android.support.test.espresso.Espresso.onView;
2349dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franzimport static android.support.test.espresso.action.ViewActions.click;
2449dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franzimport static android.support.test.espresso.assertion.ViewAssertions.matches;
2549dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franzimport static android.support.test.espresso.matcher.ViewMatchers.withId;
2649dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franzimport static android.support.test.espresso.matcher.ViewMatchers.withText;
27a9cf45028e89c62c9d6d7a71e81ec2dcf45cf7f5Benjamin Franzimport static org.junit.Assert.assertEquals;
2849dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franzimport static org.junit.Assert.assertTrue;
2949dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franzimport static org.mockito.Mockito.verify;
3049dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz
31b0e275f0511cfe10c698d6a260fcfdb194e7c810Jakub Gielzakimport android.app.Activity;
3249dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franzimport android.content.ComponentName;
3349dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franzimport android.content.Context;
3449dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franzimport android.content.Intent;
35b0e275f0511cfe10c698d6a260fcfdb194e7c810Jakub Gielzakimport android.graphics.Color;
3649dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franzimport android.provider.Settings;
3749dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franzimport android.support.test.InstrumentationRegistry;
3849dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franzimport android.support.test.filters.SmallTest;
39a9cf45028e89c62c9d6d7a71e81ec2dcf45cf7f5Benjamin Franzimport android.support.test.rule.ActivityTestRule;
4049dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz
4149dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franzimport com.android.managedprovisioning.R;
4249dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franzimport com.android.managedprovisioning.TestInstrumentationRunner;
43b0e275f0511cfe10c698d6a260fcfdb194e7c810Jakub Gielzakimport com.android.managedprovisioning.common.CustomizationVerifier;
4449dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franzimport com.android.managedprovisioning.model.ProvisioningParams;
4549dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz
4680ae370242ebd15119d1a6e9e5026e036bfe1cf7Victor Changimport org.junit.After;
4749dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franzimport org.junit.AfterClass;
4849dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franzimport org.junit.Before;
4949dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franzimport org.junit.BeforeClass;
5049dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franzimport org.junit.Rule;
5149dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franzimport org.junit.Test;
5249dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franzimport org.mockito.Mock;
5349dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franzimport org.mockito.MockitoAnnotations;
5449dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz
5549dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz/**
5649dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz * Unit tests for {@link EncryptDeviceActivity}.
5749dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz */
5849dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz@SmallTest
5949dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franzpublic class EncryptDeviceActivityTest {
6049dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz
6149dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz    private static final ComponentName ADMIN = new ComponentName("com.test.admin", ".Receiver");
62b0e275f0511cfe10c698d6a260fcfdb194e7c810Jakub Gielzak    private static final int SAMPLE_COLOR = Color.parseColor("#d40000");
6349dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz    private static final ProvisioningParams PROFILE_OWNER_PARAMS = new ProvisioningParams.Builder()
6449dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz            .setProvisioningAction(ACTION_PROVISION_MANAGED_PROFILE)
65b0e275f0511cfe10c698d6a260fcfdb194e7c810Jakub Gielzak            .setMainColor(SAMPLE_COLOR)
6649dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz            .setDeviceAdminComponentName(ADMIN)
6749dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz            .build();
6849dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz    private static final ProvisioningParams DEVICE_OWNER_PARAMS = new ProvisioningParams.Builder()
6949dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz            .setProvisioningAction(ACTION_PROVISION_MANAGED_DEVICE)
70b0e275f0511cfe10c698d6a260fcfdb194e7c810Jakub Gielzak            .setMainColor(SAMPLE_COLOR)
7149dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz            .setDeviceAdminComponentName(ADMIN)
7249dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz            .build();
7349dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz    private static final Intent PROFILE_OWNER_INTENT = new Intent()
7449dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz            .putExtra(ProvisioningParams.EXTRA_PROVISIONING_PARAMS, PROFILE_OWNER_PARAMS);
7549dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz    private static final Intent DEVICE_OWNER_INTENT = new Intent()
7649dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz            .putExtra(ProvisioningParams.EXTRA_PROVISIONING_PARAMS, DEVICE_OWNER_PARAMS);
7749dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz
7849dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz    @Rule
79a9cf45028e89c62c9d6d7a71e81ec2dcf45cf7f5Benjamin Franz    public ActivityTestRule<EncryptDeviceActivity> mActivityRule = new ActivityTestRule<>(
8049dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz            EncryptDeviceActivity.class, true /* Initial touch mode  */,
8149dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz            false /* Lazily launch activity */);
8249dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz
8349dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz    @Mock EncryptionController mController;
8449dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz    private static int sRotationLocked;
8549dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz
8649dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz    @BeforeClass
8749dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz    public static void setUpClass() {
8849dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz        // Stop the activity from rotating in order to keep hold of the context
8949dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz        Context context = InstrumentationRegistry.getTargetContext();
9049dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz
9149dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz        sRotationLocked = Settings.System.getInt(context.getContentResolver(),
9249dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz                Settings.System.ACCELEROMETER_ROTATION, 0);
9349dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz        Settings.System.putInt(context.getContentResolver(),
9449dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz                Settings.System.ACCELEROMETER_ROTATION, 0);
9549dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz    }
9649dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz
9749dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz    @AfterClass
9849dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz    public static void tearDownClass() {
9949dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz        // Reset the rotation value back to what it was before the test
10049dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz        Context context = InstrumentationRegistry.getTargetContext();
10149dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz
10249dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz        Settings.System.putInt(context.getContentResolver(),
10349dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz                Settings.System.ACCELEROMETER_ROTATION, sRotationLocked);
10449dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz    }
10549dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz
10649dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz    @Before
10749dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz    public void setUp() {
10849dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz        MockitoAnnotations.initMocks(this);
10949dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz
11049dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz        TestEncryptionActivity.sController = mController;
111a9cf45028e89c62c9d6d7a71e81ec2dcf45cf7f5Benjamin Franz        TestEncryptionActivity.sLastLaunchedIntent = null;
11249dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz
11349dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz        TestInstrumentationRunner.registerReplacedActivity(EncryptDeviceActivity.class,
11449dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz                TestEncryptionActivity.class);
11549dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz    }
11649dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz
11780ae370242ebd15119d1a6e9e5026e036bfe1cf7Victor Chang    @After
11880ae370242ebd15119d1a6e9e5026e036bfe1cf7Victor Chang    public void tearDown() {
11980ae370242ebd15119d1a6e9e5026e036bfe1cf7Victor Chang        TestInstrumentationRunner.unregisterReplacedActivity(EncryptDeviceActivity.class);
12080ae370242ebd15119d1a6e9e5026e036bfe1cf7Victor Chang    }
12180ae370242ebd15119d1a6e9e5026e036bfe1cf7Victor Chang
12249dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz    @Test
12349dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz    public void testProfileOwner() {
12449dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz        // WHEN launching EncryptDeviceActivity with a profile owner intent
125b0e275f0511cfe10c698d6a260fcfdb194e7c810Jakub Gielzak        Activity activity = mActivityRule.launchActivity(PROFILE_OWNER_INTENT);
12649dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz
12749dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz        // THEN the profile owner description should be present
12849dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz        onView(withId(R.id.encrypt_main_text))
12949dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz                .check(matches(withText(R.string.encrypt_device_text_for_profile_owner_setup)));
13049dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz
131b0e275f0511cfe10c698d6a260fcfdb194e7c810Jakub Gielzak        // status bar color matches the one from intent parameters
132b0e275f0511cfe10c698d6a260fcfdb194e7c810Jakub Gielzak        new CustomizationVerifier(activity).assertStatusBarColorCorrect(SAMPLE_COLOR);
133b0e275f0511cfe10c698d6a260fcfdb194e7c810Jakub Gielzak
13449dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz        // WHEN pressing the encrypt button
13549dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz        onView(withId(R.id.encrypt_button)).perform(click());
13649dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz
13749dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz        // THEN encryption reminder should be set
13849dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz        verify(mController).setEncryptionReminder(PROFILE_OWNER_PARAMS);
13949dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz
14049dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz        // THEN encryption activity should be started
141a9cf45028e89c62c9d6d7a71e81ec2dcf45cf7f5Benjamin Franz        assertEquals(ACTION_START_ENCRYPTION,
142a9cf45028e89c62c9d6d7a71e81ec2dcf45cf7f5Benjamin Franz                TestEncryptionActivity.sLastLaunchedIntent.getAction());
14349dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz    }
14449dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz
14549dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz    @Test
14649dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz    public void testDeviceOwner() {
14749dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz        // WHEN launching EncryptDeviceActivity with a profile owner intent
148b0e275f0511cfe10c698d6a260fcfdb194e7c810Jakub Gielzak        Activity activity = mActivityRule.launchActivity(DEVICE_OWNER_INTENT);
14949dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz
15049dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz        // THEN the profile owner description should be present
15149dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz        onView(withId(R.id.encrypt_main_text))
15249dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz                .check(matches(withText(R.string.encrypt_device_text_for_device_owner_setup)));
15349dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz
154b0e275f0511cfe10c698d6a260fcfdb194e7c810Jakub Gielzak        // status bar color matches the one from intent parameters
155b0e275f0511cfe10c698d6a260fcfdb194e7c810Jakub Gielzak        new CustomizationVerifier(activity).assertStatusBarColorCorrect(SAMPLE_COLOR);
156b0e275f0511cfe10c698d6a260fcfdb194e7c810Jakub Gielzak
15749dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz        // WHEN pressing the encrypt button
15849dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz        onView(withId(R.id.encrypt_button)).perform(click());
15949dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz
16049dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz        // THEN encryption reminder should be set
16149dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz        verify(mController).setEncryptionReminder(DEVICE_OWNER_PARAMS);
16249dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz
16349dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz        // THEN encryption activity should be started
164a9cf45028e89c62c9d6d7a71e81ec2dcf45cf7f5Benjamin Franz        assertEquals(ACTION_START_ENCRYPTION,
165a9cf45028e89c62c9d6d7a71e81ec2dcf45cf7f5Benjamin Franz                TestEncryptionActivity.sLastLaunchedIntent.getAction());
166a9cf45028e89c62c9d6d7a71e81ec2dcf45cf7f5Benjamin Franz    }
167a9cf45028e89c62c9d6d7a71e81ec2dcf45cf7f5Benjamin Franz
168a9cf45028e89c62c9d6d7a71e81ec2dcf45cf7f5Benjamin Franz    @Test
169a9cf45028e89c62c9d6d7a71e81ec2dcf45cf7f5Benjamin Franz    public void testNoParams() {
170a9cf45028e89c62c9d6d7a71e81ec2dcf45cf7f5Benjamin Franz        // WHEN launching EncryptDeviceActivity without a params object
171a9cf45028e89c62c9d6d7a71e81ec2dcf45cf7f5Benjamin Franz        mActivityRule.launchActivity(new Intent());
172a9cf45028e89c62c9d6d7a71e81ec2dcf45cf7f5Benjamin Franz
173a9cf45028e89c62c9d6d7a71e81ec2dcf45cf7f5Benjamin Franz        // THEN the activity should finish immediately
174a9cf45028e89c62c9d6d7a71e81ec2dcf45cf7f5Benjamin Franz        assertTrue(mActivityRule.getActivity().isFinishing());
17549dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz    }
17649dbaa804b8fd5d1845f6ace366b93c0c5e3bd44Benjamin Franz}
177