aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Marie Henaff <jmhenaff@google.com>2017-10-04 10:39:27 +0200
committerJean-Marie Henaff <jmhenaff@google.com>2017-10-04 10:39:27 +0200
commitce162f3ba18765eb525026f349692d4229acc7f8 (patch)
tree4e3394a3c04f4df7bed7c7d7ab9af54b699ab565
parentccafacdda126fdd00e62e98b0d96e4495e608cd7 (diff)
downloadr8-ce162f3ba18765eb525026f349692d4229acc7f8.tar.gz
Enable run of tests on devices and emulators
This CL updates the DexVm enum to add add an information about the kind of runtime used to run the tests, whether it's a host version of the runtime or a target one (device or emulator). It adds also the DeviceRunner class which drives the target device for the tests. Change-Id: I10666951f083a4f1da2efe3e9d368803a223a1b2 Bug:
-rw-r--r--build.gradle2
-rw-r--r--scripts/test-exit-status.sh8
-rw-r--r--src/test/examples/filledarray/FilledArray.java3
-rw-r--r--src/test/java/com/android/tools/r8/DeviceRunner.java532
-rw-r--r--src/test/java/com/android/tools/r8/JctfTestSpecifications.java227
-rw-r--r--src/test/java/com/android/tools/r8/R8RunArtTestsTest.java169
-rw-r--r--src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java13
-rw-r--r--src/test/java/com/android/tools/r8/R8RunExamplesTest.java13
-rw-r--r--src/test/java/com/android/tools/r8/R8RunSmaliTestsTest.java28
-rw-r--r--src/test/java/com/android/tools/r8/RunExamplesAndroidNTest.java12
-rw-r--r--src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java25
-rw-r--r--src/test/java/com/android/tools/r8/TestCondition.java16
-rw-r--r--src/test/java/com/android/tools/r8/ToolHelper.java208
-rw-r--r--src/test/java/com/android/tools/r8/debug/DebugTestBase.java11
-rw-r--r--src/test/java/com/android/tools/r8/debug/InterfaceMethodTest.java3
-rw-r--r--src/test/java/com/android/tools/r8/graph/TargetLookupTest.java3
-rw-r--r--src/test/java/com/android/tools/r8/jasmin/FillBooleanArrayTruncation.java2
-rw-r--r--src/test/java/com/android/tools/r8/jdwp/RunJdwpTests.java14
-rw-r--r--src/test/java/com/android/tools/r8/rewrite/staticvalues/inlibraries/StaticLibraryValuesChangeTest.java3
-rw-r--r--src/test/java/com/android/tools/r8/utils/ArtCommandBuilderTest.java2
-rwxr-xr-xtools/create_art_tests.py6
-rwxr-xr-xtools/test.py9
22 files changed, 1005 insertions, 304 deletions
diff --git a/build.gradle b/build.gradle
index e10d9e0e4..1ad9b98e6 100644
--- a/build.gradle
+++ b/build.gradle
@@ -140,6 +140,7 @@ dependencies {
testCompile group: 'org.smali', name: 'smali', version: '2.2b4'
testCompile files('third_party/jasmin/jasmin-2.4.jar')
testCompile files('third_party/jdwp-tests/apache-harmony-jdwp-tests-host.jar')
+ testCompile files('third_party/ddmlib/ddmlib.jar')
jctfCommonCompile 'junit:junit:4.12'
jctfTestsCompile 'junit:junit:4.12'
jctfTestsCompile sourceSets.jctfCommon.output
@@ -202,6 +203,7 @@ def cloudDependencies = [
"kotlin",
"android_cts_baseline",
"shadow",
+ "ddmlib",
],
// All dex-vms have a fixed OS of Linux, as they are only supported on Linux, and will be run in a Docker
// container on other platforms where supported.
diff --git a/scripts/test-exit-status.sh b/scripts/test-exit-status.sh
new file mode 100644
index 000000000..2fa99d5d8
--- /dev/null
+++ b/scripts/test-exit-status.sh
@@ -0,0 +1,8 @@
+# Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+UUID=$1
+shift
+eval "$@"
+echo $? > /data/r8-tests-$UUID/exitStatus
diff --git a/src/test/examples/filledarray/FilledArray.java b/src/test/examples/filledarray/FilledArray.java
index 46c437c87..4e0c65239 100644
--- a/src/test/examples/filledarray/FilledArray.java
+++ b/src/test/examples/filledarray/FilledArray.java
@@ -10,8 +10,7 @@ public class FilledArray {
private static byte[] bytes = new byte[] {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, -19, -20, -96,
Byte.MAX_VALUE, Byte.MIN_VALUE };
- private static char[] chars = new char[] {
- Character.MAX_VALUE, 'a', 'b', 'c', 'd', Character.MIN_VALUE };
+ private static char[] chars = new char[] {'a', 'b', 'c', 'd'};
private static int[] ints = new int[] { Integer.MAX_VALUE, 0, -42, 42, Integer.MIN_VALUE };
private static short[] shorts = new short[] { Short.MAX_VALUE, 0, -42, 42, Short.MIN_VALUE };
private static long[] longs = new long[] {
diff --git a/src/test/java/com/android/tools/r8/DeviceRunner.java b/src/test/java/com/android/tools/r8/DeviceRunner.java
new file mode 100644
index 000000000..fc9103263
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/DeviceRunner.java
@@ -0,0 +1,532 @@
+// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8;
+
+import com.android.tools.r8.utils.StringUtils;
+import com.google.common.base.Joiner;
+
+import com.android.ddmlib.AdbCommandRejectedException;
+import com.android.ddmlib.AndroidDebugBridge;
+import com.android.ddmlib.FileListingService;
+import com.android.ddmlib.IDevice;
+import com.android.ddmlib.IShellOutputReceiver;
+import com.android.ddmlib.ShellCommandUnresponsiveException;
+import com.android.ddmlib.SyncException;
+import com.android.ddmlib.TimeoutException;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * This class is used to run tests on devices (or emulators)
+ * using ddmlib.
+ */
+public class DeviceRunner {
+
+ private static final boolean VERBOSE = false;
+ private static final long ADB_CONNECTION_TIMEOUT = 5000;
+ private static final long ADB_WAIT_STEP = ADB_CONNECTION_TIMEOUT / 10;
+ private static final String TEST_SCRIPT_NAME = "test-exit-status.sh";
+ private static final File TEST_SCRIPT_FILE =
+ new File(System.getProperty("user.dir"), "scripts/" + TEST_SCRIPT_NAME);
+ private static final char PATH_SEPARATOR_CHAR = ':';
+ private static final String RUNTIME_NAME = "ART";
+
+ private List<String> vmOptions = Collections.emptyList();
+ private Map<String, String> systemProperties = Collections.emptyMap();
+ private List<File> classpath = Collections.emptyList();
+ private List<File> bootClasspath = Collections.emptyList();
+ private String mainClass;
+ private List<String> programArguments = Collections.emptyList();
+ private OutputStream outRedirectStream = new ByteArrayOutputStream();
+
+ private ShellOutputReceiver hostOutput = new ShellOutputReceiver();
+
+ public static class DeviceRunnerConfigurationException extends Exception {
+
+ public DeviceRunnerConfigurationException(String message) {
+ super(message);
+ }
+ }
+
+ private static class ShellOutputReceiver implements IShellOutputReceiver {
+
+ private final PrintStream out;
+
+ public ShellOutputReceiver() {
+ this.out = System.out;
+ }
+
+ public ShellOutputReceiver(OutputStream out) {
+ this.out = new PrintStream(out);
+ }
+
+ @Override
+ public void addOutput(byte[] data, int offset, int length) {
+ out.print(new String(Arrays.copyOfRange(data, offset, offset + length)));
+ }
+
+ @Override
+ public void flush() {
+ }
+
+ @Override
+ public boolean isCancelled() {
+ return false;
+ }
+ }
+
+ private static class ShellOutputToStringReceiver implements IShellOutputReceiver {
+
+ StringBuffer outBuffer = new StringBuffer();
+
+ @Override
+ public void addOutput(byte[] data, int offset, int length) {
+ outBuffer.append(new String(Arrays.copyOfRange(data, offset, offset + length)));
+ }
+
+ @Override
+ public void flush() {
+ }
+
+ @Override
+ public boolean isCancelled() {
+ return false;
+ }
+
+ public String getOutput() {
+ return outBuffer.toString();
+ }
+ }
+
+ public DeviceRunner() {
+ try {
+ AndroidDebugBridge.init(/* clientSupport */ false);
+ } catch (IllegalStateException ex) {
+ // ADB was already initialized, we're fine, so just ignore.
+ }
+ }
+
+ public DeviceRunner setVmOptions(List<String> vmOptions) {
+ this.vmOptions = vmOptions;
+ return this;
+ }
+
+ public DeviceRunner setSystemProperties(Map<String, String> systemProperties) {
+ this.systemProperties = systemProperties;
+ return this;
+ }
+
+ public DeviceRunner setClasspath(List<File> classpath) {
+ this.classpath = classpath;
+ return this;
+ }
+
+ public DeviceRunner setBootClasspath(List<File> bootClasspath) {
+ this.bootClasspath = bootClasspath;
+ return this;
+ }
+
+ public DeviceRunner setMainClass(String mainClass) {
+ this.mainClass = mainClass;
+ return this;
+ }
+
+ public DeviceRunner setProgramArguments(List<String> programArguments) {
+ this.programArguments = programArguments;
+ return this;
+ }
+
+ public DeviceRunner setOutputStream(OutputStream outputStream) {
+ outRedirectStream = outputStream;
+ return this;
+ }
+
+ public ToolHelper.ProcessResult run() throws DeviceRunnerConfigurationException, IOException {
+
+ AndroidDebugBridge adb = initializeAdb();
+
+ IDevice[] connectedDevices = adb.getDevices();
+ if (connectedDevices.length == 0) {
+ throw new DeviceRunnerConfigurationException("No device found");
+ }
+
+ if (connectedDevices.length != 1) {
+ throw new DeviceRunnerConfigurationException(
+ "Running tests on more than one device is not yet supported. "
+ + "Currently connected devices: ["
+ + StringUtils.join(Arrays.asList(connectedDevices), ",") + "]");
+ }
+
+ int exitStatus = -1;
+ String uuid = java.util.UUID.randomUUID().toString();
+ IDevice device = connectedDevices[0];
+ try {
+ checkDeviceRuntime(device);
+
+ log("Running on device: " + device.getName());
+
+ ensureAdbRoot(device);
+
+ // Remove trailing '\n' returned by emulator
+ File testsRootDirFile = new File(device.getMountPoint(IDevice.MNT_DATA).replace("\n", ""),
+ "r8-tests-" + uuid);
+ String testsRootDir = convertToTargetPath(testsRootDirFile);
+
+ String testScriptPathOnTarget = convertToTargetPath(
+ new File(testsRootDirFile, TEST_SCRIPT_NAME));
+
+ ClasspathPair destFilePaths = installTestFiles(device, testsRootDirFile,
+ testScriptPathOnTarget);
+
+ File rootDir = new File(device.getMountPoint(IDevice.MNT_ROOT).replace("\n", ""));
+
+ // Bug : exit code return by adb shell is wrong (always 0)
+ // https://code.google.com/p/android/issues/detail?id=3254
+ // Use go team hack to work this around
+ // https://code.google.com/p/go/source/browse/misc/arm/a
+ executeShellCommand(testScriptPathOnTarget + ' ' + uuid + ' ' + Joiner.on(' ').join(
+ buildCommandLine(rootDir, testsRootDir, destFilePaths.bootclasspath,
+ destFilePaths.classpath)), device, new ShellOutputReceiver(outRedirectStream),
+ /* maxTimeToOutputResponse = */10000);
+ exitStatus = getExitStatus(device, testsRootDir);
+ log("Exit status: " + exitStatus);
+
+ if (exitStatus != 0) {
+ System.err.println("Execution failed on device '" + device.getName() + "'");
+ }
+
+ } catch (IOException t) {
+ System.err.println("Error with device '" + device.getName() + "': " + t.getMessage());
+ t.printStackTrace();
+ throw t;
+ } finally {
+ deleteTestFiles(device, uuid);
+ }
+
+ // Convert target line separator to whatever host is for output comparison-based tests
+ String outputAsString = outRedirectStream.toString()
+ .replace("\n", ToolHelper.LINE_SEPARATOR);
+
+ return new ToolHelper.ProcessResult(exitStatus, outputAsString, "");
+ }
+
+ private AndroidDebugBridge initializeAdb() throws DeviceRunnerConfigurationException {
+ AndroidDebugBridge adb = AndroidDebugBridge.createBridge(getAdbLocation(), false);
+
+ long start = System.currentTimeMillis();
+
+ log("Initializing adb...");
+
+ while (!isAdbInitialized(adb)) {
+ long timeLeft = start + ADB_CONNECTION_TIMEOUT - System.currentTimeMillis();
+ if (timeLeft <= 0) {
+ break;
+ }
+ try {
+ Thread.sleep(ADB_WAIT_STEP);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ throw new AssertionError(e);
+ }
+ }
+
+ if (!isAdbInitialized(adb)) {
+ String userDefinedPathToSdk = System.getProperty("ANDROID_SDK_HOME");
+ if (userDefinedPathToSdk != null) {
+ throw new DeviceRunnerConfigurationException(
+ "Adb not found. Check SDK location '"
+ + userDefinedPathToSdk
+ + "'");
+ } else {
+ throw new DeviceRunnerConfigurationException(
+ "Adb not found. Set either PATH or ANDROID_SDK_HOME environment variable");
+ }
+ }
+
+ log("Done");
+ return adb;
+ }
+
+ private static class ClasspathPair {
+ public String[] bootclasspath;
+ public String[] classpath;
+
+ ClasspathPair(String[] bootclasspath, String[] classpath) {
+ this.bootclasspath = bootclasspath;
+ this.classpath = classpath;
+ }
+ }
+
+ /**
+ * @return path of classpath and bootclasspath files on device
+ */
+ private ClasspathPair installTestFiles(IDevice device, File testsRootDirFile,
+ String testScriptPathOnTarget) throws IOException {
+
+ String testsRootDir = convertToTargetPath(testsRootDirFile);
+
+ String[] desFilePaths = new String[classpath.size()];
+ String[] destFileBootCpPaths = new String[bootClasspath.size()];
+
+ executeShellCommand("mkdir " + testsRootDir, device);
+ executeShellCommand(
+ "rm " + testsRootDir + FileListingService.FILE_SEPARATOR + "*", device);
+ executePushCommand(TEST_SCRIPT_FILE.getAbsolutePath(), testScriptPathOnTarget, device);
+ executeShellCommand("chmod 777 " + testScriptPathOnTarget, device);
+
+ int i = 0;
+ for (File f : bootClasspath) {
+ destFileBootCpPaths[i] = convertToTargetPath(
+ new File(testsRootDirFile, "f" + i + "_" + f.getName()));
+ executePushCommand(f.getAbsolutePath(), destFileBootCpPaths[i], device);
+ i++;
+ }
+ i = 0;
+ for (File f : classpath) {
+ desFilePaths[i] = convertToTargetPath(
+ new File(testsRootDirFile, "f" + i + "_" + f.getName()));
+ executePushCommand(f.getAbsolutePath(), desFilePaths[i], device);
+ i++;
+ }
+ return new ClasspathPair(destFileBootCpPaths, desFilePaths);
+ }
+
+ private int getExitStatus(IDevice device, String testsRootDir) throws IOException {
+ File exitStatusFile = createTempFile("exitStatus", "");
+ executePullCommand(
+ testsRootDir + "/exitStatus", exitStatusFile.getAbsolutePath(), device);
+
+ try (BufferedReader br = new BufferedReader(new FileReader(exitStatusFile))) {
+ String readLine = br.readLine();
+ if (readLine == null) {
+ throw new FileNotFoundException("Exit status not found at " + exitStatusFile.getPath());
+ }
+ return Integer.parseInt(readLine);
+ }
+ }
+
+ private void executeShellCommand(
+ String command,
+ IDevice device,
+ ShellOutputReceiver hostOutput,
+ int maxTimeToOutputResponse) throws IOException {
+ log("adb -s " + device.getSerialNumber() + " shell " + command);
+ try {
+ if (maxTimeToOutputResponse != -1) {
+ device.executeShellCommand(command, hostOutput, maxTimeToOutputResponse);
+ } else {
+ device.executeShellCommand(command, hostOutput);
+ }
+ } catch (IOException
+ | ShellCommandUnresponsiveException
+ | TimeoutException
+ | AdbCommandRejectedException e) {
+ throw new IOException(
+ "Failed to execute shell command: '" + command + "'", e);
+ }
+ }
+
+ private void executeShellCommand(String command, IDevice device)
+ throws IOException {
+ executeShellCommand(command, device, hostOutput, -1);
+ }
+
+ private void executePushCommand(
+ String srcFile, String destFile, IDevice device) throws IOException {
+ log("adb -s " + device.getSerialNumber() + " push " + srcFile + " " + destFile);
+ try {
+ device.pushFile(srcFile, destFile);
+ } catch (IOException | AdbCommandRejectedException | TimeoutException | SyncException e) {
+ throw new IOException(
+ "Unable to push file '" + srcFile + "' on device into '" + destFile + "'", e);
+ }
+ }
+
+ private void executePullCommand(
+ String srcFile, String destFile, IDevice device) throws IOException {
+ log("adb -s " + device.getSerialNumber() + " pull " + srcFile + " " + destFile);
+ try {
+ device.pullFile(srcFile, destFile);
+ } catch (IOException | AdbCommandRejectedException | TimeoutException | SyncException e) {
+ throw new IOException(
+ "Unable to pull file '" + srcFile + "' from device into '" + destFile + "'", e);
+ }
+ }
+
+ private boolean isAdbInitialized(AndroidDebugBridge adb) {
+ return adb.isConnected() && adb.hasInitialDeviceList();
+ }
+
+ private String getAdbLocation() {
+ String adbLocation = "adb";
+ String userSpecifiedSdkLocation = System.getenv("ANDROID_SDK_HOME");
+ if (userSpecifiedSdkLocation != null) {
+ adbLocation =
+ userSpecifiedSdkLocation
+ + File.separatorChar
+ + "platform-tools"
+ + File.separatorChar
+ + "adb";
+ }
+ return adbLocation;
+ }
+
+
+ private void ensureAdbRoot(IDevice device) throws IOException {
+ boolean isRoot;
+ try {
+ isRoot = device.isRoot();
+ } catch (TimeoutException
+ | AdbCommandRejectedException
+ | IOException
+ | ShellCommandUnresponsiveException e) {
+ throw new IOException(
+ "Cannot fetch root status for device '"
+ + device.getName()
+ + "("
+ + device.getSerialNumber()
+ + ")"
+ + "': "
+ + e.getMessage(),
+ e);
+ }
+
+ int numberOfTries = 0;
+ while (!isRoot && numberOfTries < 5) {
+ try {
+ isRoot = device.root();
+ } catch (TimeoutException
+ | AdbCommandRejectedException
+ | IOException
+ | ShellCommandUnresponsiveException e1) {
+ // root() seems to throw an IOException: EOF, and it tends
+ // to make the subsequent call to isRoot() fail with
+ // AdbCommandRejectedException: device offline, until adbd is
+ // restarted as root.
+ } finally {
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e1) {
+ Thread.currentThread().interrupt();
+ }
+ }
+ numberOfTries++;
+ }
+
+ if (!isRoot) {
+ throw new IOException(
+ "Cannot switch to root on device '"
+ + device.getName()
+ + "("
+ + device.getSerialNumber()
+ + ")"
+ + "'");
+ }
+ }
+
+ private void checkDeviceRuntime(IDevice device)
+ throws DeviceRunnerConfigurationException, IOException {
+ ShellOutputToStringReceiver outputToString = new ShellOutputToStringReceiver();
+ try {
+ device.executeShellCommand("dalvikvm -showversion", outputToString);
+ if (!outputToString.getOutput().contains(RUNTIME_NAME)) {
+ throw new DeviceRunnerConfigurationException(
+ "The plugged device does not run the required runtime: '" + RUNTIME_NAME + "'");
+ }
+ } catch (TimeoutException
+ | AdbCommandRejectedException
+ | ShellCommandUnresponsiveException
+ | IOException e) {
+ throw new IOException("Could not check device runtime", e);
+ }
+ }
+
+ private String convertToTargetPath(File file) {
+ String path = file.getPath();
+ Path root = file.toPath().getRoot();
+ if (root != null) {
+ path = path.replace(root.toString(), FileListingService.FILE_SEPARATOR);
+ }
+ return path.replace(File.separator, FileListingService.FILE_SEPARATOR);
+ }
+
+ private static File createTempFile(String prefix, String suffix) throws IOException {
+ File tmp = File.createTempFile("r8-tests-" + prefix, suffix);
+ tmp.deleteOnExit();
+ return tmp;
+ }
+
+ private void deleteTestFiles(IDevice device, String uuid) throws IOException {
+ String deleteCommand = "find data -name '*r8-tests-" + uuid + "*' -exec rm -rf {} +";
+ log("adb -s " + device.getSerialNumber() + " shell " + deleteCommand);
+ try {
+ device.executeShellCommand(deleteCommand, hostOutput);
+ } catch (TimeoutException
+ | AdbCommandRejectedException
+ | ShellCommandUnresponsiveException
+ | IOException e) {
+ throw new IOException("Error while deleting test file on device", e);
+ }
+ }
+
+ private List<String> buildCommandLine(File rootDir, String testRootDir,
+ String[] bootClasspathFiles, String[] classpathFiles) {
+ List<String> result = new ArrayList<>();
+
+ result.add(convertToTargetPath(new File(rootDir, "/bin/dalvikvm")));
+
+ for (String option : vmOptions) {
+ result.add(option);
+ }
+ for (Map.Entry<String, String> entry : systemProperties.entrySet()) {
+ StringBuilder builder = new StringBuilder("-D");
+ builder.append(entry.getKey());
+ builder.append("=");
+ builder.append(entry.getValue());
+ result.add(builder.toString());
+ }
+
+ if (classpathFiles.length > 0) {
+ result.add("-cp");
+ result.add(Joiner.on(PATH_SEPARATOR_CHAR).join(
+ Arrays.asList(classpathFiles).stream()
+ .map(filePath -> convertToTargetPath(new File(filePath)))
+ .collect(Collectors.toList())));
+ }
+ if (bootClasspathFiles.length > 0) {
+ result.add("-Xbootclasspath:" + Joiner.on(PATH_SEPARATOR_CHAR).join(
+ Arrays.asList(bootClasspathFiles).stream()
+ .map(filePath -> convertToTargetPath(new File(filePath)))
+ .collect(Collectors.toList())));
+ }
+
+ if (mainClass != null) {
+ result.add(mainClass);
+ }
+ for (String argument : programArguments) {
+ result.add(argument);
+ }
+ return result;
+ }
+
+ private void log(String message) {
+ if (VERBOSE) {
+ System.out.println(message);
+ }
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/JctfTestSpecifications.java b/src/test/java/com/android/tools/r8/JctfTestSpecifications.java
index c58fc2b88..e262359dc 100644
--- a/src/test/java/com/android/tools/r8/JctfTestSpecifications.java
+++ b/src/test/java/com/android/tools/r8/JctfTestSpecifications.java
@@ -15,6 +15,7 @@ import static com.android.tools.r8.TestCondition.runtimes;
import com.android.tools.r8.R8RunArtTestsTest.CompilerUnderTest;
import com.android.tools.r8.R8RunArtTestsTest.DexTool;
import com.android.tools.r8.ToolHelper.DexVm;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.Multimap;
import java.util.Collection;
@@ -41,11 +42,11 @@ public class JctfTestSpecifications {
// java.lang.AssertionError: Expected exception: java.lang.NumberFormatException
.put("lang.StringBuffer.insertILjava_lang_Object.StringBuffer_insert_A01",
- match(runtimes(DexVm.ART_DEFAULT)))
+ match(runtimes(Version.DEFAULT)))
// 1) t01
// java.lang.StringIndexOutOfBoundsException: length=21; regionStart=0; regionLength=42
- .put("lang.StringBuffer.serialization.StringBuffer_serialization_A01", any())
+ .put("lang.StringBuffer.serialization.StringBuffer_serialization_A01", any())
// 1) t01
// java.lang.AssertionError: Unable to configure default providers
// 2) t02
@@ -67,12 +68,12 @@ public class JctfTestSpecifications {
// java.lang.AssertionError: Failed to load serialization resource file: serialization/com/google/jctf/test/lib/java/lang/NumberFormatException/serialization/NumberFormatException_serialization_A01.golden.0.ser
.put("lang.StrictMath.roundF.StrictMath_round_A01",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0)))
// 1) t01
// java.lang.AssertionError: Wrong result produced for argument: 0.49999997 expected:<1.0> but was:<0.0>
.put("lang.StrictMath.roundD.StrictMath_round_A01",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0)))
// 1) t01
// java.lang.AssertionError: Wrong result produced for argument: 0.49999999999999994 expected:<1.0> but was:<0.0>
@@ -126,7 +127,7 @@ public class JctfTestSpecifications {
.put(
"lang.Thread.ConstructorLjava_lang_ThreadGroupLjava_lang_RunnableLjava_lang_StringJ.Thread_Constructor_A01",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_6_0_1)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1)))
// 1) t01
// java.lang.OutOfMemoryError: pthread_create (-8589934591GB stack) failed: Resource temporarily unavailable
@@ -154,7 +155,7 @@ public class JctfTestSpecifications {
// java.lang.AssertionError: Expected exception: java.lang.IllegalThreadStateException
.put("lang.Thread.getAllStackTraces.Thread_getAllStackTraces_A01",
- match(runtimes(DexVm.ART_7_0_0)))
+ match(runtimes(Version.V7_0_0)))
// 1) t01
// java.lang.AssertionError
@@ -196,7 +197,7 @@ public class JctfTestSpecifications {
// java.lang.UnsupportedOperationException
.put("lang.Thread.getContextClassLoader.Thread_getContextClassLoader_A03",
- match(runtimes(DexVm.ART_7_0_0)))
+ match(runtimes(Version.V7_0_0)))
// 1) t01
// java.lang.AssertionError: improper ClassLoader expected same:<null> was not:<dalvik.system.PathClassLoader[DexPathList[[dex file "/tmp/junit7794202178392390143/classes.dex"],nativeLibraryDirectories=[r8/tools/linux/art/bin/../lib, r8/tools/linux/art/bin/../lib]]]>
@@ -956,7 +957,7 @@ public class JctfTestSpecifications {
.put(
"lang.ClassLoader.defineClassLjava_lang_StringLjava_nio_ByteBufferLjava_security_ProtectionDomain.ClassLoader_defineClass_A07",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0)))
// 1) t01
// java.lang.Exception: Unexpected exception, expected<java.lang.NullPointerException> but was<java.lang.UnsupportedOperationException>
// Caused by: java.lang.UnsupportedOperationException: can't load this type of class file
@@ -1733,22 +1734,22 @@ public class JctfTestSpecifications {
// java.lang.AssertionError: Failed to load serialization resource file: serialization/com/google/jctf/test/lib/java/lang/Byte/serialization/Byte_serialization_A01.golden.0.ser
.put("lang.Byte.parseByteLjava_lang_StringI.Byte_parseByte_A02",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
// 1) t01
// java.lang.AssertionError: Parsed Byte instance from string:+1 radix:10
.put("lang.Byte.valueOfLjava_lang_StringI.Byte_valueOf_A02",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
// 1) t01
// java.lang.AssertionError: Parsed Byte instance from string:+1 radix:10
.put("lang.Byte.valueOfLjava_lang_String.Byte_ValueOf_A02",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
// 1) t02
// java.lang.AssertionError: Parsed Byte instance from string:+1
.put("lang.Byte.decodeLjava_lang_String.Byte_decode_A04",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
// 1) t01
// java.lang.AssertionError: Decoded Byte instance from string:+1
@@ -1765,12 +1766,14 @@ public class JctfTestSpecifications {
// java.lang.AssertionError: Failed to load serialization resource file: serialization/com/google/jctf/test/lib/java/lang/ClassCastException/serialization/ClassCastException_serialization_A01.golden.0.ser
.put("lang.Byte.ConstructorLjava_lang_String.Byte_Constructor_A02",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ match(runtimes(DexVm.Version.DEFAULT, DexVm.Version.V7_0_0, DexVm.Version.V6_0_1,
+ DexVm.Version.V5_1_1)))
// 1) t02
// java.lang.AssertionError: Parsed Byte instance from string:+1
.put("lang.Byte.parseByteLjava_lang_String.Byte_parseByte_A02",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ match(runtimes(DexVm.Version.DEFAULT, DexVm.Version.V7_0_0, DexVm.Version.V6_0_1,
+ DexVm.Version.V5_1_1)))
// 1) t02
// java.lang.AssertionError: Parsed Byte instance from string:+1
@@ -1840,7 +1843,7 @@ public class JctfTestSpecifications {
// java.lang.AssertionError: Failed to load serialization resource file: serialization/com/google/jctf/test/lib/java/lang/Boolean/serialization/Boolean_serialization_A01.golden.0.ser
.put("lang.Integer.valueOfLjava_lang_StringI.Integer_valueOf_A02",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ match(runtimes(DexVm.Version.DEFAULT, DexVm.Version.V7_0_0, Version.V6_0_1, DexVm.Version.V5_1_1)))
// 1) t07
// java.lang.AssertionError: NumberFormatException expected for input: +1 and radix: 10
@@ -1849,52 +1852,52 @@ public class JctfTestSpecifications {
// java.lang.AssertionError: Failed to load serialization resource file: serialization/com/google/jctf/test/lib/java/lang/Integer/serialization/Integer_serialization_A01.golden.0.ser
.put("lang.Integer.parseIntLjava_lang_String.Integer_parseInt_A02",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ match(runtimes(Version.DEFAULT, DexVm.Version.V7_0_0, DexVm.Version.V6_0_1, DexVm.Version.V5_1_1)))
// 1) t06
// java.lang.AssertionError: Expected exception: java.lang.NumberFormatException
.put("lang.Integer.getIntegerLjava_lang_StringI.Integer_getInteger_A02",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ match(runtimes(Version.DEFAULT, DexVm.Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
// 1) t03
// java.lang.AssertionError: expected:<6031769> but was:<1>
.put("lang.Integer.valueOfLjava_lang_String.Integer_valueOf_A02",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
// 1) t07
// java.lang.AssertionError: NumberFormatException expected for input: +1
.put("lang.Integer.decodeLjava_lang_String.Integer_decode_A04",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
// 1) t06
// java.lang.AssertionError: Expected exception: java.lang.NumberFormatException
.put("lang.Integer.parseIntLjava_lang_StringI.Integer_parseInt_A02",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
// 1) t06
// java.lang.AssertionError: Expected exception: java.lang.NumberFormatException
.put("lang.Integer.getIntegerLjava_lang_StringLjava_lang_Integer.Integer_getInteger_A02",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
// 1) t03
// java.lang.AssertionError: expected:<6031769> but was:<1>
.put("lang.Integer.ConstructorLjava_lang_String.Integer_Constructor_A02",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
// 1) t06
// java.lang.AssertionError: Expected exception: java.lang.NumberFormatException
.put("lang.Integer.getIntegerLjava_lang_String.Integer_getInteger_A02",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
// 1) t03
// java.lang.AssertionError: expected null, but was:<1>
.put("lang.ref.PhantomReference.isEnqueued.PhantomReference_isEnqueued_A01",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
// 1) t04
// java.lang.AssertionError: reference is not enqueued after 2 sec
.put("lang.ref.SoftReference.isEnqueued.SoftReference_isEnqueued_A01",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
// 1) t03
// java.lang.AssertionError: reference is not enqueued after 2 sec
@@ -1903,7 +1906,7 @@ public class JctfTestSpecifications {
// java.lang.AssertionError: expected null, but was:<[I@e2603b4>
.put("lang.ref.ReferenceQueue.poll.ReferenceQueue_poll_A01",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
// 1) t03
// java.lang.AssertionError: reference is not enqueued after 2 sec
@@ -1916,12 +1919,12 @@ public class JctfTestSpecifications {
// java.lang.AssertionError: expected null, but was:<[I@1b32f32>
.put("lang.ref.WeakReference.isEnqueued.WeakReference_isEnqueued_A01",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
// 1) t03
// java.lang.AssertionError: reference is not enqueued after 2 sec
.put("lang.StackTraceElement.toString.StackTraceElement_toString_A01",
- match(runtimes(DexVm.ART_DEFAULT)))
+ match(runtimes(Version.DEFAULT)))
// 1) t03
// org.junit.ComparisonFailure: expected:<...ethod(Unknown Source[])> but was:<...ethod(Unknown Source[:1])>
@@ -1989,7 +1992,7 @@ public class JctfTestSpecifications {
// java.lang.AssertionError: Failed to load serialization resource file: serialization/com/google/jctf/test/lib/java/lang/ClassFormatError/serialization/ClassFormatError_serialization_A01.golden.0.ser
.put("lang.Math.cbrtD.Math_cbrt_A01",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_6_0_1)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1)))
// 1) t01
// java.lang.AssertionError: cbrt(27.) expected:<3.0> but was:<3.0000000000000004>
@@ -2022,12 +2025,12 @@ public class JctfTestSpecifications {
// org.junit.ComparisonFailure: expected:<0.001[0]> but was:<0.001[]>
.put("lang.Short.valueOfLjava_lang_StringI.Short_valueOf_A02",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
// 1) t03
// java.lang.AssertionError: Missing NumberFormatException for radix=10
.put("lang.Short.valueOfLjava_lang_String.Short_valueOf_A02",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
// 1) t03
// java.lang.AssertionError: Missing NumberFormatException for arg="+1"
@@ -2036,17 +2039,17 @@ public class JctfTestSpecifications {
// java.lang.AssertionError: Failed to load serialization resource file: serialization/com/google/jctf/test/lib/java/lang/Short/serialization/Short_serialization_A01.golden.0.ser
.put("lang.Short.parseShortLjava_lang_String.Short_parseShort_A02",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
// 1) t01
// java.lang.AssertionError: Parsed Short instance from string:+1
.put("lang.Short.decodeLjava_lang_String.Short_decode_A04",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
// 1) t01
// java.lang.AssertionError: Decoded Short instance from string:+1
.put("lang.Short.ConstructorLjava_lang_String.Short_Constructor_A02",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
// 1) t02
// java.lang.AssertionError: Created Short instance from string:+1
@@ -2066,13 +2069,13 @@ public class JctfTestSpecifications {
// java.lang.AssertionError: Failed to load serialization resource file: serialization/com/google/jctf/test/lib/java/lang/annotation/AnnotationFormatError/serialization/AnnotationFormatError_serialization_A01.golden.0.ser
.put("lang.Short.parseShortLjava_lang_StringI.Short_parseShort_A02",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
// 1) t01
// java.lang.AssertionError: Parsed Short instance from string:+1 radix:10
.put(
"lang.annotation.IncompleteAnnotationException.ConstructorLjava_lang_ClassLjava_lang_String.IncompleteAnnotationException_Constructor_A01",
- match(runtimes(DexVm.ART_DEFAULT)))
+ match(runtimes(Version.DEFAULT)))
// 1) t02
// java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toString()' on a null object reference
// 2) t04
@@ -2286,7 +2289,7 @@ public class JctfTestSpecifications {
// java.lang.AssertionError: expected null, but was:<class com.google.jctf.test.lib.java.lang.Class.getDeclaringClass.Class_getDeclaringClass_A01>
.put("lang.Class.getDeclaredFields.Class_getDeclaredFields_A01",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
// 1) t02
// java.lang.AssertionError: array lengths differed, expected.length=0 actual.length=2
@@ -2397,7 +2400,7 @@ public class JctfTestSpecifications {
// java.lang.AssertionError: Vague error message
.put("lang.Class.getClasses.Class_getClasses_A01",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_4_4_4)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V4_4_4)))
// 1) t03
// java.lang.AssertionError: Array lengths expected:<2> but was:<3>
@@ -2412,12 +2415,12 @@ public class JctfTestSpecifications {
// java.lang.SecurityException
.put("lang.Class.getDeclaredMethods.Class_getDeclaredMethods_A01",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0)))
// 1) t03
// java.lang.AssertionError: Array lengths expected:<1> but was:<3>
.put("lang.Class.getMethods.Class_getMethods_A01",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0)))
// 1) t03
// java.lang.AssertionError: Array lengths expected:<1> but was:<3>
@@ -2573,7 +2576,7 @@ public class JctfTestSpecifications {
// Caused by: java.lang.AssertionError: Unable to configure default providers
.put("lang.Class.getMethodLjava_lang_String_Ljava_lang_Class.Class_getMethod_A01",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_4_4_4)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V4_4_4)))
// 1) t04
// java.lang.AssertionError: expected:<interface com.google.jctf.test.lib.java.lang.Class.getMethodLjava_lang_String_Ljava_lang_Class.Class_getMethod_A01$I1> but was:<interface com.google.jctf.test.lib.java.lang.Class.getMethodLjava_lang_String$Ljava_lang_Class.Class_getMethod_A01$I2>
@@ -2701,7 +2704,7 @@ public class JctfTestSpecifications {
// java.lang.AssertionError: Failed to load serialization resource file: serialization/com/google/jctf/test/lib/java/lang/String/CASE_INSENSITIVE_ORDER/serialization/String_serialization_A01.golden.0.ser
.put("lang.String.getBytesLjava_lang_String.String_getBytes_A14",
- match(runtimes(DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V7_0_0, Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t07
// arrays first differed at element [0]; expected:<-2> but was:<-1>
// Caused by: java.lang.AssertionError: expected:<-2> but was:<-1>
@@ -2762,7 +2765,7 @@ public class JctfTestSpecifications {
// org.junit.ComparisonFailure: Incorrect double string returned expected:<0.001[0]> but was:<0.001[]>
.put("lang.String.getBytesLjava_nio_charset_Charset.String_getBytes_A14",
- match(runtimes(DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V7_0_0, Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t07
// arrays first differed at element [0]; expected:<-2> but was:<-1>
// Caused by: java.lang.AssertionError: expected:<-2> but was:<-1>
@@ -2805,7 +2808,7 @@ public class JctfTestSpecifications {
// Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.net.URL.getProtocol()' on a null object reference
.put("lang.Package.isAnnotationPresentLjava_lang_Class.Package_isAnnotationPresent_A02",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0)))
// 1) testIsAnnotationPresent_Null2
// java.lang.Exception: Unexpected exception, expected<java.lang.NullPointerException> but was<java.lang.ClassNotFoundException>
// Caused by: java.lang.ClassNotFoundException: com.google.jctf.simpleClass
@@ -2834,7 +2837,7 @@ public class JctfTestSpecifications {
// Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.net.URL.getProtocol()' on a null object reference
.put("lang.Package.getAnnotationLjava_lang_Class.Package_getAnnotation_A02",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0)))
// 1) testGetAnnotation_Null2
// java.lang.Exception: Unexpected exception, expected<java.lang.NullPointerException> but was<java.lang.ClassNotFoundException>
// Caused by: java.lang.ClassNotFoundException: com.google.jctf.simpleClass
@@ -3625,7 +3628,7 @@ public class JctfTestSpecifications {
.put(
"lang.reflect.Proxy.getInvocationHandlerLjava_lang_Object.Proxy_getInvocationHandler_A02",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
// 1) t02
// java.lang.Exception: Unexpected exception, expected<java.lang.IllegalArgumentException> but was<java.lang.NullPointerException>
// Caused by: java.lang.NullPointerException
@@ -3636,13 +3639,13 @@ public class JctfTestSpecifications {
// 2) t05
// java.lang.NullPointerException: Attempt to invoke virtual method 'int java.io.InputStream.available()' on a null object reference
- .put("lang.reflect.Proxy.Class.Proxy_class_A02", match(runtimes(DexVm.ART_4_4_4)))
+ .put("lang.reflect.Proxy.Class.Proxy_class_A02", match(runtimes(Version.V4_4_4)))
// 1) t02
// java.lang.AssertionError: expected array was null
// 2) t04
// java.lang.AssertionError: expected array was null
- .put("lang.reflect.Proxy.Class.Proxy_class_A03", match(runtimes(DexVm.ART_4_4_4)))
+ .put("lang.reflect.Proxy.Class.Proxy_class_A03", match(runtimes(Version.V4_4_4)))
// 1) t03
// java.lang.AbstractMethodError: abstract method not implemented
@@ -3662,7 +3665,7 @@ public class JctfTestSpecifications {
// 2) t05
// java.lang.NullPointerException: Attempt to invoke virtual method 'int java.io.InputStream.available()' on a null object reference
- .put("lang.reflect.Proxy.h.Proxy_h_A01", match(runtimes(DexVm.ART_DEFAULT)))
+ .put("lang.reflect.Proxy.h.Proxy_h_A01", match(runtimes(Version.DEFAULT)))
// 1) t01
// java.lang.reflect.InvocationTargetException
// Caused by: java.lang.NullPointerException
@@ -3693,7 +3696,7 @@ public class JctfTestSpecifications {
.put(
"lang.reflect.Proxy.ConstructorLjava_lang_reflect_InvocationHandler.Proxy_Constructor_A01",
- match(runtimes(DexVm.ART_DEFAULT)))
+ match(runtimes(Version.DEFAULT)))
// 1) t01
// java.lang.NullPointerException
@@ -3811,7 +3814,7 @@ public class JctfTestSpecifications {
.put(
"lang.reflect.InvocationHandler.invokeLjava_lang_ObjectLjava_lang_reflect_Method_Ljava_lang_Object.InvocationHandler_invoke_A01",
- match(runtimes(DexVm.ART_4_4_4)))
+ match(runtimes(Version.V4_4_4)))
// 1) t04
// java.lang.AssertionError: expected array was null
@@ -3826,7 +3829,7 @@ public class JctfTestSpecifications {
// java.lang.AssertionError: Expected exception: java.lang.TypeNotPresentException
.put("lang.reflect.Method.hashCode.Method_hashCode_A01",
- match(runtimes(DexVm.ART_4_4_4)))
+ match(runtimes(Version.V4_4_4)))
// 1)
// java.lang.AssertionError: expected:<-1918826964> but was:<-1295482945>
@@ -3885,7 +3888,7 @@ public class JctfTestSpecifications {
// java.lang.AssertionError: Exception is not thrown: field: bytePublicField, object: com.google.jctf.test.lib.java.lang.reflect.Field.TestStaticFinalPrimitiveField@b1b0f3d
.put("lang.reflect.Field.setByteLjava_lang_ObjectB.Field_setByte_A02",
- match(runtimes(DexVm.ART_4_4_4)))
+ match(runtimes(Version.V4_4_4)))
// 1) t01
// java.lang.AssertionError: Illegal exception is thrown: java.lang.IllegalAccessException: field is marked 'final', field: bytePublicField, class: class com.google.jctf.test.lib.java.lang.reflect.Field.TestFinalPrimitiveField
@@ -3894,7 +3897,7 @@ public class JctfTestSpecifications {
// java.lang.AssertionError: Exception is not thrown: field: booleanPublicField, object: com.google.jctf.test.lib.java.lang.reflect.Field.TestStaticFinalPrimitiveField@953cc4f
.put("lang.reflect.Field.setBooleanLjava_lang_ObjectZ.Field_setBoolean_A02",
- match(runtimes(DexVm.ART_4_4_4)))
+ match(runtimes(Version.V4_4_4)))
// 1) t01
// java.lang.AssertionError: Illegal exception is thrown: java.lang.IllegalAccessException: field is marked 'final', field: booleanPublicField, class: class com.google.jctf.test.lib.java.lang.reflect.Field.TestFinalPrimitiveField
@@ -3926,7 +3929,7 @@ public class JctfTestSpecifications {
// java.lang.AssertionError: Exception is not thrown: field: charPublicField, object: com.google.jctf.test.lib.java.lang.reflect.Field.TestStaticFinalPrimitiveField@95271f1
.put("lang.reflect.Field.setCharLjava_lang_ObjectC.Field_setChar_A02",
- match(runtimes(DexVm.ART_4_4_4)))
+ match(runtimes(Version.V4_4_4)))
// 1) t01
// java.lang.AssertionError: Illegal exception is thrown: java.lang.IllegalAccessException: field is marked 'final', field: charPublicField, class: class com.google.jctf.test.lib.java.lang.reflect.Field.TestFinalPrimitiveField
@@ -3942,7 +3945,7 @@ public class JctfTestSpecifications {
// java.lang.AssertionError: Exception is not thrown: field: floatPublicField, object: com.google.jctf.test.lib.java.lang.reflect.Field.TestStaticFinalPrimitiveField@3fca927
.put("lang.reflect.Field.setFloatLjava_lang_ObjectF.Field_setFloat_A02",
- match(runtimes(DexVm.ART_4_4_4)))
+ match(runtimes(Version.V4_4_4)))
// 1) t01
// java.lang.AssertionError: Illegal exception is thrown: java.lang.IllegalAccessException: field is marked 'final', field: floatPublicField, class: class com.google.jctf.test.lib.java.lang.reflect.Field.TestFinalPrimitiveField
@@ -3953,7 +3956,7 @@ public class JctfTestSpecifications {
// java.lang.AssertionError: Misconfiguration: MissingAntn should not be accessible
.put("lang.reflect.Field.setIntLjava_lang_ObjectI.Field_setInt_A02",
- match(runtimes(DexVm.ART_4_4_4)))
+ match(runtimes(Version.V4_4_4)))
// 1) t01
// java.lang.AssertionError: Illegal exception is thrown: java.lang.IllegalAccessException: field is marked 'final', field: intPublicField, class: class com.google.jctf.test.lib.java.lang.reflect.Field.TestFinalPrimitiveField
@@ -4022,7 +4025,7 @@ public class JctfTestSpecifications {
// java.lang.AssertionError: Exception is not thrown: field: intPublicField, object: com.google.jctf.test.lib.java.lang.reflect.Field.TestStaticFinalPrimitiveField@94fbd35
.put("lang.reflect.Field.setDoubleLjava_lang_ObjectD.Field_setDouble_A02",
- match(runtimes(DexVm.ART_4_4_4)))
+ match(runtimes(Version.V4_4_4)))
// 1) t01
// java.lang.AssertionError: Illegal exception is thrown: java.lang.IllegalAccessException: field is marked 'final', field: doublePublicField, class: class com.google.jctf.test.lib.java.lang.reflect.Field.TestFinalPrimitiveField
@@ -4038,7 +4041,7 @@ public class JctfTestSpecifications {
// java.lang.AssertionError: Exception is not thrown: field: shortPublicField, object: com.google.jctf.test.lib.java.lang.reflect.Field.TestStaticFinalPrimitiveField@7887a47
.put("lang.reflect.Field.setLongLjava_lang_ObjectJ.Field_setLong_A02",
- match(runtimes(DexVm.ART_4_4_4)))
+ match(runtimes(Version.V4_4_4)))
// 1) t01
// java.lang.AssertionError: Illegal exception is thrown: java.lang.IllegalAccessException: field is marked 'final', field: longPublicField, class: class com.google.jctf.test.lib.java.lang.reflect.Field.TestFinalPrimitiveField
@@ -4058,7 +4061,7 @@ public class JctfTestSpecifications {
// java.lang.AssertionError: Exception is not thrown: field: doublePublicField, object: com.google.jctf.test.lib.java.lang.reflect.Field.TestStaticFinalPrimitiveField@4dd95e2
.put("lang.reflect.Field.setShortLjava_lang_ObjectS.Field_setShort_A02",
- match(runtimes(DexVm.ART_4_4_4)))
+ match(runtimes(Version.V4_4_4)))
// 1) t01
// java.lang.AssertionError: Illegal exception is thrown: java.lang.IllegalAccessException: field is marked 'final', field: shortPublicField, class: class com.google.jctf.test.lib.java.lang.reflect.Field.TestFinalPrimitiveField
@@ -4084,7 +4087,7 @@ public class JctfTestSpecifications {
// java.lang.NullPointerException: Attempt to invoke virtual method 'int java.io.InputStream.available()' on a null object reference
.put("lang.reflect.Field.setLjava_lang_ObjectLjava_lang_Object.Field_set_A02",
- match(runtimes(DexVm.ART_4_4_4)))
+ match(runtimes(Version.V4_4_4)))
// 1) t01
// java.lang.AssertionError: Illegal exception is thrown: java.lang.IllegalAccessException: field is marked 'final', field: bytePublicField, class: class com.google.jctf.test.lib.java.lang.reflect.Field.TestFinalPrimitiveField
@@ -4456,7 +4459,7 @@ public class JctfTestSpecifications {
.put(
"util.concurrent.ConcurrentHashMap.serialization.ConcurrentHashMap_serialization_A01",
- match(runtimes(DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1)))
// 1) t01
// java.lang.AssertionError: Unable to configure default providers
@@ -4515,7 +4518,7 @@ public class JctfTestSpecifications {
// java.lang.AssertionError: Destroyed thread group was not finalized
.put("lang.ThreadGroup.destroy.ThreadGroup_destroy_A01",
- match(D8_COMPILER, runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(D8_COMPILER, runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t02
// java.lang.IllegalThreadStateException: Thread group still contains threads: Test group
// 2) t04
@@ -4524,62 +4527,62 @@ public class JctfTestSpecifications {
// java.lang.AssertionError: Destroyed thread group was not finalized
.put("lang.Thread.start.Thread_start_A01",
- match(runtimes(DexVm.ART_7_0_0)))
+ match(runtimes(Version.V7_0_0)))
// 1) t01(com.google.jctf.test.lib.java.lang.Thread.start.Thread_start_A01)
// java.lang.AssertionError: no IllegalThreadStateException 1
.put("lang.String.getBytesLjava_lang_String.String_getBytes_A02",
- match(runtimes(DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V7_0_0, Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t01(com.google.jctf.test.lib.java.lang.String.getBytesLjava_lang_String.String_getBytes_A02)
// java.lang.Exception: Unexpected exception, expected<java.lang.NullPointerException> but was<java.io.UnsupportedEncodingException>
.put(
"util.concurrent.CopyOnWriteArrayList.lastIndexOfLjava_lang_ObjectI.CopyOnWriteArrayList_lastIndexOf_A02",
- match(runtimes(DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V7_0_0, Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// java.lang.AssertionError: Expected exception: java.lang.IndexOutOfBoundsException
.put(
"util.concurrent.CopyOnWriteArrayList.lastIndexOfLjava_lang_ObjectI.CopyOnWriteArrayList_lastIndexOf_A01",
- match(runtimes(DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V7_0_0, Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t01(com.google.jctf.test.lib.java.util.concurrent.CopyOnWriteArrayList.lastIndexOfLjava_lang_ObjectI.CopyOnWriteArrayList_lastIndexOf_A01)
// java.lang.AssertionError: expected:<3> but was:<1>
// 2) t02(com.google.jctf.test.lib.java.util.concurrent.CopyOnWriteArrayList.lastIndexOfLjava_lang_ObjectI.CopyOnWriteArrayList_lastIndexOf_A01)
// java.lang.ArrayIndexOutOfBoundsException: length=3; index=2147483647
.put("lang.StringBuffer.getCharsII_CI.StringBuffer_getChars_A03",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t03
// java.lang.NullPointerException: dst == null
.put("lang.StringBuffer.appendF.StringBuffer_append_A01",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t02
// java.lang.AssertionError: Buffer is invalid length after append expected:<26> but was:<25>
.put("lang.StringBuffer.insertI_CII.StringBuffer_insert_A02",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t01
// java.lang.NullPointerException: Attempt to get length of null array
.put("lang.StrictMath.scalbDI.StrictMath_scalb_A03",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t01
// java.lang.AssertionError: Wrong result provided for argument: -1.7976931348623157E308 scaleFactor: 2147483647 expected:<-Infinity> but was:<-0.0>
.put("lang.StrictMath.scalbDI.StrictMath_scalb_A01",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t03
// java.lang.AssertionError: Wrong result provided for argument: -2.2250738585072014E-308 scaleFactor: -2147483647 expected:<-0.0> but was:<-Infinity>
// 2) t04
// java.lang.AssertionError: Wrong result provided for argument: 1.7976931348623157E308 scaleFactor: -2046 expected:<2.2250738585072014E-308> but was:<2.225073858507201E-308>
.put("lang.StrictMath.scalbFI.StrictMath_scalb_A03",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t01
// java.lang.AssertionError: Wrong result provided for argument: -3.4028235E38 scaleFactor: 2147483647 expected:<-Infinity> but was:<-0.0>
.put("lang.StrictMath.scalbFI.StrictMath_scalb_A01",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t02
// java.lang.AssertionError: Wrong result provided for argument: 3.4028235E38 scaleFactor: -254 expected:<1.1754943508222875E-38> but was:<1.1754942106924411E-38>
// 2) t03
@@ -4587,96 +4590,96 @@ public class JctfTestSpecifications {
.put(
"lang.Thread.ConstructorLjava_lang_ThreadGroupLjava_lang_RunnableLjava_lang_StringJ.Thread_Constructor_A07",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t02
// java.lang.AssertionError: wrong daemonism expected:<true> but was:<false>
.put(
"lang.Thread.ConstructorLjava_lang_ThreadGroupLjava_lang_RunnableLjava_lang_String.Thread_Constructor_A07",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t02
// java.lang.AssertionError: wrong daemonism expected:<true> but was:<false>
.put("lang.Thread.toString.Thread_toString_A01",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t02
// java.lang.AssertionError
.put("lang.Thread.start.Thread_start_A02",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t01
// java.lang.IllegalThreadStateException: Thread group still contains threads: start
.put("lang.Thread.setPriorityI.Thread_setPriority_A01",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t02
// java.lang.AssertionError: expected:<5> but was:<10>
.put("lang.ClassLoader.ConstructorLjava_lang_ClassLoader.ClassLoader_Constructor_A01",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t01
// java.lang.NullPointerException: parentLoader == null && !nullAllowed
// 2) t03
// java.lang.NullPointerException: parentLoader == null && !nullAllowed
.put("lang.Enum.compareToLjava_lang_Enum.Enum_compareTo_A03",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t01
// java.lang.AssertionError: Expected exception: java.lang.ClassCastException
.put("lang.Enum.hashCode.Enum_hashCode_A01",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t02
// java.lang.AssertionError
.put("lang.StackTraceElement.hashCode.StackTraceElement_hashCode_A01",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t02
// java.lang.AssertionError
.put("lang.ProcessBuilder.environment.ProcessBuilder_environment_A01",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t01
// java.lang.AssertionError: should throw ClassCastException.
.put("lang.ProcessBuilder.environment.ProcessBuilder_environment_A03",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t01
// java.lang.AssertionError: should throw ClassCastException.
.put("lang.Float.toStringF.Float_toString_A04",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t02
// org.junit.ComparisonFailure: Invalid string produced for bits: 4efffffa expected:<2.147482[88]E9> but was:<2.147482[9]E9>
.put("lang.Float.toStringF.Float_toString_A03",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t02
// org.junit.ComparisonFailure: expected:<-1.175494[35]E-38> but was:<-1.175494[4]E-38>
.put("lang.ThreadGroup.getMaxPriority.ThreadGroup_getMaxPriority_A01",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t01
// java.lang.AssertionError: New value should be the same as we set expected:<2> but was:<1>
.put(
"lang.ThreadGroup.uncaughtExceptionLjava_lang_ThreadLjava_lang_Throwable.ThreadGroup_uncaughtException_A02",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t05
// java.lang.AssertionError: Non-informative exception info: java.lang.RuntimeException
.put("lang.ThreadGroup.list.ThreadGroup_list_A01",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t04
// java.lang.IllegalThreadStateException: Thread group still contains threads: Test group(list)
.put("lang.ThreadGroup.setMaxPriorityI.ThreadGroup_setMaxPriority_A01",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t01
// java.lang.IllegalThreadStateException: Thread group still contains threads: Test root(setMaxPriority)
.put("lang.ThreadGroup.setMaxPriorityI.ThreadGroup_setMaxPriority_A04",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t01
// java.lang.AssertionError: New value should be the same as we set expected:<2> but was:<1>
// 2) t02
@@ -4685,46 +4688,46 @@ public class JctfTestSpecifications {
// java.lang.AssertionError: expected:<7> but was:<1>
.put("lang.ThreadGroup.toString.ThreadGroup_toString_A01",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t01
// org.junit.ComparisonFailure: toString does not follow the RI expected:<... group(toString),max[pri]=10]> but was:<... group(toString),max[Priority]=10]>
.put("lang.Class.getFieldLjava_lang_String.Class_getField_A01",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t04
// java.lang.AssertionError: expected:<interface com.google.jctf.test.lib.java.lang.Class.getFieldLjava_lang_String.Class_getField_A01$I1> but was:<class com.google.jctf.test.lib.java.lang.Class.getFieldLjava_lang_String.Class_getField_A01$S1>
.put("lang.String.replaceCC.String_replace_A01",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t04
// java.lang.AssertionError: expected same:<aaaaaa> was not:<aaaaaa>
.put("lang.Package.isCompatibleWithLjava_lang_String.Package_isCompatibleWith_A02",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t01
// java.lang.AssertionError: NumberFormatException isn't thrown for desired . and current 1.0
// 2) t03
// java.lang.AssertionError: NumberFormatException isn't thrown for desired 1.0 and current .
.put("lang.StringBuilder.appendF.StringBuilder_append_A01",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t01
// java.lang.AssertionError: Invalid length of created builder expected:<14> but was:<13>
.put("lang.StringBuilder.insertIF.StringBuilder_insert_A01",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t01
// java.lang.AssertionError: Invalid length of created builder expected:<14> but was:<13>
.put(
"lang.reflect.AccessibleObject.setAccessibleZ.AccessibleObject_setAccessible_A04",
- match(runtimes(DexVm.ART_4_4_4)))
+ match(runtimes(Version.V4_4_4)))
// 1) t01
// java.lang.AssertionError: SecurityException expected.
.put(
"lang.reflect.AccessibleObject.setAccessible_Ljava_lang_reflect_AccessibleObjectZ.AccessibleObject_setAccessible_A04",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t01
// java.lang.AssertionError: SecurityException expected.
// 2) t02
@@ -4735,23 +4738,23 @@ public class JctfTestSpecifications {
// java.lang.AssertionError: SecurityException expected.
.put("lang.Character.UnicodeBlock.forName_java_lang_String.UnicodeBlock_forName_A03",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t01
// java.lang.AssertionError: Expected exception: java.lang.IllegalArgumentException
.put("lang.System.loadLjava_lang_String.System_load_A02",
- match(runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ match(runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
// 1) t03
// java.lang.AssertionError: Expected exception: java.lang.UnsatisfiedLinkError
.put("lang.StrictMath.nextAfterFD.StrictMath_nextAfter_A01",
- match(R8_NOT_AFTER_D8_COMPILER, runtimes(DexVm.ART_5_1_1)))
+ match(R8_NOT_AFTER_D8_COMPILER, runtimes(Version.V5_1_1)))
// 1) t01
// java.lang.AssertionError: Wrong value returned for start: Infinity direction: NaN expected:<Infinity> but was:<NaN>
// 2) t02
// java.lang.AssertionError: Wrong value returned for start: -0.0 direction: NaN expected:<-1.4E-45> but was:<NaN>
- .put("lang.Math.hypotDD.Math_hypot_A04", match(runtimes(DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ .put("lang.Math.hypotDD.Math_hypot_A04", match(runtimes(Version.V5_1_1, Version.V4_4_4)))
// 1) t04
// java.lang.AssertionError
@@ -4796,23 +4799,23 @@ public class JctfTestSpecifications {
// java.lang.AssertionError: java.lang.AssertionError: expected:<7> but was:<6>
.put("lang.ref.PhantomReference.clear.PhantomReference_clear_A01",
- match(runtimes(DexVm.ART_4_4_4)))
+ match(runtimes(Version.V4_4_4)))
.put("lang.ref.SoftReference.clear.SoftReference_clear_A01",
- match(runtimes(DexVm.ART_4_4_4)))
+ match(runtimes(Version.V4_4_4)))
.put("lang.ref.WeakReference.clear.WeakReference_clear_A01",
- match(runtimes(DexVm.ART_4_4_4)))
+ match(runtimes(Version.V4_4_4)))
// Passes or fails randomly. Have seen out of memory and assertion errors.
.put("lang.ref.PhantomReference.isEnqueued.PhantomReference_isEnqueued_A01",
- match(runtimes(DexVm.ART_4_4_4)))
+ match(runtimes(Version.V4_4_4)))
.put("lang.ref.WeakReference.isEnqueued.WeakReference_isEnqueued_A01",
- match(runtimes(DexVm.ART_4_4_4)))
+ match(runtimes(Version.V4_4_4)))
.put("lang.ref.SoftReference.isEnqueued.SoftReference_isEnqueued_A01",
- match(runtimes(DexVm.ART_4_4_4)))
+ match(runtimes(Version.V4_4_4)))
// Passes or fails randomly. Check that something is enqueued after 2 seconds.
.put("lang.ref.ReferenceQueue.poll.ReferenceQueue_poll_A01",
- match(runtimes(DexVm.ART_4_4_4)))
+ match(runtimes(Version.V4_4_4)))
// Passes or fails randomly.
.build(); // end of flakyWithArt
@@ -4942,7 +4945,7 @@ public class JctfTestSpecifications {
CompilationMode compilationMode) {
Collection<TestCondition> entries = testConditions.get(name);
for (TestCondition entry : entries) {
- if (entry.test(DexTool.NONE, compilerUnderTest, dexVm, compilationMode)) {
+ if (entry.test(DexTool.NONE, compilerUnderTest, dexVm.getVersion(), compilationMode)) {
return true;
}
}
diff --git a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
index c379193f2..5fe7c169e 100644
--- a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
@@ -10,6 +10,8 @@ import com.android.tools.r8.JctfTestSpecifications.Outcome;
import com.android.tools.r8.TestCondition.RuntimeSet;
import com.android.tools.r8.ToolHelper.ArtCommandBuilder;
import com.android.tools.r8.ToolHelper.DexVm;
+import com.android.tools.r8.ToolHelper.DexVm.Kind;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
import com.android.tools.r8.ToolHelper.ProcessResult;
import com.android.tools.r8.dex.Constants;
import com.android.tools.r8.errors.CompilationError;
@@ -83,10 +85,10 @@ public abstract class R8RunArtTestsTest {
private static final String ART_LEGACY_TESTS_NATIVE_LIBRARY_DIR = "tests/2016-12-19/art/lib64";
private static final RuntimeSet LEGACY_RUNTIME = TestCondition.runtimes(
- DexVm.ART_4_4_4,
- DexVm.ART_5_1_1,
- DexVm.ART_6_0_1,
- DexVm.ART_7_0_0);
+ DexVm.Version.V4_4_4,
+ DexVm.Version.V5_1_1,
+ DexVm.Version.V6_0_1,
+ DexVm.Version.V7_0_0);
// Input jar for jctf tests.
private static final String JCTF_COMMON_JAR = "build/libs/jctfCommon.jar";
@@ -146,14 +148,16 @@ public abstract class R8RunArtTestsTest {
private static final Multimap<String, TestCondition> timeoutOrSkipRunWithArt =
new ImmutableListMultimap.Builder<String, TestCondition>()
// Loops on art - timeout.
- .put("109-suspend-check", TestCondition.match(TestCondition.runtimes(DexVm.ART_5_1_1)))
+ .put("109-suspend-check",
+ TestCondition.match(TestCondition.runtimes(DexVm.Version.V5_1_1)))
// Flaky loops on art.
- .put("129-ThreadGetId", TestCondition.match(TestCondition.runtimes(DexVm.ART_5_1_1)))
+ .put("129-ThreadGetId", TestCondition.match(TestCondition.runtimes(DexVm.Version.V5_1_1)))
// Takes ages to run on art 5.1.1 and behaves the same as on 6.0.1. Running this
// tests on 5.1.1 makes our buildbot cycles time too long.
- .put("800-smali", TestCondition.match(TestCondition.runtimes(DexVm.ART_5_1_1)))
+ .put("800-smali", TestCondition.match(TestCondition.runtimes(DexVm.Version.V5_1_1)))
// Hangs on dalvik.
- .put("802-deoptimization", TestCondition.match(TestCondition.runtimes(DexVm.ART_4_4_4)))
+ .put("802-deoptimization",
+ TestCondition.match(TestCondition.runtimes(DexVm.Version.V4_4_4)))
.build();
// Tests that are flaky with the Art version we currently use.
@@ -183,10 +187,10 @@ public abstract class R8RunArtTestsTest {
// Failed on buildbot with: terminate called after throwing an instance
// of '__gnu_cxx::recursive_init_error'
.put("096-array-copy-concurrent-gc",
- TestCondition.match(TestCondition.runtimes(DexVm.ART_4_4_4)))
+ TestCondition.match(TestCondition.runtimes(DexVm.Version.V4_4_4)))
// Sometimes fails with out of memory on Dalvik.
.put("114-ParallelGC",
- TestCondition.match(TestCondition.runtimes(DexVm.ART_4_4_4)))
+ TestCondition.match(TestCondition.runtimes(DexVm.Version.V4_4_4)))
// Seen crash: currently no more information
.put("144-static-field-sigquit", TestCondition.any())
// Opens a lot of file descriptors and depending on the state of the machine this
@@ -417,8 +421,8 @@ public abstract class R8RunArtTestsTest {
"617-clinit-oome"
);
- private static Map<DexVm, List<String>> expectedToFailRunWithArtVersion = ImmutableMap.of(
- DexVm.ART_7_0_0, ImmutableList.of(
+ private static Map<DexVm.Version, List<String>> expectedToFailRunWithArtVersion = ImmutableMap.of(
+ DexVm.Version.V7_0_0, ImmutableList.of(
// Generally fails on non-R8/D8 running.
"412-new-array",
"610-arraycopy",
@@ -426,7 +430,7 @@ public abstract class R8RunArtTestsTest {
// Crashes the VM, cause is unclear.
"080-oom-throw"
),
- DexVm.ART_6_0_1, ImmutableList.of(
+ DexVm.Version.V6_0_1, ImmutableList.of(
// Generally fails on non-R8/D8 running.
"004-checker-UnsafeTest18",
"005-annotations",
@@ -445,7 +449,7 @@ public abstract class R8RunArtTestsTest {
// Crashes the VM, cause is unclear.
"080-oom-throw"
),
- DexVm.ART_5_1_1, ImmutableList.of(
+ DexVm.Version.V5_1_1, ImmutableList.of(
// Generally fails on non R8/D8 running.
"004-checker-UnsafeTest18",
"004-NativeAllocations",
@@ -463,7 +467,7 @@ public abstract class R8RunArtTestsTest {
"605-new-string-from-bytes",
"626-const-class-linking"
),
- DexVm.ART_4_4_4, ImmutableList.of(
+ DexVm.Version.V4_4_4, ImmutableList.of(
// Generally fails on non R8/D8 running.
"004-checker-UnsafeTest18",
"004-NativeAllocations",
@@ -494,12 +498,13 @@ public abstract class R8RunArtTestsTest {
.put("064-field-access",
TestCondition.match(
TestCondition.R8_NOT_AFTER_D8_COMPILER,
- TestCondition.runtimes(DexVm.ART_4_4_4)))
+ TestCondition.runtimes(DexVm.Version.V4_4_4)))
.put("064-field-access",
TestCondition.match(
TestCondition.R8_COMPILER,
TestCondition.runtimes(
- DexVm.ART_DEFAULT, DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ DexVm.Version.DEFAULT, DexVm.Version.V7_0_0, DexVm.Version.V6_0_1,
+ DexVm.Version.V5_1_1)))
// The growth limit test fails after processing by R8 because R8 will eliminate an
// "unneeded" const store. The following reflective call to the VM's GC will then see the
// large array as still live and the subsequent allocations will fail to reach the desired
@@ -512,71 +517,73 @@ public abstract class R8RunArtTestsTest {
"461-get-reference-vreg",
TestCondition.match(
TestCondition.D8_COMPILER,
- TestCondition.runtimes(DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ TestCondition
+ .runtimes(DexVm.Version.V7_0_0, DexVm.Version.V6_0_1, DexVm.Version.V5_1_1)))
// Dalvik fails on reading an uninitialized local.
.put(
"471-uninitialized-locals",
- TestCondition.match(TestCondition.runtimes(DexVm.ART_4_4_4)))
+ TestCondition.match(TestCondition.runtimes(DexVm.Version.V4_4_4)))
// Out of memory.
.put("152-dead-large-object",
- TestCondition.match(TestCondition.runtimes(DexVm.ART_4_4_4)))
+ TestCondition.match(TestCondition.runtimes(DexVm.Version.V4_4_4)))
// Cannot resolve exception handler. Interestingly, D8 generates different code in
// release mode (which is also the code generated by R8) which passes.
.put("111-unresolvable-exception",
TestCondition.match(
TestCondition.D8_COMPILER,
- TestCondition.runtimes(DexVm.ART_4_4_4)))
+ TestCondition.runtimes(DexVm.Version.V4_4_4)))
// Type not present.
.put("124-missing-classes",
- TestCondition.match(TestCondition.runtimes(DexVm.ART_4_4_4)))
+ TestCondition.match(TestCondition.runtimes(DexVm.Version.V4_4_4)))
// Failed creating vtable.
.put("587-inline-class-error",
- TestCondition.match(TestCondition.runtimes(DexVm.ART_4_4_4)))
+ TestCondition.match(TestCondition.runtimes(DexVm.Version.V4_4_4)))
// Failed creating vtable.
.put("595-error-class",
- TestCondition.match(TestCondition.runtimes(DexVm.ART_4_4_4)))
+ TestCondition.match(TestCondition.runtimes(DexVm.Version.V4_4_4)))
// NoSuchFieldException: systemThreadGroup on Art 4.4.4.
.put("129-ThreadGetId",
- TestCondition.match(TestCondition.runtimes(DexVm.ART_4_4_4)))
+ TestCondition.match(TestCondition.runtimes(DexVm.Version.V4_4_4)))
// Verifier says: can't modify final field LMain;.staticFinalField.
.put("600-verifier-fails",
- TestCondition.match(TestCondition.runtimes(DexVm.ART_4_4_4)))
+ TestCondition.match(TestCondition.runtimes(DexVm.Version.V4_4_4)))
// VFY: args to if-eq/if-ne must both be refs or cat1.
.put("134-reg-promotion",
TestCondition.match(
TestCondition.R8_COMPILER,
- TestCondition.runtimes(DexVm.ART_4_4_4)))
+ TestCondition.runtimes(DexVm.Version.V4_4_4)))
.put("134-reg-promotion",
TestCondition.match(
TestCondition.tools(DexTool.NONE, DexTool.JACK),
TestCondition.D8_COMPILER,
- TestCondition.runtimes(DexVm.ART_4_4_4)))
+ TestCondition.runtimes(DexVm.Version.V4_4_4)))
// VFY: tried to get class from non-ref register.
.put("506-verify-aput",
- TestCondition.match(TestCondition.runtimes(DexVm.ART_4_4_4)))
+ TestCondition.match(TestCondition.runtimes(DexVm.Version.V4_4_4)))
// NoSuchMethod: startMethodTracing.
.put("545-tracing-and-jit",
- TestCondition.match(TestCondition.runtimes(DexVm.ART_4_4_4)))
+ TestCondition.match(TestCondition.runtimes(DexVm.Version.V4_4_4)))
// filled-new-array arg 0(1) not valid.
.put("412-new-array",
- TestCondition.match(TestCondition.runtimes(DexVm.ART_4_4_4)))
+ TestCondition.match(TestCondition.runtimes(DexVm.Version.V4_4_4)))
// TODO(ager): unclear what is failing here.
.put("098-ddmc",
- TestCondition.match(TestCondition.runtimes(DexVm.ART_4_4_4)))
+ TestCondition.match(TestCondition.runtimes(DexVm.Version.V4_4_4)))
// Get unexpected modifier bits on dalvik.
.put("121-modifiers", TestCondition.match(
TestCondition.tools(DexTool.DX),
- TestCondition.runtimes(DexVm.ART_4_4_4)))
+ TestCondition.runtimes(DexVm.Version.V4_4_4)))
// Unsatisfiable link error:
// libarttest.so: undefined symbol: _ZN3art6Thread18RunEmptyCheckpointEv
.put(
"543-env-long-ref",
TestCondition.match(
TestCondition.D8_COMPILER,
- TestCondition.runtimes(DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ TestCondition
+ .runtimes(DexVm.Version.V7_0_0, DexVm.Version.V6_0_1, DexVm.Version.V5_1_1)))
// lib64 libarttest.so: wrong ELF class ELFCLASS64.
.put("543-env-long-ref",
- TestCondition.match(TestCondition.runtimes(DexVm.ART_4_4_4)))
+ TestCondition.match(TestCondition.runtimes(DexVm.Version.V4_4_4)))
// Regression test for an issue that is not fixed on version 5.1.1. Throws an Exception
// instance instead of the expected NullPointerException. This bug is only tickled when
// running the R8 generated code when starting from jar or from dex code generated with
@@ -587,14 +594,15 @@ public abstract class R8RunArtTestsTest {
TestCondition.match(
TestCondition.tools(DexTool.NONE, DexTool.DX),
TestCondition.R8_COMPILER,
- TestCondition.runtimes(DexVm.ART_5_1_1)))
+ TestCondition.runtimes(DexVm.Version.V5_1_1)))
// Contains a method (B.<init>) which pass too few arguments to invoke. Also, contains an
// iput on a static field.
.put(
"600-verifier-fails",
TestCondition.match(
TestCondition.D8_COMPILER,
- TestCondition.runtimes(DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
+ TestCondition.runtimes(DexVm.Version.V7_0_0, DexVm.Version.V6_0_1,
+ DexVm.Version.V5_1_1)))
.build();
// Tests where the output of R8/D8 runs in Art but produces different output than the expected.txt
@@ -605,12 +613,12 @@ public abstract class R8RunArtTestsTest {
.put("072-precise-gc",
TestCondition.match(
TestCondition.R8_COMPILER,
- TestCondition.runtimes(DexVm.ART_4_4_4)))
+ TestCondition.runtimes(DexVm.Version.V4_4_4)))
.put("072-precise-gc",
TestCondition.match(
TestCondition.tools(DexTool.JACK, DexTool.NONE),
TestCondition.D8_COMPILER,
- TestCondition.runtimes(DexVm.ART_4_4_4)))
+ TestCondition.runtimes(DexVm.Version.V4_4_4)))
// This one is expected to have different output. It counts instances, but the list that
// keeps the instances alive is dead and could be garbage collected. The compiler reuses
// the register for the list and therefore there are no live instances.
@@ -621,23 +629,25 @@ public abstract class R8RunArtTestsTest {
"800-smali",
TestCondition.match(
TestCondition.D8_COMPILER,
- TestCondition.runtimes(DexVm.ART_5_1_1, DexVm.ART_6_0_1)))
+ TestCondition.runtimes(DexVm.Version.V5_1_1, DexVm.Version.V6_0_1)))
// Triggers regression test in 6.0.1 when using R8/D8 in debug mode.
.put(
"474-fp-sub-neg",
TestCondition.match(
TestCondition.tools(DexTool.NONE, DexTool.JACK),
TestCondition.D8_COMPILER,
- TestCondition.runtimes(DexVm.ART_6_0_1)))
+ TestCondition.runtimes(DexVm.Version.V6_0_1)))
.build();
private static final TestCondition beforeAndroidN =
TestCondition
- .match(TestCondition.runtimes(DexVm.ART_4_4_4, DexVm.ART_5_1_1, DexVm.ART_6_0_1));
+ .match(TestCondition
+ .runtimes(DexVm.Version.V4_4_4, DexVm.Version.V5_1_1, DexVm.Version.V6_0_1));
private static final TestCondition beforeAndroidO =
TestCondition.match(
TestCondition.runtimes(
- DexVm.ART_4_4_4, DexVm.ART_5_1_1, DexVm.ART_6_0_1, DexVm.ART_7_0_0));
+ DexVm.Version.V4_4_4, DexVm.Version.V5_1_1, DexVm.Version.V6_0_1,
+ DexVm.Version.V7_0_0));
// TODO(ager): Could we test that these fail in the way that we expect?
private static final Multimap<String, TestCondition> expectedToFailRunWithArt =
@@ -666,7 +676,8 @@ public abstract class R8RunArtTestsTest {
TestCondition.match(
TestCondition.tools(DexTool.JACK, DexTool.DX),
TestCondition.compilers(CompilerUnderTest.R8, CompilerUnderTest.D8),
- TestCondition.runtimes(DexVm.ART_4_4_4, DexVm.ART_5_1_1, DexVm.ART_6_0_1)))
+ TestCondition
+ .runtimes(DexVm.Version.V4_4_4, DexVm.Version.V5_1_1, DexVm.Version.V6_0_1)))
// Array index out of bounds exception.
.put("449-checker-bce", TestCondition.any())
// Fails: get_vreg_jni.cc:46] Check failed: value == 42u (value=314630384, 42u=42)
@@ -675,28 +686,28 @@ public abstract class R8RunArtTestsTest {
.put(
"454-get-vreg",
TestCondition.match(
- TestCondition.runtimes(DexVm.ART_4_4_4, DexVm.ART_5_1_1,
- DexVm.ART_6_0_1, DexVm.ART_7_0_0)))
+ TestCondition.runtimes(DexVm.Version.V4_4_4, DexVm.Version.V5_1_1,
+ DexVm.Version.V6_0_1, DexVm.Version.V7_0_0)))
.put(
"454-get-vreg",
TestCondition.match(
TestCondition.tools(DexTool.NONE),
TestCondition.D8_COMPILER,
- TestCondition.runtimes(DexVm.ART_DEFAULT)))
+ TestCondition.runtimes(DexVm.Version.DEFAULT)))
.put("454-get-vreg", TestCondition.match(TestCondition.R8_COMPILER))
// Fails: regs_jni.cc:42] Check failed: GetVReg(m, 0, kIntVReg, &value)
// The R8/D8 code does not put values in the same registers as the tests expects.
.put(
"457-regs",
TestCondition.match(
- TestCondition.runtimes(DexVm.ART_4_4_4, DexVm.ART_5_1_1,
- DexVm.ART_6_0_1, DexVm.ART_7_0_0)))
+ TestCondition.runtimes(DexVm.Version.V4_4_4, DexVm.Version.V5_1_1,
+ DexVm.Version.V6_0_1, DexVm.Version.V7_0_0)))
.put(
"457-regs",
TestCondition.match(
TestCondition.tools(DexTool.NONE),
TestCondition.D8_COMPILER,
- TestCondition.runtimes(DexVm.ART_DEFAULT)))
+ TestCondition.runtimes(DexVm.Version.DEFAULT)))
.put("457-regs", TestCondition.match(TestCondition.R8_COMPILER))
// Class not found.
.put("529-checker-unresolved", TestCondition.any())
@@ -753,11 +764,13 @@ public abstract class R8RunArtTestsTest {
// Uses dex file version 37 and therefore only runs on Android N and above.
.put("972-iface-super-multidex",
TestCondition.match(TestCondition.tools(DexTool.JACK, DexTool.DX),
- TestCondition.runtimes(DexVm.ART_4_4_4, DexVm.ART_5_1_1, DexVm.ART_6_0_1)))
+ TestCondition
+ .runtimes(DexVm.Version.V4_4_4, DexVm.Version.V5_1_1, DexVm.Version.V6_0_1)))
// Uses dex file version 37 and therefore only runs on Android N and above.
.put("978-virtual-interface",
TestCondition.match(TestCondition.tools(DexTool.JACK, DexTool.DX),
- TestCondition.runtimes(DexVm.ART_4_4_4, DexVm.ART_5_1_1, DexVm.ART_6_0_1)))
+ TestCondition
+ .runtimes(DexVm.Version.V4_4_4, DexVm.Version.V5_1_1, DexVm.Version.V6_0_1)))
.build();
// Tests where code generation fails.
@@ -1015,12 +1028,12 @@ public abstract class R8RunArtTestsTest {
private static Set<String> collectTestsMatchingConditions(
DexTool dexTool,
CompilerUnderTest compilerUnderTest,
- DexVm dexVm,
+ DexVm.Version dexVmVersion,
CompilationMode mode,
Multimap<String, TestCondition> testConditionsMap) {
Set<String> set = Sets.newHashSet();
for (Map.Entry<String, TestCondition> kv : testConditionsMap.entries()) {
- if (kv.getValue().test(dexTool, compilerUnderTest, dexVm, mode)) {
+ if (kv.getValue().test(dexTool, compilerUnderTest, dexVmVersion, mode)) {
set.add(kv.getKey());
}
}
@@ -1028,9 +1041,9 @@ public abstract class R8RunArtTestsTest {
}
private static Map<SpecificationKey, TestSpecification> getTestsMap(
- CompilerUnderTest compilerUnderTest, CompilationMode compilationMode, DexVm dexVm) {
+ CompilerUnderTest compilerUnderTest, CompilationMode compilationMode, DexVm.Version version) {
File artTestDir = new File(ART_TESTS_DIR);
- if (LEGACY_RUNTIME.set.contains(dexVm)) {
+ if (LEGACY_RUNTIME.set.contains(version)) {
artTestDir = new File(ART_LEGACY_TESTS_DIR);
}
if (!artTestDir.exists()) {
@@ -1053,11 +1066,11 @@ public abstract class R8RunArtTestsTest {
// Collect the tests failing code generation.
Set<String> failsWithCompiler =
collectTestsMatchingConditions(
- dexTool, compilerUnderTest, dexVm, compilationMode, failingWithCompiler);
+ dexTool, compilerUnderTest, version, compilationMode, failingWithCompiler);
// Collect the tests that are flaky.
skipArt.addAll(collectTestsMatchingConditions(
- dexTool, compilerUnderTest, dexVm, compilationMode, flakyRunWithArt));
+ dexTool, compilerUnderTest, version, compilationMode, flakyRunWithArt));
// Collect tests that has no input:
if (dexTool == DexTool.NONE) {
@@ -1066,43 +1079,44 @@ public abstract class R8RunArtTestsTest {
// Collect the test that we should skip in this configuration
skipTest.addAll(collectTestsMatchingConditions(
- dexTool, compilerUnderTest, dexVm, compilationMode, testToSkip));
+ dexTool, compilerUnderTest, version, compilationMode, testToSkip));
// Collect the test that we should skip in this configuration.
skipArt.addAll(
collectTestsMatchingConditions(
- dexTool, compilerUnderTest, dexVm, compilationMode, timeoutOrSkipRunWithArt));
+ dexTool, compilerUnderTest, version, compilationMode, timeoutOrSkipRunWithArt));
// Collect the tests failing to run in Art (we still run R8/D8 on these).
Set<String> failsWithArt =
collectTestsMatchingConditions(
- dexTool, compilerUnderTest, dexVm, compilationMode, failingRunWithArt);
+ dexTool, compilerUnderTest, version, compilationMode, failingRunWithArt);
{
Set<String> tmpSet =
collectTestsMatchingConditions(
- dexTool, compilerUnderTest, dexVm, compilationMode, expectedToFailRunWithArt);
+ dexTool, compilerUnderTest, version, compilationMode, expectedToFailRunWithArt);
failsWithArt.addAll(tmpSet);
}
- if (!ToolHelper.isDefaultDexVm(dexVm)) {
+ if (!ToolHelper.isDefaultDexVm(ToolHelper.getDexVm())) {
// Generally failing when not TOT art.
failsWithArt.addAll(expectedToFailRunWithArtNonDefault);
// Version specific failures
- failsWithArt.addAll(expectedToFailRunWithArtVersion.get(dexVm));
+ failsWithArt
+ .addAll(expectedToFailRunWithArtVersion.get(ToolHelper.getDexVm().getVersion()));
}
// Collect the tests failing with output differences in Art.
Set<String> failsRunWithArtOutput =
collectTestsMatchingConditions(
- dexTool, compilerUnderTest, dexVm, compilationMode, failingRunWithArtOutput);
+ dexTool, compilerUnderTest, version, compilationMode, failingRunWithArtOutput);
Set<String> expectedToFailWithCompilerSet =
collectTestsMatchingConditions(
- dexTool, compilerUnderTest, dexVm, compilationMode, expectedToFailWithCompiler);
+ dexTool, compilerUnderTest, version, compilationMode, expectedToFailWithCompiler);
// Collect the tests where the original works in Art and the R8/D8 generated output does not.
Set<String> failsRunWithArtOriginalOnly =
collectTestsMatchingConditions(
- dexTool, compilerUnderTest, dexVm, compilationMode, failingRunWithArtOriginalOnly);
+ dexTool, compilerUnderTest, version, compilationMode, failingRunWithArtOriginalOnly);
File compilerTestDir = artTestDir.toPath().resolve(dexToolDirectory(dexTool)).toFile();
File[] testDirs = compilerTestDir.listFiles();
@@ -1112,7 +1126,7 @@ public abstract class R8RunArtTestsTest {
// Skip all tests compiled to dex with jack on Dalvik. They have a too high dex
// version number in the generated output.
boolean skip = skipTest.contains(name) ||
- (dexTool == DexTool.JACK && dexVm == DexVm.ART_4_4_4);
+ (dexTool == DexTool.JACK && version == DexVm.Version.V4_4_4);
// All the native code for all Art tests is currently linked into the
// libarttest.so file.
data.put(
@@ -1177,9 +1191,7 @@ public abstract class R8RunArtTestsTest {
if (artVersion != DexVm.ART_DEFAULT) {
artTestNativeLibraryDir = new File(ART_LEGACY_TESTS_NATIVE_LIBRARY_DIR);
}
- builder.appendArtSystemProperty(
- "java.library.path",
- artTestNativeLibraryDir.getAbsolutePath());
+ builder.addToJavaLibraryPath(artTestNativeLibraryDir);
builder.appendProgramArgument(specification.nativeLibrary);
}
return builder;
@@ -1480,7 +1492,7 @@ public abstract class R8RunArtTestsTest {
}
ArtCommandBuilder builder = buildArtCommand(processedFile, specification, dexVm);
- if (ToolHelper.getDexVm() != DexVm.ART_4_4_4) {
+ if (ToolHelper.getDexVm() != DexVm.ART_4_4_4_HOST) {
builder.appendArtOption("-Ximage:/system/non/existent/image.art");
}
for (String s : ToolHelper.getBootLibs()) {
@@ -1516,11 +1528,11 @@ public abstract class R8RunArtTestsTest {
CompilationMode compilationMode = defaultCompilationMode(compilerUnderTest);
TestSpecification specification =
- getTestsMap(firstCompilerUnderTest, compilationMode, version)
+ getTestsMap(firstCompilerUnderTest, compilationMode, version.getVersion())
.get(new SpecificationKey(name, toolchain));
if (specification == null) {
- if (version == DexVm.ART_DEFAULT) {
+ if (version.getVersion() == DexVm.Version.DEFAULT) {
throw new RuntimeException("Test " + name + " has no specification for toolchain"
+ toolchain + ".");
} else {
@@ -1534,6 +1546,11 @@ public abstract class R8RunArtTestsTest {
return;
}
+ if (specification.nativeLibrary != null && ToolHelper.getDexVm().getKind() == Kind.TARGET) {
+ // JNI tests not yet supported for devices
+ return;
+ }
+
File[] inputFiles;
if (toolchain == DexTool.NONE) {
inputFiles = addFileTree(new File[0], new File(specification.directory, "classes"));
@@ -1564,7 +1581,7 @@ public abstract class R8RunArtTestsTest {
if (compilerUnderTest == CompilerUnderTest.R8_AFTER_D8) {
compilationMode = CompilationMode.DEBUG;
specification =
- getTestsMap(CompilerUnderTest.R8_AFTER_D8, compilationMode, version)
+ getTestsMap(CompilerUnderTest.R8_AFTER_D8, compilationMode, version.getVersion())
.get(new SpecificationKey(name, DexTool.DX));
if (specification == null) {
@@ -1673,7 +1690,7 @@ public abstract class R8RunArtTestsTest {
}
File checkCommand = specification.resolveFile("check");
- if (checkCommand.exists()) {
+ if (checkCommand.exists() && !ToolHelper.isWindows()) {
// Run the Art test custom check command.
File actualFile = temp.newFile();
com.google.common.io.Files.asByteSink(actualFile).write(output.getBytes(Charsets.UTF_8));
diff --git a/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
index b43b0412b..ebf474953 100644
--- a/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
@@ -5,6 +5,7 @@
package com.android.tools.r8;
import com.android.tools.r8.ToolHelper.DexVm;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
import com.android.tools.r8.dex.Constants;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.google.common.collect.ImmutableList;
@@ -19,21 +20,21 @@ import org.junit.Test;
public class R8RunExamplesAndroidOTest extends RunExamplesAndroidOTest<R8Command.Builder> {
- private static Map<DexVm, List<String>> alsoFailsOn =
+ private static Map<DexVm.Version, List<String>> alsoFailsOn =
ImmutableMap.of(
- DexVm.ART_4_4_4, ImmutableList.of(
+ Version.V4_4_4, ImmutableList.of(
"invokecustom-with-shrinking"
),
- DexVm.ART_5_1_1, ImmutableList.of(
+ Version.V5_1_1, ImmutableList.of(
"invokecustom-with-shrinking"
),
- DexVm.ART_6_0_1, ImmutableList.of(
+ Version.V6_0_1, ImmutableList.of(
"invokecustom-with-shrinking"
),
- DexVm.ART_7_0_0, ImmutableList.of(
+ Version.V7_0_0, ImmutableList.of(
"invokecustom-with-shrinking"
),
- DexVm.ART_DEFAULT, ImmutableList.of(
+ Version.DEFAULT, ImmutableList.of(
)
);
diff --git a/src/test/java/com/android/tools/r8/R8RunExamplesTest.java b/src/test/java/com/android/tools/r8/R8RunExamplesTest.java
index c8561b8df..5c7d303dd 100644
--- a/src/test/java/com/android/tools/r8/R8RunExamplesTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunExamplesTest.java
@@ -12,6 +12,7 @@ import static org.junit.Assert.fail;
import com.android.tools.r8.R8RunArtTestsTest.CompilerUnderTest;
import com.android.tools.r8.R8RunArtTestsTest.DexTool;
import com.android.tools.r8.ToolHelper.DexVm;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.shaking.ProguardRuleParserException;
import com.android.tools.r8.utils.FileUtils;
@@ -64,7 +65,7 @@ public class R8RunExamplesTest {
.put(
"filledarray.FilledArray",
TestCondition.match(
- TestCondition.runtimes(DexVm.ART_6_0_1, DexVm.ART_5_1_1, DexVm.ART_4_4_4)))
+ TestCondition.runtimes(Version.V6_0_1, Version.V5_1_1, Version.V4_4_4)))
.build();
@Parameters(name = "{0}_{1}_{2}_{3}")
@@ -250,7 +251,7 @@ public class R8RunExamplesTest {
// this explicit loop to get rid of repeated testing on the buildbots.
for (DexVm version : artVersions) {
TestCondition condition = failingRun.get(mainClass);
- if (condition != null && condition.test(getTool(), compiler, version, mode)) {
+ if (condition != null && condition.test(getTool(), compiler, version.getVersion(), mode)) {
thrown.expect(Throwable.class);
} else {
thrown = ExpectedException.none();
@@ -261,17 +262,17 @@ public class R8RunExamplesTest {
ToolHelper.checkArtOutputIdentical(original, generated.toString(), mainClass, version);
// Check output against JVM output.
- if (shouldMatchJVMOutput(version)) {
+ if (shouldMatchJVMOutput(version.getVersion())) {
String javaOutput = javaResult.stdout;
assertEquals(
"JVM and Art output differ:\n" + "JVM:\n" + javaOutput + "\nArt:\n" + output,
- output,
- javaOutput);
+ javaOutput,
+ output);
}
}
}
- private boolean shouldMatchJVMOutput(DexVm version) {
+ private boolean shouldMatchJVMOutput(DexVm.Version version) {
TestCondition condition = outputNotIdenticalToJVMOutput.get(mainClass);
return condition == null || !condition.test(getTool(), compiler, version, mode);
}
diff --git a/src/test/java/com/android/tools/r8/R8RunSmaliTestsTest.java b/src/test/java/com/android/tools/r8/R8RunSmaliTestsTest.java
index 2de362444..cf0b71ebe 100644
--- a/src/test/java/com/android/tools/r8/R8RunSmaliTestsTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunSmaliTestsTest.java
@@ -6,6 +6,7 @@ package com.android.tools.r8;
import static org.junit.Assert.assertEquals;
import com.android.tools.r8.ToolHelper.DexVm;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
import com.android.tools.r8.shaking.ProguardRuleParserException;
import com.android.tools.r8.utils.StringUtils;
import com.google.common.collect.ImmutableList;
@@ -35,13 +36,13 @@ public class R8RunSmaliTestsTest {
private static final String SMALI_DIR = ToolHelper.SMALI_BUILD_DIR;
// Tests where the original smali code fails on Art, but runs after R8 processing.
- private static Map<DexVm, List<String>> originalFailingOnArtVersions = ImmutableMap.of(
- DexVm.ART_5_1_1, ImmutableList.of(
+ private static Map<DexVm.Version, List<String>> originalFailingOnArtVersions = ImmutableMap.of(
+ Version.V5_1_1, ImmutableList.of(
// Smali code contains an empty switch payload.
"sparse-switch",
"regression/33846227"
),
- DexVm.ART_4_4_4, ImmutableList.of(
+ Version.V4_4_4, ImmutableList.of(
// Smali code contains an empty switch payload.
"sparse-switch",
"regression/33846227"
@@ -49,19 +50,20 @@ public class R8RunSmaliTestsTest {
);
// Tests where the output has a different output than the original on certain VMs.
- private static Map<DexVm, Map<String, String>> customProcessedOutputExpectation = ImmutableMap.of(
- DexVm.ART_4_4_4, ImmutableMap.of(
- "bad-codegen", "java.lang.NullPointerException\n",
- "type-confusion-regression2", "java.lang.NullPointerException\n",
- "type-confusion-regression3", "java.lang.NullPointerException\n",
- "merge-blocks-regression", "java.lang.NullPointerException\n"
- )
- );
+ private static Map<DexVm.Version, Map<String, String>> customProcessedOutputExpectation =
+ ImmutableMap.of(
+ Version.V4_4_4, ImmutableMap.of(
+ "bad-codegen", "java.lang.NullPointerException\n",
+ "type-confusion-regression2", "java.lang.NullPointerException\n",
+ "type-confusion-regression3", "java.lang.NullPointerException\n",
+ "merge-blocks-regression", "java.lang.NullPointerException\n"
+ )
+ );
// Tests where the input fails with a verification error on Dalvik instead of the
// expected runtime exception.
- private static Map<DexVm, List<String>> dalvikVerificationError = ImmutableMap.of(
- DexVm.ART_4_4_4, ImmutableList.of(
+ private static Map<DexVm.Version, List<String>> dalvikVerificationError = ImmutableMap.of(
+ Version.V4_4_4, ImmutableList.of(
// The invokes are in fact invalid, but the test expects the current Art behavior
// of throwing an IncompatibleClassChange exception. Dalvik fails to verify.
"illegal-invokes"
diff --git a/src/test/java/com/android/tools/r8/RunExamplesAndroidNTest.java b/src/test/java/com/android/tools/r8/RunExamplesAndroidNTest.java
index 03093dff5..fd29dc11c 100644
--- a/src/test/java/com/android/tools/r8/RunExamplesAndroidNTest.java
+++ b/src/test/java/com/android/tools/r8/RunExamplesAndroidNTest.java
@@ -104,17 +104,17 @@ public abstract class RunExamplesAndroidNTest<B> {
abstract void build(Path inputFile, Path out) throws Throwable;
}
- private static Map<DexVm, List<String>> failsOn =
+ private static Map<DexVm.Version, List<String>> failsOn =
ImmutableMap.of(
- DexVm.ART_4_4_4,
+ DexVm.Version.V4_4_4,
ImmutableList.of(),
- DexVm.ART_5_1_1,
+ DexVm.Version.V5_1_1,
ImmutableList.of(),
- DexVm.ART_6_0_1,
+ DexVm.Version.V6_0_1,
ImmutableList.of(),
- DexVm.ART_7_0_0,
+ DexVm.Version.V7_0_0,
ImmutableList.of(),
- DexVm.ART_DEFAULT,
+ DexVm.Version.DEFAULT,
ImmutableList.of());
@Rule public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
diff --git a/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java
index 84f276882..08f196c86 100644
--- a/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java
@@ -12,6 +12,7 @@ import static org.junit.Assert.assertTrue;
import com.android.tools.r8.ToolHelper.DexVm;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.AndroidApp;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
import com.android.tools.r8.utils.DexInspector;
import com.android.tools.r8.utils.DexInspector.FoundClassSubject;
import com.android.tools.r8.utils.DexInspector.FoundMethodSubject;
@@ -174,9 +175,9 @@ public abstract class RunExamplesAndroidOTest
ImmutableList.of(
"invokepolymorphic-error-due-to-min-sdk", "invokecustom-error-due-to-min-sdk");
- private static Map<DexVm, List<String>> failsOn =
+ private static Map<DexVm.Version, List<String>> failsOn =
ImmutableMap.of(
- DexVm.ART_4_4_4, ImmutableList.of(
+ DexVm.Version.V4_4_4, ImmutableList.of(
// API not supported
"paramnames",
"repeat_annotations_new_api",
@@ -190,7 +191,7 @@ public abstract class RunExamplesAndroidOTest
"testCallToMissingSuperInterfaceDesugaredAndroidO",
"testMissingSuperDesugaredAndroidO"
),
- DexVm.ART_5_1_1, ImmutableList.of(
+ DexVm.Version.V5_1_1, ImmutableList.of(
// API not supported
"paramnames",
"repeat_annotations_new_api",
@@ -204,7 +205,7 @@ public abstract class RunExamplesAndroidOTest
"testCallToMissingSuperInterfaceDesugaredAndroidO",
"testMissingSuperDesugaredAndroidO"
),
- DexVm.ART_6_0_1, ImmutableList.of(
+ DexVm.Version.V6_0_1, ImmutableList.of(
// API not supported
"paramnames",
"repeat_annotations_new_api",
@@ -218,7 +219,7 @@ public abstract class RunExamplesAndroidOTest
"testCallToMissingSuperInterfaceDesugaredAndroidO",
"testMissingSuperDesugaredAndroidO"
),
- DexVm.ART_7_0_0, ImmutableList.of(
+ DexVm.Version.V7_0_0, ImmutableList.of(
// API not supported
"paramnames",
// Dex version not supported
@@ -229,8 +230,7 @@ public abstract class RunExamplesAndroidOTest
"testCallToMissingSuperInterfaceDesugaredAndroidO",
"testMissingSuperDesugaredAndroidO"
),
- DexVm.ART_DEFAULT, ImmutableList.of(
- )
+ DexVm.Version.DEFAULT, ImmutableList.of()
);
@Rule
@@ -239,9 +239,10 @@ public abstract class RunExamplesAndroidOTest
@Rule
public ExpectedException thrown = ExpectedException.none();
- boolean failsOn(Map<ToolHelper.DexVm, List<String>> failsOn, String name) {
- return failsOn.containsKey(ToolHelper.getDexVm())
- && failsOn.get(ToolHelper.getDexVm()).contains(name);
+ boolean failsOn(Map<ToolHelper.DexVm.Version, List<String>> failsOn, String name) {
+ Version vmVersion = ToolHelper.getDexVm().getVersion();
+ return failsOn.containsKey(vmVersion)
+ && failsOn.get(vmVersion).contains(name);
}
boolean expectedToFail(String name) {
@@ -395,8 +396,8 @@ public abstract class RunExamplesAndroidOTest
"JVM output does not match art output.\n\tjvm: "
+ javaResult.stdout
+ "\n\tart: "
- + output.replace("\r", ""),
- output.equals(javaResult.stdout.replace("\r", "")));
+ + output,
+ output.replace("\r", "").equals(javaResult.stdout.replace("\r", "")));
}
}
diff --git a/src/test/java/com/android/tools/r8/TestCondition.java b/src/test/java/com/android/tools/r8/TestCondition.java
index 438fd3728..1aca2bdea 100644
--- a/src/test/java/com/android/tools/r8/TestCondition.java
+++ b/src/test/java/com/android/tools/r8/TestCondition.java
@@ -31,9 +31,9 @@ public class TestCondition {
static class RuntimeSet {
- final EnumSet<DexVm> set;
+ final EnumSet<DexVm.Version> set;
- public RuntimeSet(EnumSet<DexVm> set) {
+ public RuntimeSet(EnumSet<DexVm.Version> set) {
this.set = set;
}
}
@@ -64,19 +64,19 @@ public class TestCondition {
private static final ToolSet ANY_TOOL = new ToolSet(EnumSet.allOf(DexTool.class));
private static final CompilerSet ANY_COMPILER =
new CompilerSet(EnumSet.allOf(CompilerUnderTest.class));
- private static final RuntimeSet ANY_RUNTIME = new RuntimeSet(EnumSet.allOf(DexVm.class));
+ private static final RuntimeSet ANY_RUNTIME = new RuntimeSet(EnumSet.allOf(DexVm.Version.class));
private static final CompilationModeSet ANY_MODE =
new CompilationModeSet(EnumSet.allOf(CompilationMode.class));
private final EnumSet<DexTool> dexTools;
private final EnumSet<CompilerUnderTest> compilers;
- private final EnumSet<DexVm> dexVms;
+ private final EnumSet<DexVm.Version> dexVms;
private final EnumSet<CompilationMode> compilationModes;
public TestCondition(
EnumSet<DexTool> dexTools,
EnumSet<CompilerUnderTest> compilers,
- EnumSet<DexVm> dexVms,
+ EnumSet<DexVm.Version> dexVms,
EnumSet<CompilationMode> compilationModes) {
this.dexTools = dexTools;
this.compilers = compilers;
@@ -94,7 +94,7 @@ public class TestCondition {
return new CompilerSet(EnumSet.copyOf(Arrays.asList(compilers)));
}
- public static RuntimeSet runtimes(DexVm... runtimes) {
+ public static RuntimeSet runtimes(DexVm.Version... runtimes) {
assert runtimes.length > 0;
return new RuntimeSet(EnumSet.copyOf(Arrays.asList(runtimes)));
}
@@ -146,11 +146,11 @@ public class TestCondition {
public boolean test(
DexTool dexTool,
CompilerUnderTest compilerUnderTest,
- DexVm dexVm,
+ DexVm.Version dexVmVersion,
CompilationMode compilationMode) {
return dexTools.contains(dexTool)
&& compilers.contains(compilerUnderTest)
- && dexVms.contains(dexVm)
+ && dexVms.contains(dexVmVersion)
&& compilationModes.contains(compilationMode);
}
}
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 377d2aac6..b97bd7b1b 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -7,6 +7,8 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import com.android.tools.r8.DeviceRunner.DeviceRunnerConfigurationException;
+import com.android.tools.r8.ToolHelper.DexVm.Kind;
import com.android.tools.r8.dex.ApplicationReader;
import com.android.tools.r8.dex.Constants;
import com.android.tools.r8.graph.AppInfoWithSubtyping;
@@ -69,11 +71,15 @@ public class ToolHelper {
private static final int DEFAULT_MIN_SDK = AndroidApiLevel.I.getLevel();
public enum DexVm {
- ART_4_4_4("4.4.4"),
- ART_5_1_1("5.1.1"),
- ART_6_0_1("6.0.1"),
- ART_7_0_0("7.0.0"),
- ART_DEFAULT("default");
+ ART_4_4_4_TARGET(Version.V4_4_4, Kind.TARGET),
+ ART_4_4_4_HOST(Version.V4_4_4, Kind.HOST),
+ ART_5_1_1_TARGET(Version.V5_1_1, Kind.TARGET),
+ ART_5_1_1_HOST(Version.V5_1_1, Kind.HOST),
+ ART_6_0_1_TARGET(Version.V6_0_1, Kind.TARGET),
+ ART_6_0_1_HOST(Version.V6_0_1, Kind.HOST),
+ ART_7_0_0_TARGET(Version.V7_0_0, Kind.TARGET),
+ ART_7_0_0_HOST(Version.V7_0_0, Kind.HOST),
+ ART_DEFAULT(Version.DEFAULT, Kind.HOST);
private static final ImmutableMap<String, DexVm> SHORT_NAME_MAP =
new ImmutableMap.Builder<String, DexVm>()
@@ -82,8 +88,45 @@ public class ToolHelper {
Collectors.toMap(a -> a.toString(), a -> a)))
.build();
+ public enum Version {
+ V4_4_4("4.4.4"),
+ V5_1_1("5.1.1"),
+ V6_0_1("6.0.1"),
+ V7_0_0("7.0.0"),
+ DEFAULT("default");
+
+ Version (String shortName) { this.shortName = shortName; }
+
+ public boolean isNewerThan(Version other) {
+ return compareTo(other) > 0;
+ }
+
+ public boolean isOlderThanOrEqual(Version other) {
+ return compareTo(other) <= 0;
+ }
+
+ public String toString() {
+ return shortName;
+ }
+
+ private String shortName;
+ }
+
+ public enum Kind {
+ HOST("host"),
+ TARGET("target");
+
+ Kind (String shortName) { this.shortName = shortName; }
+
+ public String toString() {
+ return shortName;
+ }
+
+ private String shortName;
+ }
+
public String toString() {
- return shortName;
+ return version.shortName + '_' + kind.shortName;
}
public static DexVm fromShortName(String shortName) {
@@ -91,29 +134,33 @@ public class ToolHelper {
}
public boolean isNewerThan(DexVm other) {
- return compareTo(other) > 0;
+ return version.isNewerThan(other.version);
}
public boolean isOlderThanOrEqual(DexVm other) {
- return compareTo(other) <= 0;
+ return version.isOlderThanOrEqual(other.version);
}
-
- private DexVm(String shortName) {
- this.shortName = shortName;
+ DexVm(Version version, Kind kind) {
+ this.version = version;
+ this.kind = kind;
}
- private final String shortName;
+ public Version getVersion() { return version; }
+ public Kind getKind() { return kind; }
+
+ private final Version version;
+ private final Kind kind;
}
public abstract static class CommandBuilder {
- private List<String> options = new ArrayList<>();
- private Map<String, String> systemProperties = new LinkedHashMap<>();
- private List<String> classpaths = new ArrayList<>();
- private String mainClass;
- private List<String> programArguments = new ArrayList<>();
- private List<String> bootClassPaths = new ArrayList<>();
+ protected List<String> options = new ArrayList<>();
+ protected Map<String, String> systemProperties = new LinkedHashMap<>();
+ protected List<String> classpaths = new ArrayList<>();
+ protected String mainClass;
+ protected List<String> programArguments = new ArrayList<>();
+ protected List<String> bootClassPaths = new ArrayList<>();
public CommandBuilder appendArtOption(String option) {
options.add(option);
@@ -151,8 +198,10 @@ public class ToolHelper {
// explicitly set it;
if (shouldUseDocker()) {
result.add("tools/docker/run.sh");
- } else {
+ } else if (isLinux()) {
result.add("/bin/bash");
+ } else {
+ assert isWindows();
}
result.add(getExecutable());
for (String option : options) {
@@ -199,22 +248,49 @@ public class ToolHelper {
private DexVm version;
public ArtCommandBuilder() {
+ this.version = getDexVm();
}
public ArtCommandBuilder(DexVm version) {
- assert ART_BINARY_VERSIONS.containsKey(version);
+ if (version.getKind() == Kind.HOST) {
+ assert ART_BINARY_VERSIONS.containsKey(version);
+ }
this.version = version;
}
@Override
protected boolean shouldUseDocker() {
- return !isLinux();
+ return isMac();
}
@Override
protected String getExecutable() {
return version != null ? getArtBinary(version) : getArtBinary();
}
+
+ public boolean isForDevice() {
+ return version.getKind() == Kind.TARGET;
+ }
+
+ public ArtCommandBuilder addToJavaLibraryPath(File file) {
+ Assume.assumeTrue("JNI tests are not yet supported on devices", !isForDevice());
+ appendArtSystemProperty("java.library.path", file.getAbsolutePath());
+ return this;
+ }
+
+ public DeviceRunner asDeviceRunner() {
+ return new DeviceRunner()
+ .setVmOptions(options)
+ .setSystemProperties(systemProperties)
+ .setClasspath(toFileList(classpaths))
+ .setBootClasspath(toFileList(bootClassPaths))
+ .setMainClass(mainClass)
+ .setProgramArguments(programArguments);
+ }
+ }
+
+ private static List<File> toFileList(List<String> filePathList) {
+ return filePathList.stream().map(path -> new File(path)).collect(Collectors.toList());
}
public static class DXCommandBuilder extends CommandBuilder {
@@ -259,29 +335,27 @@ public class ToolHelper {
}
private static final String TOOLS = "tools";
- private static final String OS_STRING = isLinux() ? "linux" : (isMac() ? "mac" : "windows");
private static final Map<DexVm, String> ART_DIRS =
- ImmutableMap.of(
- DexVm.ART_DEFAULT, "art",
- DexVm.ART_7_0_0, "art-7.0.0",
- DexVm.ART_6_0_1, "art-6.0.1",
- DexVm.ART_5_1_1, "art-5.1.1",
- DexVm.ART_4_4_4, "dalvik");
-
+ ImmutableMap.<DexVm, String>builder()
+ .put(DexVm.ART_DEFAULT, "art")
+ .put(DexVm.ART_7_0_0_HOST, "art-7.0.0")
+ .put(DexVm.ART_6_0_1_HOST, "art-6.0.1")
+ .put(DexVm.ART_5_1_1_HOST, "art-5.1.1")
+ .put(DexVm.ART_4_4_4_HOST, "dalvik").build();
private static final Map<DexVm, String> ART_BINARY_VERSIONS =
- ImmutableMap.of(
- DexVm.ART_DEFAULT, "bin/art",
- DexVm.ART_7_0_0, "bin/art",
- DexVm.ART_6_0_1, "bin/art",
- DexVm.ART_5_1_1, "bin/art",
- DexVm.ART_4_4_4, "bin/dalvik");
+ ImmutableMap.<DexVm, String>builder()
+ .put(DexVm.ART_DEFAULT, "bin/art")
+ .put(DexVm.ART_7_0_0_HOST, "bin/art")
+ .put(DexVm.ART_6_0_1_HOST, "bin/art")
+ .put(DexVm.ART_5_1_1_HOST, "bin/art")
+ .put(DexVm.ART_4_4_4_HOST, "bin/dalvik").build();
private static final Map<DexVm, String> ART_BINARY_VERSIONS_X64 =
ImmutableMap.of(
DexVm.ART_DEFAULT, "bin/art",
- DexVm.ART_7_0_0, "bin/art",
- DexVm.ART_6_0_1, "bin/art");
+ DexVm.ART_7_0_0_HOST, "bin/art",
+ DexVm.ART_6_0_1_HOST, "bin/art");
private static final List<String> DALVIK_BOOT_LIBS =
ImmutableList.of(
@@ -298,13 +372,13 @@ public class ToolHelper {
private static final Map<DexVm, List<String>> BOOT_LIBS =
ImmutableMap.of(
DexVm.ART_DEFAULT, ART_BOOT_LIBS,
- DexVm.ART_7_0_0, ART_BOOT_LIBS,
- DexVm.ART_6_0_1, ART_BOOT_LIBS,
- DexVm.ART_5_1_1, ART_BOOT_LIBS,
- DexVm.ART_4_4_4, DALVIK_BOOT_LIBS);
+ DexVm.ART_7_0_0_HOST, ART_BOOT_LIBS,
+ DexVm.ART_6_0_1_HOST, ART_BOOT_LIBS,
+ DexVm.ART_5_1_1_HOST, ART_BOOT_LIBS,
+ DexVm.ART_4_4_4_HOST, DALVIK_BOOT_LIBS);
private static final String LIB_PATH = TOOLS + "/linux/art/lib";
- private static final String DX = TOOLS + "/" + OS_STRING + "/dx/bin/dx";
+ private static final String DX = getDxExecutablePath();
private static final String DEX2OAT = TOOLS + "/linux/art/bin/dex2oat";
private static final String ANGLER_DIR = TOOLS + "/linux/art/product/angler";
private static final String ANGLER_BOOT_IMAGE = ANGLER_DIR + "/system/framework/boot.art";
@@ -322,6 +396,23 @@ public class ToolHelper {
return ""; //never here
}
+ public static String toolsDir() {
+ String osName = System.getProperty("os.name");
+ if (osName.equals("Mac OS X")) {
+ return "mac";
+ } else if (osName.contains("Windows")) {
+ return "windows";
+ } else {
+ return "linux";
+ }
+ }
+
+ private static String getDxExecutablePath() {
+ String toolsDir = toolsDir();
+ String executableName = toolsDir.equals("windows") ? "dx.bat" : "dx";
+ return TOOLS + "/" + toolsDir() + "/dx/bin/" + executableName;
+ }
+
public static String getArtBinary(DexVm version) {
String binary = ART_BINARY_VERSIONS.get(version);
if (binary == null) {
@@ -377,12 +468,15 @@ public class ToolHelper {
String artVersion = System.getProperty("dex_vm");
if (artVersion != null) {
DexVm artVersionEnum = getDexVm();
- if (!ART_BINARY_VERSIONS.containsKey(artVersionEnum)) {
+ if (artVersionEnum.getKind() == Kind.HOST
+ && !ART_BINARY_VERSIONS.containsKey(artVersionEnum)) {
throw new RuntimeException("Unsupported Art version " + artVersion);
}
return ImmutableSet.of(artVersionEnum);
} else {
- if (isLinux()) {
+ if (isWindows()) {
+ throw new RuntimeException("You need to specify a runtime with 'dex_vm' property");
+ } else if (isLinux()) {
return ART_BINARY_VERSIONS.keySet();
} else {
return ART_BINARY_VERSIONS_X64.keySet();
@@ -405,6 +499,11 @@ public class ToolHelper {
public static DexVm getDexVm() {
String artVersion = System.getProperty("dex_vm");
if (artVersion == null) {
+ if (isWindows()) {
+ throw new RuntimeException(
+ "Default Art version is not supported on Windows. Please specify a non-host runtime "
+ + "with property 'dex_vm'");
+ }
return DexVm.ART_DEFAULT;
} else {
DexVm artVersionEnum = DexVm.fromShortName(artVersion);
@@ -417,10 +516,10 @@ public class ToolHelper {
}
public static int getMinApiLevelForDexVm(DexVm dexVm) {
- switch (dexVm) {
- case ART_DEFAULT:
+ switch (dexVm.version) {
+ case DEFAULT:
return AndroidApiLevel.O.getLevel();
- case ART_7_0_0:
+ case V7_0_0:
return AndroidApiLevel.N.getLevel();
default:
return AndroidApiLevel.getDefault().getLevel();
@@ -444,7 +543,7 @@ public class ToolHelper {
}
public static boolean artSupported() {
- if (!isLinux() && !isMac()) {
+ if (!isLinux() && !isMac() && !isWindows()) {
System.err.println("Testing on your platform is not fully supported. " +
"Art does not work on on your platform.");
return false;
@@ -710,7 +809,16 @@ public class ToolHelper {
private static ProcessResult runArtProcess(ArtCommandBuilder builder) throws IOException {
Assume.assumeTrue(ToolHelper.artSupported());
- ProcessResult result = runProcess(builder.asProcessBuilder());
+ ProcessResult result;
+ if (builder.isForDevice()) {
+ try {
+ result = builder.asDeviceRunner().run();
+ } catch (DeviceRunnerConfigurationException e) {
+ throw new RuntimeException(e);
+ }
+ } else {
+ result = runProcess(builder.asProcessBuilder());
+ }
if (result.exitCode != 0) {
fail("Unexpected art failure: '" + result.stderr + "'\n" + result.stdout);
}
@@ -768,6 +876,8 @@ public class ToolHelper {
public static void runDex2Oat(Path file, Path outFile) throws IOException {
Assume.assumeTrue(ToolHelper.artSupported());
+ // TODO(jmhenaff): find a way to run this on windows (push dex and run on device/emulator?)
+ Assume.assumeTrue(!ToolHelper.isWindows());
assert Files.exists(file);
assert ByteStreams.toByteArray(Files.newInputStream(file)).length > 0;
List<String> command = new ArrayList<>();
diff --git a/src/test/java/com/android/tools/r8/debug/DebugTestBase.java b/src/test/java/com/android/tools/r8/debug/DebugTestBase.java
index 34c1181ed..b26066365 100644
--- a/src/test/java/com/android/tools/r8/debug/DebugTestBase.java
+++ b/src/test/java/com/android/tools/r8/debug/DebugTestBase.java
@@ -10,6 +10,8 @@ import com.android.tools.r8.R8Command;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.ArtCommandBuilder;
import com.android.tools.r8.ToolHelper.DexVm;
+import com.android.tools.r8.ToolHelper.DexVm.Kind;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
import com.android.tools.r8.dex.Constants;
import com.android.tools.r8.shaking.ProguardConfiguration;
import com.android.tools.r8.shaking.ProguardRuleParserException;
@@ -288,6 +290,9 @@ public abstract class DebugTestBase {
// Skip test due to unsupported runtime.
Assume.assumeTrue("Skipping test " + testName.getMethodName() + " because ART is not supported",
ToolHelper.artSupported());
+ Assume.assumeTrue("Skipping test " + testName.getMethodName()
+ + " because debug tests are not yet supported on Windows",
+ !ToolHelper.isWindows());
Assume.assumeFalse(
"Skipping failing test " + testName.getMethodName() + " for runtime " + ToolHelper
.getDexVm(), UNSUPPORTED_ART_VERSIONS.contains(ToolHelper.getDexVm()));
@@ -438,7 +443,7 @@ public abstract class DebugTestBase {
// when breaking in <clinit>. Last known good version is 7.0.0.
Assume.assumeTrue(
"Skipping test " + testName.getMethodName() + " because ART version is not supported",
- isRunningJava() || ToolHelper.getDexVm().isOlderThanOrEqual(DexVm.ART_7_0_0));
+ isRunningJava() || ToolHelper.getDexVm().getVersion().isOlderThanOrEqual(Version.V7_0_0));
checkStaticField(className, fieldName, fieldSignature, expectedValue);
});
}
@@ -610,11 +615,11 @@ public abstract class DebugTestBase {
// Set debuggee command-line.
if (RUNTIME_KIND == RuntimeKind.ART) {
ArtCommandBuilder artCommandBuilder = new ArtCommandBuilder(ToolHelper.getDexVm());
- if (ToolHelper.getDexVm().isNewerThan(DexVm.ART_5_1_1)) {
+ if (ToolHelper.getDexVm().getVersion().isNewerThan(DexVm.Version.V5_1_1)) {
artCommandBuilder.appendArtOption("-Xcompiler-option");
artCommandBuilder.appendArtOption("--debuggable");
}
- if (DEBUG_TESTS && ToolHelper.getDexVm().isNewerThan(DexVm.ART_4_4_4)) {
+ if (DEBUG_TESTS && ToolHelper.getDexVm().getVersion().isNewerThan(Version.V4_4_4)) {
artCommandBuilder.appendArtOption("-verbose:jdwp");
}
setProperty("jpda.settings.debuggeeJavaPath", artCommandBuilder.build());
diff --git a/src/test/java/com/android/tools/r8/debug/InterfaceMethodTest.java b/src/test/java/com/android/tools/r8/debug/InterfaceMethodTest.java
index 03f011fd6..46ad8156c 100644
--- a/src/test/java/com/android/tools/r8/debug/InterfaceMethodTest.java
+++ b/src/test/java/com/android/tools/r8/debug/InterfaceMethodTest.java
@@ -8,6 +8,7 @@ import static org.junit.Assert.assertEquals;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.DexVm;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
import com.android.tools.r8.debug.DebugTestBase.JUnit3Wrapper.Command;
import com.android.tools.r8.debug.DebugTestBase.StepFilter.IntelliJStepFilter;
import java.util.ArrayList;
@@ -23,7 +24,7 @@ public class InterfaceMethodTest extends DebugTestBase {
public void testDefaultMethod() throws Throwable {
// TODO(b/67225390) Dalvik steps into class loader first.
Assume.assumeTrue("Dalvik suspends in class loader",
- ToolHelper.getDexVm().isNewerThan(DexVm.ART_4_4_4));
+ ToolHelper.getDexVm().getVersion().isNewerThan(Version.V4_4_4));
String debuggeeClass = "DebugInterfaceMethod";
String parameterName = "msg";
diff --git a/src/test/java/com/android/tools/r8/graph/TargetLookupTest.java b/src/test/java/com/android/tools/r8/graph/TargetLookupTest.java
index c01ef7032..b344c8cc9 100644
--- a/src/test/java/com/android/tools/r8/graph/TargetLookupTest.java
+++ b/src/test/java/com/android/tools/r8/graph/TargetLookupTest.java
@@ -10,6 +10,7 @@ import static org.junit.Assert.assertNull;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.DexVm;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
import com.android.tools.r8.smali.SmaliTestBase;
import com.android.tools.r8.utils.InternalOptions;
import com.google.common.collect.ImmutableList;
@@ -69,7 +70,7 @@ public class TargetLookupTest extends SmaliTestBase {
assertNull(appInfo.lookupDirectTarget(method.method));
assertNotNull(appInfo.lookupStaticTarget(method.method));
- if (ToolHelper.getDexVm() == DexVm.ART_4_4_4) {
+ if (ToolHelper.getDexVm().getVersion() == DexVm.Version.V4_4_4) {
// Dalvik rejects at verification time instead of producing the
// expected IncompatibleClassChangeError.
try {
diff --git a/src/test/java/com/android/tools/r8/jasmin/FillBooleanArrayTruncation.java b/src/test/java/com/android/tools/r8/jasmin/FillBooleanArrayTruncation.java
index a03f8a5ac..c8b78034d 100644
--- a/src/test/java/com/android/tools/r8/jasmin/FillBooleanArrayTruncation.java
+++ b/src/test/java/com/android/tools/r8/jasmin/FillBooleanArrayTruncation.java
@@ -30,7 +30,7 @@ public class FillBooleanArrayTruncation extends JasminTestBase {
private void runTest(JasminBuilder builder, String main) throws Exception {
String javaResult = runOnJava(builder, main);
- if (ToolHelper.getDexVm() == DexVm.ART_4_4_4) {
+ if (ToolHelper.getDexVm().getVersion() == DexVm.Version.V4_4_4) {
// On dalvik the need for truncation is treated as a verification error.
runOnDalvikCheckVerifyError(builder, main);
runOnDalvikDxCheckVerifyError(builder, main);
diff --git a/src/test/java/com/android/tools/r8/jdwp/RunJdwpTests.java b/src/test/java/com/android/tools/r8/jdwp/RunJdwpTests.java
index a71291d72..8e12fc688 100644
--- a/src/test/java/com/android/tools/r8/jdwp/RunJdwpTests.java
+++ b/src/test/java/com/android/tools/r8/jdwp/RunJdwpTests.java
@@ -13,6 +13,7 @@ import com.android.tools.r8.D8;
import com.android.tools.r8.D8Command;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.DexVm;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
import com.android.tools.r8.ToolHelper.ProcessResult;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
@@ -57,15 +58,15 @@ public class RunJdwpTests {
}
static boolean isAndroidMOrAbove(DexVm dexVm, Tool tool) {
- return dexVm.isNewerThan(DexVm.ART_5_1_1);
+ return dexVm.getVersion().isNewerThan(Version.V5_1_1);
}
static boolean isAndroidNOrAbove(DexVm dexVm, Tool tool) {
- return dexVm.isNewerThan(DexVm.ART_6_0_1);
+ return dexVm.getVersion().isNewerThan(Version.V6_0_1);
}
static boolean isAndroidOOrAbove(DexVm dexVm, Tool tool) {
- return dexVm.isNewerThan(DexVm.ART_7_0_0);
+ return dexVm.getVersion().isNewerThan(Version.V7_0_0);
}
static boolean isLatestRuntime(DexVm dexVm, Tool tool) {
@@ -208,8 +209,13 @@ public class RunJdwpTests {
"-cp", System.getProperty("java.class.path") + File.pathSeparator + lib,
run, pkg + "." + test);
} else {
+ // TODO(jmhenaff): fix issue with python scripts
+ Assume
+ .assumeTrue("Python script fails because of library names conflicts. Skipping",
+ !ToolHelper.isWindows());
command = Arrays.asList(
- RUN_SCRIPT, "--classpath=" + lib, "--version=" + ToolHelper.getDexVm(), test);
+ RUN_SCRIPT, "--classpath=" + lib, "--version=" + ToolHelper.getDexVm().getVersion(),
+ test);
}
ProcessBuilder builder = new ProcessBuilder(command);
ProcessResult result = ToolHelper.runProcess(builder);
diff --git a/src/test/java/com/android/tools/r8/rewrite/staticvalues/inlibraries/StaticLibraryValuesChangeTest.java b/src/test/java/com/android/tools/r8/rewrite/staticvalues/inlibraries/StaticLibraryValuesChangeTest.java
index c7b0c32c3..d1a2514bf 100644
--- a/src/test/java/com/android/tools/r8/rewrite/staticvalues/inlibraries/StaticLibraryValuesChangeTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/staticvalues/inlibraries/StaticLibraryValuesChangeTest.java
@@ -8,6 +8,7 @@ import static org.junit.Assert.assertEquals;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
import com.android.tools.r8.jasmin.JasminBuilder;
import com.android.tools.r8.shaking.FilteredClassPath;
import com.android.tools.r8.smali.SmaliTestBase.SmaliBuilder;
@@ -38,7 +39,7 @@ public class StaticLibraryValuesChangeTest extends TestBase {
*/
// TODO(66944616): Can we make this work on Dalvik as well?
- Assume.assumeTrue("Skipping on 4.4.4", ToolHelper.getDexVm() != ToolHelper.DexVm.ART_4_4_4);
+ Assume.assumeTrue("Skipping on 4.4.4", ToolHelper.getDexVm().getVersion() != Version.V4_4_4);
// Build the second version of LibraryClass
JasminBuilder compileTimeLibrary = new JasminBuilder();
diff --git a/src/test/java/com/android/tools/r8/utils/ArtCommandBuilderTest.java b/src/test/java/com/android/tools/r8/utils/ArtCommandBuilderTest.java
index b68c15d02..b18dda819 100644
--- a/src/test/java/com/android/tools/r8/utils/ArtCommandBuilderTest.java
+++ b/src/test/java/com/android/tools/r8/utils/ArtCommandBuilderTest.java
@@ -8,6 +8,7 @@ import static org.junit.Assert.assertEquals;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.ArtCommandBuilder;
import com.android.tools.r8.ToolHelper.DexVm;
+import com.android.tools.r8.ToolHelper.DexVm.Kind;
import org.junit.Assert;
import org.junit.Assume;
import org.junit.Before;
@@ -21,6 +22,7 @@ public class ArtCommandBuilderTest {
@Before
public void setUp() {
Assume.assumeTrue(ToolHelper.artSupported());
+ Assume.assumeTrue(ToolHelper.getDexVm().getKind() == Kind.HOST);
}
@Test
diff --git a/tools/create_art_tests.py b/tools/create_art_tests.py
index 7cf53b9b6..600c1409f 100755
--- a/tools/create_art_tests.py
+++ b/tools/create_art_tests.py
@@ -3,14 +3,16 @@
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.
+import os
from os import makedirs, listdir
from os.path import join, exists, isdir
from string import Template, upper
from sys import exit
from shutil import rmtree
-OUTPUT_DIR = "build/generated/test/java/com/android/tools/r8/art"
-TEST_DIR = "tests/2017-07-27/art"
+OUTPUT_DIR = os.path.join('build', 'generated', 'test', 'java', 'com',
+ 'android', 'tools', 'r8', 'art')
+TEST_DIR = os.path.join('tests', '2017-07-27', 'art')
TOOLCHAINS = ["dx", "jack", "none"]
TOOLS = ["r8", "d8"]
TEMPLATE = Template(
diff --git a/tools/test.py b/tools/test.py
index 78189152c..0440f57c1 100755
--- a/tools/test.py
+++ b/tools/test.py
@@ -16,6 +16,7 @@ import utils
import uuid
import notify
+
ALL_ART_VMS = ["default", "7.0.0", "6.0.1", "5.1.1", "4.4.4"]
BUCKET = 'r8-test-results'
@@ -41,6 +42,11 @@ def ParseOptions():
'all art vm versions (stopping after first failed execution)',
default="default",
choices=ALL_ART_VMS + ["all"])
+ result.add_option('--dex_vm_kind',
+ help='Whether to use host or target version of runtime',
+ default="host",
+ nargs=1,
+ choices=["host", "target"])
result.add_option('--one_line_per_test',
help='Print a line before a tests starts and after it ends to stdout.',
default=False, action='store_true')
@@ -139,7 +145,8 @@ def Main():
# Now run tests on selected runtime(s).
vms_to_test = [options.dex_vm] if options.dex_vm != "all" else ALL_ART_VMS
for art_vm in vms_to_test:
- return_code = gradle.RunGradle(gradle_args + ['-Pdex_vm=%s' % art_vm],
+ vm_kind_to_test = "_" + options.dex_vm_kind if art_vm != "default" else ""
+ return_code = gradle.RunGradle(gradle_args + ['-Pdex_vm=%s' % (art_vm + vm_kind_to_test)],
throw_on_failure=False)
if return_code != 0:
if options.archive_failures and os.name != 'nt':