Merge "[KA13]: add unit test for exposed TCP socket keepalive API."

This commit is contained in:
Xiao Ma
2019-03-13 01:13:08 +00:00
committed by Gerrit Code Review

View File

@@ -190,6 +190,8 @@ import org.mockito.stubbing.Answer;
import java.net.Inet4Address; import java.net.Inet4Address;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@@ -206,6 +208,7 @@ import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Consumer;
import java.util.function.Predicate; import java.util.function.Predicate;
/** /**
@@ -3992,17 +3995,24 @@ public class ConnectivityServiceTest {
callback3.expectStopped(); callback3.expectStopped();
} }
@Test // Helper method to prepare the executor and run test
public void testNattSocketKeepalives_SingleThreadExecutor() throws Exception { private void runTestWithSerialExecutors(Consumer<Executor> functor) {
final ExecutorService executorSingleThread = Executors.newSingleThreadExecutor(); final ExecutorService executorSingleThread = Executors.newSingleThreadExecutor();
doTestNattSocketKeepalivesWithExecutor(executorSingleThread); final Executor executorInline = (Runnable r) -> r.run();
functor.accept(executorSingleThread);
executorSingleThread.shutdown(); executorSingleThread.shutdown();
functor.accept(executorInline);
} }
@Test @Test
public void testNattSocketKeepalives_InlineExecutor() throws Exception { public void testNattSocketKeepalives() {
final Executor executorInline = (Runnable r) -> r.run(); runTestWithSerialExecutors(executor -> {
doTestNattSocketKeepalivesWithExecutor(executorInline); try {
doTestNattSocketKeepalivesWithExecutor(executor);
} catch (Exception e) {
fail(e.getMessage());
}
});
} }
private void doTestNattSocketKeepalivesWithExecutor(Executor executor) throws Exception { private void doTestNattSocketKeepalivesWithExecutor(Executor executor) throws Exception {
@@ -4143,6 +4153,81 @@ public class ConnectivityServiceTest {
mWiFiNetworkAgent.disconnect(); mWiFiNetworkAgent.disconnect();
waitFor(mWiFiNetworkAgent.getDisconnectedCV()); waitFor(mWiFiNetworkAgent.getDisconnectedCV());
mWiFiNetworkAgent = null;
}
@Test
public void testTcpSocketKeepalives() {
runTestWithSerialExecutors(executor -> {
try {
doTestTcpSocketKeepalivesWithExecutor(executor);
} catch (Exception e) {
fail(e.getMessage());
}
});
}
private void doTestTcpSocketKeepalivesWithExecutor(Executor executor) throws Exception {
final int srcPortV4 = 12345;
final int srcPortV6 = 23456;
final InetAddress myIPv4 = InetAddress.getByName("127.0.0.1");
final InetAddress myIPv6 = InetAddress.getByName("::1");
final int validKaInterval = 15;
final int invalidKaInterval = 9;
final LinkProperties lp = new LinkProperties();
lp.setInterfaceName("wlan12");
lp.addLinkAddress(new LinkAddress(myIPv6, 64));
lp.addLinkAddress(new LinkAddress(myIPv4, 25));
lp.addRoute(new RouteInfo(InetAddress.getByName("fe80::1234")));
lp.addRoute(new RouteInfo(InetAddress.getByName("127.0.0.254")));
final Network notMyNet = new Network(61234);
final Network myNet = connectKeepaliveNetwork(lp);
final Socket testSocketV4 = new Socket();
final Socket testSocketV6 = new Socket();
TestSocketKeepaliveCallback callback = new TestSocketKeepaliveCallback();
SocketKeepalive ka;
// Attempt to start Tcp keepalives with invalid parameters and check for errors.
// Invalid network.
ka = mCm.createSocketKeepalive(notMyNet, testSocketV4, executor, callback);
ka.start(validKaInterval);
callback.expectError(SocketKeepalive.ERROR_INVALID_NETWORK);
// Invalid Socket (socket is not bound with IPv4 address).
ka = mCm.createSocketKeepalive(myNet, testSocketV4, executor, callback);
ka.start(validKaInterval);
callback.expectError(SocketKeepalive.ERROR_INVALID_SOCKET);
// Invalid Socket (socket is not bound with IPv6 address).
ka = mCm.createSocketKeepalive(myNet, testSocketV6, executor, callback);
ka.start(validKaInterval);
callback.expectError(SocketKeepalive.ERROR_INVALID_SOCKET);
// Bind the socket address
testSocketV4.bind(new InetSocketAddress(myIPv4, srcPortV4));
testSocketV6.bind(new InetSocketAddress(myIPv6, srcPortV6));
// Invalid Socket (socket is bound with IPv4 address).
ka = mCm.createSocketKeepalive(myNet, testSocketV4, executor, callback);
ka.start(validKaInterval);
callback.expectError(SocketKeepalive.ERROR_INVALID_SOCKET);
// Invalid Socket (socket is bound with IPv6 address).
ka = mCm.createSocketKeepalive(myNet, testSocketV6, executor, callback);
ka.start(validKaInterval);
callback.expectError(SocketKeepalive.ERROR_INVALID_SOCKET);
testSocketV4.close();
testSocketV6.close();
mWiFiNetworkAgent.disconnect();
waitFor(mWiFiNetworkAgent.getDisconnectedCV());
mWiFiNetworkAgent = null;
} }
@Test @Test