Merge "ClatCoordinatorTest: add test for startClat error handling"

This commit is contained in:
Treehugger Robot
2022-06-03 15:17:10 +00:00
committed by Gerrit Code Review

View File

@@ -30,6 +30,7 @@ import static com.android.server.connectivity.ClatCoordinator.PRIO_CLAT;
import static com.android.testutils.MiscAsserts.assertThrows; import static com.android.testutils.MiscAsserts.assertThrows;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull; import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail; import static org.junit.Assert.fail;
import static org.mockito.Mockito.argThat; import static org.mockito.Mockito.argThat;
@@ -37,6 +38,7 @@ import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.eq; import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.net.INetd; import android.net.INetd;
@@ -105,12 +107,12 @@ public class ClatCoordinatorTest {
private static final int RAW_SOCK_FD = 535; private static final int RAW_SOCK_FD = 535;
private static final int PACKET_SOCK_FD = 536; private static final int PACKET_SOCK_FD = 536;
private static final long RAW_SOCK_COOKIE = 27149; private static final long RAW_SOCK_COOKIE = 27149;
private static final ParcelFileDescriptor TUN_PFD = new ParcelFileDescriptor( private static final ParcelFileDescriptor TUN_PFD = spy(new ParcelFileDescriptor(
new FileDescriptor()); new FileDescriptor()));
private static final ParcelFileDescriptor RAW_SOCK_PFD = new ParcelFileDescriptor( private static final ParcelFileDescriptor RAW_SOCK_PFD = spy(new ParcelFileDescriptor(
new FileDescriptor()); new FileDescriptor()));
private static final ParcelFileDescriptor PACKET_SOCK_PFD = new ParcelFileDescriptor( private static final ParcelFileDescriptor PACKET_SOCK_PFD = spy(new ParcelFileDescriptor(
new FileDescriptor()); new FileDescriptor()));
private static final String EGRESS_PROG_PATH = private static final String EGRESS_PROG_PATH =
"/sys/fs/bpf/net_shared/prog_clatd_schedcls_egress4_clat_rawip"; "/sys/fs/bpf/net_shared/prog_clatd_schedcls_egress4_clat_rawip";
@@ -533,4 +535,169 @@ public class ClatCoordinatorTest {
assertEquals("1001 /192.0.0.46 -> /2001:db8:0:b11::464 /64:ff9b::/96 1000 ether", assertEquals("1001 /192.0.0.46 -> /2001:db8:0:b11::464 /64:ff9b::/96 1000 ether",
dumpStrings[4].trim()); dumpStrings[4].trim());
} }
@Test
public void testNotStartClatWithInvalidPrefix() throws Exception {
final ClatCoordinator coordinator = makeClatCoordinator();
final IpPrefix invalidPrefix = new IpPrefix("2001:db8::/64");
assertThrows(IOException.class,
() -> coordinator.clatStart(BASE_IFACE, NETID, invalidPrefix));
}
private void assertStartClat(final TestDependencies deps) throws Exception {
final ClatCoordinator coordinator = new ClatCoordinator(deps);
assertNotNull(coordinator.clatStart(BASE_IFACE, NETID, NAT64_IP_PREFIX));
}
private void assertNotStartClat(final TestDependencies deps) {
// Expect that the injection function of TestDependencies causes clatStart() failed.
final ClatCoordinator coordinator = new ClatCoordinator(deps);
assertThrows(IOException.class,
() -> coordinator.clatStart(BASE_IFACE, NETID, NAT64_IP_PREFIX));
}
private void checkNotStartClat(final TestDependencies deps, final boolean verifyTunFd,
final boolean verifyPacketSockFd, final boolean verifyRawSockFd) throws Exception {
// [1] Expect that modified TestDependencies can't start clatd.
clearInvocations(TUN_PFD, RAW_SOCK_PFD, PACKET_SOCK_PFD);
assertNotStartClat(deps);
if (verifyTunFd) verify(TUN_PFD).close();
if (verifyPacketSockFd) verify(PACKET_SOCK_PFD).close();
if (verifyRawSockFd) verify(RAW_SOCK_PFD).close();
// [2] Expect that unmodified TestDependencies can start clatd.
// Used to make sure that the above modified TestDependencies has really broken the
// clatd starting.
assertStartClat(new TestDependencies());
}
// The following testNotStartClat* tests verifies bunches of code for unwinding the
// failure if any.
@Test
public void testNotStartClatWithNativeFailureSelectIpv4Address() throws Exception {
class FailureDependencies extends TestDependencies {
@Override
public String selectIpv4Address(@NonNull String v4addr, int prefixlen)
throws IOException {
throw new IOException();
}
}
checkNotStartClat(new FailureDependencies(), false /* verifyTunFd */,
false /* verifyPacketSockFd */, false /* verifyRawSockFd */);
}
@Test
public void testNotStartClatWithNativeFailureGenerateIpv6Address() throws Exception {
class FailureDependencies extends TestDependencies {
@Override
public String generateIpv6Address(@NonNull String iface, @NonNull String v4,
@NonNull String prefix64) throws IOException {
throw new IOException();
}
}
checkNotStartClat(new FailureDependencies(), false /* verifyTunFd */,
false /* verifyPacketSockFd */, false /* verifyRawSockFd */);
}
@Test
public void testNotStartClatWithNativeFailureCreateTunInterface() throws Exception {
class FailureDependencies extends TestDependencies {
@Override
public int createTunInterface(@NonNull String tuniface) throws IOException {
throw new IOException();
}
}
checkNotStartClat(new FailureDependencies(), false /* verifyTunFd */,
false /* verifyPacketSockFd */, false /* verifyRawSockFd */);
}
@Test
public void testNotStartClatWithNativeFailureDetectMtu() throws Exception {
class FailureDependencies extends TestDependencies {
@Override
public int detectMtu(@NonNull String platSubnet, int platSuffix, int mark)
throws IOException {
throw new IOException();
}
}
checkNotStartClat(new FailureDependencies(), true /* verifyTunFd */,
false /* verifyPacketSockFd */, false /* verifyRawSockFd */);
}
@Test
public void testNotStartClatWithNativeFailureOpenPacketSocket() throws Exception {
class FailureDependencies extends TestDependencies {
@Override
public int openPacketSocket() throws IOException {
throw new IOException();
}
}
checkNotStartClat(new FailureDependencies(), true /* verifyTunFd */,
false /* verifyPacketSockFd */, false /* verifyRawSockFd */);
}
@Test
public void testNotStartClatWithNativeFailureOpenRawSocket6() throws Exception {
class FailureDependencies extends TestDependencies {
@Override
public int openRawSocket6(int mark) throws IOException {
throw new IOException();
}
}
checkNotStartClat(new FailureDependencies(), true /* verifyTunFd */,
true /* verifyPacketSockFd */, false /* verifyRawSockFd */);
}
@Test
public void testNotStartClatWithNativeFailureAddAnycastSetsockopt() throws Exception {
class FailureDependencies extends TestDependencies {
@Override
public void addAnycastSetsockopt(@NonNull FileDescriptor sock, String v6,
int ifindex) throws IOException {
throw new IOException();
}
}
checkNotStartClat(new FailureDependencies(), true /* verifyTunFd */,
true /* verifyPacketSockFd */, true /* verifyRawSockFd */);
}
@Test
public void testNotStartClatWithNativeFailureTagSocketAsClat() throws Exception {
class FailureDependencies extends TestDependencies {
@Override
public long tagSocketAsClat(@NonNull FileDescriptor sock) throws IOException {
throw new IOException();
}
}
checkNotStartClat(new FailureDependencies(), true /* verifyTunFd */,
true /* verifyPacketSockFd */, true /* verifyRawSockFd */);
}
@Test
public void testNotStartClatWithNativeFailureConfigurePacketSocket() throws Exception {
class FailureDependencies extends TestDependencies {
@Override
public void configurePacketSocket(@NonNull FileDescriptor sock, String v6,
int ifindex) throws IOException {
throw new IOException();
}
}
checkNotStartClat(new FailureDependencies(), true /* verifyTunFd */,
true /* verifyPacketSockFd */, true /* verifyRawSockFd */);
}
@Test
public void testNotStartClatWithNativeFailureStartClatd() throws Exception {
class FailureDependencies extends TestDependencies {
@Override
public int startClatd(@NonNull FileDescriptor tunfd, @NonNull FileDescriptor readsock6,
@NonNull FileDescriptor writesock6, @NonNull String iface,
@NonNull String pfx96, @NonNull String v4, @NonNull String v6)
throws IOException {
throw new IOException();
}
}
checkNotStartClat(new FailureDependencies(), true /* verifyTunFd */,
true /* verifyPacketSockFd */, true /* verifyRawSockFd */);
}
} }