Loading tests/integration/src/android/net/ip/IpClientIntegrationTest.java +29 −38 Original line number Diff line number Diff line Loading @@ -132,7 +132,6 @@ import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.internal.util.StateMachine; import com.android.net.module.util.ArrayTrackRecord; import com.android.networkstack.apishim.CaptivePortalDataShimImpl; import com.android.networkstack.apishim.ConstantsShim; import com.android.networkstack.apishim.common.ShimUtils; Loading Loading @@ -179,9 +178,6 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Predicate; import kotlin.Lazy; import kotlin.LazyKt; /** * Tests for IpClient. */ Loading Loading @@ -224,15 +220,6 @@ public class IpClientIntegrationTest { private Dependencies mDependencies; private byte[] mClientMac; // ReadHeads for various packet streams. Cannot be initialized in @Before because ReadHead is // single-thread-only, and AndroidJUnitRunner runs @Before and @Test on different threads. // While it looks like these are created only once per test, they are actually created once per // test method because JUnit recreates a fresh test class instance before every test method. private Lazy<ArrayTrackRecord<byte[]>.ReadHead> mDhcpPacketReadHead = LazyKt.lazy(() -> mPacketReader.getReceivedPackets().newReadHead()); private Lazy<ArrayTrackRecord<byte[]>.ReadHead> mArpPacketReadHead = LazyKt.lazy(() -> mPacketReader.getReceivedPackets().newReadHead()); // Ethernet header private static final int ETH_HEADER_LEN = 14; Loading Loading @@ -478,17 +465,6 @@ public class IpClientIntegrationTest { mHandler.post(() -> mPacketReader.start()); } private IpClient makeIpClient() throws Exception { IpClient ipc = new IpClient(mContext, mIfaceName, mCb, mNetworkObserverRegistry, mNetworkStackServiceManager, mDependencies); // Wait for IpClient to enter its initial state. Otherwise, additional setup steps or tests // that mock IpClient's dependencies might interact with those mocks while IpClient is // starting. This would cause UnfinishedStubbingExceptions as mocks cannot be interacted // with while they are being stubbed. HandlerUtils.waitForIdle(ipc.getHandler(), TEST_TIMEOUT_MS); return ipc; } private void setUpIpClient() throws Exception { final Instrumentation inst = InstrumentationRegistry.getInstrumentation(); final IBinder netdIBinder = Loading @@ -499,7 +475,13 @@ public class IpClientIntegrationTest { mNetworkObserverRegistry = new NetworkObserverRegistry(); mNetworkObserverRegistry.register(mNetd); mIpc = makeIpClient(); mIpc = new IpClient(mContext, mIfaceName, mCb, mNetworkObserverRegistry, mNetworkStackServiceManager, mDependencies); // Wait for IpClient to enter its initial state. Otherwise, additional setup steps or tests // that mock IpClient's dependencies might interact with those mocks while IpClient is // starting. This would cause UnfinishedStubbingExceptions as mocks cannot be interacted // with while they are being stubbed. HandlerUtils.waitForIdle(mIpc.getHandler(), TEST_TIMEOUT_MS); // Tell the IpMemoryStore immediately to answer any question about network attributes with a // null response. Otherwise, the DHCP client will wait for two seconds before starting, Loading Loading @@ -630,15 +612,12 @@ public class IpClientIntegrationTest { mPacketReader.sendResponse(packet); } private void startIpClientProvisioning(final ProvisioningConfiguration cfg) throws Exception { mIpc.startProvisioning(cfg); } private void startIpClientProvisioning(final boolean isDhcpLeaseCacheEnabled, final boolean shouldReplyRapidCommitAck, final boolean isPreconnectionEnabled, final boolean isDhcpIpConflictDetectEnabled, final boolean isHostnameConfigurationEnabled, final String hostname, final String displayName, final ScanResultInfo scanResultInfo) throws Exception { final String displayName, final ScanResultInfo scanResultInfo) throws RemoteException { ProvisioningConfiguration.Builder prov = new ProvisioningConfiguration.Builder() .withoutIpReachabilityMonitor() .withLayer2Information(new Layer2Information(TEST_L2KEY, TEST_CLUSTER, Loading @@ -652,7 +631,7 @@ public class IpClientIntegrationTest { mDependencies.setDhcpRapidCommitEnabled(shouldReplyRapidCommitAck); mDependencies.setDhcpIpConflictDetectEnabled(isDhcpIpConflictDetectEnabled); mDependencies.setHostnameConfiguration(isHostnameConfigurationEnabled, hostname); startIpClientProvisioning(prov.build()); mIpc.startProvisioning(prov.build()); if (!isPreconnectionEnabled) { verify(mCb, timeout(TEST_TIMEOUT_MS)).setFallbackMulticastFilter(false); } Loading @@ -661,7 +640,8 @@ public class IpClientIntegrationTest { private void startIpClientProvisioning(final boolean isDhcpLeaseCacheEnabled, final boolean isDhcpRapidCommitEnabled, final boolean isPreconnectionEnabled, final boolean isDhcpIpConflictDetectEnabled) throws Exception { final boolean isDhcpIpConflictDetectEnabled) throws RemoteException { startIpClientProvisioning(isDhcpLeaseCacheEnabled, isDhcpRapidCommitEnabled, isPreconnectionEnabled, isDhcpIpConflictDetectEnabled, false /* isHostnameConfigurationEnabled */, null /* hostname */, Loading Loading @@ -783,10 +763,14 @@ public class IpClientIntegrationTest { } private DhcpPacket getNextDhcpPacket() throws ParseException { byte[] packet = mDhcpPacketReadHead.getValue().poll(PACKET_TIMEOUT_MS, this::isDhcpPacket); assertNotNull("No expected DHCP packet received on interface within timeout", packet); byte[] packet; while ((packet = mPacketReader.popPacket(PACKET_TIMEOUT_MS)) != null) { if (!isDhcpPacket(packet)) continue; return DhcpPacket.decodeFullPacket(packet, packet.length, ENCAP_L2); } fail("No expected DHCP packet received on interface within timeout"); return null; } private DhcpPacket getReplyFromDhcpLease(final NetworkAttributes na, boolean timeout) throws Exception { Loading Loading @@ -962,7 +946,7 @@ public class IpClientIntegrationTest { private ArpPacket getNextArpPacket(final int timeout) throws Exception { byte[] packet; while ((packet = mArpPacketReadHead.getValue().poll(timeout, p -> true)) != null) { while ((packet = mPacketReader.popPacket(timeout)) != null) { final ArpPacket arpPacket = parseArpPacketOrNull(packet); if (arpPacket != null) return arpPacket; } Loading Loading @@ -1303,9 +1287,16 @@ public class IpClientIntegrationTest { == (byte) ICMPV6_ROUTER_SOLICITATION; } private void waitForRouterSolicitation() throws ParseException { /** * Wait for any router solicitation to have arrived since the packet reader was received. * * This method does not affect packets obtained via mPacketReader.popPacket. After any router * solicitation has been received, calls to this method will just return immediately. */ private void waitForRouterSolicitation() { assertNotNull("No router solicitation received on interface within timeout", mPacketReader.popPacket(PACKET_TIMEOUT_MS, this::isRouterSolicitation)); mPacketReader.getReceivedPackets().poll( PACKET_TIMEOUT_MS, 0 /* pos */, this::isRouterSolicitation)); } private void sendRouterAdvertisement(boolean waitForRs, short lifetime) throws Exception { Loading Loading
tests/integration/src/android/net/ip/IpClientIntegrationTest.java +29 −38 Original line number Diff line number Diff line Loading @@ -132,7 +132,6 @@ import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.internal.util.StateMachine; import com.android.net.module.util.ArrayTrackRecord; import com.android.networkstack.apishim.CaptivePortalDataShimImpl; import com.android.networkstack.apishim.ConstantsShim; import com.android.networkstack.apishim.common.ShimUtils; Loading Loading @@ -179,9 +178,6 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Predicate; import kotlin.Lazy; import kotlin.LazyKt; /** * Tests for IpClient. */ Loading Loading @@ -224,15 +220,6 @@ public class IpClientIntegrationTest { private Dependencies mDependencies; private byte[] mClientMac; // ReadHeads for various packet streams. Cannot be initialized in @Before because ReadHead is // single-thread-only, and AndroidJUnitRunner runs @Before and @Test on different threads. // While it looks like these are created only once per test, they are actually created once per // test method because JUnit recreates a fresh test class instance before every test method. private Lazy<ArrayTrackRecord<byte[]>.ReadHead> mDhcpPacketReadHead = LazyKt.lazy(() -> mPacketReader.getReceivedPackets().newReadHead()); private Lazy<ArrayTrackRecord<byte[]>.ReadHead> mArpPacketReadHead = LazyKt.lazy(() -> mPacketReader.getReceivedPackets().newReadHead()); // Ethernet header private static final int ETH_HEADER_LEN = 14; Loading Loading @@ -478,17 +465,6 @@ public class IpClientIntegrationTest { mHandler.post(() -> mPacketReader.start()); } private IpClient makeIpClient() throws Exception { IpClient ipc = new IpClient(mContext, mIfaceName, mCb, mNetworkObserverRegistry, mNetworkStackServiceManager, mDependencies); // Wait for IpClient to enter its initial state. Otherwise, additional setup steps or tests // that mock IpClient's dependencies might interact with those mocks while IpClient is // starting. This would cause UnfinishedStubbingExceptions as mocks cannot be interacted // with while they are being stubbed. HandlerUtils.waitForIdle(ipc.getHandler(), TEST_TIMEOUT_MS); return ipc; } private void setUpIpClient() throws Exception { final Instrumentation inst = InstrumentationRegistry.getInstrumentation(); final IBinder netdIBinder = Loading @@ -499,7 +475,13 @@ public class IpClientIntegrationTest { mNetworkObserverRegistry = new NetworkObserverRegistry(); mNetworkObserverRegistry.register(mNetd); mIpc = makeIpClient(); mIpc = new IpClient(mContext, mIfaceName, mCb, mNetworkObserverRegistry, mNetworkStackServiceManager, mDependencies); // Wait for IpClient to enter its initial state. Otherwise, additional setup steps or tests // that mock IpClient's dependencies might interact with those mocks while IpClient is // starting. This would cause UnfinishedStubbingExceptions as mocks cannot be interacted // with while they are being stubbed. HandlerUtils.waitForIdle(mIpc.getHandler(), TEST_TIMEOUT_MS); // Tell the IpMemoryStore immediately to answer any question about network attributes with a // null response. Otherwise, the DHCP client will wait for two seconds before starting, Loading Loading @@ -630,15 +612,12 @@ public class IpClientIntegrationTest { mPacketReader.sendResponse(packet); } private void startIpClientProvisioning(final ProvisioningConfiguration cfg) throws Exception { mIpc.startProvisioning(cfg); } private void startIpClientProvisioning(final boolean isDhcpLeaseCacheEnabled, final boolean shouldReplyRapidCommitAck, final boolean isPreconnectionEnabled, final boolean isDhcpIpConflictDetectEnabled, final boolean isHostnameConfigurationEnabled, final String hostname, final String displayName, final ScanResultInfo scanResultInfo) throws Exception { final String displayName, final ScanResultInfo scanResultInfo) throws RemoteException { ProvisioningConfiguration.Builder prov = new ProvisioningConfiguration.Builder() .withoutIpReachabilityMonitor() .withLayer2Information(new Layer2Information(TEST_L2KEY, TEST_CLUSTER, Loading @@ -652,7 +631,7 @@ public class IpClientIntegrationTest { mDependencies.setDhcpRapidCommitEnabled(shouldReplyRapidCommitAck); mDependencies.setDhcpIpConflictDetectEnabled(isDhcpIpConflictDetectEnabled); mDependencies.setHostnameConfiguration(isHostnameConfigurationEnabled, hostname); startIpClientProvisioning(prov.build()); mIpc.startProvisioning(prov.build()); if (!isPreconnectionEnabled) { verify(mCb, timeout(TEST_TIMEOUT_MS)).setFallbackMulticastFilter(false); } Loading @@ -661,7 +640,8 @@ public class IpClientIntegrationTest { private void startIpClientProvisioning(final boolean isDhcpLeaseCacheEnabled, final boolean isDhcpRapidCommitEnabled, final boolean isPreconnectionEnabled, final boolean isDhcpIpConflictDetectEnabled) throws Exception { final boolean isDhcpIpConflictDetectEnabled) throws RemoteException { startIpClientProvisioning(isDhcpLeaseCacheEnabled, isDhcpRapidCommitEnabled, isPreconnectionEnabled, isDhcpIpConflictDetectEnabled, false /* isHostnameConfigurationEnabled */, null /* hostname */, Loading Loading @@ -783,10 +763,14 @@ public class IpClientIntegrationTest { } private DhcpPacket getNextDhcpPacket() throws ParseException { byte[] packet = mDhcpPacketReadHead.getValue().poll(PACKET_TIMEOUT_MS, this::isDhcpPacket); assertNotNull("No expected DHCP packet received on interface within timeout", packet); byte[] packet; while ((packet = mPacketReader.popPacket(PACKET_TIMEOUT_MS)) != null) { if (!isDhcpPacket(packet)) continue; return DhcpPacket.decodeFullPacket(packet, packet.length, ENCAP_L2); } fail("No expected DHCP packet received on interface within timeout"); return null; } private DhcpPacket getReplyFromDhcpLease(final NetworkAttributes na, boolean timeout) throws Exception { Loading Loading @@ -962,7 +946,7 @@ public class IpClientIntegrationTest { private ArpPacket getNextArpPacket(final int timeout) throws Exception { byte[] packet; while ((packet = mArpPacketReadHead.getValue().poll(timeout, p -> true)) != null) { while ((packet = mPacketReader.popPacket(timeout)) != null) { final ArpPacket arpPacket = parseArpPacketOrNull(packet); if (arpPacket != null) return arpPacket; } Loading Loading @@ -1303,9 +1287,16 @@ public class IpClientIntegrationTest { == (byte) ICMPV6_ROUTER_SOLICITATION; } private void waitForRouterSolicitation() throws ParseException { /** * Wait for any router solicitation to have arrived since the packet reader was received. * * This method does not affect packets obtained via mPacketReader.popPacket. After any router * solicitation has been received, calls to this method will just return immediately. */ private void waitForRouterSolicitation() { assertNotNull("No router solicitation received on interface within timeout", mPacketReader.popPacket(PACKET_TIMEOUT_MS, this::isRouterSolicitation)); mPacketReader.getReceivedPackets().poll( PACKET_TIMEOUT_MS, 0 /* pos */, this::isRouterSolicitation)); } private void sendRouterAdvertisement(boolean waitForRs, short lifetime) throws Exception { Loading