Merge "Update dexmaker" am: e0c976f125 am: c00eab7757
am: e474268f95

Change-Id: I456accc8ed7b71c30dcd7749de7b1dc66cb917a1
diff --git a/README.version b/README.version
index ce2cdcd..29832cf 100644
--- a/README.version
+++ b/README.version
@@ -1,5 +1,5 @@
 URL: https://github.com/linkedin/dexmaker/
-Version: master (d4959c215e3e2a92b478ddc72a2692cb40f3efd3)
+Version: master (fce01046a9519f8c1e5fd826fe5169eb600710ad)
 License: Apache 2.0
 Description:
 Dexmaker is a Java-language API for doing compile time or runtime code generation targeting the Dalvik VM. Unlike cglib or ASM, this library creates Dalvik .dex files instead of Java .class files.
diff --git a/dexmaker-mockito-inline-tests/src/androidTest/java/com/android/dx/mockito/tests b/dexmaker-mockito-inline-tests/src/androidTest/java/com/android/dx/mockito/tests
new file mode 120000
index 0000000..f13e9f0
--- /dev/null
+++ b/dexmaker-mockito-inline-tests/src/androidTest/java/com/android/dx/mockito/tests
@@ -0,0 +1 @@
+../../../../../../../../dexmaker-mockito-tests/src/androidTest/java/com/android/dx/mockito/tests
\ No newline at end of file
diff --git a/dexmaker-mockito-inline/src/main/java/com/android/dx/mockito/inline/DexmakerStackTraceCleaner.java b/dexmaker-mockito-inline/src/main/java/com/android/dx/mockito/inline/DexmakerStackTraceCleaner.java
index 2757a9e..883f77b 100644
--- a/dexmaker-mockito-inline/src/main/java/com/android/dx/mockito/inline/DexmakerStackTraceCleaner.java
+++ b/dexmaker-mockito-inline/src/main/java/com/android/dx/mockito/inline/DexmakerStackTraceCleaner.java
@@ -39,6 +39,7 @@
                         && !className.startsWith("java.lang.reflect.Proxy")
                         && !(className.startsWith("com.android.dx.mockito.")
                              // Do not clean unit tests
+                             && !className.startsWith("com.android.dx.mockito.tests")
                              && !className.startsWith("com.android.dx.mockito.inline.tests"))
 
                         // dalvik interface proxies
diff --git a/dexmaker-mockito-inline/src/main/java/com/android/dx/mockito/inline/InvocationHandlerAdapter.java b/dexmaker-mockito-inline/src/main/java/com/android/dx/mockito/inline/InvocationHandlerAdapter.java
index 0c9af71..5d01a1e 100644
--- a/dexmaker-mockito-inline/src/main/java/com/android/dx/mockito/inline/InvocationHandlerAdapter.java
+++ b/dexmaker-mockito-inline/src/main/java/com/android/dx/mockito/inline/InvocationHandlerAdapter.java
@@ -18,6 +18,7 @@
 
 import org.mockito.internal.creation.DelegatingMethod;
 import org.mockito.internal.debugging.LocationImpl;
+import org.mockito.internal.exceptions.VerificationAwareInvocation;
 import org.mockito.internal.invocation.ArgumentsProcessor;
 import org.mockito.internal.progress.SequenceNumber;
 import org.mockito.invocation.Invocation;
@@ -123,7 +124,7 @@
     /**
      * Invocation on a proxy
      */
