Fix flaky UdpEncapsulationSocket test

This commit reduces the flakiness of the
testOpenAndCloseUdpEncapsulationSocket by retrying up to three times.
Unfortunately, testing port-selected socket creation is racy against
other applications. This helps to handle the same race condition as done
in IpSecService#bindToRandomPort

Bug: 128024100
Test: 200x runs of testOpenAndCloseUdpEncapsulationSocket
Change-Id: I7e036ce821019dbac6c50899bd0894e89d2fe82a
Merged-In: Idf040a67e53d9b9ec6e6c647ce24f8ada501d355
Merged-In: Iad9aea4b42cd8b31a5a2659bb9cb54dd1c64e8b7
(cherry picked from commit 614ab3dd4e49e9b664f5065983fb9067148fef12)
This commit is contained in:
Lorenzo Colitti
2019-04-04 09:18:29 -07:00
parent 29b6be1471
commit cd1fec8907

View File

@@ -156,10 +156,21 @@ public class IpSecServiceTest {
@Test @Test
public void testOpenAndCloseUdpEncapsulationSocket() throws Exception { public void testOpenAndCloseUdpEncapsulationSocket() throws Exception {
int localport = findUnusedPort(); int localport = -1;
IpSecUdpEncapResponse udpEncapResp = null;
for (int i = 0; i < IpSecService.MAX_PORT_BIND_ATTEMPTS; i++) {
localport = findUnusedPort();
udpEncapResp = mIpSecService.openUdpEncapsulationSocket(localport, new Binder());
assertNotNull(udpEncapResp);
if (udpEncapResp.status == IpSecManager.Status.OK) {
break;
}
// Else retry to reduce possibility for port-bind failures.
}
IpSecUdpEncapResponse udpEncapResp =
mIpSecService.openUdpEncapsulationSocket(localport, new Binder());
assertNotNull(udpEncapResp); assertNotNull(udpEncapResp);
assertEquals(IpSecManager.Status.OK, udpEncapResp.status); assertEquals(IpSecManager.Status.OK, udpEncapResp.status);
assertEquals(localport, udpEncapResp.port); assertEquals(localport, udpEncapResp.port);
@@ -204,12 +215,11 @@ public class IpSecServiceTest {
@Test @Test
public void testOpenUdpEncapsulationSocketAfterClose() throws Exception { public void testOpenUdpEncapsulationSocketAfterClose() throws Exception {
int localport = findUnusedPort();
IpSecUdpEncapResponse udpEncapResp = IpSecUdpEncapResponse udpEncapResp =
mIpSecService.openUdpEncapsulationSocket(localport, new Binder()); mIpSecService.openUdpEncapsulationSocket(0, new Binder());
assertNotNull(udpEncapResp); assertNotNull(udpEncapResp);
assertEquals(IpSecManager.Status.OK, udpEncapResp.status); assertEquals(IpSecManager.Status.OK, udpEncapResp.status);
assertEquals(localport, udpEncapResp.port); int localport = udpEncapResp.port;
mIpSecService.closeUdpEncapsulationSocket(udpEncapResp.resourceId); mIpSecService.closeUdpEncapsulationSocket(udpEncapResp.resourceId);
udpEncapResp.fileDescriptor.close(); udpEncapResp.fileDescriptor.close();
@@ -226,12 +236,11 @@ public class IpSecServiceTest {
*/ */
@Test @Test
public void testUdpEncapPortNotReleased() throws Exception { public void testUdpEncapPortNotReleased() throws Exception {
int localport = findUnusedPort();
IpSecUdpEncapResponse udpEncapResp = IpSecUdpEncapResponse udpEncapResp =
mIpSecService.openUdpEncapsulationSocket(localport, new Binder()); mIpSecService.openUdpEncapsulationSocket(0, new Binder());
assertNotNull(udpEncapResp); assertNotNull(udpEncapResp);
assertEquals(IpSecManager.Status.OK, udpEncapResp.status); assertEquals(IpSecManager.Status.OK, udpEncapResp.status);
assertEquals(localport, udpEncapResp.port); int localport = udpEncapResp.port;
udpEncapResp.fileDescriptor.close(); udpEncapResp.fileDescriptor.close();
@@ -273,14 +282,11 @@ public class IpSecServiceTest {
@Test @Test
public void testOpenUdpEncapsulationSocketTwice() throws Exception { public void testOpenUdpEncapsulationSocketTwice() throws Exception {
int localport = findUnusedPort();
IpSecUdpEncapResponse udpEncapResp = IpSecUdpEncapResponse udpEncapResp =
mIpSecService.openUdpEncapsulationSocket(localport, new Binder()); mIpSecService.openUdpEncapsulationSocket(0, new Binder());
assertNotNull(udpEncapResp); assertNotNull(udpEncapResp);
assertEquals(IpSecManager.Status.OK, udpEncapResp.status); assertEquals(IpSecManager.Status.OK, udpEncapResp.status);
assertEquals(localport, udpEncapResp.port); int localport = udpEncapResp.port;
mIpSecService.openUdpEncapsulationSocket(localport, new Binder());
IpSecUdpEncapResponse testUdpEncapResp = IpSecUdpEncapResponse testUdpEncapResp =
mIpSecService.openUdpEncapsulationSocket(localport, new Binder()); mIpSecService.openUdpEncapsulationSocket(localport, new Binder());