Merge changes Id3eaa838,If07fb6c1 into main

* changes:
  Move failWithErrorReason to a common place
  Enable the last preference tests
This commit is contained in:
Jean Chalard 2025-04-30 20:05:50 -07:00 • committed by Android (Google) Code Review
commit 175e8aeebf
4 changed files with 34 additions and 29 deletions

View file

@ -70,7 +70,7 @@ open class RecorderCallback private constructor(
data class Reserved private constructor(
override val network: Network,
val caps: NetworkCapabilities
): CallbackEntry() {
) : CallbackEntry() {
constructor(caps: NetworkCapabilities) : this(NULL_NETWORK, caps)
}
data class Available(override val network: Network) : CallbackEntry()
@ -399,12 +399,6 @@ open class TestableNetworkCallback private constructor(
}
} as T
// "Nothing" is the return type to declare a function never returns a value.
fun failWithErrorReason(errorMsg: String?, errorReason: String): Nothing {
val message = if (errorMsg != null) "$errorMsg : $errorReason" else errorReason
fail(message)
}
inline fun <reified T : CallbackEntry> expect(
network: HasNetwork,
timeoutMs: Long = defaultTimeoutMs,

View file

@ -56,12 +56,6 @@ class TestableNetworkOfferCallback(
history.add(CallbackEntry.Unneeded(request))
}
// TODO : move to some utility, this is copied from TestableNetworkCallback
fun failWithErrorReason(errorMsg: String?, errorReason: String): Nothing {
val message = if (errorMsg != null) "$errorMsg : $errorReason" else errorReason
fail(message)
}
inline fun <reified T : CallbackEntry> expect(
errorMsg: String? = null,
predicate: (T) -> Boolean = { true }

View file

@ -142,4 +142,12 @@ fun assertEventuallyTrue(
}
Thread.sleep(pollIntervalMs)
}
}
}
// "Nothing" is the return type to declare a function never returns a value. This is useful
// because the compiler will know the branch of the code calling this does not return, which
// lets check exhaustivity, infer return types, nullability and smart casts.
fun failWithErrorReason(errorMsg: String?, errorReason: String): Nothing {
val message = if (errorMsg != null) "$errorMsg : $errorReason" else errorReason
fail(message)
}

View file

@ -48,6 +48,7 @@ import com.android.testutils.TestableNetworkOfferCallback.CallbackEntry.Needed
import com.android.testutils.TestableNetworkOfferCallback.CallbackEntry.Unneeded
import com.android.testutils.postAndWait
import com.android.testutils.runAsShell
import kotlin.test.assertEquals
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@ -329,12 +330,6 @@ class CSPreferenceTest : CSTest() {
satelliteCallback.assertNoCallback()
restrictedSatelliteCallback.assertNoCallback()
// TODO : the test below cannot be stabilized because the order of the callbacks
// (which request is needed first) is not guaranteed and actually changes across
// invocations, and TestableNetworkOfferCallback does not yet offer the tooling
// to check the track record from a mark.
return
updateSatellitePreference(setOf(SMSUID), setOf(UID1))
// TODO : ideally ConnectivityService would not send unneeded then needed. This is
// happening because updating the preferences removes the requests, which causes a
@ -342,15 +337,20 @@ class CSPreferenceTest : CSTest() {
// causes another rematch.
satelliteCallback.expect<Unneeded> { it.isRestricted }
restrictedSatelliteCallback.expect<Unneeded> { it.isRestricted }
satelliteCallback.expect<Needed> { !it.isRestricted }
satelliteCallback.expect<Needed> { it.isRestricted }
val mark1 = satelliteCallback.mark
satelliteCallback.eventuallyExpect<Needed>(from = mark1) { !it.isRestricted }
satelliteCallback.eventuallyExpect<Needed>(from = mark1) { it.isRestricted }
assertEquals(2, satelliteCallback.mark - mark1)
restrictedSatelliteCallback.expect<Needed> { it.isRestricted }
satelliteCallback.assertNoCallback()
restrictedSatelliteCallback.assertNoCallback()
updateSatellitePreference(emptySet(), setOf(UID1))
satelliteCallback.expect<Unneeded> { it.isRestricted }
satelliteCallback.expect<Unneeded> { !it.isRestricted }
val mark2 = satelliteCallback.mark
satelliteCallback.eventuallyExpect<Unneeded>(from = mark2) { it.isRestricted }
satelliteCallback.eventuallyExpect<Unneeded>(from = mark2) { !it.isRestricted }
assertEquals(2, satelliteCallback.mark - mark2)
satelliteCallback.expect<Needed> { !it.isRestricted }
restrictedSatelliteCallback.expect<Unneeded> { it.isRestricted }
satelliteCallback.assertNoCallback()
@ -358,20 +358,29 @@ class CSPreferenceTest : CSTest() {
updateSatellitePreference(setOf(SMSUID), setOf(UID1))
restrictedSatelliteCallback.expect<Needed> { it.isRestricted }
satelliteCallback.expect<Unneeded> { !it.isRestricted }
val mark3 = satelliteCallback.mark
satelliteCallback.eventuallyExpect<Needed>(from = mark3) { it.isRestricted }
satelliteCallback.eventuallyExpect<Needed>(from = mark3) { !it.isRestricted }
assertEquals(2, satelliteCallback.mark - mark3)
satelliteCallback.assertNoCallback()
restrictedSatelliteCallback.assertNoCallback()
val wifiAgent = Agent(TRANSPORT_WIFI)
val wifiAgent = Agent(nc(TRANSPORT_WIFI, NET_CAPABILITY_INTERNET))
wifiAgent.connect()
satelliteCallback.expect<Unneeded> { it.isRestricted }
satelliteCallback.expect<Unneeded> { !it.isRestricted }
val mark4 = satelliteCallback.mark
satelliteCallback.eventuallyExpect<Unneeded>(from = mark4) { it.isRestricted }
satelliteCallback.eventuallyExpect<Unneeded>(from = mark4) { !it.isRestricted }
assertEquals(2, satelliteCallback.mark - mark4)
restrictedSatelliteCallback.expect<Unneeded> { it.isRestricted }
satelliteCallback.assertNoCallback()
restrictedSatelliteCallback.assertNoCallback()
wifiAgent.disconnect()
satelliteCallback.expect<Needed> { it.isRestricted }
satelliteCallback.expect<Needed> { !it.isRestricted }
val mark5 = satelliteCallback.mark
satelliteCallback.eventuallyExpect<Needed>(from = mark5) { it.isRestricted }
satelliteCallback.eventuallyExpect<Needed>(from = mark5) { !it.isRestricted }
assertEquals(2, satelliteCallback.mark - mark5)
restrictedSatelliteCallback.expect<Needed> { it.isRestricted }
satelliteCallback.assertNoCallback()
restrictedSatelliteCallback.assertNoCallback()