Move common test code to IkeSocketTestBase
This CL moves common testing logic from the subclasses to
IkeSocketTestBase
Bug: 172073025
Test: FrameworksIkeTests, CtsIkeTestCases
Change-Id: I8c90e134d3e894bc6df8590538e8568161f41489
diff --git a/tests/iketests/src/java/com/android/internal/net/ipsec/ike/IkeSocketTestBase.java b/tests/iketests/src/java/com/android/internal/net/ipsec/ike/IkeSocketTestBase.java
index 2363cff..028de8e 100644
--- a/tests/iketests/src/java/com/android/internal/net/ipsec/ike/IkeSocketTestBase.java
+++ b/tests/iketests/src/java/com/android/internal/net/ipsec/ike/IkeSocketTestBase.java
@@ -16,9 +16,16 @@
package com.android.internal.net.ipsec.ike;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.verify;
import android.net.InetAddresses;
import android.net.Network;
@@ -28,8 +35,13 @@
import android.util.Log;
import android.util.LongSparseArray;
+import com.android.internal.net.TestUtils;
+import com.android.internal.net.ipsec.ike.message.IkeHeader;
+import com.android.internal.util.HexDump;
+
import org.junit.After;
import org.junit.Before;
+import org.mockito.ArgumentCaptor;
import java.io.FileDescriptor;
import java.io.IOException;
@@ -206,4 +218,109 @@
reset();
}
}
+
+ protected interface IkeSocketFactory {
+ IkeSocket getIkeSocket(Network network, IkeSessionStateMachine ikeSession)
+ throws ErrnoException, IOException;
+ }
+
+ protected void verifyGetAndCloseIkeSocketSameNetwork(IkeSocketFactory ikeUdpSocketFactory)
+ throws Exception {
+ IkeSessionStateMachine mockIkeSessionOne = mock(IkeSessionStateMachine.class);
+ IkeSessionStateMachine mockIkeSessionTwo = mock(IkeSessionStateMachine.class);
+
+ IkeSocket ikeSocketOne = ikeUdpSocketFactory.getIkeSocket(mMockNetwork, mockIkeSessionOne);
+ assertEquals(1, ikeSocketOne.mAliveIkeSessions.size());
+
+ IkeSocket ikeSocketTwo = ikeUdpSocketFactory.getIkeSocket(mMockNetwork, mockIkeSessionTwo);
+ assertEquals(2, ikeSocketTwo.mAliveIkeSessions.size());
+ assertEquals(ikeSocketOne, ikeSocketTwo);
+
+ verify(mMockNetwork).bindSocket(eq(ikeSocketOne.getFd()));
+
+ ikeSocketOne.releaseReference(mockIkeSessionOne);
+ assertEquals(1, ikeSocketOne.mAliveIkeSessions.size());
+ assertTrue(isFdOpen(ikeSocketOne.getFd()));
+
+ ikeSocketTwo.releaseReference(mockIkeSessionTwo);
+ assertEquals(0, ikeSocketTwo.mAliveIkeSessions.size());
+ verifyCloseFd(ikeSocketTwo.getFd());
+ }
+
+ protected void verifyGetAndCloseIkeSocketDifferentNetwork(IkeSocketFactory ikeUdpSocketFactory)
+ throws Exception {
+ IkeSessionStateMachine mockIkeSessionOne = mock(IkeSessionStateMachine.class);
+ IkeSessionStateMachine mockIkeSessionTwo = mock(IkeSessionStateMachine.class);
+
+ Network mockNetworkOne = mock(Network.class);
+ Network mockNetworkTwo = mock(Network.class);
+
+ IkeSocket ikeSocketOne =
+ ikeUdpSocketFactory.getIkeSocket(mockNetworkOne, mockIkeSessionOne);
+ assertEquals(1, ikeSocketOne.mAliveIkeSessions.size());
+
+ IkeSocket ikeSocketTwo =
+ ikeUdpSocketFactory.getIkeSocket(mockNetworkTwo, mockIkeSessionTwo);
+ assertEquals(1, ikeSocketTwo.mAliveIkeSessions.size());
+
+ assertNotEquals(ikeSocketOne, ikeSocketTwo);
+
+ ArgumentCaptor<FileDescriptor> fdCaptorOne = ArgumentCaptor.forClass(FileDescriptor.class);
+ ArgumentCaptor<FileDescriptor> fdCaptorTwo = ArgumentCaptor.forClass(FileDescriptor.class);
+ verify(mockNetworkOne).bindSocket(fdCaptorOne.capture());
+ verify(mockNetworkTwo).bindSocket(fdCaptorTwo.capture());
+
+ FileDescriptor fdOne = fdCaptorOne.getValue();
+ FileDescriptor fdTwo = fdCaptorTwo.getValue();
+ assertNotNull(fdOne);
+ assertNotNull(fdTwo);
+ assertNotEquals(fdOne, fdTwo);
+
+ ikeSocketOne.releaseReference(mockIkeSessionOne);
+ assertEquals(0, ikeSocketOne.mAliveIkeSessions.size());
+ verifyCloseFd(ikeSocketOne.getFd());
+
+ ikeSocketTwo.releaseReference(mockIkeSessionTwo);
+ assertEquals(0, ikeSocketTwo.mAliveIkeSessions.size());
+ verifyCloseFd(ikeSocketTwo.getFd());
+ }
+
+ protected void verifyHandlePacket(
+ byte[] receivedPacket, IkeSocket.IPacketReceiver packetReceiver) throws Exception {
+ packetReceiver.handlePacket(receivedPacket, mSpiToIkeStateMachineMap);
+
+ byte[] expectedIkePacketBytes = TestUtils.hexStringToByteArray(IKE_REQ_MESSAGE_HEX_STRING);
+ ArgumentCaptor<IkeHeader> ikeHeaderCaptor = ArgumentCaptor.forClass(IkeHeader.class);
+ verify(mMockIkeSessionStateMachine)
+ .receiveIkePacket(ikeHeaderCaptor.capture(), eq(expectedIkePacketBytes));
+
+ IkeHeader capturedIkeHeader = ikeHeaderCaptor.getValue();
+ assertEquals(REMOTE_SPI, capturedIkeHeader.ikeInitiatorSpi);
+ assertEquals(LOCAL_SPI, capturedIkeHeader.ikeResponderSpi);
+ }
+
+ protected void verifyIkeUdpSocketReceivePacket(
+ IkeSocketFactory ikeUdpSocketFactory, IkeSocket.IPacketReceiver packetReceiver)
+ throws Exception {
+ IkeSessionStateMachine mockIkeSession = mock(IkeSessionStateMachine.class);
+ IkeUdpSocket ikeSocket =
+ (IkeUdpSocket) ikeUdpSocketFactory.getIkeSocket(mMockNetwork, mockIkeSession);
+ assertNotNull(ikeSocket);
+
+ // Set up state
+ ikeSocket.registerIke(LOCAL_SPI, mockIkeSession);
+ IkeSocket.IPacketReceiver mockPacketReceiver = mock(IkeSocket.IPacketReceiver.class);
+ IkeUdpSocket.setPacketReceiver(mockPacketReceiver);
+ try {
+ // Send a packet
+ byte[] pktBytes = HexDump.hexStringToByteArray(IKE_REQ_MESSAGE_HEX_STRING);
+ ikeSocket.handlePacket(pktBytes, pktBytes.length);
+
+ verify(mockPacketReceiver).handlePacket(eq(pktBytes), any());
+
+ } finally {
+ ikeSocket.releaseReference(mockIkeSession);
+ IkeUdpSocket.setPacketReceiver(getPacketReceiver());
+ }
+ }
}
diff --git a/tests/iketests/src/java/com/android/internal/net/ipsec/ike/IkeUdp4SocketTest.java b/tests/iketests/src/java/com/android/internal/net/ipsec/ike/IkeUdp4SocketTest.java
index ee05885..6903aad 100644
--- a/tests/iketests/src/java/com/android/internal/net/ipsec/ike/IkeUdp4SocketTest.java
+++ b/tests/iketests/src/java/com/android/internal/net/ipsec/ike/IkeUdp4SocketTest.java
@@ -16,137 +16,54 @@
package com.android.internal.net.ipsec.ike;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
import android.net.Network;
import android.os.Handler;
import android.os.test.TestLooper;
+import android.system.ErrnoException;
import com.android.internal.net.TestUtils;
-import com.android.internal.net.ipsec.ike.message.IkeHeader;
-import com.android.internal.util.HexDump;
import org.junit.Test;
-import org.mockito.ArgumentCaptor;
-import java.io.FileDescriptor;
+import java.io.IOException;
-// TODO: Combine this and IkeUdp6SocketTest, and take a Factory method as an input.
public final class IkeUdp4SocketTest extends IkeSocketTestBase {
private final TestLooper mLooper = new TestLooper();
private final Handler mHandler = new Handler(mLooper.getLooper());
+ private final IkeSocketFactory mIkeSocketFactory =
+ new IkeSocketFactory() {
+ @Override
+ public IkeSocket getIkeSocket(Network network, IkeSessionStateMachine ikeSession)
+ throws ErrnoException, IOException {
+ return IkeUdp4Socket.getInstance(network, ikeSession, mHandler);
+ }
+ };
+
@Override
protected IkeSocket.IPacketReceiver getPacketReceiver() {
return new IkeUdpSocket.PacketReceiver();
}
@Test
- public void testGetAndCloseIkeUdp4SocketSameNetwork() throws Exception {
- IkeSessionStateMachine mockIkeSessionOne = mock(IkeSessionStateMachine.class);
- IkeSessionStateMachine mockIkeSessionTwo = mock(IkeSessionStateMachine.class);
-
- IkeUdp4Socket ikeSocketOne =
- IkeUdp4Socket.getInstance(mMockNetwork, mockIkeSessionOne, mHandler);
- assertEquals(1, ikeSocketOne.mAliveIkeSessions.size());
-
- IkeUdp4Socket ikeSocketTwo =
- IkeUdp4Socket.getInstance(mMockNetwork, mockIkeSessionTwo, mHandler);
- assertEquals(2, ikeSocketTwo.mAliveIkeSessions.size());
- assertEquals(ikeSocketOne, ikeSocketTwo);
-
- verify(mMockNetwork).bindSocket(eq(ikeSocketOne.getFd()));
-
- ikeSocketOne.releaseReference(mockIkeSessionOne);
- assertEquals(1, ikeSocketOne.mAliveIkeSessions.size());
- assertTrue(isFdOpen(ikeSocketOne.getFd()));
-
- ikeSocketTwo.releaseReference(mockIkeSessionTwo);
- assertEquals(0, ikeSocketTwo.mAliveIkeSessions.size());
- verifyCloseFd(ikeSocketTwo.getFd());
+ public void testGetAndCloseIkeUdp6SocketSameNetwork() throws Exception {
+ verifyGetAndCloseIkeSocketSameNetwork(mIkeSocketFactory);
}
@Test
- public void testGetAndCloseIkeUdp4SocketDifferentNetwork() throws Exception {
- IkeSessionStateMachine mockIkeSessionOne = mock(IkeSessionStateMachine.class);
- IkeSessionStateMachine mockIkeSessionTwo = mock(IkeSessionStateMachine.class);
-
- Network mockNetworkOne = mock(Network.class);
- Network mockNetworkTwo = mock(Network.class);
-
- IkeUdp4Socket ikeSocketOne =
- IkeUdp4Socket.getInstance(mockNetworkOne, mockIkeSessionOne, mHandler);
- assertEquals(1, ikeSocketOne.mAliveIkeSessions.size());
-
- IkeUdp4Socket ikeSocketTwo =
- IkeUdp4Socket.getInstance(mockNetworkTwo, mockIkeSessionTwo, mHandler);
- assertEquals(1, ikeSocketTwo.mAliveIkeSessions.size());
-
- assertNotEquals(ikeSocketOne, ikeSocketTwo);
-
- ArgumentCaptor<FileDescriptor> fdCaptorOne = ArgumentCaptor.forClass(FileDescriptor.class);
- ArgumentCaptor<FileDescriptor> fdCaptorTwo = ArgumentCaptor.forClass(FileDescriptor.class);
- verify(mockNetworkOne).bindSocket(fdCaptorOne.capture());
- verify(mockNetworkTwo).bindSocket(fdCaptorTwo.capture());
-
- FileDescriptor fdOne = fdCaptorOne.getValue();
- FileDescriptor fdTwo = fdCaptorTwo.getValue();
- assertNotNull(fdOne);
- assertNotNull(fdTwo);
- assertNotEquals(fdOne, fdTwo);
-
- ikeSocketOne.releaseReference(mockIkeSessionOne);
- assertEquals(0, ikeSocketOne.mAliveIkeSessions.size());
- verifyCloseFd(ikeSocketOne.getFd());
-
- ikeSocketTwo.releaseReference(mockIkeSessionTwo);
- assertEquals(0, ikeSocketTwo.mAliveIkeSessions.size());
- verifyCloseFd(ikeSocketTwo.getFd());
+ public void testGetAndCloseIkeUdp6SocketDifferentNetwork() throws Exception {
+ verifyGetAndCloseIkeSocketDifferentNetwork(mIkeSocketFactory);
}
@Test
public void testReceiveIkePacket() throws Exception {
- IkeSessionStateMachine mockIkeSession = mock(IkeSessionStateMachine.class);
- IkeUdp4Socket ikeSocket = IkeUdp4Socket.getInstance(mMockNetwork, mockIkeSession, mHandler);
- assertNotNull(ikeSocket);
-
- // Set up state
- ikeSocket.registerIke(LOCAL_SPI, mockIkeSession);
- IkeSocket.IPacketReceiver packetReceiver = mock(IkeSocket.IPacketReceiver.class);
- IkeUdpSocket.setPacketReceiver(packetReceiver);
- try {
- // Send a packet
- byte[] pktBytes = HexDump.hexStringToByteArray(IKE_REQ_MESSAGE_HEX_STRING);
- ikeSocket.handlePacket(pktBytes, pktBytes.length);
-
- verify(packetReceiver).handlePacket(eq(pktBytes), any());
-
- } finally {
- ikeSocket.releaseReference(mockIkeSession);
- IkeUdpSocket.setPacketReceiver(getPacketReceiver());
- }
+ verifyIkeUdpSocketReceivePacket(mIkeSocketFactory, getPacketReceiver());
}
@Test
public void testHandlePacket() throws Exception {
- byte[] recvBuf = TestUtils.hexStringToByteArray(IKE_REQ_MESSAGE_HEX_STRING);
-
- getPacketReceiver().handlePacket(recvBuf, mSpiToIkeStateMachineMap);
-
- byte[] expectedIkePacketBytes = TestUtils.hexStringToByteArray(IKE_REQ_MESSAGE_HEX_STRING);
- ArgumentCaptor<IkeHeader> ikeHeaderCaptor = ArgumentCaptor.forClass(IkeHeader.class);
- verify(mMockIkeSessionStateMachine)
- .receiveIkePacket(ikeHeaderCaptor.capture(), eq(expectedIkePacketBytes));
-
- IkeHeader capturedIkeHeader = ikeHeaderCaptor.getValue();
- assertEquals(REMOTE_SPI, capturedIkeHeader.ikeInitiatorSpi);
- assertEquals(LOCAL_SPI, capturedIkeHeader.ikeResponderSpi);
+ verifyHandlePacket(
+ TestUtils.hexStringToByteArray(IKE_REQ_MESSAGE_HEX_STRING), getPacketReceiver());
}
}
diff --git a/tests/iketests/src/java/com/android/internal/net/ipsec/ike/IkeUdp6SocketTest.java b/tests/iketests/src/java/com/android/internal/net/ipsec/ike/IkeUdp6SocketTest.java
index 7c6e30d..b92718f 100644
--- a/tests/iketests/src/java/com/android/internal/net/ipsec/ike/IkeUdp6SocketTest.java
+++ b/tests/iketests/src/java/com/android/internal/net/ipsec/ike/IkeUdp6SocketTest.java
@@ -16,33 +16,31 @@
package com.android.internal.net.ipsec.ike;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
import android.net.Network;
import android.os.Handler;
import android.os.test.TestLooper;
+import android.system.ErrnoException;
import com.android.internal.net.TestUtils;
-import com.android.internal.net.ipsec.ike.message.IkeHeader;
-import com.android.internal.util.HexDump;
import org.junit.Test;
-import org.mockito.ArgumentCaptor;
-import java.io.FileDescriptor;
+import java.io.IOException;
-// TODO: Combine this and IkeUdp4SocketTest, and take a Factory method as an input.
public final class IkeUdp6SocketTest extends IkeSocketTestBase {
private final TestLooper mLooper = new TestLooper();
private final Handler mHandler = new Handler(mLooper.getLooper());
+ private final IkeSocketFactory mIkeSocketFactory =
+ new IkeSocketFactory() {
+ @Override
+ public IkeSocket getIkeSocket(Network network, IkeSessionStateMachine ikeSession)
+ throws ErrnoException, IOException {
+ return IkeUdp6Socket.getInstance(network, ikeSession, mHandler);
+ }
+ };
+
@Override
protected IkeSocket.IPacketReceiver getPacketReceiver() {
return new IkeUdpSocket.PacketReceiver();
@@ -50,103 +48,22 @@
@Test
public void testGetAndCloseIkeUdp6SocketSameNetwork() throws Exception {
- IkeSessionStateMachine mockIkeSessionOne = mock(IkeSessionStateMachine.class);
- IkeSessionStateMachine mockIkeSessionTwo = mock(IkeSessionStateMachine.class);
-
- IkeUdp6Socket ikeSocketOne =
- IkeUdp6Socket.getInstance(mMockNetwork, mockIkeSessionOne, mHandler);
- assertEquals(1, ikeSocketOne.mAliveIkeSessions.size());
-
- IkeUdp6Socket ikeSocketTwo =
- IkeUdp6Socket.getInstance(mMockNetwork, mockIkeSessionTwo, mHandler);
- assertEquals(2, ikeSocketTwo.mAliveIkeSessions.size());
- assertEquals(ikeSocketOne, ikeSocketTwo);
-
- verify(mMockNetwork).bindSocket(eq(ikeSocketOne.getFd()));
-
- ikeSocketOne.releaseReference(mockIkeSessionOne);
- assertEquals(1, ikeSocketOne.mAliveIkeSessions.size());
- assertTrue(isFdOpen(ikeSocketOne.getFd()));
-
- ikeSocketTwo.releaseReference(mockIkeSessionTwo);
- assertEquals(0, ikeSocketTwo.mAliveIkeSessions.size());
- verifyCloseFd(ikeSocketTwo.getFd());
+ verifyGetAndCloseIkeSocketSameNetwork(mIkeSocketFactory);
}
@Test
public void testGetAndCloseIkeUdp6SocketDifferentNetwork() throws Exception {
- IkeSessionStateMachine mockIkeSessionOne = mock(IkeSessionStateMachine.class);
- IkeSessionStateMachine mockIkeSessionTwo = mock(IkeSessionStateMachine.class);
-
- Network mockNetworkOne = mock(Network.class);
- Network mockNetworkTwo = mock(Network.class);
-
- IkeUdp6Socket ikeSocketOne =
- IkeUdp6Socket.getInstance(mockNetworkOne, mockIkeSessionOne, mHandler);
- assertEquals(1, ikeSocketOne.mAliveIkeSessions.size());
-
- IkeUdp6Socket ikeSocketTwo =
- IkeUdp6Socket.getInstance(mockNetworkTwo, mockIkeSessionTwo, mHandler);
- assertEquals(1, ikeSocketTwo.mAliveIkeSessions.size());
-
- assertNotEquals(ikeSocketOne, ikeSocketTwo);
-
- ArgumentCaptor<FileDescriptor> fdCaptorOne = ArgumentCaptor.forClass(FileDescriptor.class);
- ArgumentCaptor<FileDescriptor> fdCaptorTwo = ArgumentCaptor.forClass(FileDescriptor.class);
- verify(mockNetworkOne).bindSocket(fdCaptorOne.capture());
- verify(mockNetworkTwo).bindSocket(fdCaptorTwo.capture());
-
- FileDescriptor fdOne = fdCaptorOne.getValue();
- FileDescriptor fdTwo = fdCaptorTwo.getValue();
- assertNotNull(fdOne);
- assertNotNull(fdTwo);
- assertNotEquals(fdOne, fdTwo);
-
- ikeSocketOne.releaseReference(mockIkeSessionOne);
- assertEquals(0, ikeSocketOne.mAliveIkeSessions.size());
- verifyCloseFd(ikeSocketOne.getFd());
-
- ikeSocketTwo.releaseReference(mockIkeSessionTwo);
- assertEquals(0, ikeSocketTwo.mAliveIkeSessions.size());
- verifyCloseFd(ikeSocketTwo.getFd());
+ verifyGetAndCloseIkeSocketDifferentNetwork(mIkeSocketFactory);
}
@Test
public void testReceiveIkePacket() throws Exception {
- IkeSessionStateMachine mockIkeSession = mock(IkeSessionStateMachine.class);
- IkeUdp6Socket ikeSocket = IkeUdp6Socket.getInstance(mMockNetwork, mockIkeSession, mHandler);
- assertNotNull(ikeSocket);
-
- // Set up state
- ikeSocket.registerIke(LOCAL_SPI, mockIkeSession);
- IkeSocket.IPacketReceiver packetReceiver = mock(IkeSocket.IPacketReceiver.class);
- IkeUdpSocket.setPacketReceiver(packetReceiver);
- try {
- // Send a packet
- byte[] pktBytes = HexDump.hexStringToByteArray(IKE_REQ_MESSAGE_HEX_STRING);
- ikeSocket.handlePacket(pktBytes, pktBytes.length);
-
- verify(packetReceiver).handlePacket(eq(pktBytes), any());
-
- } finally {
- ikeSocket.releaseReference(mockIkeSession);
- IkeUdpSocket.setPacketReceiver(getPacketReceiver());
- }
+ verifyIkeUdpSocketReceivePacket(mIkeSocketFactory, getPacketReceiver());
}
@Test
public void testHandlePacket() throws Exception {
- byte[] recvBuf = TestUtils.hexStringToByteArray(IKE_REQ_MESSAGE_HEX_STRING);
-
- getPacketReceiver().handlePacket(recvBuf, mSpiToIkeStateMachineMap);
-
- byte[] expectedIkePacketBytes = TestUtils.hexStringToByteArray(IKE_REQ_MESSAGE_HEX_STRING);
- ArgumentCaptor<IkeHeader> ikeHeaderCaptor = ArgumentCaptor.forClass(IkeHeader.class);
- verify(mMockIkeSessionStateMachine)
- .receiveIkePacket(ikeHeaderCaptor.capture(), eq(expectedIkePacketBytes));
-
- IkeHeader capturedIkeHeader = ikeHeaderCaptor.getValue();
- assertEquals(REMOTE_SPI, capturedIkeHeader.ikeInitiatorSpi);
- assertEquals(LOCAL_SPI, capturedIkeHeader.ikeResponderSpi);
+ verifyHandlePacket(
+ TestUtils.hexStringToByteArray(IKE_REQ_MESSAGE_HEX_STRING), getPacketReceiver());
}
}
diff --git a/tests/iketests/src/java/com/android/internal/net/ipsec/ike/IkeUdpEncapSocketTest.java b/tests/iketests/src/java/com/android/internal/net/ipsec/ike/IkeUdpEncapSocketTest.java
index c75c3c6..8d0a0dc 100644
--- a/tests/iketests/src/java/com/android/internal/net/ipsec/ike/IkeUdpEncapSocketTest.java
+++ b/tests/iketests/src/java/com/android/internal/net/ipsec/ike/IkeUdpEncapSocketTest.java
@@ -17,15 +17,11 @@
package com.android.internal.net.ipsec.ike;
import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.anyObject;
import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
@@ -39,13 +35,13 @@
import android.net.Network;
import android.os.HandlerThread;
import android.os.Looper;
+import android.os.test.TestLooper;
import android.system.ErrnoException;
import android.util.Log;
import androidx.test.InstrumentationRegistry;
import com.android.internal.net.TestUtils;
-import com.android.internal.net.ipsec.ike.message.IkeHeader;
import com.android.internal.net.ipsec.ike.testutils.MockIpSecTestUtils;
import com.android.server.IpSecService;
@@ -53,7 +49,6 @@
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
-import org.mockito.ArgumentCaptor;
import java.io.FileDescriptor;
import java.io.IOException;
@@ -61,12 +56,28 @@
import java.nio.ByteBuffer;
public final class IkeUdpEncapSocketTest extends IkeSocketTestBase {
+ private final TestLooper mLooper = new TestLooper();
+
private UdpEncapsulationSocket mSpyUdpEncapSocket;
private UdpEncapsulationSocket mSpyDummyUdpEncapSocketOne;
private UdpEncapsulationSocket mSpyDummyUdpEncapSocketTwo;
private IpSecManager mSpyIpSecManager;
+ private final IkeSocketFactory mIkeSocketFactory =
+ new IkeSocketFactory() {
+ @Override
+ public IkeSocket getIkeSocket(Network network, IkeSessionStateMachine ikeSession)
+ throws ErrnoException, IOException {
+ try {
+ return IkeUdpEncapSocket.getIkeUdpEncapSocket(
+ network, mSpyIpSecManager, ikeSession, mLooper.getLooper());
+ } catch (ResourceUnavailableException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+ };
+
@Override
@Before
public void setUp() throws Exception {
@@ -110,85 +121,24 @@
@Test
public void testGetAndCloseIkeUdpEncapSocketSameNetwork() throws Exception {
- // Must be prepared here; AndroidJUnitRunner runs tests on different threads from the
- // setUp() call. Since the new Handler() call is run in getIkeUdpEncapSocket, the Looper
- // must be prepared here.
- if (Looper.myLooper() == null) Looper.prepare();
-
- IkeSessionStateMachine mockIkeSessionOne = mock(IkeSessionStateMachine.class);
- IkeSessionStateMachine mockIkeSessionTwo = mock(IkeSessionStateMachine.class);
-
- IkeUdpEncapSocket ikeSocketOne =
- IkeUdpEncapSocket.getIkeUdpEncapSocket(
- mMockNetwork, mSpyIpSecManager, mockIkeSessionOne, Looper.myLooper());
- assertEquals(1, ikeSocketOne.mAliveIkeSessions.size());
-
- IkeUdpEncapSocket ikeSocketTwo =
- IkeUdpEncapSocket.getIkeUdpEncapSocket(
- mMockNetwork, mSpyIpSecManager, mockIkeSessionTwo, Looper.myLooper());
- assertEquals(2, ikeSocketTwo.mAliveIkeSessions.size());
- assertEquals(ikeSocketOne, ikeSocketTwo);
-
+ verifyGetAndCloseIkeSocketSameNetwork(mIkeSocketFactory);
verify(mSpyIpSecManager).openUdpEncapsulationSocket();
- verify(mMockNetwork).bindSocket(any(FileDescriptor.class));
-
- ikeSocketOne.releaseReference(mockIkeSessionOne);
- assertEquals(1, ikeSocketOne.mAliveIkeSessions.size());
- verify(mSpyDummyUdpEncapSocketOne, never()).close();
-
- ikeSocketTwo.releaseReference(mockIkeSessionTwo);
- assertEquals(0, ikeSocketTwo.mAliveIkeSessions.size());
verify(mSpyDummyUdpEncapSocketOne).close();
}
@Test
public void testGetAndCloseIkeUdpEncapSocketDifferentNetwork() throws Exception {
- // Must be prepared here; AndroidJUnitRunner runs tests on different threads from the
- // setUp() call. Since the new Handler() call is run in getIkeUdpEncapSocket, the Looper
- // must be prepared here.
- if (Looper.myLooper() == null) Looper.prepare();
-
- IkeSessionStateMachine mockIkeSessionOne = mock(IkeSessionStateMachine.class);
- IkeSessionStateMachine mockIkeSessionTwo = mock(IkeSessionStateMachine.class);
-
- Network mockNetworkOne = mock(Network.class);
- Network mockNetworkTwo = mock(Network.class);
-
- IkeUdpEncapSocket ikeSocketOne =
- IkeUdpEncapSocket.getIkeUdpEncapSocket(
- mockNetworkOne, mSpyIpSecManager, mockIkeSessionOne, Looper.myLooper());
- assertEquals(1, ikeSocketOne.mAliveIkeSessions.size());
-
- IkeUdpEncapSocket ikeSocketTwo =
- IkeUdpEncapSocket.getIkeUdpEncapSocket(
- mockNetworkTwo, mSpyIpSecManager, mockIkeSessionTwo, Looper.myLooper());
- assertEquals(1, ikeSocketTwo.mAliveIkeSessions.size());
-
- assertNotEquals(ikeSocketOne, ikeSocketTwo);
+ verifyGetAndCloseIkeSocketDifferentNetwork(mIkeSocketFactory);
verify(mSpyIpSecManager, times(2)).openUdpEncapsulationSocket();
-
- ArgumentCaptor<FileDescriptor> fdCaptorOne = ArgumentCaptor.forClass(FileDescriptor.class);
- ArgumentCaptor<FileDescriptor> fdCaptorTwo = ArgumentCaptor.forClass(FileDescriptor.class);
- verify(mockNetworkOne).bindSocket(fdCaptorOne.capture());
- verify(mockNetworkTwo).bindSocket(fdCaptorTwo.capture());
-
- FileDescriptor fdOne = fdCaptorOne.getValue();
- FileDescriptor fdTwo = fdCaptorTwo.getValue();
- assertNotNull(fdOne);
- assertNotNull(fdTwo);
- assertNotEquals(fdOne, fdTwo);
-
- ikeSocketOne.releaseReference(mockIkeSessionOne);
- assertEquals(0, ikeSocketOne.mAliveIkeSessions.size());
verify(mSpyDummyUdpEncapSocketOne).close();
-
- ikeSocketTwo.releaseReference(mockIkeSessionTwo);
- assertEquals(0, ikeSocketTwo.mAliveIkeSessions.size());
verify(mSpyDummyUdpEncapSocketTwo).close();
}
@Ignore
public void disableTestSendIkePacket() throws Exception {
+ // Must be prepared here; AndroidJUnitRunner runs tests on different threads
+ // from the setUp() call. Since the new Handler() call is run in
+ // getIkeUdpEncapSocket, the Looper must be prepared here.
if (Looper.myLooper() == null) Looper.prepare();
// Send IKE packet
@@ -293,16 +243,7 @@
TestUtils.hexStringToByteArray(
NON_ESP_MARKER_HEX_STRING + IKE_REQ_MESSAGE_HEX_STRING);
- getPacketReceiver().handlePacket(recvBuf, mSpiToIkeStateMachineMap);
-
- byte[] expectedIkePacketBytes = TestUtils.hexStringToByteArray(IKE_REQ_MESSAGE_HEX_STRING);
- ArgumentCaptor<IkeHeader> ikeHeaderCaptor = ArgumentCaptor.forClass(IkeHeader.class);
- verify(mMockIkeSessionStateMachine)
- .receiveIkePacket(ikeHeaderCaptor.capture(), eq(expectedIkePacketBytes));
-
- IkeHeader capturedIkeHeader = ikeHeaderCaptor.getValue();
- assertEquals(REMOTE_SPI, capturedIkeHeader.ikeInitiatorSpi);
- assertEquals(LOCAL_SPI, capturedIkeHeader.ikeResponderSpi);
+ verifyHandlePacket(recvBuf, getPacketReceiver());
}
@Test