summaryrefslogtreecommitdiff
path: root/sdksandbox/tests/testutils/src/android/app/sdksandbox/hosttestutils/SecondaryUserUtils.java
blob: d063b89d8ab3d559906268439c33cb84a66a9fe2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/*
 * Copyright (C) 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.app.sdksandbox.hosttestutils;

import static com.google.common.truth.Truth.assertThat;

import static org.junit.Assert.fail;

import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;

public class SecondaryUserUtils {

    private static final long NUMBER_OF_POLLS = 2 * 60;
    private static final long POLL_INTERVAL_IN_MILLIS = 1000;

    private final BaseHostJUnit4Test mTest;

    private int mOriginalUserId = -1;
    private int mSecondaryUserId = -1;

    public SecondaryUserUtils(BaseHostJUnit4Test test) {
        mTest = test;
    }

    public int createAndStartSecondaryUser() throws Exception {
        if (mSecondaryUserId != -1) {
            throw new IllegalStateException("Cannot create secondary user, it already exists");
        }
        mOriginalUserId = mTest.getDevice().getCurrentUser();
        String name = "SdkSandboxStorageHost_User" + System.currentTimeMillis();
        mSecondaryUserId = mTest.getDevice().createUser(name);
        // Note we can't install apps on a locked user, so we wait
        mTest.getDevice().startUser(mSecondaryUserId, /*waitFlag=*/ true);
        return mSecondaryUserId;
    }

    public void removeSecondaryUserIfNecessary() throws Exception {
        removeSecondaryUserIfNecessary(/*waitForUserDataDeletion=*/ false);
    }

    public void removeSecondaryUserIfNecessary(boolean waitForUserDataDeletion) throws Exception {
        if (mSecondaryUserId == -1) {
            return;
        }

        final int userBeingRemoved = mSecondaryUserId;
        // Set to -1 so that we can create new users later, even when removal goes wrong
        mSecondaryUserId = -1;

        if (mOriginalUserId != -1 && userBeingRemoved != -1) {
            // Can't remove the 2nd user without switching out of it
            assertThat(mTest.getDevice().switchUser(mOriginalUserId)).isTrue();
            mTest.getDevice().removeUser(userBeingRemoved);
            if (waitForUserDataDeletion) {
                waitForUserDataDeletion(userBeingRemoved);
            }
        }
    }

    private void waitForUserDataDeletion(int userId) throws Exception {
        final String deSdkSandboxDataRootPath = "/data/misc_de/" + userId + "/sdksandbox";
        for (int i = 0; i < NUMBER_OF_POLLS; ++i) {
            if (!mTest.getDevice().isDirectory(deSdkSandboxDataRootPath)) {
                return;
            }
            Thread.sleep(POLL_INTERVAL_IN_MILLIS);
        }
        fail("User data was not deleted for UserId " + userId);
    }
}