Issue: ProxyBuilder.getMethodsToProxyRecursive() was not returning list of methods in deterministic order.

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
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 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 @@
         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 @@
 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;