diff options
9 files changed, 206 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/TEST_MAPPING b/services/core/java/com/android/server/TEST_MAPPING index ceb12c8f483e..9e8b9c62ff51 100644 --- a/services/core/java/com/android/server/TEST_MAPPING +++ b/services/core/java/com/android/server/TEST_MAPPING @@ -36,6 +36,15 @@ } ], "file_patterns": ["ClipboardService\\.java"] + }, + { + "name": "FrameworksMockingServicesTests", + "options": [ + { + "include-filter": "com.android.server.sensorprivacy" + } + ], + "file_patterns": ["SensorPrivacyService\\.java"] } ], "presubmit-large": [ diff --git a/services/tests/mockingservicestests/assets/SensorPrivacyServiceMockingTest/OWNERS b/services/tests/mockingservicestests/assets/SensorPrivacyServiceMockingTest/OWNERS new file mode 100644 index 000000000000..c74393b102a8 --- /dev/null +++ b/services/tests/mockingservicestests/assets/SensorPrivacyServiceMockingTest/OWNERS @@ -0,0 +1,3 @@ +# Bug component: 137825 + +file:platform/frameworks/native:/libs/sensorprivacy/OWNERS diff --git a/services/tests/mockingservicestests/assets/SensorPrivacyServiceMockingTest/persisted_file1.xml b/services/tests/mockingservicestests/assets/SensorPrivacyServiceMockingTest/persisted_file1.xml new file mode 100644 index 000000000000..a4de08a85487 --- /dev/null +++ b/services/tests/mockingservicestests/assets/SensorPrivacyServiceMockingTest/persisted_file1.xml @@ -0,0 +1,7 @@ +<?xml version='1.0' encoding='UTF-8' standalone='yes' ?> +<sensor-privacy persistence-version="1" version="1"> + <user id="0" enabled="false"> + <individual-sensor-privacy sensor="1" enabled="true" /> + <individual-sensor-privacy sensor="2" enabled="true" /> + </user> +</sensor-privacy> diff --git a/services/tests/mockingservicestests/assets/SensorPrivacyServiceMockingTest/persisted_file2.xml b/services/tests/mockingservicestests/assets/SensorPrivacyServiceMockingTest/persisted_file2.xml new file mode 100644 index 000000000000..361075eba7da --- /dev/null +++ b/services/tests/mockingservicestests/assets/SensorPrivacyServiceMockingTest/persisted_file2.xml @@ -0,0 +1,16 @@ +<?xml version='1.0' encoding='UTF-8' standalone='yes' ?> +<sensor-privacy persistence-version="1" version="1"> + <user id="0" enabled="false"> + <individual-sensor-privacy sensor="1" enabled="true" /> + <individual-sensor-privacy sensor="2" enabled="true" /> + </user> + <user id="10" enabled="false"> + <individual-sensor-privacy sensor="1" enabled="true" /> + <individual-sensor-privacy sensor="2" enabled="false" /> + </user> + <user id="11" enabled="false"> + </user> + <user id="12" enabled="false"> + <individual-sensor-privacy sensor="1" enabled="true" /> + </user> +</sensor-privacy> diff --git a/services/tests/mockingservicestests/assets/SensorPrivacyServiceMockingTest/persisted_file3.xml b/services/tests/mockingservicestests/assets/SensorPrivacyServiceMockingTest/persisted_file3.xml new file mode 100644 index 000000000000..e8f9edfde2d7 --- /dev/null +++ b/services/tests/mockingservicestests/assets/SensorPrivacyServiceMockingTest/persisted_file3.xml @@ -0,0 +1,7 @@ +<?xml version='1.0' encoding='UTF-8' standalone='yes' ?> +<sensor-privacy persistence-version="1" version="1"> + <user id="0" enabled="false"> + <individual-sensor-privacy sensor="1" enabled="false" /> + <individual-sensor-privacy sensor="2" enabled="false" /> + </user> +</sensor-privacy> diff --git a/services/tests/mockingservicestests/assets/SensorPrivacyServiceMockingTest/persisted_file4.xml b/services/tests/mockingservicestests/assets/SensorPrivacyServiceMockingTest/persisted_file4.xml new file mode 100644 index 000000000000..d26c27594773 --- /dev/null +++ b/services/tests/mockingservicestests/assets/SensorPrivacyServiceMockingTest/persisted_file4.xml @@ -0,0 +1,10 @@ +<?xml version='1.0' encoding='UTF-8' standalone='yes' ?> +<sensor-privacy persistence-version="1" version="1"> + <user id="0" enabled="false"> + <individual-sensor-privacy sensor="1" enabled="true" /> + <individual-sensor-privacy sensor="2" enabled="false" /> + </user> + <user id="10" enabled="false"> + <individual-sensor-privacy sensor="1" enabled="false" /> + </user> +</sensor-privacy> diff --git a/services/tests/mockingservicestests/assets/SensorPrivacyServiceMockingTest/persisted_file5.xml b/services/tests/mockingservicestests/assets/SensorPrivacyServiceMockingTest/persisted_file5.xml new file mode 100644 index 000000000000..5c9d0cdccd1b --- /dev/null +++ b/services/tests/mockingservicestests/assets/SensorPrivacyServiceMockingTest/persisted_file5.xml @@ -0,0 +1,9 @@ +<?xml version='1.0' encoding='UTF-8' standalone='yes' ?> +<sensor-privacy persistence-version="1" version="1"> + <user id="0" enabled="false"> + <individual-sensor-privacy sensor="2" enabled="false" /> + </user> + <user id="10" enabled="false"> + <individual-sensor-privacy sensor="2" enabled="false" /> + </user> +</sensor-privacy> diff --git a/services/tests/mockingservicestests/src/com/android/server/sensorprivacy/OWNERS b/services/tests/mockingservicestests/src/com/android/server/sensorprivacy/OWNERS new file mode 100644 index 000000000000..c74393b102a8 --- /dev/null +++ b/services/tests/mockingservicestests/src/com/android/server/sensorprivacy/OWNERS @@ -0,0 +1,3 @@ +# Bug component: 137825 + +file:platform/frameworks/native:/libs/sensorprivacy/OWNERS diff --git a/services/tests/mockingservicestests/src/com/android/server/sensorprivacy/SensorPrivacyServiceMockingTest.java b/services/tests/mockingservicestests/src/com/android/server/sensorprivacy/SensorPrivacyServiceMockingTest.java new file mode 100644 index 000000000000..844687f34555 --- /dev/null +++ b/services/tests/mockingservicestests/src/com/android/server/sensorprivacy/SensorPrivacyServiceMockingTest.java @@ -0,0 +1,142 @@ +/* + * Copyright (C) 2021 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 com.android.server.sensorprivacy; + +import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; + +import android.app.ActivityManager; +import android.app.ActivityTaskManager; +import android.app.AppOpsManager; +import android.content.Context; +import android.content.pm.UserInfo; +import android.os.Environment; +import android.telephony.TelephonyManager; +import android.testing.AndroidTestingRunner; + +import androidx.test.platform.app.InstrumentationRegistry; + +import com.android.dx.mockito.inline.extended.ExtendedMockito; +import com.android.server.LocalServices; +import com.android.server.SensorPrivacyService; +import com.android.server.pm.UserManagerInternal; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoSession; +import org.mockito.quality.Strictness; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; + +@RunWith(AndroidTestingRunner.class) +public class SensorPrivacyServiceMockingTest { + + private static final String PERSISTENCE_FILE_PATHS_TEMPLATE = + "SensorPrivacyServiceMockingTest/persisted_file%d.xml"; + public static final String PERSISTENCE_FILE1 = + String.format(PERSISTENCE_FILE_PATHS_TEMPLATE, 1); + public static final String PERSISTENCE_FILE2 = + String.format(PERSISTENCE_FILE_PATHS_TEMPLATE, 2); + public static final String PERSISTENCE_FILE3 = + String.format(PERSISTENCE_FILE_PATHS_TEMPLATE, 3); + public static final String PERSISTENCE_FILE4 = + String.format(PERSISTENCE_FILE_PATHS_TEMPLATE, 4); + public static final String PERSISTENCE_FILE5 = + String.format(PERSISTENCE_FILE_PATHS_TEMPLATE, 5); + + private Context mContext; + @Mock + private AppOpsManager mMockedAppOpsManager; + @Mock + private UserManagerInternal mMockedUserManagerInternal; + @Mock + private ActivityManager mMockedActivityManager; + @Mock + private ActivityTaskManager mMockedActivityTaskManager; + @Mock + private TelephonyManager mMockedTelephonyManager; + + @Test + public void testServiceInit() throws IOException { + MockitoSession mockitoSession = ExtendedMockito.mockitoSession() + .initMocks(this) + .strictness(Strictness.WARN) + .spyStatic(LocalServices.class) + .spyStatic(Environment.class) + .startMocking(); + + try { + mContext = InstrumentationRegistry.getInstrumentation().getContext(); + spyOn(mContext); + + doReturn(mMockedAppOpsManager).when(mContext).getSystemService(AppOpsManager.class); + doReturn(mMockedUserManagerInternal) + .when(() -> LocalServices.getService(UserManagerInternal.class)); + doReturn(mMockedActivityManager).when(mContext).getSystemService(ActivityManager.class); + doReturn(mMockedActivityTaskManager) + .when(mContext).getSystemService(ActivityTaskManager.class); + doReturn(mMockedTelephonyManager).when(mContext).getSystemService( + TelephonyManager.class); + + String dataDir = mContext.getApplicationInfo().dataDir; + doReturn(new File(dataDir)).when(() -> Environment.getDataSystemDirectory()); + + File onDeviceFile = new File(dataDir, "sensor_privacy.xml"); + onDeviceFile.delete(); + + // Try all files with one known user + doReturn(new int[]{0}).when(mMockedUserManagerInternal).getUserIds(); + doReturn(ExtendedMockito.mock(UserInfo.class)).when(mMockedUserManagerInternal) + .getUserInfo(0); + initServiceWithPersistenceFile(onDeviceFile, null); + initServiceWithPersistenceFile(onDeviceFile, PERSISTENCE_FILE1); + initServiceWithPersistenceFile(onDeviceFile, PERSISTENCE_FILE2); + initServiceWithPersistenceFile(onDeviceFile, PERSISTENCE_FILE3); + initServiceWithPersistenceFile(onDeviceFile, PERSISTENCE_FILE4); + initServiceWithPersistenceFile(onDeviceFile, PERSISTENCE_FILE5); + + // Try all files with two known users + doReturn(new int[]{0, 10}).when(mMockedUserManagerInternal).getUserIds(); + doReturn(ExtendedMockito.mock(UserInfo.class)).when(mMockedUserManagerInternal) + .getUserInfo(0); + doReturn(ExtendedMockito.mock(UserInfo.class)).when(mMockedUserManagerInternal) + .getUserInfo(10); + initServiceWithPersistenceFile(onDeviceFile, null); + initServiceWithPersistenceFile(onDeviceFile, PERSISTENCE_FILE1); + initServiceWithPersistenceFile(onDeviceFile, PERSISTENCE_FILE2); + initServiceWithPersistenceFile(onDeviceFile, PERSISTENCE_FILE3); + initServiceWithPersistenceFile(onDeviceFile, PERSISTENCE_FILE4); + initServiceWithPersistenceFile(onDeviceFile, PERSISTENCE_FILE5); + + } finally { + mockitoSession.finishMocking(); + } + } + + private void initServiceWithPersistenceFile(File onDeviceFile, + String persistenceFilePath) throws IOException { + if (persistenceFilePath != null) { + Files.copy(mContext.getAssets().open(persistenceFilePath), + onDeviceFile.toPath()); + } + new SensorPrivacyService(mContext); + onDeviceFile.delete(); + } +} |