aboutsummaryrefslogtreecommitdiff
path: root/dexmaker-mockito-inline-extended/src/main/java/com/android/dx/mockito/inline/MarkerToHandlerMap.java
diff options
context:
space:
mode:
authorJohn Wu <topjohnwu@google.com>2022-09-16 00:38:14 +0000
committerJohn Wu <topjohnwu@google.com>2022-09-26 18:11:33 +0000
commitd61bf9eaf51eb0478fc045b6cc3309794a7ef3fe (patch)
tree377b97acdc9589837a3b1c6ff73ace50a169cba9 /dexmaker-mockito-inline-extended/src/main/java/com/android/dx/mockito/inline/MarkerToHandlerMap.java
parent6f5561ba7bd7cf224771168f7549542e47a25e35 (diff)
downloaddexmaker-d61bf9eaf51eb0478fc045b6cc3309794a7ef3fe.tar.gz
Revert^2 "Update to upstream dexmaker"
Cherry-pick "Do not read Build.VERSION to allow non-standard Android distributions (Ia8c4ba4c82cd6f193c565f1bfe48faffc4aac08f)" to fix ART host tests. 783d1254b1698492fd8ae7e04a20115d1283ba60 Change-Id: Iec6a60d0016f50101fe9151931065dc04148c767
Diffstat (limited to 'dexmaker-mockito-inline-extended/src/main/java/com/android/dx/mockito/inline/MarkerToHandlerMap.java')
-rw-r--r--dexmaker-mockito-inline-extended/src/main/java/com/android/dx/mockito/inline/MarkerToHandlerMap.java118
1 files changed, 118 insertions, 0 deletions
diff --git a/dexmaker-mockito-inline-extended/src/main/java/com/android/dx/mockito/inline/MarkerToHandlerMap.java b/dexmaker-mockito-inline-extended/src/main/java/com/android/dx/mockito/inline/MarkerToHandlerMap.java
new file mode 100644
index 0000000..74a38b8
--- /dev/null
+++ b/dexmaker-mockito-inline-extended/src/main/java/com/android/dx/mockito/inline/MarkerToHandlerMap.java
@@ -0,0 +1,118 @@
+package com.android.dx.mockito.inline;
+
+import org.mockito.invocation.MockHandler;
+import org.mockito.mock.MockCreationSettings;
+
+import java.util.AbstractMap;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * A map for mock marker object -> {@link InvocationHandlerAdapter} but
+ * does not use the mock marker object as the key directly.
+ * The problem of not doing so is that the object's real hashCode() and equals() =
+ * methods will be invoked during
+ * {@link InlineStaticMockMaker#createMock(MockCreationSettings, MockHandler)}. This poses a
+ * potential test runtime error depending on the object's hashCode() implementation
+ */
+class MarkerToHandlerMap implements Map<Object, InvocationHandlerAdapter> {
+
+ private final Map<MockMarkerKey, InvocationHandlerAdapter> markerToHandler = new HashMap<>();
+
+ @Override
+ public int size() {
+ return markerToHandler.size();
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return markerToHandler.isEmpty();
+ }
+
+ @Override
+ public boolean containsKey(Object key) {
+ return markerToHandler.containsKey(new MockMarkerKey(key));
+ }
+
+ @Override
+ public boolean containsValue(Object value) {
+ return markerToHandler.containsValue(value);
+ }
+
+ @Override
+ public InvocationHandlerAdapter get(Object key) {
+ return markerToHandler.get(new MockMarkerKey(key));
+ }
+
+ @Override
+ public InvocationHandlerAdapter put(Object key, InvocationHandlerAdapter value) {
+ return markerToHandler.put(new MockMarkerKey(key), value);
+ }
+
+ @Override
+ public InvocationHandlerAdapter remove(Object key) {
+ return markerToHandler.remove(new MockMarkerKey(key));
+ }
+
+ @Override
+ public void putAll(Map<?, ? extends InvocationHandlerAdapter> m) {
+ for (Entry<?, ? extends InvocationHandlerAdapter> entry : m.entrySet()) {
+ put(new MockMarkerKey(entry.getKey()), entry.getValue());
+ }
+ }
+
+ @Override
+ public void clear() {
+ markerToHandler.clear();
+ }
+
+ @Override
+ public Set<Object> keySet() {
+ Set<Object> set = new HashSet<>(entrySet().size());
+ for (MockMarkerKey key : markerToHandler.keySet()) {
+ set.add(key.mockMarker);
+ }
+ return set;
+ }
+
+ @Override
+ public Collection<InvocationHandlerAdapter> values() {
+ return markerToHandler.values();
+ }
+
+ @Override
+ public Set<Entry<Object, InvocationHandlerAdapter>> entrySet() {
+ Set<Entry<Object, InvocationHandlerAdapter>> set = new HashSet<>(entrySet().size());
+ for (Entry<MockMarkerKey, InvocationHandlerAdapter> entry : markerToHandler.entrySet()) {
+ set.add(new AbstractMap.SimpleImmutableEntry<>(entry.getKey().mockMarker, entry.getValue()));
+ }
+ return set;
+ }
+
+ private static class MockMarkerKey {
+
+ private final Object mockMarker;
+
+ public MockMarkerKey(Object mockMarker) {
+ this.mockMarker = mockMarker;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ MockMarkerKey mockMarkerKey = (MockMarkerKey) o;
+
+ return mockMarker == mockMarkerKey.mockMarker;
+ }
+
+ @Override
+ public int hashCode() {
+ return System.identityHashCode(mockMarker);
+ }
+ }
+}