Merge changes Ief507b3f,I45256bb1
* changes:
Add InetDiagMessage.inetDiagReqV2 with different args
Fix StructInetDiagSockId parsing for v4-mapped v6 address
diff --git a/staticlibs/Android.bp b/staticlibs/Android.bp
index 1fe6c2c..904e8c6 100644
--- a/staticlibs/Android.bp
+++ b/staticlibs/Android.bp
@@ -328,6 +328,38 @@
lint: { strict_updatability_linting: true },
}
+// Limited set of utilities for use by service-connectivity-mdns-standalone-build-test, to make sure
+// the mDNS code can build with only system APIs.
+// The mDNS code is platform code so it should use framework-annotations-lib, contrary to apps that
+// should use sdk_version: "system_current" and only androidx.annotation_annotation. But this build
+// rule verifies that the mDNS code can be built into apps, if code transformations are applied to
+// the annotations.
+// When using "system_current", framework annotations are not available; they would appear as
+// package-private as they are marked as such in the system_current stubs. So build against
+// core_platform and add the stubs manually in "libs". See http://b/147773144#comment7.
+java_library {
+ name: "net-utils-device-common-mdns-standalone-build-test",
+ // Build against core_platform and add the stub libraries manually in "libs", as annotations
+ // are already included in android_system_stubs_current but package-private, so
+ // "framework-annotations-lib" needs to be manually included before
+ // "android_system_stubs_current" (b/272392042)
+ sdk_version: "core_platform",
+ srcs: [
+ "device/com/android/net/module/util/FdEventsReader.java",
+ "device/com/android/net/module/util/HexDump.java",
+ "device/com/android/net/module/util/SharedLog.java",
+ "framework/com/android/net/module/util/ByteUtils.java",
+ "framework/com/android/net/module/util/CollectionUtils.java",
+ "framework/com/android/net/module/util/LinkPropertiesUtils.java",
+ ],
+ libs: [
+ "framework-annotations-lib",
+ "android_system_stubs_current",
+ "androidx.annotation_annotation",
+ ],
+ visibility: ["//packages/modules/Connectivity/service-t"],
+}
+
// Use a filegroup and not a library for telephony sources, as framework-annotations cannot be
// included either (some annotations would be duplicated on the bootclasspath).
filegroup {
diff --git a/staticlibs/framework/com/android/net/module/util/LinkPropertiesUtils.java b/staticlibs/framework/com/android/net/module/util/LinkPropertiesUtils.java
index 1565f2b..e271f64 100644
--- a/staticlibs/framework/com/android/net/module/util/LinkPropertiesUtils.java
+++ b/staticlibs/framework/com/android/net/module/util/LinkPropertiesUtils.java
@@ -146,6 +146,24 @@
right != null ? right.getLinkAddresses() : null);
}
+ /**
+ * Compares {@code left} {@code LinkProperties} allLinkAddresses against the {@code right}.
+ *
+ * @param left A LinkProperties or null
+ * @param right A LinkProperties or null
+ * @return {@code true} if both are identical, {@code false} otherwise.
+ * @see LinkProperties#getAllLinkAddresses()
+ */
+ public static boolean isIdenticalAllLinkAddresses(@Nullable LinkProperties left,
+ @Nullable LinkProperties right) {
+ if (left == right) return true;
+ if (left == null || right == null) return false;
+ final List<LinkAddress> leftAddresses = left.getAllLinkAddresses();
+ final List<LinkAddress> rightAddresses = right.getAllLinkAddresses();
+ if (leftAddresses.size() != rightAddresses.size()) return false;
+ return leftAddresses.containsAll(rightAddresses);
+ }
+
/**
* Compares {@code left} {@code LinkProperties} interface addresses against the {@code right}.
*
diff --git a/staticlibs/tests/unit/src/com/android/net/module/util/LinkPropertiesUtilsTest.java b/staticlibs/tests/unit/src/com/android/net/module/util/LinkPropertiesUtilsTest.java
index 09f0490..80ab618 100644
--- a/staticlibs/tests/unit/src/com/android/net/module/util/LinkPropertiesUtilsTest.java
+++ b/staticlibs/tests/unit/src/com/android/net/module/util/LinkPropertiesUtilsTest.java
@@ -94,6 +94,9 @@
assertTrue(LinkPropertiesUtils.isIdenticalAddresses(source, target));
assertTrue(LinkPropertiesUtils.isIdenticalAddresses(target, source));
+ assertTrue(LinkPropertiesUtils.isIdenticalAllLinkAddresses(source, target));
+ assertTrue(LinkPropertiesUtils.isIdenticalAllLinkAddresses(target, source));
+
assertTrue(LinkPropertiesUtils.isIdenticalDnses(source, target));
assertTrue(LinkPropertiesUtils.isIdenticalDnses(target, source));
@@ -116,12 +119,17 @@
assertFalse(LinkPropertiesUtils.isIdenticalAddresses(source, target));
assertFalse(LinkPropertiesUtils.isIdenticalAddresses(target, source));
+ assertFalse(LinkPropertiesUtils.isIdenticalAllLinkAddresses(source, target));
+ assertFalse(LinkPropertiesUtils.isIdenticalAllLinkAddresses(target, source));
+
// Currently, target contains V4_LINKADDR, V6_LINKADDR and testLinkAddr.
// Compare addresses.size() equals but contains different address.
target.removeLinkAddress(V4_LINKADDR);
assertEquals(source.getAddresses().size(), target.getAddresses().size());
assertFalse(LinkPropertiesUtils.isIdenticalAddresses(source, target));
assertFalse(LinkPropertiesUtils.isIdenticalAddresses(target, source));
+ assertFalse(LinkPropertiesUtils.isIdenticalAllLinkAddresses(source, target));
+ assertFalse(LinkPropertiesUtils.isIdenticalAllLinkAddresses(target, source));
// Restore link address
target.addLinkAddress(V4_LINKADDR);
target.removeLinkAddress(testLinkAddr);
@@ -169,6 +177,13 @@
target.setHttpProxy(null);
assertFalse(LinkPropertiesUtils.isIdenticalHttpProxy(source, target));
assertFalse(LinkPropertiesUtils.isIdenticalHttpProxy(target, source));
+
+ final LinkProperties stacked = new LinkProperties();
+ stacked.setInterfaceName("v4-" + target.getInterfaceName());
+ stacked.addLinkAddress(testLinkAddr);
+ target.addStackedLink(stacked);
+ assertFalse(LinkPropertiesUtils.isIdenticalAllLinkAddresses(source, target));
+ assertFalse(LinkPropertiesUtils.isIdenticalAllLinkAddresses(target, source));
}
private <T> void compareResult(List<T> oldItems, List<T> newItems, List<T> expectRemoved,
diff --git a/staticlibs/tests/unit/src/com/android/testutils/TestableNetworkCallbackTest.kt b/staticlibs/tests/unit/src/com/android/testutils/TestableNetworkCallbackTest.kt
index ec7cdbd..4ed881a 100644
--- a/staticlibs/tests/unit/src/com/android/testutils/TestableNetworkCallbackTest.kt
+++ b/staticlibs/tests/unit/src/com/android/testutils/TestableNetworkCallbackTest.kt
@@ -366,18 +366,6 @@
}
@Test
- fun testPollOrThrow() {
- assertFails { mCallback.pollOrThrow(SHORT_TIMEOUT_MS) }
- TNCInterpreter.interpretTestSpec(initial = mCallback, lineShift = 1,
- threadTransform = { cb -> cb.createLinkedCopy() }, spec = """
- sleep; onAvailable(133) | pollOrThrow(2) = Available(133) time 1..4
- | pollOrThrow(1) fails
- onCapabilitiesChanged(108) | pollOrThrow(1) = CapabilitiesChanged(108) time 0..3
- onBlockedStatus(199) | pollOrThrow(1) = BlockedStatus(199) time 0..3
- """)
- }
-
- @Test
fun testEventuallyExpect() {
// TODO: Current test does not verify the inline one. Also verify the behavior after
// aligning two eventuallyExpect()
@@ -455,7 +443,6 @@
}
},
Regex("""poll\((\d+)\)""") to { i, cb, t -> cb.poll(t.timeArg(1)) },
- Regex("""pollOrThrow\((\d+)\)""") to { i, cb, t -> cb.pollOrThrow(t.timeArg(1)) },
// Interpret "eventually(Available(xx), timeout)" as calling eventuallyExpect that expects
// CallbackEntry.AVAILABLE with netId of xx within timeout*INTERPRET_TIME_UNIT timeout, and
// likewise for all callback types.
diff --git a/staticlibs/testutils/devicetests/com/android/testutils/TestableNetworkCallback.kt b/staticlibs/testutils/devicetests/com/android/testutils/TestableNetworkCallback.kt
index e7d86e0..0e73112 100644
--- a/staticlibs/testutils/devicetests/com/android/testutils/TestableNetworkCallback.kt
+++ b/staticlibs/testutils/devicetests/com/android/testutils/TestableNetworkCallback.kt
@@ -223,18 +223,6 @@
fun poll(timeoutMs: Long = defaultTimeoutMs, predicate: (CallbackEntry) -> Boolean = { true }) =
history.poll(timeoutMs, predicate)
- /**
- * Get the next callback or throw if timeout.
- *
- * With no argument, this method waits out the default timeout. To wait forever, pass
- * Long.MAX_VALUE.
- */
- @JvmOverloads
- fun pollOrThrow(
- timeoutMs: Long = defaultTimeoutMs,
- errorMsg: String = "Did not receive callback after $timeoutMs"
- ): CallbackEntry = poll(timeoutMs) ?: fail(errorMsg)
-
/*****
* expect family of methods.
* These methods fetch the next callback and assert it matches the conditions : type,
@@ -350,15 +338,16 @@
timeoutMs: Long = defaultTimeoutMs,
errorMsg: String? = null,
test: (T) -> Boolean = { true }
- ) = pollOrThrow(timeoutMs, "Did not receive ${T::class.simpleName} after ${timeoutMs}ms").also {
- if (it !is T) fail("Expected callback ${T::class.simpleName}, got $it")
- if (ANY_NETWORK !== network && it.network != network) {
- fail("Expected network $network for callback : $it")
- }
- if (!test(it)) {
- fail("${errorMsg ?: "Callback doesn't match predicate"} : $it")
- }
- } as T
+ ) = (poll(timeoutMs) ?: fail("Did not receive ${T::class.simpleName} after ${timeoutMs}ms"))
+ .also {
+ if (it !is T) fail("Expected callback ${T::class.simpleName}, got $it")
+ if (ANY_NETWORK !== network && it.network != network) {
+ fail("Expected network $network for callback : $it")
+ }
+ if (!test(it)) {
+ fail("${errorMsg ?: "Callback doesn't match predicate"} : $it")
+ }
+ } as T
inline fun <reified T : CallbackEntry> expect(
network: HasNetwork,
@@ -367,6 +356,12 @@
test: (T) -> Boolean = { true }
) = expect(network.network, timeoutMs, errorMsg, test)
+ /*****
+ * assertNoCallback family of methods.
+ * These methods make sure that no callback that matches the predicate was received.
+ * If no predicate is given, they make sure that no callback at all was received.
+ * These methods run the waiter func given in the constructor if any.
+ */
@JvmOverloads
fun assertNoCallback(
timeoutMs: Long = defaultNoCallbackTimeoutMs,
@@ -379,9 +374,12 @@
fun assertNoCallback(valid: (CallbackEntry) -> Boolean) =
assertNoCallback(defaultNoCallbackTimeoutMs, valid)
- // Expects a callback of the specified type matching the predicate within the timeout.
- // Any callback that doesn't match the predicate will be skipped. Fails only if
- // no matching callback is received within the timeout.
+ /*****
+ * eventuallyExpect family of methods.
+ * These methods make sure a callback that matches the type/predicate is received eventually.
+ * Any callback of the wrong type, or doesn't match the optional predicate, is ignored.
+ * They fail if no callback matching the predicate is received within the timeout.
+ */
inline fun <reified T : CallbackEntry> eventuallyExpect(
timeoutMs: Long = defaultTimeoutMs,
from: Int = mark,
@@ -408,13 +406,6 @@
assertNotNull(it, "Callback ${type.java} not received within ${timeoutMs}ms")
} as T
- // TODO (b/157405399) remove this method when there are no longer any uses of it.
- inline fun <reified T : CallbackEntry> eventuallyExpectOrNull(
- timeoutMs: Long = defaultTimeoutMs,
- from: Int = mark,
- crossinline predicate: (T) -> Boolean = { true }
- ) = history.poll(timeoutMs, from) { it is T && predicate(it) } as T?
-
// Expects onAvailable and the callbacks that follow it. These are:
// - onSuspended, iff the network was suspended when the callbacks fire.
// - onCapabilitiesChanged.