android / android/codelab-android-datastore

"multiple instances" error when removing value during unit testing

Aperta
#48 7 commenti 8 reazioni 0 assegnatari Vedi su GitHub
Lingua principale
Kotlin
Stelle
240
Fork
113
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

When trying to remove some key from datastore-preferences during unittest I'm getting an error about "multiple instances" of the datastore.
The following code reproduces the problem:

`
import android.content.Context
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.PreferenceDataStoreFactory
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.stringPreferencesKey
import androidx.datastore.preferences.preferencesDataStoreFile
import androidx.test.core.app.ApplicationProvider
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.SupervisorJob
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner

@ExperimentalCoroutinesApi
@RunWith(RobolectricTestRunner::class)
class TestDataStore {

companion object {
private val DATASTORE_KEY = stringPreferencesKey("DATASTORE_KEY")
}

@get:Rule
val testCoroutineRule = TestCoroutineRule()

private lateinit var dataStore: DataStore

@Before
fun setup() {
val context = ApplicationProvider.getApplicationContext()
dataStore =
PreferenceDataStoreFactory.create(
scope = CoroutineScope(testCoroutineRule.testCoroutineDispatcher + SupervisorJob())
) {
context.preferencesDataStoreFile("preferences")
}
}

@Test
fun test() {
testCoroutineRule.runBlockingTest {
dataStore.edit { it[DATASTORE_KEY] = "team" }

dataStore.edit { it.remove(DATASTORE_KEY) }
}
}
}
`

The stacktrace:

`Unable to rename C:\Users\Cassio\AppData\Local\Temp\robolectric-Method_test8095984772844777287\com.nautiluslog.data.test-dataDir\files\datastore\preferences.preferences_pb.tmp.This likely means that there are multiple instances of DataStore for this file. Ensure that you are only creating a single instance of datastore for this file.
java.io.IOException: Unable to rename C:\Users\Cassio\AppData\Local\Temp\robolectric-Method_test8095984772844777287\com.nautiluslog.data.test-dataDir\files\datastore\preferences.preferences_pb.tmp.This likely means that there are multiple instances of DataStore for this file. Ensure that you are only creating a single instance of datastore for this file.
at androidx.datastore.core.SingleProcessDataStore.writeData$datastore_core(SingleProcessDataStore.kt:433)
at androidx.datastore.core.SingleProcessDataStore.transformAndWrite(SingleProcessDataStore.kt:410)
at androidx.datastore.core.SingleProcessDataStore.handleUpdate(SingleProcessDataStore.kt:276)
at androidx.datastore.core.SingleProcessDataStore.access$handleUpdate(SingleProcessDataStore.kt:76)
at androidx.datastore.core.SingleProcessDataStore$actor$3.invokeSuspend(SingleProcessDataStore.kt:242)
at androidx.datastore.core.SingleProcessDataStore$actor$3.invoke(SingleProcessDataStore.kt)
at androidx.datastore.core.SingleProcessDataStore$actor$3.invoke(SingleProcessDataStore.kt)
at androidx.datastore.core.SimpleActor$offer$2.invokeSuspend(SimpleActor.kt:122)
(Coroutine boundary)
at com.nautiluslog.data.repository.TestDataStore$test$1.invokeSuspend(TestDataStore.kt:54)
at com.nautiluslog.testutils.TestCoroutineRule$runBlockingTest$1.invokeSuspend(TestCoroutineRule.kt:30)
at kotlinx.coroutines.test.TestBuildersKt$runBlockingTest$deferred$1.invokeSuspend(TestBuilders.kt:50)`

Guida per i contributori

Apri la guida per i contributori

Direzione di ricerca

Inizia eseguendo il reproducer in TestDataStore.kt, in particolare il setup e le due chiamate a dataStore.edit, usando TestCoroutineRule da TestCoroutineRule.kt. Leggi le posizioni dello stack trace in SingleProcessDataStore.kt per comprendere la scrittura non riuscita e la ridenominazione; il lavoro è completato quando il test può rimuovere DATASTORE_KEY senza l’errore relativo a più istanze o alla ridenominazione.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
android, kotlin
Ambito
database, mobile
Tipo di issue
Bug
Difficoltà
3/5
Tempo stimato
1-2 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
45/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.