From 544d6bcec508630959b661467f5c1239cbb530a8 Mon Sep 17 00:00:00 2001 From: Chaohui Wang Date: Tue, 6 Dec 2022 13:29:59 +0800 Subject: [PATCH] Add LiveDataTestUtil Bug: 260441791 Test: Unit test Change-Id: I9ba13e44b95b236845d7e4ca7c1363afbfdfa843 --- .../spa/testutils/LiveDataTestUtil.kt | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 packages/SettingsLib/Spa/testutils/src/com/android/settingslib/spa/testutils/LiveDataTestUtil.kt diff --git a/packages/SettingsLib/Spa/testutils/src/com/android/settingslib/spa/testutils/LiveDataTestUtil.kt b/packages/SettingsLib/Spa/testutils/src/com/android/settingslib/spa/testutils/LiveDataTestUtil.kt new file mode 100644 index 0000000000000..dddda5511c7bd --- /dev/null +++ b/packages/SettingsLib/Spa/testutils/src/com/android/settingslib/spa/testutils/LiveDataTestUtil.kt @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2022 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.settingslib.spa.testutils + +import androidx.lifecycle.LiveData +import androidx.lifecycle.Observer +import java.util.concurrent.CountDownLatch +import java.util.concurrent.TimeUnit +import java.util.concurrent.TimeoutException + +fun LiveData.getOrAwaitValue( + timeout: Long = 1, + timeUnit: TimeUnit = TimeUnit.SECONDS, + afterObserve: () -> Unit = {}, +): T? { + var data: T? = null + val latch = CountDownLatch(1) + val observer = Observer { newData -> + data = newData + latch.countDown() + } + this.observeForever(observer) + + afterObserve() + + try { + // Don't wait indefinitely if the LiveData is not set. + if (!latch.await(timeout, timeUnit)) { + throw TimeoutException("LiveData value was never set.") + } + } finally { + this.removeObserver(observer) + } + + return data +}