From 58047b9451d824dd377980976132d9296ff8aaa5 Mon Sep 17 00:00:00 2001 From: Chris Wren Date: Thu, 26 Jan 2017 13:14:14 -0500 Subject: [PATCH] add a comparator for LogMaker Tests need to be able to compare partial log structures. Bug: 34705522 Test: runtest --path frameworks/base/core/tests/coretests/src/android/metrics Change-Id: I4e26e43f5f5ea3fbba5a2a2a9563982c7260671b --- api/system-current.txt | 1 + core/java/android/metrics/LogMaker.java | 21 ++++++ .../src/android/metrics/LogMakerTest.java | 74 ++++++++++++++++++++++ 3 files changed, 96 insertions(+) diff --git a/api/system-current.txt b/api/system-current.txt index 29179cfc8fcf..014b54cf5755 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -26158,6 +26158,7 @@ package android.metrics { method public long getTimestamp(); method public int getType(); method public boolean isLongCounterBucket(); + method public boolean isSubsetOf(android.metrics.LogMaker); method public boolean isValidValue(java.lang.Object); method public java.lang.Object[] serialize(); method public android.metrics.LogMaker setCategory(int); diff --git a/core/java/android/metrics/LogMaker.java b/core/java/android/metrics/LogMaker.java index 83f30bee4434..0ee25744488c 100644 --- a/core/java/android/metrics/LogMaker.java +++ b/core/java/android/metrics/LogMaker.java @@ -240,6 +240,9 @@ public class LogMaker { return out; } + /** + * Reconstitute an object from the output of {@link #serialize()}. + */ public void deserialize(Object[] items) { int i = 0; while (i < items.length) { @@ -252,4 +255,22 @@ public class LogMaker { } } } + + /** + * @param that the object to compare to. + * @return true if values in that equal values in this, for tags that exist in this. + */ + public boolean isSubsetOf(LogMaker that) { + if (that == null) { + return false; + } + for (int i = 0; i < entries.size(); i++) { + int key = this.entries.keyAt(i); + Object thisValue = this.entries.valueAt(i); + Object thatValue = that.entries.get(key); + if ((thisValue == null && thatValue != null) || !thisValue.equals(thatValue)) + return false; + } + return true; + } } diff --git a/core/tests/coretests/src/android/metrics/LogMakerTest.java b/core/tests/coretests/src/android/metrics/LogMakerTest.java index b0c394e1b194..b9c973fb09cd 100644 --- a/core/tests/coretests/src/android/metrics/LogMakerTest.java +++ b/core/tests/coretests/src/android/metrics/LogMakerTest.java @@ -132,4 +132,78 @@ public class LogMakerTest extends TestCase { assertTrue(badBuilder.serialize().length < LogMaker.MAX_SERIALIZED_SIZE); } + public void testIdentityEquality() { + LogMaker a = new LogMaker(0); + a.addTaggedData(1, "onetwothree"); + a.addTaggedData(2, 123); + a.addTaggedData(3, 123L); + + assertTrue("objects should be equal to themselves", a.isSubsetOf(a)); + } + + public void testExactEquality() { + LogMaker a = new LogMaker(0); + a.addTaggedData(1, "onetwothree"); + a.addTaggedData(2, 123); + a.addTaggedData(3, 123L); + LogMaker b = new LogMaker(0); + b.addTaggedData(1, "onetwothree"); + b.addTaggedData(2, 123); + b.addTaggedData(3, 123L); + + assertTrue("deep equality should be true", a.isSubsetOf(b)); + assertTrue("deep equality shoudl be true", b.isSubsetOf(a)); + } + + public void testSubsetEquality() { + LogMaker a = new LogMaker(0); + a.addTaggedData(1, "onetwothree"); + a.addTaggedData(2, 123); + LogMaker b = new LogMaker(0); + b.addTaggedData(1, "onetwothree"); + b.addTaggedData(2, 123); + b.addTaggedData(3, 123L); + + assertTrue("a is a strict subset of b", a.isSubsetOf(b)); + assertTrue("b is not a strict subset of a", !b.isSubsetOf(a)); + } + + public void testInequality() { + LogMaker a = new LogMaker(0); + a.addTaggedData(1, "onetwofour"); + a.addTaggedData(2, 1234); + LogMaker b = new LogMaker(0); + b.addTaggedData(1, "onetwothree"); + b.addTaggedData(2, 123); + b.addTaggedData(3, 123L); + + assertTrue("a is not a subset of b", !a.isSubsetOf(b)); + assertTrue("b is not a subset of a", !b.isSubsetOf(a)); + } + + public void testWildcardEquality() { + LogMaker empty = new LogMaker(0); + empty.clearTaggedData(MetricsEvent.RESERVED_FOR_LOGBUILDER_CATEGORY); //dirty trick + LogMaker b = new LogMaker(0); + b.addTaggedData(1, "onetwothree"); + b.addTaggedData(2, 123); + b.addTaggedData(3, 123L); + + assertTrue("empty builder is a subset of anything", empty.isSubsetOf(b)); + } + + public void testNullEquality() { + LogMaker a = new LogMaker(0); + a.addTaggedData(1, "onetwofour"); + a.addTaggedData(2, 1234); + + assertTrue("a is not a subset of null", !a.isSubsetOf(null)); + } + + public void testMajorCategory() { + LogMaker a = new LogMaker(1); + LogMaker b = new LogMaker(2); + assertFalse(a.isSubsetOf(b)); + assertFalse(b.isSubsetOf(a)); + } } -- 2.11.0