diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2017-07-06 07:27:03 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2017-07-06 07:27:03 +0000 |
commit | 0017fc721b2a61ab18b3512fe244cd523f9e9628 (patch) | |
tree | 8ee497acf2b01130c9f1877d4a3005378c335847 | |
parent | dba92b7c012c4cbc6df03f128b3044a06b1f44c0 (diff) | |
parent | 83d4708964ed6922e0062850d09a52a7f34f2f9f (diff) | |
download | android_dalvik-0017fc721b2a61ab18b3512fe244cd523f9e9628.tar.gz android_dalvik-0017fc721b2a61ab18b3512fe244cd523f9e9628.tar.bz2 android_dalvik-0017fc721b2a61ab18b3512fe244cd523f9e9628.zip |
release-request-60f1fc0d-1c6d-400a-8b4e-444f1452f036-for-git_oc-mr1-release-4157261 snap-temp-L11100000079944679
Change-Id: I59f77f7e1ce1f263d3387a519c316c5fb25c917c
-rw-r--r-- | dx/tests/127-merge-stress/com/android/dx/merge/MergeTest.java | 71 | ||||
-rwxr-xr-x | dx/tests/127-merge-stress/run | 47 | ||||
-rw-r--r-- | dx/tests/133-source-debug-extension/HelloKt.class | bin | 0 -> 2655 bytes | |||
-rw-r--r-- | dx/tests/137-dexmerger-dex38/expected.txt | 36 | ||||
-rw-r--r-- | dx/tests/139-lambda-metafactory/expected.txt | 58 | ||||
-rwxr-xr-x | dx/tests/run-all-tests | 4 |
6 files changed, 138 insertions, 78 deletions
diff --git a/dx/tests/127-merge-stress/com/android/dx/merge/MergeTest.java b/dx/tests/127-merge-stress/com/android/dx/merge/MergeTest.java index cb0814c17..875cfadb3 100644 --- a/dx/tests/127-merge-stress/com/android/dx/merge/MergeTest.java +++ b/dx/tests/127-merge-stress/com/android/dx/merge/MergeTest.java @@ -21,8 +21,15 @@ import com.android.dex.DexIndexOverflowException; import com.android.dx.command.dexer.DxContext; import java.io.File; +import java.io.IOException; + +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.Executors; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.TimeUnit; import java.util.Arrays; import java.util.Random; +import java.util.HashSet; /** * This test tries to merge given dex files at random, a first pass at 2 by 2, followed by @@ -32,31 +39,67 @@ public class MergeTest { private static final int NUMBER_OF_TRIES = 1000; + private static final int WORKER_THREADS = 4; + + private static final ExecutorService executor = Executors.newFixedThreadPool(WORKER_THREADS); + + // Helper task to concurrently run merge tests. + static class MergeTask implements Runnable { + private final DexMerger dexMerger; + private final String[] dexFiles; + + MergeTask(String[] dexFiles, Dex[] dexesToMerge) throws IOException { + this.dexMerger = new DexMerger(dexesToMerge, CollisionPolicy.KEEP_FIRST, new DxContext()); + this.dexFiles = dexFiles; + } + + public void run() { + try { + dexMerger.merge(); + } catch (DexIndexOverflowException e) { + // ignore index overflow + } catch (Throwable t) { + System.err.println("Exception processing DEX files: " + t); + System.err.println("Problem merging those dexes: " + Arrays.toString(dexFiles)); + System.exit(1); + } + } + } + public static void main(String[] args) throws Throwable { Random random = new Random(); + HashSet<Integer> seen = new HashSet<>(); for (int pass = 0; pass < 2; pass++) { for (int i = 0; i < NUMBER_OF_TRIES; i++) { // On the first pass only do 2-way merges, then do from 3 to 10 way merges // but not more to avoid dex index overflow. int numDex = pass == 0 ? 2 : random.nextInt(8) + 3; - String[] fileNames = new String[numDex]; // only for the error message - try { - Dex[] dexesToMerge = new Dex[numDex]; - for (int j = 0; j < numDex; j++) { - String fileName = args[random.nextInt(args.length)]; - fileNames[j] = fileName; - dexesToMerge[j] = new Dex(new File(fileName)); + String[] fileNames = new String[numDex]; + for (int j = 0; j < numDex; ++j) { + int fileIndex = random.nextInt(args.length); + fileNames[j] = args[fileIndex]; + } + + if (!seen.add(fileNames.hashCode())) { + // Skip, already seen set of file names with the same hash. + continue; + } + + Dex[] dexesToMerge = new Dex[numDex]; + for (int j = 0; j < numDex; ++j) { + try { + dexesToMerge[j] = new Dex(new File(fileNames[j])); + } catch (IOException e) { + System.err.println("Error opening " + fileNames[j]); + System.err.println(e); + System.exit(1); } - new DexMerger(dexesToMerge, CollisionPolicy.KEEP_FIRST, new DxContext()).merge(); - } catch (DexIndexOverflowException e) { - // ignore index overflow - } catch (Throwable t) { - System.err.println( - "Problem merging those dexes: " + Arrays.toString(fileNames)); - throw t; } + executor.execute(new MergeTask(fileNames, dexesToMerge)); } } + executor.shutdown(); + executor.awaitTermination(8, TimeUnit.HOURS); } } diff --git a/dx/tests/127-merge-stress/run b/dx/tests/127-merge-stress/run index f2df4a507..0bdbd96e1 100755 --- a/dx/tests/127-merge-stress/run +++ b/dx/tests/127-merge-stress/run @@ -29,30 +29,47 @@ for i in "$dxjar"; do fi done -# Find dex files in the tree -dexes=`find $ANDROID_BUILD_TOP/out -name '*.dex' -printf '%p '` -dexesinjars=`find $ANDROID_BUILD_TOP/libcore $ANDROID_BUILD_TOP/out -name '*.jar' -exec sh -c 'unzip -l "{}" 2>/dev/null | grep -q classes.dex ' \; -printf '%p '` -dexesinapks=`find $ANDROID_BUILD_TOP/libcore $ANDROID_BUILD_TOP/out -name '*.apk' -exec sh -c 'unzip -l "{}" 2>/dev/null | grep -q classes.dex ' \; -printf '%p '` - -# Select only the valid dex files -validdexes="" -for dex in $dexes $dexesinjars $dexesinapks; do +# Compile and run java merging test +$JAVAC -Xlint:-options -source 1.7 -target 1.7 -cp $dxjar -d . com/android/dx/merge/MergeTest.java || exit 1 + +# Find all files that could contain dex bytecode. +candidates=`find "$ANDROID_BUILD_TOP/out" -name '*.dex' -o -name '*.jar' -o -name '*.apk'` +validdexes=() +checksums=() +for dex in $candidates; do if [[ "$dex" = *"core"* ]]; then # Ignoring core files as hit limits of merging capability. continue fi - dexdump2 -c $dex >/dev/null + + # Filter out jar files and apks that do not unzip or contain a + # classes.dex file. DexMerger assumes file contents based on the + # file extension. Android build names some DEX files with a .jar + # extension and this raises an exception in DexMerger as it fails + # to unzip them. + if [[ "$dex" == *"jar" || "$dex" == *"apk" ]]; then + unzip -l "$dex" 2>&1 | grep -q -m 1 classes.dex + if [[ $? != 0 ]]; then + continue + fi + fi + + # Skip duplicate files + checksum=`shasum "$dex" | sed -e 's/ .*//' -e 's/^/_/'` + if [[ "$checksums[$checksum]" == "$checksum" ]]; then + continue + fi + checksums[$checksum]=$checksum + + dexdump2 -c $dex >/dev/null 2>&1 if [ $? -eq 0 ]; then - validdexes="$validdexes $dex" + validdexes+=("$dex") fi done -if [ "$validdexes" = "" ]; then +if [ ${#validdexes[@]} -eq 0 ]; then echo No valid DEX files found. exit 1 fi -# Compile and run java merging test -$JAVAC -Xlint:-options -source 1.7 -target 1.7 -cp $dxjar -d . com/android/dx/merge/MergeTest.java -java -cp .:$dxjar com.android.dx.merge.MergeTest $validdexes >/dev/null - +java -cp .:$dxjar -ea -esa com.android.dx.merge.MergeTest "${validdexes[@]}" > /dev/null diff --git a/dx/tests/133-source-debug-extension/HelloKt.class b/dx/tests/133-source-debug-extension/HelloKt.class Binary files differnew file mode 100644 index 000000000..c4e8a67dd --- /dev/null +++ b/dx/tests/133-source-debug-extension/HelloKt.class diff --git a/dx/tests/137-dexmerger-dex38/expected.txt b/dx/tests/137-dexmerger-dex38/expected.txt index 030ce92f7..24cfec77d 100644 --- a/dx/tests/137-dexmerger-dex38/expected.txt +++ b/dx/tests/137-dexmerger-dex38/expected.txt @@ -7105,23 +7105,23 @@ Method handle #1: type : invoke-static target : Linvokecustom/InvokeCustom; bsmLookupStaticWithExtraArgs target_type : (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite; -Call site #0: +Call site #0: // offset 57124 link_argument[0] : 0 (MethodHandle) link_argument[1] : targetMethodTest1 (String) link_argument[2] : ()V (MethodType) -Call site #1: +Call site #1: // offset 57124 link_argument[0] : 0 (MethodHandle) link_argument[1] : targetMethodTest1 (String) link_argument[2] : ()V (MethodType) -Call site #2: +Call site #2: // offset 57131 link_argument[0] : 0 (MethodHandle) link_argument[1] : targetMethodTest2 (String) link_argument[2] : (ZBCSIFJDLjava/lang/String;)V (MethodType) -Call site #3: +Call site #3: // offset 57131 link_argument[0] : 0 (MethodHandle) link_argument[1] : targetMethodTest2 (String) link_argument[2] : (ZBCSIFJDLjava/lang/String;)V (MethodType) -Call site #4: +Call site #4: // offset 57138 link_argument[0] : 0 (MethodHandle) link_argument[1] : targetMethodTest3 (String) link_argument[2] : ()V (MethodType) @@ -7129,7 +7129,7 @@ Call site #4: link_argument[4] : 123456789 (long) link_argument[5] : 123.456 (float) link_argument[6] : 123457 (double) -Call site #5: +Call site #5: // offset 57138 link_argument[0] : 0 (MethodHandle) link_argument[1] : targetMethodTest3 (String) link_argument[2] : ()V (MethodType) @@ -7137,51 +7137,51 @@ Call site #5: link_argument[4] : 123456789 (long) link_argument[5] : 123.456 (float) link_argument[6] : 123457 (double) -Call site #6: +Call site #6: // offset 57166 link_argument[0] : 0 (MethodHandle) link_argument[1] : targetMethodTest5 (String) link_argument[2] : (III)I (MethodType) -Call site #7: +Call site #7: // offset 57166 link_argument[0] : 0 (MethodHandle) link_argument[1] : targetMethodTest5 (String) link_argument[2] : (III)I (MethodType) -Call site #8: +Call site #8: // offset 57173 link_argument[0] : 0 (MethodHandle) link_argument[1] : targetMethodTest6 (String) link_argument[2] : (JJJ)J (MethodType) -Call site #9: +Call site #9: // offset 57173 link_argument[0] : 0 (MethodHandle) link_argument[1] : targetMethodTest6 (String) link_argument[2] : (JJJ)J (MethodType) -Call site #10: +Call site #10: // offset 57180 link_argument[0] : 0 (MethodHandle) link_argument[1] : targetMethodTest7 (String) link_argument[2] : (FFD)D (MethodType) -Call site #11: +Call site #11: // offset 57180 link_argument[0] : 0 (MethodHandle) link_argument[1] : targetMethodTest7 (String) link_argument[2] : (FFD)D (MethodType) -Call site #12: +Call site #12: // offset 57187 link_argument[0] : 0 (MethodHandle) link_argument[1] : targetMethodTest8 (String) link_argument[2] : (Ljava/lang/String;)V (MethodType) -Call site #13: +Call site #13: // offset 57187 link_argument[0] : 0 (MethodHandle) link_argument[1] : targetMethodTest8 (String) link_argument[2] : (Ljava/lang/String;)V (MethodType) -Call site #14: +Call site #14: // offset 57187 link_argument[0] : 0 (MethodHandle) link_argument[1] : targetMethodTest8 (String) link_argument[2] : (Ljava/lang/String;)V (MethodType) -Call site #15: +Call site #15: // offset 57187 link_argument[0] : 0 (MethodHandle) link_argument[1] : targetMethodTest8 (String) link_argument[2] : (Ljava/lang/String;)V (MethodType) -Call site #16: +Call site #16: // offset 57187 link_argument[0] : 0 (MethodHandle) link_argument[1] : targetMethodTest8 (String) link_argument[2] : (Ljava/lang/String;)V (MethodType) -Call site #17: +Call site #17: // offset 57187 link_argument[0] : 0 (MethodHandle) link_argument[1] : targetMethodTest8 (String) link_argument[2] : (Ljava/lang/String;)V (MethodType) diff --git a/dx/tests/139-lambda-metafactory/expected.txt b/dx/tests/139-lambda-metafactory/expected.txt index aabe59ddf..fc21cb47f 100644 --- a/dx/tests/139-lambda-metafactory/expected.txt +++ b/dx/tests/139-lambda-metafactory/expected.txt @@ -1,9 +1,9 @@ Note: Main.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. 000000: 6465 780a 3033 3800 |magic: "dex\n038\0" -000008: 0b09 8ceb |checksum -00000c: 58f3 aefc 1fe5 e7b3 cb99|signature -000016: 31ee 6fcf 484a 1019 6918| +000008: 7e08 861f |checksum +00000c: e48a 8e6c 24e0 84f7 c591|signature +000016: a728 6015 6a2c 6639 54a9| 000020: 3c07 0000 |file_size: 0000073c 000024: 7000 0000 |header_size: 00000070 000028: 7856 3412 |endian_tag: 12345678 @@ -315,10 +315,10 @@ Note: Recompile with -Xlint:unchecked for details. 0002d0: 7010 0900 0000 | 0000: invoke-direct {v0}, java.lang.Object.<init>:()V // method@0009 0002d6: 0e00 | 0003: return-void | debug info - | line_start: 5 + | line_start: 21 | parameters_size: 0000 | 0000: prologue end - | 0000: line 5 + | 0000: line 21 | end sequence | |[2d8] Foo.lambda$bar$0:(ILjava/lang/Object;)V @@ -338,12 +338,12 @@ Note: Recompile with -Xlint:unchecked for details. 000300: 6e20 0600 1000 | 000c: invoke-virtual {v0, v1}, java.io.PrintStream.println:(I)V // method@0006 000306: 0e00 | 000f: return-void | debug info - | line_start: 8 + | line_start: 24 | parameters_size: 0002 | parameter <unnamed> v4 | parameter k v5 | 0000: prologue end - | 0000: line 8 + | 0000: line 24 | 0007: advance pc | 0007: -local v5 k java.lang.Object | end sequence @@ -363,14 +363,14 @@ Note: Recompile with -Xlint:unchecked for details. 00032a: 7220 0000 1000 | 0009: invoke-interface {v0, v1}, Consumer.accept:(Ljava/lang/Object;)V // method@0000 000330: 0e00 | 000c: return-void | debug info - | line_start: 8 + | line_start: 24 | parameters_size: 0001 | parameter j v3 | 0000: prologue end - | 0000: line 8 - | 0004: line 9 + | 0000: line 24 + | 0004: line 25 | 0004: +local v0 consumer Consumer - | 000c: line 10 + | 000c: line 26 | end sequence | 000332: 0000 | @@ -384,10 +384,10 @@ Note: Recompile with -Xlint:unchecked for details. 000344: 7010 0900 0000 | 0000: invoke-direct {v0}, java.lang.Object.<init>:()V // method@0009 00034a: 0e00 | 0003: return-void | debug info - | line_start: 13 + | line_start: 29 | parameters_size: 0000 | 0000: prologue end - | 0000: line 13 + | 0000: line 29 | end sequence | |[34c] Main.main:([Ljava/lang/String;)V @@ -403,12 +403,12 @@ Note: Recompile with -Xlint:unchecked for details. 000368: 6e20 0200 1000 | 0006: invoke-virtual {v0, v1}, Foo.bar:(I)V // method@0002 00036e: 0e00 | 0009: return-void | debug info - | line_start: 15 + | line_start: 31 | parameters_size: 0001 | parameter args v2 | 0000: prologue end - | 0000: line 15 - | 0009: line 16 + | 0000: line 31 + | 0009: line 32 | end sequence | |[370] annotations directory @@ -614,48 +614,48 @@ Note: Recompile with -Xlint:unchecked for details. | |byte_data: |[5de] debug info -0005de: 05 |line_start: 5 +0005de: 15 |line_start: 21 0005df: 00 |parameters_size: 0000 0005e0: 07 |0000: prologue end -0005e1: 0e |0000: line 5 +0005e1: 0e |0000: line 21 0005e2: 00 |end sequence | |[5e3] debug info -0005e3: 08 |line_start: 8 +0005e3: 18 |line_start: 24 0005e4: 02 |parameters_size: 0002 0005e5: 00 |parameter <unnamed> v4 0005e6: 24 |parameter k v5 0005e7: 07 |0000: prologue end -0005e8: 0e |0000: line 8 +0005e8: 0e |0000: line 24 0005e9: 0107 |0007: advance pc 0005eb: 0505 |0007: -local v5 k java.lang.Object 0005ed: 00 |end sequence | |[5ee] debug info -0005ee: 08 |line_start: 8 +0005ee: 18 |line_start: 24 0005ef: 01 |parameters_size: 0001 0005f0: 23 |parameter j v3 0005f1: 07 |0000: prologue end -0005f2: 0e |0000: line 8 -0005f3: 4b |0004: line 9 +0005f2: 0e |0000: line 24 +0005f3: 4b |0004: line 25 0005f4: 0300 2002 |0004: +local v0 consumer Consumer -0005f8: 87 |000c: line 10 +0005f8: 87 |000c: line 26 0005f9: 00 |end sequence | |[5fa] debug info -0005fa: 0d |line_start: 13 +0005fa: 1d |line_start: 29 0005fb: 00 |parameters_size: 0000 0005fc: 07 |0000: prologue end -0005fd: 0e |0000: line 13 +0005fd: 0e |0000: line 29 0005fe: 00 |end sequence | |[5ff] debug info -0005ff: 0f |line_start: 15 +0005ff: 1f |line_start: 31 000600: 01 |parameters_size: 0001 000601: 1e |parameter args v2 000602: 07 |0000: prologue end -000603: 0e |0000: line 15 -000604: 96 |0009: line 16 +000603: 0e |0000: line 31 +000604: 96 |0009: line 32 000605: 00 |end sequence | |[606] annotation diff --git a/dx/tests/run-all-tests b/dx/tests/run-all-tests index dce490c91..1c6be0273 100755 --- a/dx/tests/run-all-tests +++ b/dx/tests/run-all-tests @@ -34,7 +34,7 @@ progdir=`pwd` prog="${progdir}"/`basename "${prog}"` # Command-line options -skip_tests="127-merge-stress" +skip_tests="" sequential="no" usage="no" while [[ "$1" == "-"* ]]; do @@ -67,7 +67,7 @@ failed=() skipped=() # Tests failing and require attention (e.g. 115-merge) -known_bad="100-local-mismatch 115-merge 119-merge-conflict 133-source-debug-extension" +known_bad="100-local-mismatch 115-merge 119-merge-conflict" function display_results { printf "\n\nTest Results\n" |