Merge "[Cronet] Filter out large tests from presubmit"
diff --git a/framework-t/src/android/net/NetworkTemplate.java b/framework-t/src/android/net/NetworkTemplate.java
index b3c70cf..9d0476e 100644
--- a/framework-t/src/android/net/NetworkTemplate.java
+++ b/framework-t/src/android/net/NetworkTemplate.java
@@ -61,6 +61,7 @@
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
+import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
@@ -194,8 +195,22 @@
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.TIRAMISU,
publicAlternatives = "Use {@code Builder} instead.")
public static NetworkTemplate buildTemplateMobileAll(@NonNull String subscriberId) {
+ final Set<String> set;
+ // Prevent from crash for b/273963543, where the OEMs still call into this method
+ // with null subscriberId and get crashed.
+ final int firstSdk = Build.VERSION.DEVICE_INITIAL_SDK_INT;
+ if (firstSdk > Build.VERSION_CODES.TIRAMISU && subscriberId == null) {
+ throw new IllegalArgumentException("buildTemplateMobileAll does not accept null"
+ + " subscriberId on Android U devices or above");
+ }
+ if (subscriberId == null) {
+ set = new HashSet<>();
+ set.add(null);
+ } else {
+ set = Set.of(subscriberId);
+ }
return new NetworkTemplate.Builder(MATCH_MOBILE).setMeteredness(METERED_YES)
- .setSubscriberIds(Set.of(subscriberId)).build();
+ .setSubscriberIds(set).build();
}
/**
@@ -410,12 +425,20 @@
// subscriber ID.
case MATCH_CARRIER:
if (matchSubscriberIds.length == 0) {
- throw new IllegalArgumentException("checkValidMatchSubscriberIds with empty"
- + " list of ids for rule" + getMatchRuleName(matchRule));
+ throw new IllegalArgumentException("matchSubscriberIds may not contain"
+ + " null for rule " + getMatchRuleName(matchRule));
}
- // fall through
- case MATCH_MOBILE:
if (CollectionUtils.contains(matchSubscriberIds, null)) {
+ throw new IllegalArgumentException("matchSubscriberIds may not contain"
+ + " null for rule " + getMatchRuleName(matchRule));
+ }
+ break;
+ case MATCH_MOBILE:
+ // Prevent from crash for b/273963543, where the OEMs still call into unsupported
+ // buildTemplateMobileAll with null subscriberId and get crashed.
+ final int firstSdk = Build.VERSION.DEVICE_INITIAL_SDK_INT;
+ if (firstSdk > Build.VERSION_CODES.TIRAMISU
+ && CollectionUtils.contains(matchSubscriberIds, null)) {
throw new IllegalArgumentException("checkValidMatchSubscriberIds list of ids"
+ " may not contain null for rule " + getMatchRuleName(matchRule));
}
diff --git a/service-t/native/libs/libnetworkstats/NetworkTraceHandler.cpp b/service-t/native/libs/libnetworkstats/NetworkTraceHandler.cpp
index 3d22aac..dc5732f 100644
--- a/service-t/native/libs/libnetworkstats/NetworkTraceHandler.cpp
+++ b/service-t/native/libs/libnetworkstats/NetworkTraceHandler.cpp
@@ -136,10 +136,12 @@
}
void NetworkTraceHandler::OnStart(const StartArgs&) {
+ if (mIsTest) return; // Don't touch non-hermetic bpf in test.
mStarted = sPoller.Start(mPollMs);
}
void NetworkTraceHandler::OnStop(const StopArgs&) {
+ if (mIsTest) return; // Don't touch non-hermetic bpf in test.
if (mStarted) sPoller.Stop();
mStarted = false;
}
diff --git a/service-t/native/libs/libnetworkstats/NetworkTraceHandlerTest.cpp b/service-t/native/libs/libnetworkstats/NetworkTraceHandlerTest.cpp
index 27dce75..f2c1a86 100644
--- a/service-t/native/libs/libnetworkstats/NetworkTraceHandlerTest.cpp
+++ b/service-t/native/libs/libnetworkstats/NetworkTraceHandlerTest.cpp
@@ -33,14 +33,6 @@
using ::perfetto::protos::TracePacket;
using ::perfetto::protos::TrafficDirection;
-// This handler makes OnStart and OnStop a no-op so that tracing is not really
-// started on the device.
-class HandlerForTest : public NetworkTraceHandler {
- public:
- void OnStart(const StartArgs&) override {}
- void OnStop(const StopArgs&) override {}
-};
-
class NetworkTraceHandlerTest : public testing::Test {
protected:
// Starts a tracing session with the handler under test.
@@ -52,7 +44,7 @@
perfetto::DataSourceDescriptor dsd;
dsd.set_name("test.network_packets");
- HandlerForTest::Register(dsd);
+ NetworkTraceHandler::Register(dsd, /*isTest=*/true);
perfetto::TraceConfig cfg;
cfg.add_buffers()->set_size_kb(1024);
@@ -94,7 +86,7 @@
std::vector<TracePacket>* output,
NetworkPacketTraceConfig config = {}) {
auto session = StartTracing(config);
- HandlerForTest::Trace([&](HandlerForTest::TraceContext ctx) {
+ NetworkTraceHandler::Trace([&](NetworkTraceHandler::TraceContext ctx) {
ctx.GetDataSourceLocked()->Write(input, ctx);
ctx.Flush();
});
@@ -357,7 +349,7 @@
auto session = StartTracing(config);
- HandlerForTest::Trace([&](HandlerForTest::TraceContext ctx) {
+ NetworkTraceHandler::Trace([&](NetworkTraceHandler::TraceContext ctx) {
ctx.GetDataSourceLocked()->Write(inputs[0], ctx);
ctx.GetDataSourceLocked()->Write(inputs[1], ctx);
ctx.GetDataSourceLocked()->Write(inputs[2], ctx);
diff --git a/service-t/native/libs/libnetworkstats/include/netdbpf/NetworkTraceHandler.h b/service-t/native/libs/libnetworkstats/include/netdbpf/NetworkTraceHandler.h
index 9bc777b..bc10e68 100644
--- a/service-t/native/libs/libnetworkstats/include/netdbpf/NetworkTraceHandler.h
+++ b/service-t/native/libs/libnetworkstats/include/netdbpf/NetworkTraceHandler.h
@@ -70,6 +70,9 @@
// Connects to the system Perfetto daemon and registers the trace handler.
static void InitPerfettoTracing();
+ // When isTest is true, skip non-hermetic code.
+ NetworkTraceHandler(bool isTest = false) : mIsTest(isTest) {}
+
// perfetto::DataSource overrides:
void OnSetup(const SetupArgs& args) override;
void OnStart(const StartArgs&) override;
@@ -92,6 +95,7 @@
static internal::NetworkTracePoller sPoller;
bool mStarted;
+ bool mIsTest;
// Values from config, see proto for details.
uint32_t mPollMs;
diff --git a/tests/common/java/android/net/netstats/NetworkTemplateTest.kt b/tests/common/java/android/net/netstats/NetworkTemplateTest.kt
index fb6759e..fd7bd74 100644
--- a/tests/common/java/android/net/netstats/NetworkTemplateTest.kt
+++ b/tests/common/java/android/net/netstats/NetworkTemplateTest.kt
@@ -30,16 +30,17 @@
import android.net.NetworkTemplate.MATCH_WIFI
import android.net.NetworkTemplate.NETWORK_TYPE_ALL
import android.net.NetworkTemplate.OEM_MANAGED_ALL
+import android.os.Build
import android.telephony.TelephonyManager
import com.android.testutils.ConnectivityModuleTest
import com.android.testutils.DevSdkIgnoreRule
import com.android.testutils.SC_V2
+import kotlin.test.assertEquals
+import kotlin.test.assertFailsWith
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
-import kotlin.test.assertEquals
-import kotlin.test.assertFailsWith
private const val TEST_IMSI1 = "imsi"
private const val TEST_WIFI_KEY1 = "wifiKey1"
@@ -96,9 +97,27 @@
}
// Verify carrier and mobile template cannot contain one of subscriber Id is null.
- listOf(MATCH_MOBILE, MATCH_CARRIER).forEach {
+ assertFailsWith<IllegalArgumentException> {
+ NetworkTemplate.Builder(MATCH_CARRIER).setSubscriberIds(setOf(null)).build()
+ }
+ val firstSdk = Build.VERSION.DEVICE_INITIAL_SDK_INT
+ if (firstSdk > Build.VERSION_CODES.TIRAMISU) {
assertFailsWith<IllegalArgumentException> {
- NetworkTemplate.Builder(it).setSubscriberIds(setOf(null)).build()
+ NetworkTemplate.Builder(MATCH_MOBILE).setSubscriberIds(setOf(null)).build()
+ }
+ } else {
+ NetworkTemplate.Builder(MATCH_MOBILE).setSubscriberIds(setOf(null)).build().let {
+ val expectedTemplate = NetworkTemplate(
+ MATCH_MOBILE,
+ arrayOfNulls<String>(1) /*subscriberIds*/,
+ emptyArray<String>() /*wifiNetworkKey*/,
+ METERED_ALL,
+ ROAMING_ALL,
+ DEFAULT_NETWORK_ALL,
+ NETWORK_TYPE_ALL,
+ OEM_MANAGED_ALL
+ )
+ assertEquals(expectedTemplate, it)
}
}
diff --git a/tests/unit/java/android/net/NetworkTemplateTest.kt b/tests/unit/java/android/net/NetworkTemplateTest.kt
index fc25fd8..2f6c76b 100644
--- a/tests/unit/java/android/net/NetworkTemplateTest.kt
+++ b/tests/unit/java/android/net/NetworkTemplateTest.kt
@@ -50,16 +50,17 @@
import com.android.testutils.DevSdkIgnoreRule
import com.android.testutils.DevSdkIgnoreRunner
import com.android.testutils.assertParcelSane
+import kotlin.test.assertEquals
+import kotlin.test.assertFalse
+import kotlin.test.assertNotEquals
+import kotlin.test.assertTrue
import org.junit.Before
+import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mockito.mock
import org.mockito.Mockito.`when`
import org.mockito.MockitoAnnotations
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertNotEquals
-import kotlin.test.assertTrue
private const val TEST_IMSI1 = "imsi1"
private const val TEST_IMSI2 = "imsi2"
@@ -70,6 +71,8 @@
@RunWith(DevSdkIgnoreRunner::class)
@DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.S_V2)
class NetworkTemplateTest {
+ @get:Rule
+ val ignoreRule = DevSdkIgnoreRule()
private val mockContext = mock(Context::class.java)
private val mockWifiInfo = mock(WifiInfo::class.java)
@@ -215,6 +218,18 @@
templateNullWifiKey.assertDoesNotMatch(identWifiNullKey)
}
+ @DevSdkIgnoreRule.IgnoreAfter(Build.VERSION_CODES.TIRAMISU)
+ @Test
+ fun testBuildTemplateMobileAll_nullSubscriberId() {
+ val templateMobileAllWithNullImsi = buildTemplateMobileAll(null)
+ val setWithNull = HashSet<String?>().apply {
+ add(null)
+ }
+ val templateFromBuilder = NetworkTemplate.Builder(MATCH_MOBILE).setMeteredness(METERED_YES)
+ .setSubscriberIds(setWithNull).build()
+ assertEquals(templateFromBuilder, templateMobileAllWithNullImsi)
+ }
+
@Test
fun testMobileMatches() {
val templateMobileImsi1 = buildTemplateMobileAll(TEST_IMSI1)