Rewrite the script to create art tests in python.
This makes it easier to use on Windows and makes it a lot easier to
read and modify as well.
Change-Id: I9055014e722ae08ad9d907b450b6ca3f20401adf
diff --git a/build.gradle b/build.gradle
index 4caf5fa..37745576 100644
--- a/build.gradle
+++ b/build.gradle
@@ -295,13 +295,12 @@
task createArtTests(type: Exec) {
def outputDir = "build/generated/test/java/com/android/tools/r8/art"
- def createArtTestsScript = "scripts/create-art-tests.sh"
+ def createArtTestsScript = "tools/create_art_tests.py"
inputs.file "tests/art.tar.gz"
inputs.file createArtTestsScript
outputs.dir outputDir
dependsOn downloadDeps
- executable "bash"
- args "${projectDir}/${createArtTestsScript}"
+ commandLine "${createArtTestsScript}"
workingDir = projectDir
}
diff --git a/scripts/create-art-tests.sh b/scripts/create-art-tests.sh
deleted file mode 100755
index dc6d6d2..0000000
--- a/scripts/create-art-tests.sh
+++ /dev/null
@@ -1,75 +0,0 @@
-#!/bin/bash
-#
-# Copyright (c) 2016, 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.
-
-function generate_test() {
- local name=$1
- local testClassName=$2
- local testGeneratingToolchain=$3
- # The bash uppercase substitution ^^ is not supported on the bash version on Mac OS.
- local testGeneratingToolchainEnum=$(echo $testGeneratingToolchain | tr /a-z/ /A-Z/)
- local fileName=$4
- local compilerUnderTest=$5
- local compilerUnderTestEnum=$(echo ${compilerUnderTest} | tr /a-z/ /A-Z/)
-
- cat <<EOF > $fileName
-// Copyright (c) 2016, 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.art.${testGeneratingToolchain}.${compilerUnderTest};
-
-import static com.android.tools.r8.R8RunArtTestsTest.DexTool.${testGeneratingToolchainEnum};
-
-import com.android.tools.r8.R8RunArtTestsTest;
-import org.junit.Test;
-
-/**
- * Auto-generated test for the art ${name} test using the ${testGeneratingToolchain} toolchain.
- *
- * DO NOT EDIT THIS FILE. EDIT THE HERE DOCUMENT TEMPLATE IN scripts/create-art-tests.sh INSTEAD!
- */
-public class ${testClassName} extends R8RunArtTestsTest {
-
- public ${testClassName}() {
- super("${name}", ${testGeneratingToolchainEnum});
- }
-
- @Test
- public void run${testClassName}() throws Throwable {
- // For testing with other Art VMs than the default pass the VM version as a argument to
- // runArtTest, e.g. runArtTest(ToolHelper.ART_4_4_4).
- runArtTest(CompilerUnderTest.${compilerUnderTestEnum});
- }
-}
-EOF
-}
-
-TESTDIR="tests/art"
-TOOLCHAINS=("dx" "jack" "none")
-DESTINATIONDIR="build/generated/test/java/com/android/tools/r8/art"
-
-if [ ! -e $TESTDIR ]; then
- echo "Missing art tests in $TESTDIR."
- exit
-fi
-
-for TOOLCHAIN in ${TOOLCHAINS[@]}; do
- for d in $DESTINATIONDIR/$TOOLCHAIN/r8 $DESTINATIONDIR/$TOOLCHAIN/d8; do
- rm -rf $d
- mkdir -p $d
- done
- # class files are found in the dx directory.
- if [ "$TOOLCHAIN" == "none" ]; then
- SOURCEDIR=${TESTDIR}/dx
- else
- SOURCEDIR=${TESTDIR}/${TOOLCHAIN}
- fi
- for TEST in ${SOURCEDIR}/*; do
- TESTNAME=$(basename $TEST)
- TESTCLASSNAME="Art${TESTNAME//-/_}Test"
- generate_test $TESTNAME $TESTCLASSNAME ${TOOLCHAIN} $DESTINATIONDIR/$TOOLCHAIN/r8/$TESTCLASSNAME.java r8
- generate_test $TESTNAME $TESTCLASSNAME ${TOOLCHAIN} $DESTINATIONDIR/$TOOLCHAIN/d8/$TESTCLASSNAME.java d8
- done
-done
diff --git a/tools/create_art_tests.py b/tools/create_art_tests.py
new file mode 100755
index 0000000..3a83cbc
--- /dev/null
+++ b/tools/create_art_tests.py
@@ -0,0 +1,82 @@
+#!/usr/bin/env python
+# 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.
+
+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/art"
+TOOLCHAINS = ["dx", "jack", "none"]
+TOOLS = ["r8", "d8"]
+TEMPLATE = Template(
+"""// Copyright (c) 2016, 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.art.$testGeneratingToolchain.$compilerUnderTest;
+
+import static com.android.tools.r8.R8RunArtTestsTest.DexTool.$testGeneratingToolchainEnum;
+
+import com.android.tools.r8.R8RunArtTestsTest;
+import org.junit.Test;
+
+/**
+ * Auto-generated test for the art $name test using the $testGeneratingToolchain toolchain.
+ *
+ * DO NOT EDIT THIS FILE. EDIT THE HERE DOCUMENT TEMPLATE IN tools/create_art_tests.py INSTEAD!
+ */
+public class $testClassName extends R8RunArtTestsTest {
+
+ public $testClassName() {
+ super("$name", $testGeneratingToolchainEnum);
+ }
+
+ @Test
+ public void run$testClassName() throws Throwable {
+ // For testing with other Art VMs than the default pass the VM version as a argument to
+ // runArtTest, e.g. runArtTest(ToolHelper.ART_4_4_4).
+ runArtTest(CompilerUnderTest.$compilerUnderTestEnum);
+ }
+}
+""")
+
+def create_toolchain_dirs(toolchain):
+ toolchain_dir = join(OUTPUT_DIR, toolchain)
+ if exists(toolchain_dir):
+ rmtree(toolchain_dir)
+ makedirs(join(toolchain_dir, "d8"))
+ makedirs(join(toolchain_dir, "r8"))
+
+def write_file(toolchain, tool, class_name, contents):
+ file_name = join(OUTPUT_DIR, toolchain, tool, class_name + ".java")
+ with open(file_name, "w") as file:
+ file.write(contents)
+
+def create_tests(toolchain):
+ source_dir = join(TEST_DIR, "dx" if toolchain == "none" else toolchain)
+ dirs = [d for d in listdir(source_dir)
+ if isdir(join(source_dir, d))]
+ for dir in dirs:
+ class_name = "Art" + dir.replace("-", "_") + "Test"
+ for tool in TOOLS:
+ contents = TEMPLATE.substitute(
+ name=dir,
+ compilerUnderTestEnum=upper(tool),
+ compilerUnderTest=tool,
+ testGeneratingToolchain=toolchain,
+ testGeneratingToolchainEnum=upper(toolchain),
+ testClassName=class_name)
+ write_file(toolchain, tool, class_name, contents)
+
+
+def main():
+ for toolchain in TOOLCHAINS:
+ create_toolchain_dirs(toolchain)
+ create_tests(toolchain)
+
+if __name__ == "__main__":
+ exit(main())