From 2b63e33de2ce4e138a90e301bea090375ef889fa Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Sat, 8 Nov 2025 10:16:57 -0600 Subject: [PATCH] Fix reentrant deadlock --- .../org/tasks/data/CaldavDaoExtensionsTest.kt | 25 +++++++++++++++++++ .../org/tasks/data/CaldavDaoExtensions.kt | 18 +++++++------ 2 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 app/src/androidTest/java/org/tasks/data/CaldavDaoExtensionsTest.kt diff --git a/app/src/androidTest/java/org/tasks/data/CaldavDaoExtensionsTest.kt b/app/src/androidTest/java/org/tasks/data/CaldavDaoExtensionsTest.kt new file mode 100644 index 000000000..8ed1ee101 --- /dev/null +++ b/app/src/androidTest/java/org/tasks/data/CaldavDaoExtensionsTest.kt @@ -0,0 +1,25 @@ +package org.tasks.data + +import dagger.hilt.android.testing.HiltAndroidTest +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withTimeout +import org.junit.Assert.assertTrue +import org.junit.Test +import org.tasks.data.dao.CaldavDao +import org.tasks.data.entity.CaldavAccount +import org.tasks.injection.InjectingTestCase +import javax.inject.Inject + +@HiltAndroidTest +class CaldavDaoExtensionsTest : InjectingTestCase() { + @Inject lateinit var caldavDao: CaldavDao + + @Test + fun getLocalListCreatesAccountIfNeeded() = runBlocking { + withTimeout(5000L) { + assertTrue(caldavDao.getAccounts().isEmpty()) + caldavDao.getLocalList() + assertTrue(caldavDao.getAccounts(CaldavAccount.TYPE_LOCAL).isNotEmpty()) + } + } +} diff --git a/kmp/src/commonMain/kotlin/org/tasks/data/CaldavDaoExtensions.kt b/kmp/src/commonMain/kotlin/org/tasks/data/CaldavDaoExtensions.kt index 7ccb8070c..0b3f99ffe 100644 --- a/kmp/src/commonMain/kotlin/org/tasks/data/CaldavDaoExtensions.kt +++ b/kmp/src/commonMain/kotlin/org/tasks/data/CaldavDaoExtensions.kt @@ -12,6 +12,17 @@ import tasks.kmp.generated.resources.default_list private val mutex = Mutex() suspend fun CaldavDao.newLocalAccount(): CaldavAccount = mutex.withLock { + newLocalAccountUnsafe() +} + +suspend fun CaldavDao.getLocalList() = mutex.withLock { + getLocalList(getLocalAccount()) +} + +suspend fun CaldavDao.getLocalAccount() = + getAccounts(CaldavAccount.TYPE_LOCAL).firstOrNull() ?: newLocalAccountUnsafe() + +private suspend fun CaldavDao.newLocalAccountUnsafe(): CaldavAccount { val account = CaldavAccount( accountType = CaldavAccount.TYPE_LOCAL, uuid = UUIDHelper.newUUID(), @@ -21,13 +32,6 @@ suspend fun CaldavDao.newLocalAccount(): CaldavAccount = mutex.withLock { return account } -suspend fun CaldavDao.getLocalList() = mutex.withLock { - getLocalList(getLocalAccount()) -} - -suspend fun CaldavDao.getLocalAccount() = - getAccounts(CaldavAccount.TYPE_LOCAL).firstOrNull() ?: newLocalAccount() - private suspend fun CaldavDao.getLocalList(account: CaldavAccount): CaldavCalendar = getCalendarsByAccount(account.uuid!!).getOrNull(0) ?: CaldavCalendar(