Skip to content

Commit 7bd97ef

Browse files
DeviceInfracopybara-github
DeviceInfra
authored andcommitted
Internal change
PiperOrigin-RevId: 737623787
1 parent a41035a commit 7bd97ef

File tree

11 files changed

+157
-49
lines changed

11 files changed

+157
-49
lines changed

src/java/com/google/devtools/mobileharness/api/devicemanager/detector/AndroidJitEmulatorDetector.java

+3-13
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,14 @@
2222
import com.google.devtools.mobileharness.api.devicemanager.detector.model.AndroidEmulatorType;
2323
import com.google.devtools.mobileharness.api.devicemanager.detector.model.DetectionResult;
2424
import com.google.devtools.mobileharness.api.devicemanager.detector.model.DetectionResult.DetectionType;
25-
import com.google.devtools.mobileharness.shared.util.flags.Flags;
25+
import com.google.devtools.mobileharness.platform.android.shared.emulator.AndroidJitEmulatorUtil;
2626
import javax.annotation.Nullable;
2727

2828
/** Detector for Android JIT emulators. */
2929
public final class AndroidJitEmulatorDetector implements Detector {
3030
/** Initialized in {@link #precondition()}. */
3131
@Nullable private volatile ImmutableList<String> emulatorIds;
3232

33-
// Acloud creates cuttlefish emulator with port 6520 + index, where index is instance id minus
34-
// one. Example: "acloud create --local-instance 1" will create a local emulator with port 6520.
35-
// And instance 2 will be 6521, so on and so forth.
36-
private static final int EMULATOR_BASE_PORT = 6520;
37-
3833
public AndroidJitEmulatorDetector() {}
3934

4035
/**
@@ -44,13 +39,8 @@ public AndroidJitEmulatorDetector() {}
4439
*/
4540
@Override
4641
public boolean precondition() {
47-
int emulatorNumber = Flags.instance().androidJitEmulatorNum.getNonNull();
48-
ImmutableList.Builder<String> emulatorIdsBuilder = ImmutableList.builder();
49-
for (int i = 0; i < emulatorNumber; i++) {
50-
emulatorIdsBuilder.add("0.0.0.0:" + (i + EMULATOR_BASE_PORT));
51-
}
52-
emulatorIds = emulatorIdsBuilder.build();
53-
return emulatorNumber > 0;
42+
emulatorIds = AndroidJitEmulatorUtil.getAllVirtualDeviceIds();
43+
return emulatorIds != null && !emulatorIds.isEmpty();
5444
}
5545

5646
/**

src/java/com/google/devtools/mobileharness/api/devicemanager/detector/BUILD

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ java_library(
3434
":base",
3535
"//src/java/com/google/devtools/mobileharness/api/devicemanager/detector/model",
3636
"//src/java/com/google/devtools/mobileharness/api/devicemanager/detector/model:android_emulator_type",
37-
"//src/java/com/google/devtools/mobileharness/shared/util/flags",
37+
"//src/java/com/google/devtools/mobileharness/platform/android/shared/emulator:android_jit_emulator_util",
3838
"@maven//:com_google_code_findbugs_jsr305",
3939
"@maven//:com_google_guava_guava",
4040
],

src/java/com/google/devtools/mobileharness/platform/android/shared/emulator/AndroidJitEmulatorUtil.java

+53-3
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,26 @@
1616

1717
package com.google.devtools.mobileharness.platform.android.shared.emulator;
1818

19+
import com.google.common.collect.ImmutableList;
20+
import com.google.devtools.mobileharness.shared.util.flags.Flags;
21+
import java.util.ArrayList;
22+
import java.util.List;
23+
import java.util.regex.Matcher;
24+
import java.util.regex.Pattern;
25+
1926
/** Utility class for Android JIT emulator. */
2027
public final class AndroidJitEmulatorUtil {
2128

2229
private AndroidJitEmulatorUtil() {}
2330

31+
// Acloud creates cuttlefish emulator with port 6520 + index, where index is instance id minus
32+
// one. Example: "acloud create --local-instance 1" will create a local emulator with port 6520.
33+
// And instance 2 will be 6521, so on and so forth.
2434
public static final int EMULATOR_BASE_PORT = 6520;
2535
public static final int EMULATOR_INSTANCE_ID_BASE = 1;
36+
public static final Pattern LOCAL_NOOP_EMULATOR_ID_PATTERN =
37+
Pattern.compile("^([\\w\\.]+):local-virtual-device-(\\d+)$");
38+
public static final String TF_GLOBAL_CONFIG_PATH = "/mtt/scripts/host-config.xml";
2639

2740
public static String getAcloudInstanceId(String deviceId) {
2841
int instanceIndex = getInstanceIndex(deviceId);
@@ -33,14 +46,51 @@ public static String getAcloudInstanceId(String deviceId) {
3346
}
3447

3548
public static String getVirtualDeviceNameInTradefed(String deviceId) {
36-
int instanceIndex = getInstanceIndex(deviceId);
37-
if (instanceIndex < 0) {
49+
if (!Flags.instance().virtualDeviceServerIp.getNonNull().isEmpty()
50+
&& !Flags.instance().virtualDeviceServerUsername.getNonNull().isEmpty()) {
51+
return deviceId;
52+
}
53+
Matcher matcher = LOCAL_NOOP_EMULATOR_ID_PATTERN.matcher(deviceId);
54+
if (matcher.find()) {
55+
return String.format("local-virtual-device-%s", matcher.group(2));
56+
} else {
3857
return "";
3958
}
40-
return String.format("local-virtual-device-%s", String.valueOf(instanceIndex));
4159
}
4260

4361
private static int getInstanceIndex(String deviceId) {
4462
return Integer.parseInt(deviceId.substring(deviceId.indexOf(':') + 1)) - EMULATOR_BASE_PORT;
4563
}
64+
65+
public static ImmutableList<String> getAllVirtualDeviceIds() {
66+
int emulatorNumber = Flags.instance().androidJitEmulatorNum.getNonNull();
67+
List<String> emulatorIds = new ArrayList<>();
68+
69+
if (Flags.instance().noopJitEmulator.getNonNull()) {
70+
if (!Flags.instance().virtualDeviceServerIp.getNonNull().isEmpty()
71+
&& !Flags.instance().virtualDeviceServerUsername.getNonNull().isEmpty()) {
72+
for (int i = 0; i < emulatorNumber; i++) {
73+
emulatorIds.add(
74+
String.format(
75+
"gce-device-%s-%d-%s",
76+
Flags.instance().virtualDeviceServerIp.getNonNull(),
77+
i,
78+
Flags.instance().virtualDeviceServerUsername.getNonNull()));
79+
}
80+
} else {
81+
for (int i = 0; i < emulatorNumber; i++) {
82+
emulatorIds.add(String.format("0.0.0.0:local-virtual-device-%d", i));
83+
}
84+
}
85+
} else {
86+
for (int i = 0; i < emulatorNumber; i++) {
87+
emulatorIds.add(String.format("0.0.0.0:%d", EMULATOR_BASE_PORT + i));
88+
}
89+
}
90+
return ImmutableList.copyOf(emulatorIds);
91+
}
92+
93+
public static String getHostConfigPath() {
94+
return TF_GLOBAL_CONFIG_PATH;
95+
}
4696
}

src/java/com/google/devtools/mobileharness/platform/android/shared/emulator/BUILD

+5-7
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,12 @@ java_library(
3333
name = "android_jit_emulator_util",
3434
srcs = ["AndroidJitEmulatorUtil.java"],
3535
visibility = [
36+
"//src/java/com/google/devtools/mobileharness/api/devicemanager/detector:__subpackages__",
3637
"//src/java/com/google/wireless/qa/mobileharness/shared/api:__subpackages__",
38+
"//src/javatests/com/google/devtools/mobileharness/platform/android/shared/emulator:__subpackages__",
3739
],
38-
)
39-
40-
filegroup(
41-
name = "tf_virtual_device_host_config",
42-
srcs = ["host-config.xml"],
43-
visibility = [
44-
"//src/java/com/google/wireless/qa/mobileharness/shared/api:__subpackages__",
40+
deps = [
41+
"//src/java/com/google/devtools/mobileharness/shared/util/flags",
42+
"@maven//:com_google_guava_guava",
4543
],
4644
)

src/java/com/google/devtools/mobileharness/platform/android/shared/emulator/host-config.xml

-5
This file was deleted.

src/java/com/google/devtools/mobileharness/shared/util/flags/Flags.java

+16
Original file line numberDiff line numberDiff line change
@@ -1817,6 +1817,22 @@ private static String getTmpDirRootDefaultOss() {
18171817
converter = Flag.BooleanConverter.class)
18181818
public Flag<Boolean> useTfRetry = useTfRetryDefault;
18191819

1820+
private static final Flag<String> virtualDeviceServerIpDefault = Flag.value("");
1821+
1822+
@com.beust.jcommander.Parameter(
1823+
names = "--virtual_device_server_ip",
1824+
description = "The IP address of the remote virtual device server.",
1825+
converter = Flag.StringConverter.class)
1826+
public Flag<String> virtualDeviceServerIp = virtualDeviceServerIpDefault;
1827+
1828+
private static final Flag<String> virtualDeviceServerUsernameDefault = Flag.value("");
1829+
1830+
@com.beust.jcommander.Parameter(
1831+
names = "--virtual_device_server_username",
1832+
description = "The username of the remote virtual device server.",
1833+
converter = Flag.StringConverter.class)
1834+
public Flag<String> virtualDeviceServerUsername = virtualDeviceServerUsernameDefault;
1835+
18201836
private static final Flag<Boolean> xtsDisableTfResultLogDefault = Flag.value(true);
18211837

18221838
@com.beust.jcommander.Parameter(

src/java/com/google/wireless/qa/mobileharness/shared/api/device/AndroidJitEmulator.java

+6-3
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,8 @@ public AndroidJitEmulator(String deviceId) {
8282
@Override
8383
public void setUp() throws MobileHarnessException, InterruptedException {
8484
logger.atInfo().log("JIT emulator start setup. %s", deviceId);
85-
addDimension(Ascii.toLowerCase(AndroidProperty.ABILIST.name()), "x86_64");
86-
addDimension(Ascii.toLowerCase(AndroidProperty.ABI.name()), "x86_64");
85+
addDimension(Ascii.toLowerCase(AndroidProperty.ABILIST.name()), "x86_64,arm64-v8a");
86+
addDimension(Ascii.toLowerCase(AndroidProperty.ABI.name()), "arm64-v8a");
8787
addSupportedDriver("NoOpDriver");
8888
addSupportedDriver("AndroidInstrumentation");
8989
addSupportedDriver("MoblyTest");
@@ -103,7 +103,10 @@ public void setUp() throws MobileHarnessException, InterruptedException {
103103
@Override
104104
public void preRunTest(TestInfo testInfo) throws MobileHarnessException, InterruptedException {
105105
if (Flags.instance().noopJitEmulator.getNonNull()) {
106-
logger.atInfo().log("JIT emulator %s is no-op", deviceId);
106+
logger.atInfo().log(
107+
"JIT emulator %s is no-op. Tradefed will be responsible for actually launching the"
108+
+ " emulator.",
109+
deviceId);
107110
return;
108111
}
109112
String imgZip = testInfo.jobInfo().files().getSingle("device");

src/java/com/google/wireless/qa/mobileharness/shared/api/driver/BUILD

-1
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,6 @@ java_library(
244244
srcs = ["XtsTradefedTest.java"],
245245
resources = [
246246
"//src/devtools/mobileharness/infra/controller/test/util/xtsdownloader/configs:mcts_list",
247-
"//src/java/com/google/devtools/mobileharness/platform/android/shared/emulator:tf_virtual_device_host_config",
248247
"//src/java/com/google/devtools/mobileharness/platform/android/xts/agent:tradefed_invocation_agent_deploy.jar",
249248
],
250249
deps = [

src/java/com/google/wireless/qa/mobileharness/shared/api/driver/XtsTradefedTest.java

+2-8
Original file line numberDiff line numberDiff line change
@@ -160,9 +160,6 @@ public class XtsTradefedTest extends BaseDriver
160160
private static final String STATIC_MCTS_LIST_FILE_PATH =
161161
"/devtools/mobileharness/infra/controller/test/util/xtsdownloader/configs/mcts_list.txt";
162162

163-
private static final String TF_VIRTUAL_DEVICE_HOST_CONFIG =
164-
"/com/google/devtools/mobileharness/platform/android/shared/emulator/host-config.xml";
165-
166163
private final CommandExecutor cmdExecutor;
167164
private final LocalFileUtil localFileUtil;
168165
private final SystemUtil systemUtil;
@@ -793,7 +790,8 @@ private ImmutableMap<String, String> getEnvironmentToTradefedConsole(
793790
environmentToTradefedConsole.put("PATH", getEnvPath());
794791
environmentToTradefedConsole.put("TF_WORK_DIR", tmpXtsRootDir.toString());
795792
if (getDevice().hasDimension(Dimension.Name.DEVICE_CLASS_NAME, "AndroidJitEmulator")) {
796-
environmentToTradefedConsole.put("TF_GLOBAL_CONFIG", getTradefedVirtualDeviceHostConfig());
793+
environmentToTradefedConsole.put(
794+
"TF_GLOBAL_CONFIG", AndroidJitEmulatorUtil.getHostConfigPath());
797795
}
798796
if (!spec.getEnvVars().isEmpty()) {
799797
String envVarJson = spec.getEnvVars();
@@ -1275,8 +1273,4 @@ private String getTradefedAgentFilePath() throws MobileHarnessException {
12751273
private String getStaticMctsListFilePath() throws MobileHarnessException {
12761274
return resUtil.getResourceFile(getClass(), STATIC_MCTS_LIST_FILE_PATH);
12771275
}
1278-
1279-
private String getTradefedVirtualDeviceHostConfig() throws MobileHarnessException {
1280-
return resUtil.getResourceFile(getClass(), TF_VIRTUAL_DEVICE_HOST_CONFIG);
1281-
}
12821276
}

src/javatests/com/google/devtools/mobileharness/platform/android/shared/emulator/AndroidJitEmulatorUtilTest.java

+42-8
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,18 @@
1818

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

21+
import com.google.common.collect.ImmutableMap;
22+
import com.google.devtools.mobileharness.shared.util.junit.rule.SetFlagsOss;
23+
import org.junit.Rule;
2124
import org.junit.Test;
2225
import org.junit.runner.RunWith;
2326
import org.junit.runners.JUnit4;
2427

2528
@RunWith(JUnit4.class)
2629
public final class AndroidJitEmulatorUtilTest {
2730

31+
@Rule public final SetFlagsOss flags = new SetFlagsOss();
32+
2833
@Test
2934
public void getAcloudInstanceId() {
3035
assertThat(AndroidJitEmulatorUtil.getAcloudInstanceId("localhost:6521")).isEqualTo("2");
@@ -36,18 +41,47 @@ public void getAcloudInstanceId() {
3641
}
3742

3843
@Test
39-
public void getVirtualDeviceNameInTradefed() {
40-
assertThat(AndroidJitEmulatorUtil.getVirtualDeviceNameInTradefed("localhost:6521"))
44+
public void getVirtualDeviceNameInTradefed_local() {
45+
assertThat(
46+
AndroidJitEmulatorUtil.getVirtualDeviceNameInTradefed(
47+
"localhost:local-virtual-device-1"))
4148
.isEqualTo("local-virtual-device-1");
42-
assertThat(AndroidJitEmulatorUtil.getVirtualDeviceNameInTradefed("localhost:6520"))
49+
assertThat(
50+
AndroidJitEmulatorUtil.getVirtualDeviceNameInTradefed("0.0.0.0:local-virtual-device-0"))
4351
.isEqualTo("local-virtual-device-0");
44-
assertThat(AndroidJitEmulatorUtil.getVirtualDeviceNameInTradefed("localhost:6522"))
52+
assertThat(
53+
AndroidJitEmulatorUtil.getVirtualDeviceNameInTradefed(
54+
"localhost:local-virtual-device-2"))
4555
.isEqualTo("local-virtual-device-2");
46-
assertThat(AndroidJitEmulatorUtil.getVirtualDeviceNameInTradefed("localhost:6523"))
56+
assertThat(
57+
AndroidJitEmulatorUtil.getVirtualDeviceNameInTradefed(
58+
"localhost:local-virtual-device-3"))
4759
.isEqualTo("local-virtual-device-3");
48-
assertThat(AndroidJitEmulatorUtil.getVirtualDeviceNameInTradefed("localhost:6524"))
60+
assertThat(
61+
AndroidJitEmulatorUtil.getVirtualDeviceNameInTradefed(
62+
"localhost:local-virtual-device-4"))
4963
.isEqualTo("local-virtual-device-4");
50-
assertThat(AndroidJitEmulatorUtil.getVirtualDeviceNameInTradefed("localhost:6510"))
51-
.isEqualTo("");
64+
assertThat(
65+
AndroidJitEmulatorUtil.getVirtualDeviceNameInTradefed(
66+
"localhost:local-virtual-device-5"))
67+
.isEqualTo("local-virtual-device-5");
68+
}
69+
70+
@Test
71+
public void getVirtualDeviceNameInTradefed_remote() {
72+
flags.setAllFlags(
73+
ImmutableMap.of(
74+
"virtual_device_server_ip",
75+
"10.0.0.1",
76+
"virtual_device_server_username",
77+
"mobileharness"));
78+
assertThat(
79+
AndroidJitEmulatorUtil.getVirtualDeviceNameInTradefed(
80+
"gce-device-10.0.0.1-0-mobileharness"))
81+
.isEqualTo("gce-device-10.0.0.1-0-mobileharness");
82+
assertThat(
83+
AndroidJitEmulatorUtil.getVirtualDeviceNameInTradefed(
84+
"gce-device-10.0.0.1-1-mobileharness"))
85+
.isEqualTo("gce-device-10.0.0.1-1-mobileharness");
5286
}
5387
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Copyright 2022 Google LLC
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# https://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
#
15+
16+
load("@rules_java//java:java_test.bzl", "java_test")
17+
18+
java_test(
19+
name = "AndroidJitEmulatorUtilTest",
20+
size = "small",
21+
srcs = ["AndroidJitEmulatorUtilTest.java"],
22+
deps = [
23+
"//src/java/com/google/devtools/mobileharness/platform/android/shared/emulator:android_jit_emulator_util",
24+
"//src/javatests/com/google/devtools/mobileharness/builddefs:truth",
25+
"//src/javatests/com/google/devtools/mobileharness/shared/util/junit/rule:set_flags_oss",
26+
"@maven//:com_google_guava_guava",
27+
"@maven//:junit_junit",
28+
],
29+
)

0 commit comments

Comments
 (0)