Fix test issue: "java.security.KeyStoreException: AndroidKeyStore not found"
This commit is contained in:
@@ -15,16 +15,23 @@ import io.element.android.libraries.matrix.test.A_SECRET
|
|||||||
import io.element.android.libraries.pushproviders.api.Distributor
|
import io.element.android.libraries.pushproviders.api.Distributor
|
||||||
import io.element.android.libraries.pushproviders.unifiedpush.registration.EndpointRegistrationHandler
|
import io.element.android.libraries.pushproviders.unifiedpush.registration.EndpointRegistrationHandler
|
||||||
import io.element.android.libraries.pushproviders.unifiedpush.registration.RegistrationResult
|
import io.element.android.libraries.pushproviders.unifiedpush.registration.RegistrationResult
|
||||||
|
import io.element.android.tests.testutils.fake.FakeAndroidKeyStore
|
||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.test.TestScope
|
import kotlinx.coroutines.test.TestScope
|
||||||
import kotlinx.coroutines.test.runTest
|
import kotlinx.coroutines.test.runTest
|
||||||
|
import org.junit.Before
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
import org.robolectric.RobolectricTestRunner
|
import org.robolectric.RobolectricTestRunner
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner::class)
|
@RunWith(RobolectricTestRunner::class)
|
||||||
class DefaultRegisterUnifiedPushUseCaseTest {
|
class DefaultRegisterUnifiedPushUseCaseTest {
|
||||||
|
@Before
|
||||||
|
fun setup() {
|
||||||
|
FakeAndroidKeyStore.setup
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `test registration successful`() = runTest {
|
fun `test registration successful`() = runTest {
|
||||||
val endpointRegistrationHandler = EndpointRegistrationHandler()
|
val endpointRegistrationHandler = EndpointRegistrationHandler()
|
||||||
|
|||||||
@@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2025 Element Creations Ltd.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
|
||||||
|
* Please see LICENSE files in the repository root for full details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.element.android.tests.testutils.fake
|
||||||
|
|
||||||
|
import java.io.InputStream
|
||||||
|
import java.io.OutputStream
|
||||||
|
import java.security.Key
|
||||||
|
import java.security.KeyStore
|
||||||
|
import java.security.KeyStoreSpi
|
||||||
|
import java.security.Provider
|
||||||
|
import java.security.SecureRandom
|
||||||
|
import java.security.Security
|
||||||
|
import java.security.cert.Certificate
|
||||||
|
import java.security.spec.AlgorithmParameterSpec
|
||||||
|
import java.util.Date
|
||||||
|
import java.util.Enumeration
|
||||||
|
import javax.crypto.KeyGenerator
|
||||||
|
import javax.crypto.KeyGeneratorSpi
|
||||||
|
import javax.crypto.SecretKey
|
||||||
|
|
||||||
|
// Source - https://stackoverflow.com/questions/38213748/using-the-android-keystore-in-robolectric-tests/75763240#75763240
|
||||||
|
// Posted by Victor Oliveira
|
||||||
|
// Retrieved 2025-12-19, License - CC BY-SA 4.0
|
||||||
|
|
||||||
|
object FakeAndroidKeyStore {
|
||||||
|
val setup by lazy {
|
||||||
|
Security.addProvider(object : Provider("AndroidKeyStore", 1.0, "") {
|
||||||
|
init {
|
||||||
|
put("KeyStore.AndroidKeyStore", FakeKeyStore::class.java.name)
|
||||||
|
put("KeyGenerator.AES", FakeAesKeyGenerator::class.java.name)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
class FakeKeyStore : KeyStoreSpi() {
|
||||||
|
private val wrapped = KeyStore.getInstance(KeyStore.getDefaultType())
|
||||||
|
|
||||||
|
override fun engineIsKeyEntry(alias: String?): Boolean = wrapped.isKeyEntry(alias)
|
||||||
|
override fun engineIsCertificateEntry(alias: String?): Boolean = wrapped.isCertificateEntry(alias)
|
||||||
|
override fun engineGetCertificate(alias: String?): Certificate = wrapped.getCertificate(alias)
|
||||||
|
override fun engineGetCreationDate(alias: String?): Date = wrapped.getCreationDate(alias)
|
||||||
|
override fun engineDeleteEntry(alias: String?) = wrapped.deleteEntry(alias)
|
||||||
|
override fun engineSetKeyEntry(alias: String?, key: Key?, password: CharArray?, chain: Array<out Certificate>?) =
|
||||||
|
wrapped.setKeyEntry(alias, key, password, chain)
|
||||||
|
|
||||||
|
override fun engineSetKeyEntry(alias: String?, key: ByteArray?, chain: Array<out Certificate>?) = wrapped.setKeyEntry(alias, key, chain)
|
||||||
|
override fun engineStore(stream: OutputStream?, password: CharArray?) = wrapped.store(stream, password)
|
||||||
|
override fun engineSize(): Int = wrapped.size()
|
||||||
|
override fun engineAliases(): Enumeration<String> = wrapped.aliases()
|
||||||
|
override fun engineContainsAlias(alias: String?): Boolean = wrapped.containsAlias(alias)
|
||||||
|
override fun engineLoad(stream: InputStream?, password: CharArray?) = wrapped.load(stream, password)
|
||||||
|
override fun engineGetCertificateChain(alias: String?): Array<Certificate> = wrapped.getCertificateChain(alias)
|
||||||
|
override fun engineSetCertificateEntry(alias: String?, cert: Certificate?) = wrapped.setCertificateEntry(alias, cert)
|
||||||
|
override fun engineGetCertificateAlias(cert: Certificate?): String = wrapped.getCertificateAlias(cert)
|
||||||
|
override fun engineGetKey(alias: String?, password: CharArray?): Key = wrapped.getKey(alias, password)
|
||||||
|
}
|
||||||
|
|
||||||
|
class FakeAesKeyGenerator : KeyGeneratorSpi() {
|
||||||
|
private val wrapped = KeyGenerator.getInstance("AES")
|
||||||
|
|
||||||
|
override fun engineInit(random: SecureRandom?) = Unit
|
||||||
|
override fun engineInit(params: AlgorithmParameterSpec?, random: SecureRandom?) = Unit
|
||||||
|
override fun engineInit(keysize: Int, random: SecureRandom?) = Unit
|
||||||
|
override fun engineGenerateKey(): SecretKey = wrapped.generateKey()
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user