Create mocking test for SensorPrivacyService
The current test verifies that the service parses the persisted state and
initializes successfully.
Test: Checkout multiple previous manifests and cherry pick this and run
`atest SensorPrivacyServiceMockingTest`.
Bug: 186904124
Change-Id: I2990910daa6f240655ba09686e4f5e489dd10995
This commit is contained in:
@@ -36,6 +36,15 @@
|
||||
}
|
||||
],
|
||||
"file_patterns": ["ClipboardService\\.java"]
|
||||
},
|
||||
{
|
||||
"name": "FrameworksMockingServicesTests",
|
||||
"options": [
|
||||
{
|
||||
"include-filter": "com.android.server.sensorprivacy"
|
||||
}
|
||||
],
|
||||
"file_patterns": ["SensorPrivacyService\\.java"]
|
||||
}
|
||||
],
|
||||
"presubmit-large": [
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
# Bug component: 137825
|
||||
|
||||
file:platform/frameworks/native:/libs/sensorprivacy/OWNERS
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -0,0 +1,3 @@
|
||||
# Bug component: 137825
|
||||
|
||||
file:platform/frameworks/native:/libs/sensorprivacy/OWNERS
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user