-    private class ProxyInvocation implements Invocation {
+    private class ProxyInvocation implements Invocation, VerificationAwareInvocation {
         private final Object proxy;
         private final Method method;
         private final Object[] rawArgs;
diff --git a/dexmaker-mockito-inline-tests/src/androidTest/java/com/android/dx/mockito/inline/tests/CleanStackTrace.java b/dexmaker-mockito-tests/src/androidTest/java/com/android/dx/mockito/tests/CleanStackTrace.java
similarity index 78%
rename from dexmaker-mockito-inline-tests/src/androidTest/java/com/android/dx/mockito/inline/tests/CleanStackTrace.java
rename to dexmaker-mockito-tests/src/androidTest/java/com/android/dx/mockito/tests/CleanStackTrace.java
index e90145f..81a3b95 100644
--- a/dexmaker-mockito-inline-tests/src/androidTest/java/com/android/dx/mockito/inline/tests/CleanStackTrace.java
+++ b/dexmaker-mockito-tests/src/androidTest/java/com/android/dx/mockito/tests/CleanStackTrace.java
@@ -14,11 +14,12 @@
  * limitations under the License.
  */
 
-package com.android.dx.mockito.inline.tests;
+package com.android.dx.mockito.tests;
 
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 
@@ -28,7 +29,7 @@
     }
 
     public static class TestClass {
-        public final String returnA() {
+        public String returnA() {
             return "A";
         }
     }
@@ -38,7 +39,7 @@
     }
 
     @Test
-    public void cleanStackTraceProxy() {
+    public void cleanStackTraceAbstractClass() {
         TestAbstractClass t = mock(TestAbstractClass.class);
 
         try {
@@ -54,7 +55,7 @@
     }
 
     @Test
-    public void cleanStackTraceInline() {
+    public void cleanStackTraceRegularClass() {
         TestClass t = mock(TestClass.class);
 
         try {
@@ -63,8 +64,15 @@
             try {
                 throw new Exception();
             } catch (Exception here) {
-                assertEquals(here.getStackTrace()[0].getMethodName(), verifyLocation
-                        .getStackTrace()[1].getMethodName());
+                // Depending on the mock maker TestClass.returnA might be in the stack trace or not
+                for (int i = 0; i < 2; i++) {
+                    if (verifyLocation.getStackTrace()[i].getMethodName().equals(here
+                            .getStackTrace()[0].getMethodName())) {
+                        return;
+                    }
+                }
+
+                fail();
             }
         }
     }
diff --git a/dexmaker-mockito-tests/src/androidTest/java/com/android/dx/mockito/tests/MockTests.java b/dexmaker-mockito-tests/src/androidTest/java/com/android/dx/mockito/tests/GeneralMocking.java
similarity index 74%
rename from dexmaker-mockito-tests/src/androidTest/java/com/android/dx/mockito/tests/MockTests.java
rename to dexmaker-mockito-tests/src/androidTest/java/com/android/dx/mockito/tests/GeneralMocking.java
index 1102b71..6f824f2 100644
--- a/dexmaker-mockito-tests/src/androidTest/java/com/android/dx/mockito/tests/MockTests.java
+++ b/dexmaker-mockito-tests/src/androidTest/java/com/android/dx/mockito/tests/GeneralMocking.java
@@ -20,17 +20,18 @@
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.exceptions.base.MockitoException;
+import org.mockito.exceptions.verification.NoInteractionsWanted;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
 @RunWith(AndroidJUnit4.class)
-public class MockTests {
+public class GeneralMocking {
     public static class TestClass {
         public String returnA() {
             return "A";
@@ -86,34 +87,23 @@
     }
 
     @Test
-    public void cleanStackTraceProxy() {
+    public void verifyAdditionalInvocations() {
         TestClass t = mock(TestClass.class);
 
+        t.returnA();
+        t.returnA();
+
         try {
-            verify(t).returnA();
-        } catch (Throwable verifyLocation) {
+            verifyNoMoreInteractions(t);
+        } catch (NoInteractionsWanted e) {
             try {
                 throw new Exception();
             } catch (Exception here) {
-                assertEquals(here.getStackTrace()[0].getMethodName(), verifyLocation
-                        .getStackTrace()[0].getMethodName());
+                // The error message should indicate where the additional invocations have been made
+                assertTrue(e.getMessage(),
+                        e.getMessage().contains(here.getStackTrace()[0].getMethodName()));
             }
-        }
-    }
 
-    @Test
-    public void cleanStackTraceInterface() {
-        TestInterface t = mock(TestInterface.class);
-
-        try {
-            verify(t).returnA();
-        } catch (Throwable verifyLocation) {
-            try {
-                throw new Exception();
-            } catch (Exception here) {
-                assertEquals(here.getStackTrace()[0].getMethodName(), verifyLocation
-                        .getStackTrace()[0].getMethodName());
-            }
         }
     }
 }
diff --git a/dexmaker-mockito/src/main/java/com/android/dx/mockito/InvocationHandlerAdapter.java b/dexmaker-mockito/src/main/java/com/android/dx/mockito/InvocationHandlerAdapter.java
index 6a6dc72..bab9265 100644
--- a/dexmaker-mockito/src/main/java/com/android/dx/mockito/InvocationHandlerAdapter.java
+++ b/dexmaker-mockito/src/main/java/com/android/dx/mockito/InvocationHandlerAdapter.java
@@ -20,6 +20,7 @@
 
 import org.mockito.internal.creation.DelegatingMethod;
 import org.mockito.internal.debugging.LocationImpl;
+import org.mockito.internal.exceptions.VerificationAwareInvocation;
 import org.mockito.internal.invocation.ArgumentsProcessor;
 import org.mockito.internal.progress.SequenceNumber;
 import org.mockito.invocation.Invocation;
@@ -80,7 +81,7 @@
     /**
      * Invocation on a proxy
      */
-    private class ProxyInvocation implements Invocation {
+    private class ProxyInvocation implements Invocation, VerificationAwareInvocation {
         private final Object proxy;
         private final Method method;
         private final Object[] rawArgs;