blob: 88163b9e8b8137a92bd9dec28f0eb6cc47cfc903 [file] [log] [blame]
/*
* Copyright 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 androidx.datastore.core
import androidx.datastore.TestingSerializerConfig
import androidx.datastore.core.handlers.ReplaceFileCorruptionHandler
import androidx.kruth.assertThat
import java.io.File
import java.util.concurrent.TimeUnit
import kotlin.test.BeforeTest
import kotlin.test.Test
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.runTest
import org.junit.Rule
import org.junit.rules.TemporaryFolder
import org.junit.rules.Timeout
@OptIn(ExperimentalCoroutinesApi::class)
class DataStoreFactoryTest {
@get:Rule
val timeout = Timeout(10, TimeUnit.SECONDS)
@get:Rule
val tmp = TemporaryFolder()
private lateinit var testFile: File
private lateinit var dataStoreScope: TestScope
@BeforeTest
fun setUp() {
testFile = tmp.newFile()
dataStoreScope = TestScope(UnconfinedTestDispatcher())
}
@Test
fun testNewInstance() = runTest {
val store = DataStoreFactory.create(
serializer = TestingSerializer(),
scope = dataStoreScope
) { testFile }
val expectedByte = 123.toByte()
assertThat(
store.updateData {
expectedByte
}
).isEqualTo(expectedByte)
assertThat(store.data.first()).isEqualTo(expectedByte)
}
@Test
fun testCorruptionHandlerInstalled() = runTest {
val valueToReplace = 123.toByte()
val store = DataStoreFactory.create(
serializer = TestingSerializer(
TestingSerializerConfig(failReadWithCorruptionException = true)
),
corruptionHandler = ReplaceFileCorruptionHandler<Byte> {
valueToReplace
},
scope = dataStoreScope
) { testFile }
assertThat(store.data.first()).isEqualTo(valueToReplace)
}
@Test
fun testMigrationsInstalled() = runTest {
val migratedByte = 1
val migratePlus2 = object : DataMigration<Byte> {
override suspend fun shouldMigrate(currentData: Byte) = true
override suspend fun migrate(currentData: Byte) = currentData.inc().inc()
override suspend fun cleanUp() {}
}
val migrateMinus1 = object : DataMigration<Byte> {
override suspend fun shouldMigrate(currentData: Byte) = true
override suspend fun migrate(currentData: Byte) = currentData.dec()
override suspend fun cleanUp() {}
}
val store = DataStoreFactory.create(
serializer = TestingSerializer(),
migrations = listOf(migratePlus2, migrateMinus1),
scope = dataStoreScope
) { testFile }
assertThat(store.data.first()).isEqualTo(migratedByte)
}
}