Add some tests for packet wakeup logging changes

Cellular networks are now supported for marking wakeup packets. As a
result onWakeupEvent now also reports data relevant to the cell
transport.

These unit tests should add coverage for these new behaviors.

Test: atest FrameworksNetTests

Bug: 276498460
Change-Id: I0b8a03fff6255e067b736f3dbfb53de56420f90b
This commit is contained in:
Suprabh Shukla
2023-04-26 18:47:36 -07:00
parent e99a22d405
commit 53e1639b7d
3 changed files with 142 additions and 20 deletions

View File

@@ -7919,7 +7919,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
return captivePortalBuilder.build();
}
private String makeNflogPrefix(String iface, long networkHandle) {
@VisibleForTesting
static String makeNflogPrefix(String iface, long networkHandle) {
// This needs to be kept in sync and backwards compatible with the decoding logic in
// NetdEventListenerService, which is non-mainline code.
return SdkLevel.isAtLeastU() ? (networkHandle + ":" + iface) : ("iface:" + iface);

View File

@@ -154,6 +154,7 @@ import static com.android.server.ConnectivityService.PREFERENCE_ORDER_OEM;
import static com.android.server.ConnectivityService.PREFERENCE_ORDER_PROFILE;
import static com.android.server.ConnectivityService.PREFERENCE_ORDER_VPN;
import static com.android.server.ConnectivityService.createDeliveryGroupKeyForConnectivityAction;
import static com.android.server.ConnectivityService.makeNflogPrefix;
import static com.android.server.ConnectivityServiceTestUtils.transportToLegacyType;
import static com.android.server.NetworkAgentWrapper.CallbackType.OnQosCallbackRegister;
import static com.android.server.NetworkAgentWrapper.CallbackType.OnQosCallbackUnregister;
@@ -533,6 +534,10 @@ public class ConnectivityServiceTest {
private static final int TEST_PACKAGE_UID = 123;
private static final int TEST_PACKAGE_UID2 = 321;
private static final int TEST_PACKAGE_UID3 = 456;
private static final int PACKET_WAKEUP_MASK = 0xffff0000;
private static final int PACKET_WAKEUP_MARK = 0x88880000;
private static final String ALWAYS_ON_PACKAGE = "com.android.test.alwaysonvpn";
private static final String INTERFACE_NAME = "interface";
@@ -1910,6 +1915,10 @@ public class ConnectivityServiceTest {
doReturn(0).when(mResources).getInteger(R.integer.config_activelyPreferBadWifi);
doReturn(true).when(mResources)
.getBoolean(R.bool.config_cellular_radio_timesharing_capable);
doReturn(PACKET_WAKEUP_MASK).when(mResources).getInteger(
R.integer.config_networkWakeupPacketMask);
doReturn(PACKET_WAKEUP_MARK).when(mResources).getInteger(
R.integer.config_networkWakeupPacketMark);
}
// ConnectivityServiceDependencies is public to use Mockito.spy
@@ -10393,6 +10402,16 @@ public class ConnectivityServiceTest {
return event;
}
private void verifyWakeupModifyInterface(String iface, boolean add) throws RemoteException {
if (add) {
verify(mMockNetd).wakeupAddInterface(eq(iface), anyString(), anyInt(),
anyInt());
} else {
verify(mMockNetd).wakeupDelInterface(eq(iface), anyString(), anyInt(),
anyInt());
}
}
private <T> T verifyWithOrder(@Nullable InOrder inOrder, @NonNull T t) {
if (inOrder != null) {
return inOrder.verify(t);
@@ -10619,6 +10638,11 @@ public class ConnectivityServiceTest {
clat.interfaceRemoved(CLAT_MOBILE_IFNAME);
networkCallback.assertNoCallback();
verify(mMockNetd, times(1)).networkRemoveInterface(cellNetId, CLAT_MOBILE_IFNAME);
if (SdkLevel.isAtLeastU()) {
verifyWakeupModifyInterface(CLAT_MOBILE_IFNAME, false);
}
verifyNoMoreInteractions(mMockNetd);
verifyNoMoreInteractions(mClatCoordinator);
verifyNoMoreInteractions(mMockDnsResolver);
@@ -10655,6 +10679,10 @@ public class ConnectivityServiceTest {
assertRoutesAdded(cellNetId, stackedDefault);
verify(mMockNetd, times(1)).networkAddInterface(cellNetId, CLAT_MOBILE_IFNAME);
if (SdkLevel.isAtLeastU()) {
verifyWakeupModifyInterface(CLAT_MOBILE_IFNAME, true);
}
// NAT64 prefix is removed. Expect that clat is stopped.
mService.mResolverUnsolEventCallback.onNat64PrefixEvent(makeNat64PrefixEvent(
cellNetId, PREFIX_OPERATION_REMOVED, kNat64PrefixString, 96));
@@ -10669,6 +10697,11 @@ public class ConnectivityServiceTest {
cb -> cb.getLp().getStackedLinks().size() == 0);
verify(mMockNetd, times(1)).networkRemoveInterface(cellNetId, CLAT_MOBILE_IFNAME);
verify(mMockNetd, times(1)).interfaceGetCfg(CLAT_MOBILE_IFNAME);
if (SdkLevel.isAtLeastU()) {
verifyWakeupModifyInterface(CLAT_MOBILE_IFNAME, false);
}
// Clean up.
mCellAgent.disconnect();
networkCallback.expect(LOST, mCellAgent);
@@ -10681,6 +10714,11 @@ public class ConnectivityServiceTest {
} else {
verify(mMockNetd, never()).setNetworkAllowlist(any());
}
if (SdkLevel.isAtLeastU()) {
verifyWakeupModifyInterface(MOBILE_IFNAME, false);
}
verifyNoMoreInteractions(mMockNetd);
verifyNoMoreInteractions(mClatCoordinator);
reset(mMockNetd);
@@ -10710,6 +10748,11 @@ public class ConnectivityServiceTest {
verify(mMockNetd).networkAddInterface(cellNetId, CLAT_MOBILE_IFNAME);
// assertRoutesAdded sees all calls since last mMockNetd reset, so expect IPv6 routes again.
assertRoutesAdded(cellNetId, ipv6Subnet, ipv6Default, stackedDefault);
if (SdkLevel.isAtLeastU()) {
verifyWakeupModifyInterface(MOBILE_IFNAME, true);
}
reset(mMockNetd);
reset(mClatCoordinator);
@@ -10718,6 +10761,11 @@ public class ConnectivityServiceTest {
networkCallback.expect(LOST, mCellAgent);
networkCallback.assertNoCallback();
verifyClatdStop(null /* inOrder */, MOBILE_IFNAME);
if (SdkLevel.isAtLeastU()) {
verifyWakeupModifyInterface(CLAT_MOBILE_IFNAME, false);
}
verify(mMockNetd).idletimerRemoveInterface(eq(MOBILE_IFNAME), anyInt(),
eq(Integer.toString(TRANSPORT_CELLULAR)));
verify(mMockNetd).networkDestroy(cellNetId);
@@ -10726,6 +10774,11 @@ public class ConnectivityServiceTest {
} else {
verify(mMockNetd, never()).setNetworkAllowlist(any());
}
if (SdkLevel.isAtLeastU()) {
verifyWakeupModifyInterface(MOBILE_IFNAME, false);
}
verifyNoMoreInteractions(mMockNetd);
verifyNoMoreInteractions(mClatCoordinator);
@@ -17671,4 +17724,48 @@ public class ConnectivityServiceTest {
info.setExtraInfo("test_info");
assertEquals("0;2;test_info", createDeliveryGroupKeyForConnectivityAction(info));
}
@Test
public void testNetdWakeupAddInterfaceForWifiTransport() throws Exception {
final LinkProperties wifiLp = new LinkProperties();
wifiLp.setInterfaceName(WIFI_IFNAME);
mWiFiAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI, wifiLp);
mWiFiAgent.connect(false /* validated */);
final String expectedPrefix = makeNflogPrefix(WIFI_IFNAME,
mWiFiAgent.getNetwork().getNetworkHandle());
verify(mMockNetd).wakeupAddInterface(WIFI_IFNAME, expectedPrefix, PACKET_WAKEUP_MARK,
PACKET_WAKEUP_MASK);
}
@Test
public void testNetdWakeupAddInterfaceForCellularTransport() throws Exception {
final LinkProperties cellLp = new LinkProperties();
cellLp.setInterfaceName(MOBILE_IFNAME);
mCellAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR, cellLp);
mCellAgent.connect(false /* validated */);
if (SdkLevel.isAtLeastU()) {
final String expectedPrefix = makeNflogPrefix(MOBILE_IFNAME,
mCellAgent.getNetwork().getNetworkHandle());
verify(mMockNetd).wakeupAddInterface(MOBILE_IFNAME, expectedPrefix, PACKET_WAKEUP_MARK,
PACKET_WAKEUP_MASK);
} else {
verify(mMockNetd, never()).wakeupAddInterface(eq(MOBILE_IFNAME), anyString(), anyInt(),
anyInt());
}
}
@Test
public void testNetdWakeupAddInterfaceForEthernetTransport() throws Exception {
final String ethernetIface = "eth42";
final LinkProperties ethLp = new LinkProperties();
ethLp.setInterfaceName(ethernetIface);
mEthernetAgent = new TestNetworkAgentWrapper(TRANSPORT_ETHERNET, ethLp);
mEthernetAgent.connect(false /* validated */);
verify(mMockNetd, never()).wakeupAddInterface(eq(ethernetIface), anyString(), anyInt(),
anyInt());
}
}

View File

@@ -24,6 +24,7 @@ import static com.android.testutils.MiscAsserts.assertStringContains;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
@@ -41,6 +42,8 @@ import com.android.server.connectivity.metrics.nano.IpConnectivityLogClass.IpCon
import com.android.testutils.DevSdkIgnoreRule;
import com.android.testutils.DevSdkIgnoreRunner;
import libcore.util.EmptyArray;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -60,7 +63,8 @@ public class NetdEventListenerServiceTest {
private static final String EXAMPLE_IPV4 = "192.0.2.1";
private static final String EXAMPLE_IPV6 = "2001:db8:1200::2:1";
private static final long NET_HANDLE = new Network(5391).getNetworkHandle();
private static final Network TEST_WIFI_NETWORK = new Network(5391);
private static final Network TEST_CELL_NETWORK = new Network(5832);
private static final byte[] MAC_ADDR =
{(byte)0x84, (byte)0xc9, (byte)0xb2, (byte)0x6a, (byte)0xed, (byte)0x4b};
@@ -78,6 +82,8 @@ public class NetdEventListenerServiceTest {
public void setUp() {
mCm = mock(ConnectivityManager.class);
mService = new NetdEventListenerService(mCm);
doReturn(CAPABILITIES_WIFI).when(mCm).getNetworkCapabilities(TEST_WIFI_NETWORK);
doReturn(CAPABILITIES_CELL).when(mCm).getNetworkCapabilities(TEST_CELL_NETWORK);
}
@Test
@@ -111,19 +117,25 @@ public class NetdEventListenerServiceTest {
wakeupEvent(iface, uids[5], v4, tcp, mac, srcIp, dstIp, sport, dport, now);
wakeupEvent(iface, uids[6], v6, udp, mac, srcIp6, dstIp6, sport, dport, now);
wakeupEvent(iface, uids[7], v6, tcp, mac, srcIp6, dstIp6, sport, dport, now);
wakeupEvent(iface, uids[8], v6, udp, mac, srcIp6, dstIp6, sport, dport, now);
wakeupEvent("rmnet0", uids[8], v6, udp, EmptyArray.BYTE, srcIp6, dstIp6, sport, dport, now,
TEST_CELL_NETWORK);
String[] events2 = remove(listNetdEvent(), baseline);
int expectedLength2 = uids.length + 1; // +1 for the WakeupStats line
int expectedLength2 = uids.length + 2; // +2 for the WakeupStats headers
assertEquals(expectedLength2, events2.length);
assertStringContains(events2[0], "WakeupStats");
assertStringContains(events2[0], "wlan0");
assertStringContains(events2[0], "0x800");
assertStringContains(events2[0], "rmnet0");
assertStringContains(events2[0], "0x86dd");
assertStringContains(events2[1], "WakeupStats");
assertStringContains(events2[1], "wlan0");
assertStringContains(events2[1], "0x800");
assertStringContains(events2[1], "0x86dd");
for (int i = 0; i < uids.length; i++) {
String got = events2[i+1];
String got = events2[i + 2];
assertStringContains(got, "WakeupEvent");
assertStringContains(got, "wlan0");
assertStringContains(got, ((i == 8) ? "rmnet0" : "wlan0"));
assertStringContains(got, "uid: " + uids[i]);
}
@@ -134,11 +146,13 @@ public class NetdEventListenerServiceTest {
}
String[] events3 = remove(listNetdEvent(), baseline);
int expectedLength3 = BUFFER_LENGTH + 1; // +1 for the WakeupStats line
int expectedLength3 = BUFFER_LENGTH + 2; // +2 for the WakeupStats headers
assertEquals(expectedLength3, events3.length);
assertStringContains(events2[0], "WakeupStats");
assertStringContains(events2[0], "wlan0");
for (int i = 1; i < expectedLength3; i++) {
assertStringContains(events3[0], "WakeupStats");
assertStringContains(events3[0], "rmnet0");
assertStringContains(events3[1], "WakeupStats");
assertStringContains(events3[1], "wlan0");
for (int i = 2; i < expectedLength3; i++) {
String got = events3[i];
assertStringContains(got, "WakeupEvent");
assertStringContains(got, "wlan0");
@@ -173,19 +187,24 @@ public class NetdEventListenerServiceTest {
final int icmp6 = 58;
wakeupEvent("wlan0", 1000, v4, tcp, mac, srcIp, dstIp, sport, dport, now);
wakeupEvent("rmnet0", 10123, v4, tcp, mac, srcIp, dstIp, sport, dport, now);
wakeupEvent("rmnet0", 10123, v4, tcp, mac, srcIp, dstIp, sport, dport, now,
TEST_CELL_NETWORK);
wakeupEvent("wlan0", 1000, v4, udp, mac, srcIp, dstIp, sport, dport, now);
wakeupEvent("rmnet0", 10008, v4, tcp, mac, srcIp, dstIp, sport, dport, now);
wakeupEvent("rmnet0", 10008, v4, tcp, EmptyArray.BYTE, srcIp, dstIp, sport, dport, now,
TEST_CELL_NETWORK);
wakeupEvent("wlan0", -1, v6, icmp6, mac, srcIp6, dstIp6, sport, dport, now);
wakeupEvent("wlan0", 10008, v4, tcp, mac, srcIp, dstIp, sport, dport, now);
wakeupEvent("rmnet0", 1000, v4, tcp, mac, srcIp, dstIp, sport, dport, now);
wakeupEvent("rmnet0", 1000, v4, tcp, mac, srcIp, dstIp, sport, dport, now,
TEST_CELL_NETWORK);
wakeupEvent("wlan0", 10004, v4, udp, mac, srcIp, dstIp, sport, dport, now);
wakeupEvent("wlan0", 1000, v6, tcp, mac, srcIp6, dstIp6, sport, dport, now);
wakeupEvent("wlan0", 0, v6, udp, mac, srcIp6, dstIp6, sport, dport, now);
wakeupEvent("wlan0", -1, v6, icmp6, mac, srcIp6, dstIp6, sport, dport, now);
wakeupEvent("rmnet0", 10052, v4, tcp, mac, srcIp, dstIp, sport, dport, now);
wakeupEvent("rmnet0", 10052, v4, tcp, mac, srcIp, dstIp, sport, dport, now,
TEST_CELL_NETWORK);
wakeupEvent("wlan0", 0, v6, udp, mac, srcIp6, dstIp6, sport, dport, now);
wakeupEvent("rmnet0", 1000, v6, tcp, mac, srcIp6, dstIp6, sport, dport, now);
wakeupEvent("rmnet0", 1000, v6, tcp, null, srcIp6, dstIp6, sport, dport, now,
TEST_CELL_NETWORK);
wakeupEvent("wlan0", 1010, v4, udp, mac, srcIp, dstIp, sport, dport, now);
String got = flushStatistics();
@@ -214,7 +233,7 @@ public class NetdEventListenerServiceTest {
" >",
" l2_broadcast_count: 0",
" l2_multicast_count: 0",
" l2_unicast_count: 5",
" l2_unicast_count: 3",
" no_uid_wakeups: 0",
" non_application_wakeups: 0",
" root_wakeups: 0",
@@ -499,8 +518,13 @@ public class NetdEventListenerServiceTest {
}
void wakeupEvent(String iface, int uid, int ether, int ip, byte[] mac, String srcIp,
String dstIp, int sport, int dport, long now) throws Exception {
String prefix = NET_HANDLE + ":" + iface;
String dstIp, int sport, int dport, long now) {
wakeupEvent(iface, uid, ether, ip, mac, srcIp, dstIp, sport, dport, now, TEST_WIFI_NETWORK);
}
void wakeupEvent(String iface, int uid, int ether, int ip, byte[] mac, String srcIp,
String dstIp, int sport, int dport, long now, Network network) {
String prefix = network.getNetworkHandle() + ":" + iface;
mService.onWakeupEvent(prefix, uid, ether, ip, mac, srcIp, dstIp, sport, dport, now);
}