diff --git a/src/java/com/google/devtools/mobileharness/platform/android/shared/emulator/AndroidJitEmulatorUtil.java b/src/java/com/google/devtools/mobileharness/platform/android/shared/emulator/AndroidJitEmulatorUtil.java index dcaf1405c4..a34e8c6915 100644 --- a/src/java/com/google/devtools/mobileharness/platform/android/shared/emulator/AndroidJitEmulatorUtil.java +++ b/src/java/com/google/devtools/mobileharness/platform/android/shared/emulator/AndroidJitEmulatorUtil.java @@ -40,16 +40,15 @@ private AndroidJitEmulatorUtil() {} public static final String TF_GLOBAL_CONFIG_PATH = "/mtt/scripts/host-config.xml"; public static String getVirtualDeviceNameInTradefed(String deviceId) { - if (!Flags.virtualDeviceServerIp.getNonNull().isEmpty() - && !Flags.virtualDeviceServerUsername.getNonNull().isEmpty()) { - return deviceId; - } Matcher matcher = LOCAL_NOOP_EMULATOR_ID_PATTERN.matcher(deviceId); if (matcher.find()) { return String.format("local-virtual-device-%s", matcher.group(2)); - } else { - return ""; } + if (!Flags.virtualDeviceServerIp.getNonNull().isEmpty() + && !Flags.virtualDeviceServerUsername.getNonNull().isEmpty()) { + return deviceId; + } + return ""; } /** @@ -90,13 +89,28 @@ public static int getPortFromDeviceId(String deviceId) throws MobileHarnessExcep * @return the list of virtual device IDs */ public static ImmutableList getAllVirtualDeviceIds() { - int emulatorNumber = Flags.androidJitEmulatorNum.getNonNull(); + int localEmulatorNumber = Flags.androidJitEmulatorNum.getNonNull(); + int remoteEmulatorNumber = Flags.remoteAndroidJitEmulatorNum.getNonNull(); List emulatorIds = new ArrayList<>(); - if (Flags.noopJitEmulator.getNonNull()) { + // Generate local emulators + if (localEmulatorNumber > 0) { + if (Flags.noopJitEmulator.getNonNull()) { + for (int i = 0; i < localEmulatorNumber; i++) { + emulatorIds.add(String.format("0.0.0.0:local-virtual-device-%d", i)); + } + } else { + for (int i = 0; i < localEmulatorNumber; i++) { + emulatorIds.add(String.format("127.0.0.1:%d", EMULATOR_BASE_PORT + i)); + } + } + } + + // Generate remote emulators + if (remoteEmulatorNumber > 0) { if (!Flags.virtualDeviceServerIp.getNonNull().isEmpty() && !Flags.virtualDeviceServerUsername.getNonNull().isEmpty()) { - for (int i = 0; i < emulatorNumber; i++) { + for (int i = 0; i < remoteEmulatorNumber; i++) { emulatorIds.add( String.format( "gce-device-%s-%d-%s", @@ -104,16 +118,9 @@ public static ImmutableList getAllVirtualDeviceIds() { i, Flags.virtualDeviceServerUsername.getNonNull())); } - } else { - for (int i = 0; i < emulatorNumber; i++) { - emulatorIds.add(String.format("0.0.0.0:local-virtual-device-%d", i)); - } - } - } else { - for (int i = 0; i < emulatorNumber; i++) { - emulatorIds.add(String.format("127.0.0.1:%d", EMULATOR_BASE_PORT + i)); } } + return ImmutableList.copyOf(emulatorIds); } diff --git a/src/java/com/google/devtools/mobileharness/shared/util/flags/Flags.java b/src/java/com/google/devtools/mobileharness/shared/util/flags/Flags.java index b47657bd7a..2f599a1110 100644 --- a/src/java/com/google/devtools/mobileharness/shared/util/flags/Flags.java +++ b/src/java/com/google/devtools/mobileharness/shared/util/flags/Flags.java @@ -183,8 +183,8 @@ public class Flags { @FlagSpec( name = "android_jit_emulator_num", help = - "The maximum number of android Just-in-time emulators that could be run on the server" - + " simultaneously.") + "The maximum number of android Just-in-time emulators that could be run on the local" + + " server simultaneously.") public static final Flag androidJitEmulatorNum = Flag.value(0); @FlagSpec(name = "api_config", help = "Path of the text format protobuf API config file.") @@ -1321,6 +1321,13 @@ private static String getPublicDirDefaultOss() { help = "If this flag is true, all tests will run as real-time tests.") public static final Flag realTimeTest = Flag.value(false); + @FlagSpec( + name = "remote_android_jit_emulator_num", + help = + "The number of remote Android JIT emulators. This is reserved for virtual devices on" + + " remote server, different from android_jit_emulator_num") + public static final Flag remoteAndroidJitEmulatorNum = Flag.value(0); + @FlagSpec( name = "remove_job_gen_files_when_finished", help = "If this flag is true, all job generated files are removed after the job is done.") diff --git a/src/javatests/com/google/devtools/mobileharness/platform/android/shared/emulator/AndroidJitEmulatorUtilTest.java b/src/javatests/com/google/devtools/mobileharness/platform/android/shared/emulator/AndroidJitEmulatorUtilTest.java index 411433e203..7e9abde3cf 100644 --- a/src/javatests/com/google/devtools/mobileharness/platform/android/shared/emulator/AndroidJitEmulatorUtilTest.java +++ b/src/javatests/com/google/devtools/mobileharness/platform/android/shared/emulator/AndroidJitEmulatorUtilTest.java @@ -78,6 +78,25 @@ public void getVirtualDeviceNameInTradefed_remote() { .isEqualTo("gce-device-10.0.0.1-1-mobileharness"); } + @Test + public void getVirtualDeviceNameInTradefed_bothLocalAndRemote() { + flags.setAll( + ImmutableMap.of( + "virtual_device_server_ip", + "10.0.0.1", + "virtual_device_server_username", + "mobileharness")); + // Local device name mapping should still work correctly even if remote flags are set. + assertThat( + AndroidJitEmulatorUtil.getVirtualDeviceNameInTradefed("0.0.0.0:local-virtual-device-0")) + .isEqualTo("local-virtual-device-0"); + // Remote device name mapping should also work correctly. + assertThat( + AndroidJitEmulatorUtil.getVirtualDeviceNameInTradefed( + "gce-device-10.0.0.1-0-mobileharness")) + .isEqualTo("gce-device-10.0.0.1-0-mobileharness"); + } + @Test public void getAllVirtualDeviceIds_defaultSettings_returnsLocalhostPorts() { flags.set("android_jit_emulator_num", "2"); @@ -86,6 +105,30 @@ public void getAllVirtualDeviceIds_defaultSettings_returnsLocalhostPorts() { assertThat(deviceIds).containsExactly("127.0.0.1:6520", "127.0.0.1:6521").inOrder(); } + @Test + public void getAllVirtualDeviceIds_bothLocalAndRemote() { + flags.setAll( + ImmutableMap.of( + "android_jit_emulator_num", + "2", + "remote_android_jit_emulator_num", + "1", + "noop_jit_emulator", + "true", + "virtual_device_server_ip", + "10.0.0.1", + "virtual_device_server_username", + "mobileharness")); + + ImmutableList deviceIds = AndroidJitEmulatorUtil.getAllVirtualDeviceIds(); + assertThat(deviceIds) + .containsExactly( + "0.0.0.0:local-virtual-device-0", + "0.0.0.0:local-virtual-device-1", + "gce-device-10.0.0.1-0-mobileharness") + .inOrder(); + } + @Test public void getPortFromDeviceId_success() throws Exception { assertThat(AndroidJitEmulatorUtil.getPortFromDeviceId("127.0.0.1:6520")).isEqualTo(6520);