diff options
author | Andrew Yousef <ayousef@crittercism.com> | 2015-01-23 13:59:10 -0800 |
---|---|---|
committer | Andreas Gampe <agampe@google.com> | 2015-05-13 17:41:23 -0700 |
commit | fec7276299b950a8831ead9a9756d27e0fc60560 (patch) | |
tree | ae413c1b86dc97a6ee0339ffd04896cc63b1b120 | |
parent | 8239eb231c1fcc92f4d2d9ed3f4edaa9502ae54c (diff) | |
download | dexmaker-fec7276299b950a8831ead9a9756d27e0fc60560.tar.gz |
Issue: ProxyBuilder.getMethodsToProxyRecursive() was not returning list of methods in deterministic order.android-cts-6.0_r9android-cts-6.0_r8android-cts-6.0_r7android-cts-6.0_r6android-cts-6.0_r5android-cts-6.0_r4android-cts-6.0_r32android-cts-6.0_r31android-cts-6.0_r30android-cts-6.0_r3android-cts-6.0_r29android-cts-6.0_r28android-cts-6.0_r27android-cts-6.0_r26android-cts-6.0_r25android-cts-6.0_r24android-cts-6.0_r23android-cts-6.0_r22android-cts-6.0_r21android-cts-6.0_r20android-cts-6.0_r2android-cts-6.0_r19android-cts-6.0_r18android-cts-6.0_r17android-cts-6.0_r16android-cts-6.0_r15android-cts-6.0_r14android-cts-6.0_r13android-cts-6.0_r12android-cts-6.0_r1android-6.0.1_r9android-6.0.1_r81android-6.0.1_r80android-6.0.1_r8android-6.0.1_r79android-6.0.1_r78android-6.0.1_r77android-6.0.1_r74android-6.0.1_r73android-6.0.1_r72android-6.0.1_r70android-6.0.1_r7android-6.0.1_r69android-6.0.1_r68android-6.0.1_r67android-6.0.1_r66android-6.0.1_r65android-6.0.1_r63android-6.0.1_r62android-6.0.1_r61android-6.0.1_r60android-6.0.1_r59android-6.0.1_r58android-6.0.1_r57android-6.0.1_r56android-6.0.1_r55android-6.0.1_r54android-6.0.1_r53android-6.0.1_r52android-6.0.1_r51android-6.0.1_r50android-6.0.1_r5android-6.0.1_r49android-6.0.1_r48android-6.0.1_r47android-6.0.1_r46android-6.0.1_r45android-6.0.1_r43android-6.0.1_r42android-6.0.1_r41android-6.0.1_r40android-6.0.1_r4android-6.0.1_r33android-6.0.1_r32android-6.0.1_r31android-6.0.1_r30android-6.0.1_r3android-6.0.1_r28android-6.0.1_r27android-6.0.1_r26android-6.0.1_r25android-6.0.1_r24android-6.0.1_r22android-6.0.1_r21android-6.0.1_r20android-6.0.1_r18android-6.0.1_r17android-6.0.1_r16android-6.0.1_r13android-6.0.1_r12android-6.0.1_r11android-6.0.1_r10android-6.0.1_r1android-6.0.0_r7android-6.0.0_r6android-6.0.0_r5android-6.0.0_r41android-6.0.0_r4android-6.0.0_r3android-6.0.0_r26android-6.0.0_r25android-6.0.0_r24android-6.0.0_r23android-6.0.0_r2android-6.0.0_r13android-6.0.0_r12android-6.0.0_r11android-6.0.0_r1marshmallow-releasemarshmallow-mr3-releasemarshmallow-mr2-releasemarshmallow-mr1-releasemarshmallow-mr1-devmarshmallow-dr1.6-releasemarshmallow-dr1.5-releasemarshmallow-dr1.5-devmarshmallow-dr-releasemarshmallow-dr-dragon-releasemarshmallow-dr-devmarshmallow-devmarshmallow-cts-releaseandroid-live-tv
RCA: In order to determine which methods to proxy, ProxyBuilder populates hash sets of MethodSetEntry instances. This prevents duplicate entries for methods from occurring. Since the hash set is unordered and the resulting list returned by ProxyBuilder.getMethodsToProxyRecursive() is built from the hash set, the order of the list is non-deterministic.
Fix: After building the list, sort it by Method.toString(), which contains all of the information in a method's signature.
(cherry picked from commit 623897d6063d626d5afc0ed5f3231244acf363b9)
Bug: 21031230
(cherry picked from commit 8d53a06d10c6e2b96be6857aede5e4661804611e)
Change-Id: Ifb43e08befed714ceaec048186665821b0811402
-rw-r--r-- | src/main/java/com/google/dexmaker/stock/ProxyBuilder.java | 11 | ||||
-rw-r--r-- | src/test/java/com/google/dexmaker/stock/ProxyBuilderTest.java | 2 |
2 files changed, 13 insertions, 0 deletions
diff --git a/src/main/java/com/google/dexmaker/stock/ProxyBuilder.java b/src/main/java/com/google/dexmaker/stock/ProxyBuilder.java index b3a8d8a..f943840 100644 --- a/src/main/java/com/google/dexmaker/stock/ProxyBuilder.java +++ b/src/main/java/com/google/dexmaker/stock/ProxyBuilder.java @@ -38,6 +38,7 @@ import static java.lang.reflect.Modifier.STATIC; import java.lang.reflect.UndeclaredThrowableException; import java.util.Arrays; import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -613,6 +614,16 @@ public final class ProxyBuilder<T> { for (MethodSetEntry entry : methodsToProxy) { results[i++] = entry.originalMethod; } + + // Sort the results array so that they are returned by this method + // in a deterministic fashion. + Arrays.sort(results, new Comparator<Method>() { + @Override + public int compare(Method method1, Method method2) { + return method1.toString().compareTo(method2.toString()); + } + }); + return results; } diff --git a/src/test/java/com/google/dexmaker/stock/ProxyBuilderTest.java b/src/test/java/com/google/dexmaker/stock/ProxyBuilderTest.java index 4c02f83..e6912c4 100644 --- a/src/test/java/com/google/dexmaker/stock/ProxyBuilderTest.java +++ b/src/test/java/com/google/dexmaker/stock/ProxyBuilderTest.java @@ -19,10 +19,12 @@ package com.google.dexmaker.stock; import com.google.dexmaker.DexMakerTest; import java.io.File; import java.io.IOException; +import java.lang.reflect.Field; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.UndeclaredThrowableException; import java.util.Arrays; +import java.util.Map; import java.util.Random; import java.util.concurrent.Callable; import java.util.concurrent.atomic.AtomicInteger; |