Migrate CSAgentWrapper to TestableCallback.

This makes it much more powerful as well as consistent with
other use cases of this paradigm.

Test: TH
Flag: EXEMPT test-only
Change-Id: I4f5b86bfdd16d8bfe21b79235444817a13bc3c49
diff --git a/staticlibs/testutils/hostdevice/com/android/net/module/util/TestableCallback.kt b/staticlibs/testutils/hostdevice/com/android/net/module/util/TestableCallback.kt
index 18e081e..82d693b 100644
--- a/staticlibs/testutils/hostdevice/com/android/net/module/util/TestableCallback.kt
+++ b/staticlibs/testutils/hostdevice/com/android/net/module/util/TestableCallback.kt
@@ -131,6 +131,7 @@
  *   override fun onFirstAction(data: String) = history.add(FirstAction(data))
  *   override fun onSecondAction(value: Int) = history.add(SecondAction(value))
  *
+ *   // ---- Bridge to TestableCallback, do not modify (implements standard behavior) ----
  *   // Proxy methods: These make it simpler to call expect/assertNo, avoiding 'expect<_, T>'
  *   // They simply forward the call to the embedded internalEventTracker.
  *   inline fun <reified T : Event> expect(
@@ -150,6 +151,7 @@
  *     errorMsg: String? = null,
  *     noinline predicate: (T) -> Boolean = { true }
  *   ) = assertNo<_, T>(timeoutMs, errorMsg, predicate)
+ *   // ---- End of bridge section ----
  * }
  * ```
  * HINT : if the proxy methods above give an error ("Type checking has run into a recursive
@@ -173,7 +175,6 @@
  * that calls the 2-type argument version instructing the compiler to infer the first argument
  * (`expect<_, T>` infers `_`). This lets you write `expect<MySpecificEvent>()`.
  */
-
 /**
  * An interface for classes on which the expect* and assertNo* family of methods can be called.
  */
diff --git a/tests/unit/java/com/android/server/connectivityservice/base/CSAgentWrapper.kt b/tests/unit/java/com/android/server/connectivityservice/base/CSAgentWrapper.kt
index a285dd1..bb8ce8a 100644
--- a/tests/unit/java/com/android/server/connectivityservice/base/CSAgentWrapper.kt
+++ b/tests/unit/java/com/android/server/connectivityservice/base/CSAgentWrapper.kt
@@ -41,7 +41,11 @@
 import android.net.networkstack.NetworkStackClientBase
 import android.os.HandlerThread
 import android.os.Looper
-import com.android.net.module.util.ArrayTrackRecord
+import com.android.net.module.util.Expectable
+import com.android.net.module.util.TestableCallback
+import com.android.net.module.util.assertNo
+import com.android.net.module.util.eventuallyExpect
+import com.android.net.module.util.expect
 import com.android.testutils.TestableNetworkAgent.Event
 import com.android.testutils.TestableNetworkAgent.Event.OnAddKeepalivePacketFilter
 import com.android.testutils.TestableNetworkAgent.Event.OnAutomaticReconnectDisabled
@@ -64,8 +68,6 @@
 import java.time.Duration
 import java.util.concurrent.atomic.AtomicInteger
 import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
 import kotlin.test.fail
 import org.mockito.ArgumentCaptor
 import org.mockito.ArgumentMatchers.any
@@ -98,8 +100,9 @@
         val lp: LinkProperties,
         val lnc: FromS<LocalNetworkConfig>?,
         val score: FromS<NetworkScore>,
-        val provider: NetworkProvider?
-) : TestableNetworkCallback.HasNetwork {
+        val provider: NetworkProvider?,
+        private val internalEventTracker: TestableCallback<Event> = TestableCallback()
+) : TestableNetworkCallback.HasNetwork, Expectable<Event> by internalEventTracker {
     private val TAG = "CSAgent${nextAgentId()}"
     private val VALIDATION_RESULT_INVALID = 0
     private val NO_PROBE_RESULT = 0
@@ -111,7 +114,6 @@
     private var nmValidationResult = NO_PROBE_RESULT
     private var nmProbesCompleted = NO_PROBE_RESULT
     private var nmProbesSucceeded = NO_PROBE_RESULT
-    val history = ArrayTrackRecord<Event>().newReadHead()
     val DEFAULT_TIMEOUT_MS = 5000L
 
     override val network: Network get() = agent.network!!
@@ -222,7 +224,7 @@
         val nmCbCaptor = ArgumentCaptor<INetworkMonitorCallbacks>()
         doNothing().`when`(networkStack).makeNetworkMonitor(
                 nmNetworkCaptor.capture(),
-                any() /* name */,
+                any(), // name
                 nmCbCaptor.capture()
         )
 
@@ -233,7 +235,7 @@
                 score.value, nac, provider)
         } else {
             TestAgent(
-                context, csHandlerThread.looper, TAG, nc, lp, 50 /* score */, nac, provider)
+                context, csHandlerThread.looper, TAG, nc, lp, score = 50, nac, provider)
         }
         agent.register()
         assertEquals(agent.network!!.netId, nmNetworkCaptor.value.netId)
@@ -247,7 +249,7 @@
         } else {
             verify(networkMonitor).notifyNetworkConnected(any(), any())
         }
-        nmCallbacks.notifyProbeStatusChanged(0 /* completed */, 0 /* succeeded */)
+        nmCallbacks.notifyProbeStatusChanged(0, 0)
         val p = NetworkTestResultParcelable()
         p.result = nmValidationResult
         p.probesAttempted = nmProbesCompleted
@@ -347,15 +349,23 @@
         )
     }
 
-    inline fun <reified T : Event> expect(test: (T) -> Boolean = { true }): T {
-        val foundCallback = history.poll(DEFAULT_TIMEOUT_MS)
-        assertTrue(foundCallback is T, "Expected ${T::class} but found $foundCallback")
-        assertTrue(test(foundCallback), "Unexpected callback : $foundCallback")
-        return foundCallback
-    }
+    // ---- Bridge to TestableCallback, do not modify (implements standard behavior) ----
+    inline fun <reified T : Event> expect(
+        timeoutMs: Long = defaultTimeoutMs,
+        errorMsg: String? = null,
+        noinline predicate: (T) -> Boolean = { true }
+    ) = expect<_, T>(timeoutMs, errorMsg, predicate)
 
-    inline fun <reified T : Event> eventuallyExpect() =
-        history.poll(DEFAULT_TIMEOUT_MS) { it is T }.also {
-            assertNotNull(it, "Callback ${T::class} not received")
-        } as T
+    inline fun <reified T : Event> eventuallyExpect(
+        timeoutMs: Long = defaultTimeoutMs,
+        errorMsg: String? = null,
+        noinline predicate: (T) -> Boolean = { true }
+    ) = eventuallyExpect<_, T>(timeoutMs, errorMsg, predicate)
+
+    inline fun <reified T : Event> assertNo(
+        timeoutMs: Long = defaultTimeoutMs,
+        errorMsg: String? = null,
+        noinline predicate: (T) -> Boolean = { true }
+    ): Unit = assertNo<Event, T>(timeoutMs, errorMsg, predicate)
+    // ---- End of bridge section ----
 }