Merge "Introduce Rbit for instruction clarity" into main
diff --git a/tests/integration/common/android/net/ip/IpClientIntegrationTestCommon.java b/tests/integration/common/android/net/ip/IpClientIntegrationTestCommon.java
index c4dc40a..72b9050 100644
--- a/tests/integration/common/android/net/ip/IpClientIntegrationTestCommon.java
+++ b/tests/integration/common/android/net/ip/IpClientIntegrationTestCommon.java
@@ -306,10 +306,10 @@
protected static final long TEST_TIMEOUT_MS = 2_000L;
private static final long TEST_WAIT_ENOBUFS_TIMEOUT_MS = 30_000L;
private static final long TEST_WAIT_RENEW_REBIND_RETRANSMIT_MS = 15_000L;
- // To prevent the flakiness about deprecationTime and expirationTime check, +/- 2s tolerance
+ // To prevent the flakiness about deprecationTime and expirationTime check, +/- 4s tolerance
// should be enough between the timestamp when the IP provisioning completes successfully and
// when IpClientLinkObserver sees the RTM_NEWADDR netlink events.
- private static final long TEST_LIFETIME_TOLERANCE_MS = 2_000L;
+ private static final long TEST_LIFETIME_TOLERANCE_MS = 4_000L;
@Rule
public final DevSdkIgnoreRule mIgnoreRule = new DevSdkIgnoreRule();
diff --git a/tests/unit/src/android/net/apf/ApfTest.java b/tests/unit/src/android/net/apf/ApfTest.java
index 5c6a906..37b9060 100644
--- a/tests/unit/src/android/net/apf/ApfTest.java
+++ b/tests/unit/src/android/net/apf/ApfTest.java
@@ -263,6 +263,12 @@
ApfV4Generator gen = new ApfV4Generator(MIN_APF_VERSION);
assertPass(gen);
+ // Test pass opcode
+ gen = new ApfV4Generator(MIN_APF_VERSION);
+ gen.addPass();
+ gen.addJump(DROP_LABEL);
+ assertPass(gen);
+
// Test jumping to pass label.
gen = new ApfV4Generator(MIN_APF_VERSION);
gen.addJump(PASS_LABEL);
diff --git a/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java b/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java
index d3647f5..d6e9c8e 100644
--- a/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java
+++ b/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java
@@ -278,8 +278,10 @@
private @Mock TcpSocketTracker.Dependencies mTstDependencies;
private @Mock INetd mNetd;
private @Mock TcpSocketTracker mTst;
- private HashSet<WrappedNetworkMonitor> mCreatedNetworkMonitors;
- private HashSet<BroadcastReceiver> mRegisteredReceivers;
+ @GuardedBy("mCreatedNetworkMonitors")
+ private final HashSet<WrappedNetworkMonitor> mCreatedNetworkMonitors = new HashSet<>();
+ @GuardedBy("mRegisteredReceivers")
+ private final HashSet<BroadcastReceiver> mRegisteredReceivers = new HashSet<>();
private @Mock Context mMccContext;
private @Mock Resources mMccResource;
private @Mock WifiInfo mWifiInfo;
@@ -681,16 +683,22 @@
mFakeDns.setAnswer(PRIVATE_DNS_PROBE_HOST_SUFFIX, new String[]{"2001:db8::1"}, TYPE_AAAA);
doAnswer((invocation) -> {
- mRegisteredReceivers.add(invocation.getArgument(0));
+ synchronized (mRegisteredReceivers) {
+ mRegisteredReceivers.add(invocation.getArgument(0));
+ }
return new Intent();
}).when(mContext).registerReceiver(any(BroadcastReceiver.class), any());
doAnswer((invocation) -> {
- mRegisteredReceivers.add(invocation.getArgument(0));
+ synchronized (mRegisteredReceivers) {
+ mRegisteredReceivers.add(invocation.getArgument(0));
+ }
return new Intent();
}).when(mContext).registerReceiver(any(BroadcastReceiver.class), any(), anyInt());
doAnswer((invocation) -> {
- mRegisteredReceivers.remove(invocation.getArgument(0));
+ synchronized (mRegisteredReceivers) {
+ mRegisteredReceivers.remove(invocation.getArgument(0));
+ }
return null;
}).when(mContext).unregisterReceiver(any());
@@ -700,12 +708,10 @@
setDataStallEvaluationType(DATA_STALL_EVALUATION_TYPE_DNS);
setValidDataStallDnsTimeThreshold(TEST_MIN_VALID_STALL_DNS_TIME_THRESHOLD_MS);
setConsecutiveDnsTimeoutThreshold(5);
- mCreatedNetworkMonitors = new HashSet<>();
- mRegisteredReceivers = new HashSet<>();
}
- private static <T> void quitThreadsThat(Supplier<List<T>> supplier, ThrowingConsumer terminator)
- throws Exception {
+ private static <T> void quitResourcesThat(Supplier<List<T>> supplier,
+ ThrowingConsumer terminator) throws Exception {
// Run it multiple times since new threads might be generated in a thread
// that is about to be terminated, e.g. each thread that runs
// isCaptivePortal could generate 2 more probing threads.
@@ -720,8 +726,29 @@
assertEquals(Collections.emptyList(), supplier.get());
}
+ private void quitNetworkMonitors() throws Exception {
+ quitResourcesThat(() -> {
+ synchronized (mCreatedNetworkMonitors) {
+ final ArrayList<WrappedNetworkMonitor> ret =
+ new ArrayList<>(mCreatedNetworkMonitors);
+ mCreatedNetworkMonitors.clear();
+ return ret;
+ }
+ }, (it) -> {
+ final WrappedNetworkMonitor nm = (WrappedNetworkMonitor) it;
+ nm.notifyNetworkDisconnected();
+ nm.awaitQuit();
+ });
+ synchronized (mRegisteredReceivers) {
+ assertEquals("BroadcastReceiver still registered after disconnect",
+ 0, mRegisteredReceivers.size());
+ }
+ quitThreads();
+ quitExecutorServices();
+ }
+
private void quitExecutorServices() throws Exception {
- quitThreadsThat(() -> {
+ quitResourcesThat(() -> {
synchronized (mExecutorServiceToBeCleared) {
final ArrayList<ExecutorService> ret = new ArrayList<>(mExecutorServiceToBeCleared);
mExecutorServiceToBeCleared.clear();
@@ -734,7 +761,7 @@
}
private void quitThreads() throws Exception {
- quitThreadsThat(() -> {
+ quitResourcesThat(() -> {
synchronized (mThreadsToBeCleared) {
final ArrayList<Thread> ret = new ArrayList<>(mThreadsToBeCleared);
mThreadsToBeCleared.clear();
@@ -751,20 +778,7 @@
@After
public void tearDown() throws Exception {
mFakeDns.clearAll();
- // Make a local copy of mCreatedNetworkMonitors because during the iteration below,
- // WrappedNetworkMonitor#onQuitting will delete elements from it on the handler threads.
- WrappedNetworkMonitor[] networkMonitors = mCreatedNetworkMonitors.toArray(
- new WrappedNetworkMonitor[0]);
- for (WrappedNetworkMonitor nm : networkMonitors) {
- nm.notifyNetworkDisconnected();
- nm.awaitQuit();
- }
- assertEquals("NetworkMonitor still running after disconnect",
- 0, mCreatedNetworkMonitors.size());
- assertEquals("BroadcastReceiver still registered after disconnect",
- 0, mRegisteredReceivers.size());
- quitThreads();
- quitExecutorServices();
+ quitNetworkMonitors();
// Clear mocks to prevent from stubs holding instances and cause memory leaks.
Mockito.framework().clearInlineMocks();
}
@@ -849,7 +863,6 @@
@Override
protected void onQuitting() {
super.onQuitting();
- assertTrue(mCreatedNetworkMonitors.remove(this));
mQuitCv.open();
}
@@ -1171,7 +1184,9 @@
verify(mContext, never()).registerReceiver(receiverCaptor.capture(),
argThat(receiver -> ACTION_CONFIGURATION_CHANGED.equals(receiver.getAction(0))));
nm.start();
- mCreatedNetworkMonitors.add(nm);
+ synchronized (mCreatedNetworkMonitors) {
+ mCreatedNetworkMonitors.add(nm);
+ }
HandlerUtils.waitForIdle(nm.getHandler(), HANDLER_TIMEOUT_MS);
verify(mContext, times(1)).registerReceiver(receiverCaptor.capture(),
argThat(receiver -> ACTION_CONFIGURATION_CHANGED.equals(receiver.getAction(0))));
@@ -3773,6 +3788,8 @@
// started. If captive portal app receiver is registered, then the size of the registered
// receivers will be 2. Otherwise, mRegisteredReceivers should only contain 1 configuration
// change receiver.
- assertEquals(isPortal ? 2 : 1, mRegisteredReceivers.size());
+ synchronized (mRegisteredReceivers) {
+ assertEquals(isPortal ? 2 : 1, mRegisteredReceivers.size());
+ }
}
}