From 5a38385882f451215e7561ecfac96cc937394096 Mon Sep 17 00:00:00 2001 From: Artur Satayev Date: Tue, 1 Feb 2022 13:46:38 +0000 Subject: [PATCH] Revert "Revert "Introduce initOrder for apex-system-services."" This reverts commit 1352272eb620f8c52e840340a0d96f6dc019f265. Reason for revert: rollforward with a fix. Add waitForBootComplete() after installing test apex and inspecting logcat. Bug: 192880996 Test: atest ApexSystemServicesTestCases PackageParserTest ApexManagerTestChange-Id: I7a238b439fc25da4ae1ab379cc66e54565dac293 Change-Id: I0270c24c471d8e7391260b7f731b6c0fb2fa0662 --- core/res/res/values/attrs_manifest.xml | 8 +++ .../com/android/server/pm/ApexManager.java | 35 ++++++----- .../server/pm/ApexSystemServiceInfo.java | 58 +++++++++++++++++++ .../component/ParsedApexSystemService.java | 3 + .../ParsedApexSystemServiceImpl.java | 30 +++++++--- .../ParsedApexSystemServiceUtils.java | 5 +- .../java/com/android/server/SystemServer.java | 21 ++++--- .../apexes/test_com.android.server/Android.bp | 2 +- .../AndroidManifest.xml | 20 +++++-- .../{service => services}/Android.bp | 2 +- .../server/testing/FakeApexSystemService.java | 0 .../testing/FakeApexSystemService2.java | 41 +++++++++++++ .../server/ApexSystemServicesTestCases.java | 45 +++++++++++++- .../android/server/pm/ApexManagerTest.java | 7 ++- 14 files changed, 234 insertions(+), 43 deletions(-) create mode 100644 services/core/java/com/android/server/pm/ApexSystemServiceInfo.java rename services/tests/apexsystemservices/{service => services}/Android.bp (94%) rename services/tests/apexsystemservices/{service => services}/src/com/android/server/testing/FakeApexSystemService.java (100%) create mode 100644 services/tests/apexsystemservices/services/src/com/android/server/testing/FakeApexSystemService2.java diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml index 3a2fb6e70ba86..cb40e86f15359 100644 --- a/core/res/res/values/attrs_manifest.xml +++ b/core/res/res/values/attrs_manifest.xml @@ -2839,6 +2839,14 @@ + + diff --git a/services/tests/apexsystemservices/service/Android.bp b/services/tests/apexsystemservices/services/Android.bp similarity index 94% rename from services/tests/apexsystemservices/service/Android.bp rename to services/tests/apexsystemservices/services/Android.bp index 9d04f39f2237a..477ea4cdad37a 100644 --- a/services/tests/apexsystemservices/service/Android.bp +++ b/services/tests/apexsystemservices/services/Android.bp @@ -8,7 +8,7 @@ package { } java_library { - name: "FakeApexSystemService", + name: "FakeApexSystemServices", srcs: ["**/*.java"], sdk_version: "system_server_current", libs: [ diff --git a/services/tests/apexsystemservices/service/src/com/android/server/testing/FakeApexSystemService.java b/services/tests/apexsystemservices/services/src/com/android/server/testing/FakeApexSystemService.java similarity index 100% rename from services/tests/apexsystemservices/service/src/com/android/server/testing/FakeApexSystemService.java rename to services/tests/apexsystemservices/services/src/com/android/server/testing/FakeApexSystemService.java diff --git a/services/tests/apexsystemservices/services/src/com/android/server/testing/FakeApexSystemService2.java b/services/tests/apexsystemservices/services/src/com/android/server/testing/FakeApexSystemService2.java new file mode 100644 index 0000000000000..e83343b9c996d --- /dev/null +++ b/services/tests/apexsystemservices/services/src/com/android/server/testing/FakeApexSystemService2.java @@ -0,0 +1,41 @@ +/* + * 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.testing; + +import android.content.Context; +import android.util.Log; + +import androidx.annotation.NonNull; + +import com.android.server.SystemService; + +/** + * A fake system service that just logs when it is started. + */ +public class FakeApexSystemService2 extends SystemService { + + private static final String TAG = "FakeApexSystemService"; + + public FakeApexSystemService2(@NonNull Context context) { + super(context); + } + + @Override + public void onStart() { + Log.d(TAG, "FakeApexSystemService2 onStart"); + } +} diff --git a/services/tests/apexsystemservices/src/com/android/server/ApexSystemServicesTestCases.java b/services/tests/apexsystemservices/src/com/android/server/ApexSystemServicesTestCases.java index 2b453a9265bb1..10635a138eb96 100644 --- a/services/tests/apexsystemservices/src/com/android/server/ApexSystemServicesTestCases.java +++ b/services/tests/apexsystemservices/src/com/android/server/ApexSystemServicesTestCases.java @@ -37,9 +37,15 @@ import org.junit.rules.RuleChain; import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; +import java.util.Objects; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + @RunWith(DeviceJUnit4ClassRunner.class) public class ApexSystemServicesTestCases extends BaseHostJUnit4Test { + private static final int REBOOT_TIMEOUT = 1 * 60 * 1000; + private final InstallUtilsHost mHostUtils = new InstallUtilsHost(this); private final TemporaryFolder mTemporaryFolder = new TemporaryFolder(); private final SystemPreparer mPreparer = new SystemPreparer(mTemporaryFolder, this::getDevice); @@ -67,7 +73,7 @@ public class ApexSystemServicesTestCases extends BaseHostJUnit4Test { } @Test - public void noApexSystemServerStartsWithoutApex() throws Exception { + public void testNoApexSystemServiceStartsWithoutApex() throws Exception { mPreparer.reboot(); assertThat(getFakeApexSystemServiceLogcat()) @@ -75,20 +81,55 @@ public class ApexSystemServicesTestCases extends BaseHostJUnit4Test { } @Test - public void apexSystemServerStarts() throws Exception { + public void testApexSystemServiceStarts() throws Exception { // Pre-install the apex String apex = "test_com.android.server.apex"; mPreparer.pushResourceFile(apex, "/system/apex/" + apex); // Reboot activates the apex mPreparer.reboot(); + mDevice.waitForBootComplete(REBOOT_TIMEOUT); + assertThat(getFakeApexSystemServiceLogcat()) .contains("FakeApexSystemService onStart"); } + @Test + public void testInitOrder() throws Exception { + // Pre-install the apex + String apex = "test_com.android.server.apex"; + mPreparer.pushResourceFile(apex, "/system/apex/" + apex); + // Reboot activates the apex + mPreparer.reboot(); + + mDevice.waitForBootComplete(REBOOT_TIMEOUT); + + assertThat(getFakeApexSystemServiceLogcat().lines() + .map(ApexSystemServicesTestCases::getDebugMessage) + .filter(Objects::nonNull) + .collect(Collectors.toList())) + .containsExactly( + // Second service has a higher initOrder and must be started first + "FakeApexSystemService2 onStart", + "FakeApexSystemService onStart" + ) + .inOrder(); + } + private String getFakeApexSystemServiceLogcat() throws DeviceNotAvailableException { return mDevice.executeAdbCommand("logcat", "-v", "brief", "-d", "FakeApexSystemService:D", "*:S"); } + private static final Pattern DEBUG_MESSAGE = + Pattern.compile("(FakeApexSystemService[0-9]* onStart)"); + + private static String getDebugMessage(String logcatLine) { + return DEBUG_MESSAGE.matcher(logcatLine) + .results() + .map(m -> m.group(1)) + .findFirst() + .orElse(null); + } + } diff --git a/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java index 7f7c716bc1f05..2f5993d1d9895 100644 --- a/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java @@ -61,7 +61,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.util.Map; +import java.util.List; @SmallTest @Presubmit @@ -136,9 +136,10 @@ public class ApexManagerTest { mApexManager.scanApexPackagesTraced(mPackageParser2, ParallelPackageParser.makeExecutorService()); - Map services = mApexManager.getApexSystemServices(); + List services = mApexManager.getApexSystemServices(); assertThat(services).hasSize(1); - assertThat(services).containsKey("com.android.apex.test.ApexSystemService"); + assertThat(services.stream().map(ApexSystemServiceInfo::getName).findFirst().orElse(null)) + .matches("com.android.apex.test.ApexSystemService"); } @Test