diff options
author | Junyu Lai <junyulai@google.com> | 2020-05-05 04:10:53 +0000 |
---|---|---|
committer | Junyu Lai <junyulai@google.com> | 2020-05-05 10:19:55 +0000 |
commit | aa2d8a3af4df361fe60560b1a50990d37dbfa817 (patch) | |
tree | 665b65d23c03ddf1dc04d9ed65482d3573dad4ae | |
parent | cf37ca43cbb6c7fe37f7854a26eb02c260598575 (diff) |
[SP18.2] Create TestableNetworkStatsProviderCbBinder
Currently, in OffloadController unit test, mock object is used
to verify callback sent from provider. However, verify a mock
method running in different thread, is not supported if there
is no additional thread synchronization mechanism applied.
This is fine now since all the callbacks fired from
OffloadControllerTest are on the same thread with caller.
But it is not necessary true in subsequent patches that fire
callbacks from handler thread.
Hence, introduce a testable provider callback that based on
a thread-safe ArrayTrackRecord to provide the functionality
to verify mock callback fired in a different thread.
Test: m -j
Bug: 149467454
Change-Id: I2edf887ccee5f205368a294f5f9990edb818332d
Merged-In: I2edf887ccee5f205368a294f5f9990edb818332d
(cherry picked from commit bdd1690cef97c246405b43ec0d9ccea1ede5703b)
-rw-r--r-- | tests/lib/src/com/android/testutils/TestableNetworkStatsProviderCbBinder.kt | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/tests/lib/src/com/android/testutils/TestableNetworkStatsProviderCbBinder.kt b/tests/lib/src/com/android/testutils/TestableNetworkStatsProviderCbBinder.kt new file mode 100644 index 0000000..abce700 --- /dev/null +++ b/tests/lib/src/com/android/testutils/TestableNetworkStatsProviderCbBinder.kt @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.testutils + +import android.net.NetworkStats +import android.net.netstats.provider.INetworkStatsProviderCallback +import kotlin.test.assertEquals +import kotlin.test.assertTrue +import kotlin.test.fail + +private const val DEFAULT_TIMEOUT_MS = 3000L + +open class TestableNetworkStatsProviderCbBinder : INetworkStatsProviderCallback.Stub() { + sealed class CallbackType { + data class NotifyStatsUpdated( + val token: Int, + val ifaceStats: NetworkStats, + val uidStats: NetworkStats + ) : CallbackType() + object NotifyLimitReached : CallbackType() + object NotifyAlertReached : CallbackType() + object Unregister : CallbackType() + } + + private val history = ArrayTrackRecord<CallbackType>().ReadHead() + + override fun notifyStatsUpdated(token: Int, ifaceStats: NetworkStats, uidStats: NetworkStats) { + history.add(CallbackType.NotifyStatsUpdated(token, ifaceStats, uidStats)) + } + + override fun notifyLimitReached() { + history.add(CallbackType.NotifyLimitReached) + } + + override fun notifyAlertReached() { + history.add(CallbackType.NotifyAlertReached) + } + + override fun unregister() { + history.add(CallbackType.Unregister) + } + + fun expectNotifyStatsUpdated() { + val event = history.poll(DEFAULT_TIMEOUT_MS) + assertTrue(event is CallbackType.NotifyStatsUpdated) + } + + fun expectNotifyStatsUpdated(ifaceStats: NetworkStats, uidStats: NetworkStats) { + val event = history.poll(DEFAULT_TIMEOUT_MS)!! + if (event !is CallbackType.NotifyStatsUpdated) { + throw Exception("Expected NotifyStatsUpdated callback, but got ${event::class}") + } + // TODO: verify token. + assertNetworkStatsEquals(ifaceStats, event.ifaceStats) + assertNetworkStatsEquals(uidStats, event.uidStats) + } + + fun expectNotifyLimitReached() = + assertEquals(CallbackType.NotifyLimitReached, history.poll(DEFAULT_TIMEOUT_MS)) + + fun expectNotifyAlertReached() = + assertEquals(CallbackType.NotifyAlertReached, history.poll(DEFAULT_TIMEOUT_MS)) + + // Assert there is no callback in current queue. + fun assertNoCallback() { + val cb = history.poll(0) + cb?.let { fail("Expected no callback but got $cb") } + } +} |