summaryrefslogtreecommitdiff
path: root/format-common/src
diff options
context:
space:
mode:
Diffstat (limited to 'format-common/src')
-rw-r--r--format-common/src/main/kotlin/dev/msfjarvis/aps/data/passfile/PasswordEntry.kt5
-rw-r--r--format-common/src/test/kotlin/dev/msfjarvis/aps/data/passfile/PasswordEntryTest.kt25
2 files changed, 20 insertions, 10 deletions
diff --git a/format-common/src/main/kotlin/dev/msfjarvis/aps/data/passfile/PasswordEntry.kt b/format-common/src/main/kotlin/dev/msfjarvis/aps/data/passfile/PasswordEntry.kt
index 408069a2..81398b45 100644
--- a/format-common/src/main/kotlin/dev/msfjarvis/aps/data/passfile/PasswordEntry.kt
+++ b/format-common/src/main/kotlin/dev/msfjarvis/aps/data/passfile/PasswordEntry.kt
@@ -9,6 +9,7 @@ import com.github.michaelbull.result.mapBoth
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
+import dev.msfjarvis.aps.util.coroutines.DispatcherProvider
import dev.msfjarvis.aps.util.time.UserClock
import dev.msfjarvis.aps.util.totp.Otp
import dev.msfjarvis.aps.util.totp.TotpFinder
@@ -32,6 +33,8 @@ constructor(
clock: UserClock,
/** [TotpFinder] implementation to extract data from a TOTP URI */
totpFinder: TotpFinder,
+ /** Instance of [DispatcherProvider] to select an IO dispatcher for emitting TOTP values. */
+ dispatcherProvider: DispatcherProvider,
/**
* A cancellable [CoroutineScope] inside which we constantly emit new TOTP values as time elapses
*/
@@ -81,7 +84,7 @@ constructor(
username = findUsername()
totpSecret = totpFinder.findSecret(content)
if (totpSecret != null) {
- scope.launch {
+ scope.launch(dispatcherProvider.io()) {
val digits = totpFinder.findDigits(content)
val totpPeriod = totpFinder.findPeriod(content)
val totpAlgorithm = totpFinder.findAlgorithm(content)
diff --git a/format-common/src/test/kotlin/dev/msfjarvis/aps/data/passfile/PasswordEntryTest.kt b/format-common/src/test/kotlin/dev/msfjarvis/aps/data/passfile/PasswordEntryTest.kt
index 2923946e..32066cc3 100644
--- a/format-common/src/test/kotlin/dev/msfjarvis/aps/data/passfile/PasswordEntryTest.kt
+++ b/format-common/src/test/kotlin/dev/msfjarvis/aps/data/passfile/PasswordEntryTest.kt
@@ -5,6 +5,7 @@
package dev.msfjarvis.aps.data.passfile
+import dev.msfjarvis.aps.test.CoroutineTestRule
import dev.msfjarvis.aps.util.time.TestUserClock
import dev.msfjarvis.aps.util.totp.TotpFinder
import java.util.Locale
@@ -16,15 +17,22 @@ import kotlin.test.assertNull
import kotlin.test.assertTrue
import kotlin.time.ExperimentalTime
import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.test.StandardTestDispatcher
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runTest
+import org.junit.Rule
@OptIn(ExperimentalCoroutinesApi::class, ExperimentalTime::class)
class PasswordEntryTest {
+ @get:Rule val coroutineTestRule: CoroutineTestRule = CoroutineTestRule()
private fun makeEntry(content: String) =
- PasswordEntry(fakeClock, testFinder, scope, content.encodeToByteArray())
+ PasswordEntry(
+ fakeClock,
+ testFinder,
+ coroutineTestRule.testDispatcherProvider,
+ TestScope(coroutineTestRule.testDispatcher),
+ content.encodeToByteArray(),
+ )
@Test
fun testGetPassword() {
@@ -125,19 +133,20 @@ class PasswordEntryTest {
@Test
@Ignore("Timing with runTest seems hard to implement right now")
- fun testGeneratesOtpFromTotpUri() =
- scope.runTest {
+ fun testGeneratesOtpFromTotpUri() {
+ runTest {
val entry = makeEntry("secret\nextra\n$TOTP_URI")
assertTrue(entry.hasTotp())
val code = entry.totp.value
assertNotNull(code) { "Generated OTP cannot be null" }
assertEquals("818800", code)
}
+ }
@Test
@Ignore("Timing with runTest seems hard to implement right now")
- fun testGeneratesOtpWithOnlyUriInFile() =
- scope.runTest {
+ fun testGeneratesOtpWithOnlyUriInFile() {
+ runTest {
val entry = makeEntry(TOTP_URI)
assertNull(entry.password)
assertTrue(entry.hasTotp())
@@ -145,6 +154,7 @@ class PasswordEntryTest {
assertNotNull(code) { "Generated OTP cannot be null" }
assertEquals("818800", code)
}
+ }
@Test
fun testOnlyLooksForUriInFirstLine() {
@@ -171,9 +181,6 @@ class PasswordEntryTest {
const val TOTP_URI =
"otpauth://totp/ACME%20Co:john@example.com?secret=HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ&issuer=ACME%20Co&algorithm=SHA1&digits=6&period=30"
- val dispatcher = StandardTestDispatcher()
- val scope = TestScope(dispatcher)
-
val fakeClock = TestUserClock()
// This implementation is hardcoded for the URI above.