aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Yousef <ayousef@crittercism.com>2015-01-23 13:59:10 -0800
committerAndreas Gampe <agampe@google.com>2015-05-13 17:41:23 -0700
commitfec7276299b950a8831ead9a9756d27e0fc60560 (patch)
treeae413c1b86dc97a6ee0339ffd04896cc63b1b120
parent8239eb231c1fcc92f4d2d9ed3f4edaa9502ae54c (diff)
downloaddexmaker-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.java11
-rw-r--r--src/test/java/com/google/dexmaker/stock/ProxyBuilderTest.java2
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;