From 953a161f1ab40ca0a959d680371cf71514ff078a Mon Sep 17 00:00:00 2001 From: Kangping Dong Date: Thu, 30 May 2024 03:35:37 +0000 Subject: [PATCH] Fix ThreadFeatureCheckerRule on U- devices On U- devices, the ThreadNetworkManager class is not available, so we need to use the service name instead. And we should make sure Thread test cases runs on only devices that does has Thread feature supported. Change-Id: Idd356062277a5180933789c7d471c70e2689350d --- .../net/thread/cts/ActiveOperationalDatasetTest.java | 6 ++++++ .../net/thread/cts/OperationalDatasetTimestampTest.java | 6 ++++++ .../net/thread/cts/PendingOperationalDatasetTest.java | 6 ++++++ .../android/net/thread/cts/ThreadNetworkExceptionTest.java | 6 ++++++ .../android/net/thread/utils/ThreadFeatureCheckerRule.java | 6 ++++-- 5 files changed, 28 insertions(+), 2 deletions(-) diff --git a/thread/tests/cts/src/android/net/thread/cts/ActiveOperationalDatasetTest.java b/thread/tests/cts/src/android/net/thread/cts/ActiveOperationalDatasetTest.java index 0e76930fb2..996d22d2e6 100644 --- a/thread/tests/cts/src/android/net/thread/cts/ActiveOperationalDatasetTest.java +++ b/thread/tests/cts/src/android/net/thread/cts/ActiveOperationalDatasetTest.java @@ -30,6 +30,8 @@ import android.net.thread.ActiveOperationalDataset; import android.net.thread.ActiveOperationalDataset.Builder; import android.net.thread.ActiveOperationalDataset.SecurityPolicy; import android.net.thread.OperationalDatasetTimestamp; +import android.net.thread.utils.ThreadFeatureCheckerRule; +import android.net.thread.utils.ThreadFeatureCheckerRule.RequiresThreadFeature; import android.util.SparseArray; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -38,6 +40,7 @@ import androidx.test.filters.SmallTest; import com.google.common.primitives.Bytes; import com.google.common.testing.EqualsTester; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -46,6 +49,7 @@ import java.util.Arrays; /** CTS tests for {@link ActiveOperationalDataset}. */ @SmallTest +@RequiresThreadFeature @RunWith(AndroidJUnit4.class) public final class ActiveOperationalDatasetTest { private static final int TYPE_ACTIVE_TIMESTAMP = 14; @@ -81,6 +85,8 @@ public final class ActiveOperationalDatasetTest { private static final ActiveOperationalDataset DEFAULT_DATASET = ActiveOperationalDataset.fromThreadTlvs(VALID_DATASET_TLVS); + @Rule public final ThreadFeatureCheckerRule mThreadRule = new ThreadFeatureCheckerRule(); + private static byte[] removeTlv(byte[] dataset, int type) { ByteArrayOutputStream os = new ByteArrayOutputStream(dataset.length); int i = 0; diff --git a/thread/tests/cts/src/android/net/thread/cts/OperationalDatasetTimestampTest.java b/thread/tests/cts/src/android/net/thread/cts/OperationalDatasetTimestampTest.java index 9be3d56401..4d7c7f1f1f 100644 --- a/thread/tests/cts/src/android/net/thread/cts/OperationalDatasetTimestampTest.java +++ b/thread/tests/cts/src/android/net/thread/cts/OperationalDatasetTimestampTest.java @@ -21,12 +21,15 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertThrows; import android.net.thread.OperationalDatasetTimestamp; +import android.net.thread.utils.ThreadFeatureCheckerRule; +import android.net.thread.utils.ThreadFeatureCheckerRule.RequiresThreadFeature; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import com.google.common.testing.EqualsTester; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -34,8 +37,11 @@ import java.time.Instant; /** Tests for {@link OperationalDatasetTimestamp}. */ @SmallTest +@RequiresThreadFeature @RunWith(AndroidJUnit4.class) public final class OperationalDatasetTimestampTest { + @Rule public final ThreadFeatureCheckerRule mThreadRule = new ThreadFeatureCheckerRule(); + @Test public void fromInstant_tooLargeInstant_throwsIllegalArgument() { assertThrows( diff --git a/thread/tests/cts/src/android/net/thread/cts/PendingOperationalDatasetTest.java b/thread/tests/cts/src/android/net/thread/cts/PendingOperationalDatasetTest.java index 0bb18ce275..76be0549b1 100644 --- a/thread/tests/cts/src/android/net/thread/cts/PendingOperationalDatasetTest.java +++ b/thread/tests/cts/src/android/net/thread/cts/PendingOperationalDatasetTest.java @@ -28,6 +28,8 @@ import android.net.thread.ActiveOperationalDataset; import android.net.thread.ActiveOperationalDataset.SecurityPolicy; import android.net.thread.OperationalDatasetTimestamp; import android.net.thread.PendingOperationalDataset; +import android.net.thread.utils.ThreadFeatureCheckerRule; +import android.net.thread.utils.ThreadFeatureCheckerRule.RequiresThreadFeature; import android.util.SparseArray; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -36,6 +38,7 @@ import androidx.test.filters.SmallTest; import com.google.common.primitives.Bytes; import com.google.common.testing.EqualsTester; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -44,8 +47,11 @@ import java.time.Duration; /** Tests for {@link PendingOperationalDataset}. */ @SmallTest +@RequiresThreadFeature @RunWith(AndroidJUnit4.class) public final class PendingOperationalDatasetTest { + @Rule public final ThreadFeatureCheckerRule mThreadRule = new ThreadFeatureCheckerRule(); + private static ActiveOperationalDataset createActiveDataset() throws Exception { SparseArray channelMask = new SparseArray<>(1); channelMask.put(0, new byte[] {0x00, 0x1f, (byte) 0xff, (byte) 0xe0}); diff --git a/thread/tests/cts/src/android/net/thread/cts/ThreadNetworkExceptionTest.java b/thread/tests/cts/src/android/net/thread/cts/ThreadNetworkExceptionTest.java index 7d9ae81fc1..4de2e13f08 100644 --- a/thread/tests/cts/src/android/net/thread/cts/ThreadNetworkExceptionTest.java +++ b/thread/tests/cts/src/android/net/thread/cts/ThreadNetworkExceptionTest.java @@ -25,17 +25,23 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertThrows; import android.net.thread.ThreadNetworkException; +import android.net.thread.utils.ThreadFeatureCheckerRule; +import android.net.thread.utils.ThreadFeatureCheckerRule.RequiresThreadFeature; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; /** CTS tests for {@link ThreadNetworkException}. */ @SmallTest +@RequiresThreadFeature @RunWith(AndroidJUnit4.class) public final class ThreadNetworkExceptionTest { + @Rule public final ThreadFeatureCheckerRule mThreadRule = new ThreadFeatureCheckerRule(); + @Test public void constructor_validValues_valuesAreConnectlySet() throws Exception { ThreadNetworkException errorThreadDisabled = diff --git a/thread/tests/utils/src/android/net/thread/utils/ThreadFeatureCheckerRule.java b/thread/tests/utils/src/android/net/thread/utils/ThreadFeatureCheckerRule.java index bee9ceba01..38a6e90aa4 100644 --- a/thread/tests/utils/src/android/net/thread/utils/ThreadFeatureCheckerRule.java +++ b/thread/tests/utils/src/android/net/thread/utils/ThreadFeatureCheckerRule.java @@ -21,7 +21,6 @@ import static com.android.testutils.DeviceInfoUtils.isKernelVersionAtLeast; import static org.junit.Assume.assumeTrue; import android.content.Context; -import android.net.thread.ThreadNetworkManager; import android.os.SystemProperties; import android.os.VintfRuntimeInfo; @@ -122,7 +121,10 @@ public final class ThreadFeatureCheckerRule implements TestRule { /** Returns {@code true} if this device has the Thread feature supported. */ private static boolean hasThreadFeature() { final Context context = ApplicationProvider.getApplicationContext(); - return context.getSystemService(ThreadNetworkManager.class) != null; + + // Use service name rather than `ThreadNetworkManager.class` to avoid + // `ClassNotFoundException` on U- devices. + return context.getSystemService("thread_network") != null; } /**