diff --git a/README.md b/README.md index 6f8103d..d4edb92 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ The MIRACL Trust Android SDK provides the following functionalities: ```kotlin dependencies { - implementation("com.miracl:trust-sdk-android:1.12.0") + implementation("com.miracl:trust-sdk-android:1.13.0") } ``` @@ -38,7 +38,7 @@ The MIRACL Trust Android SDK provides the following functionalities: ```groovy dependencies { - implementation "com.miracl:trust-sdk-android:1.12.0" + implementation "com.miracl:trust-sdk-android:1.13.0" } ``` diff --git a/miracl-sdk/api/miracl-sdk.api b/miracl-sdk/api/miracl-sdk.api index 491ff9f..3fc52c0 100644 --- a/miracl-sdk/api/miracl-sdk.api +++ b/miracl-sdk/api/miracl-sdk.api @@ -25,7 +25,7 @@ public final class com/miracl/trust/MIRACLSuccess : com/miracl/trust/MIRACLResul public final class com/miracl/trust/MIRACLTrust { public static final field Companion Lcom/miracl/trust/MIRACLTrust$Companion; - public synthetic fun (Landroid/content/Context;Lcom/miracl/trust/configuration/Configuration;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Lcom/miracl/trust/configuration/Configuration;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun abortAuthenticationSession (Lcom/miracl/trust/session/AuthenticationSessionDetails;Lcom/miracl/trust/delegate/ResultHandler;)V public final fun abortCrossDeviceSession (Lcom/miracl/trust/session/CrossDeviceSession;Lcom/miracl/trust/delegate/ResultHandler;)V public final synthetic fun abortCrossDeviceSession (Lcom/miracl/trust/session/CrossDeviceSession;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; @@ -83,7 +83,13 @@ public final class com/miracl/trust/MIRACLTrust { public final class com/miracl/trust/MIRACLTrust$Companion { public final fun configure (Landroid/content/Context;Lcom/miracl/trust/configuration/Configuration;)V + public final fun createInstance (Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)Lcom/miracl/trust/MIRACLTrust; public final fun getInstance ()Lcom/miracl/trust/MIRACLTrust; + public final fun getUsers (Landroid/content/Context;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun setDefaultConfiguration (Lcom/miracl/trust/configuration/Configuration;)V +} + +public abstract interface annotation class com/miracl/trust/MIRACLTrustAuthenticatorApi : java/lang/annotation/Annotation { } public abstract class com/miracl/trust/authentication/AuthenticationException : java/lang/Exception { @@ -145,6 +151,7 @@ public final class com/miracl/trust/configuration/Configuration { } public final class com/miracl/trust/configuration/Configuration$Builder { + public fun ()V public fun (Ljava/lang/String;)V public fun (Ljava/lang/String;Ljava/lang/String;)V public synthetic fun (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V diff --git a/miracl-sdk/build.gradle b/miracl-sdk/build.gradle index e474e22..a6a1f14 100644 --- a/miracl-sdk/build.gradle +++ b/miracl-sdk/build.gradle @@ -13,7 +13,7 @@ plugins { alias libs.plugins.jreleaser } -version = '1.12.0' +version = '1.13.0' android { namespace 'com.miracl.trust' diff --git a/miracl-sdk/src/androidTest/java/com/miracl/trust/session/SessionManagerTest.kt b/miracl-sdk/src/androidTest/java/com/miracl/trust/session/SessionManagerTest.kt index 1bdb226..f9792f8 100644 --- a/miracl-sdk/src/androidTest/java/com/miracl/trust/session/SessionManagerTest.kt +++ b/miracl-sdk/src/androidTest/java/com/miracl/trust/session/SessionManagerTest.kt @@ -8,6 +8,8 @@ import com.miracl.trust.network.ApiRequestExecutor import com.miracl.trust.network.ApiSettings import com.miracl.trust.network.HttpsURLConnectionRequestExecutor import com.miracl.trust.util.json.KotlinxSerializationJsonUtil +import com.miracl.trust.util.log.DefaultLogger +import com.miracl.trust.util.log.Logger import com.miracl.trust.utilities.AccessIdResponse import com.miracl.trust.utilities.MIRACLService import com.miracl.trust.utilities.randomPinLength @@ -26,14 +28,15 @@ class SessionManagerTest { @Before fun setUp() = runBlocking { - val httpRequestExecutor = HttpsURLConnectionRequestExecutor(10, 10) + val logger = DefaultLogger(Logger.LoggingLevel.NONE) + val httpRequestExecutor = HttpsURLConnectionRequestExecutor(logger, 10, 10) val apiSettings = ApiSettings(projectUrl) val apiRequestExecutor = ApiRequestExecutor(httpRequestExecutor, KotlinxSerializationJsonUtil) val sessionApi = SessionApiManager(apiRequestExecutor, KotlinxSerializationJsonUtil, apiSettings) - sessionManager = SessionManager(sessionApi) + sessionManager = SessionManager(sessionApi, logger) } @Test diff --git a/miracl-sdk/src/androidTest/java/com/miracl/trust/utilities/MIRACLService.kt b/miracl-sdk/src/androidTest/java/com/miracl/trust/utilities/MIRACLService.kt index a564e77..6e9cd1f 100644 --- a/miracl-sdk/src/androidTest/java/com/miracl/trust/utilities/MIRACLService.kt +++ b/miracl-sdk/src/androidTest/java/com/miracl/trust/utilities/MIRACLService.kt @@ -7,6 +7,8 @@ import com.miracl.trust.network.HttpMethod import com.miracl.trust.network.HttpsURLConnectionRequestExecutor import com.miracl.trust.signing.Signature import com.miracl.trust.test.BuildConfig +import com.miracl.trust.util.log.DefaultLogger +import com.miracl.trust.util.log.Logger import kotlinx.coroutines.runBlocking import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -67,7 +69,12 @@ data class VerifySignatureResponse( ) object MIRACLService { - private val requestExecutor = HttpsURLConnectionRequestExecutor(10, 10) + private val requestExecutor = HttpsURLConnectionRequestExecutor( + logger = DefaultLogger(Logger.LoggingLevel.NONE), + connectTimeout = 10, + readTimeout = 10 + ) + private val json = Json { encodeDefaults = true ignoreUnknownKeys = true diff --git a/miracl-sdk/src/main/java/com/miracl/trust/MIRACLTrust.kt b/miracl-sdk/src/main/java/com/miracl/trust/MIRACLTrust.kt index 6193623..12d9f44 100644 --- a/miracl-sdk/src/main/java/com/miracl/trust/MIRACLTrust.kt +++ b/miracl-sdk/src/main/java/com/miracl/trust/MIRACLTrust.kt @@ -6,6 +6,8 @@ import androidx.annotation.VisibleForTesting import com.miracl.trust.authentication.* import com.miracl.trust.authentication.AuthenticatorScopes import com.miracl.trust.configuration.* +import com.miracl.trust.configuration.factory.ConfigurationFactory +import com.miracl.trust.configuration.factory.DefaultConfigurationFactory import com.miracl.trust.delegate.PinProvider import com.miracl.trust.delegate.ResultHandler import com.miracl.trust.factory.ComponentFactory @@ -20,9 +22,9 @@ import com.miracl.trust.session.SessionManagerContract import com.miracl.trust.signing.* import com.miracl.trust.storage.UserStorageException import com.miracl.trust.storage.UserStorage +import com.miracl.trust.storage.room.RoomDatabaseModule import com.miracl.trust.util.UrlValidator import com.miracl.trust.util.json.KotlinxSerializationJsonUtil -import com.miracl.trust.util.log.Logger import com.miracl.trust.util.log.LoggerConstants import com.miracl.trust.util.toUserDto import com.miracl.trust.util.toUser @@ -39,14 +41,24 @@ import kotlin.jvm.Throws */ public class MIRACLTrust private constructor( context: Context, + projectId: String, + projectUrl: String, configuration: Configuration ) { public companion object { - internal var logger: Logger? = null - private set - private const val NOT_INITIALIZED_EXCEPTION = "MIRACLTrust SDK not initialized!" + @VisibleForTesting + internal var configurationFactory: ConfigurationFactory = DefaultConfigurationFactory() + + @Volatile + @VisibleForTesting + internal var defaultUserStorage: UserStorage? = null + + @Volatile + @VisibleForTesting + internal var defaultConfiguration: Configuration? = null + private lateinit var instance: MIRACLTrust @JvmStatic @@ -67,11 +79,82 @@ public class MIRACLTrust private constructor( */ @JvmStatic public fun configure(context: Context, configuration: Configuration) { - instance = MIRACLTrust(context, configuration) + val projectId = requireNotNull(configuration.projectId) { + "MIRACLTrust SDK: Project ID is missing. Pass a valid Project ID to Configuration.Builder." + } + + configuration.userStorage?.loadStorage() + instance = MIRACLTrust( + projectId = projectId, + projectUrl = configuration.projectUrl, + context = context, + configuration = configuration + ) + } + + //region Authenticator API + /** + * This is an experimental API. + * @suppress + */ + @MIRACLTrustAuthenticatorApi + public fun setDefaultConfiguration(configuration: Configuration) { + configuration.userStorage?.loadStorage() + this.defaultConfiguration = configuration + } + + /** + * This is an experimental API. + * @suppress + */ + @MIRACLTrustAuthenticatorApi + public fun createInstance( + context: Context, + projectId: String, + projectUrl: String + ): MIRACLTrust { + require(projectId.isNotEmpty()) { + "MIRACLTrust SDK: Project ID cannot be empty. Pass a valid Project ID when calling createInstance()." + } + + require(UrlValidator.isValid(projectUrl)) { + "MIRACLTrust SDK: Project URL is invalid. Pass a valid URL when calling createInstance()." + } + + val configuration = defaultConfiguration ?: configurationFactory.create() + + return MIRACLTrust(context, projectId, projectUrl, configuration) } + + /** + * This is an experimental API. + * @suppress + */ + @MIRACLTrustAuthenticatorApi + public suspend fun getUsers(context: Context): List { + val userStorage = + defaultConfiguration?.userStorage ?: defaultUserStorage ?: synchronized(this) { + val userStorage = defaultConfiguration?.userStorage ?: defaultUserStorage + + userStorage ?: RoomDatabaseModule(context, "").userStorage().also { + it.loadStorage() + defaultUserStorage = it + } + } + + return withContext(Dispatchers.IO) { + try { + userStorage.all().map { it.toUser() } + } catch (ex: Exception) { + throw UserStorageException(ex) + } + } + } + //endregion } //region Properties + private val logger = configuration.logger private val apiSettings: ApiSettings private val verificator: Verificator private val registrator: RegistratorContract @@ -87,33 +170,35 @@ public class MIRACLTrust private constructor( @VisibleForTesting internal var resultHandlerDispatcher: CoroutineDispatcher = Dispatchers.Main - private val deviceName: String = configuration.deviceName + @VisibleForTesting + internal val deviceName: String = configuration.deviceName /** Project ID setting for the application in the MIRACL Trust platform. */ - public var projectId: String = configuration.projectId + public var projectId: String = projectId private set //endregion //region Initialization init { - logger = configuration.logger - val apiRequestExecutor = ApiRequestExecutor( configuration.httpRequestExecutor, KotlinxSerializationJsonUtil, configuration.applicationInfo ) - val componentFactory = configuration.componentFactory ?: ComponentFactory(context) - apiSettings = ApiSettings(configuration.projectUrl) + val componentFactory = configuration.componentFactory ?: ComponentFactory(context, logger) + apiSettings = ApiSettings(projectUrl) miraclTrustCoroutineContext = configuration.miraclCoroutineContext miraclTrustScope = CoroutineScope(SupervisorJob() + configuration.miraclCoroutineContext) - userStorage = configuration.userStorage - ?: componentFactory.defaultUserStorage(configuration.projectId) - userStorage.loadStorage() + userStorage = configuration.userStorage ?: defaultUserStorage ?: synchronized(this) { + defaultUserStorage ?: componentFactory.defaultUserStorage(projectId).also { + it.loadStorage() + defaultUserStorage = it + } + } val registrationApi = RegistrationApiManager( apiRequestExecutor = apiRequestExecutor, @@ -1687,7 +1772,7 @@ public class MIRACLTrust private constructor( //region Private private fun logError(tag: String, exception: Exception) { - logger?.error( + logger.error( tag, LoggerConstants.FLOW_ERROR .format( @@ -1698,7 +1783,7 @@ public class MIRACLTrust private constructor( private fun T.logIfError(tag: String): T { if (this is MIRACLError<*, *>) { - logger?.error( + logger.error( tag, LoggerConstants.FLOW_ERROR .format( diff --git a/miracl-sdk/src/main/java/com/miracl/trust/MIRACLTrustAuthenticatorApi.kt b/miracl-sdk/src/main/java/com/miracl/trust/MIRACLTrustAuthenticatorApi.kt new file mode 100644 index 0000000..7bb12af --- /dev/null +++ b/miracl-sdk/src/main/java/com/miracl/trust/MIRACLTrustAuthenticatorApi.kt @@ -0,0 +1,9 @@ +package com.miracl.trust + +/** + * This is an experimental API. + * @suppress + */ +@RequiresOptIn +@Retention(AnnotationRetention.BINARY) +public annotation class MIRACLTrustAuthenticatorApi diff --git a/miracl-sdk/src/main/java/com/miracl/trust/authentication/Authentication.kt b/miracl-sdk/src/main/java/com/miracl/trust/authentication/Authentication.kt index cbc56b2..7854886 100644 --- a/miracl-sdk/src/main/java/com/miracl/trust/authentication/Authentication.kt +++ b/miracl-sdk/src/main/java/com/miracl/trust/authentication/Authentication.kt @@ -15,7 +15,7 @@ import com.miracl.trust.session.SessionApi import com.miracl.trust.storage.UserStorage import com.miracl.trust.util.acquirePin import com.miracl.trust.util.hexStringToByteArray -import com.miracl.trust.util.log.Loggable +import com.miracl.trust.util.log.Logger import com.miracl.trust.util.log.LoggerConstants import com.miracl.trust.util.toUserDto import com.miracl.trust.util.toHexString @@ -74,8 +74,9 @@ internal class Authenticator( private val sessionApi: SessionApi, private val crypto: Crypto, private val registrator: RegistratorContract, - private val userStorage: UserStorage -) : AuthenticatorContract, Loggable { + private val userStorage: UserStorage, + private val logger: Logger +) : AuthenticatorContract { companion object { const val PUSH_NOTIFICATION_PROJECT_ID = "projectID" const val PUSH_NOTIFICATION_USER_ID = "userID" @@ -320,7 +321,7 @@ internal class Authenticator( try { userStorage.update(user.revoke().toUserDto()) } catch (ex: Exception) { - logger?.error( + logger.error( LoggerConstants.AUTHENTICATOR_TAG, LoggerConstants.AuthenticatorOperations.REVOKE_USER_ERROR.format( ex @@ -330,6 +331,6 @@ internal class Authenticator( } private fun logOperation(operation: String) { - logger?.info(LoggerConstants.AUTHENTICATOR_TAG, operation) + logger.info(LoggerConstants.AUTHENTICATOR_TAG, operation) } } \ No newline at end of file diff --git a/miracl-sdk/src/main/java/com/miracl/trust/configuration/Configuration.kt b/miracl-sdk/src/main/java/com/miracl/trust/configuration/Configuration.kt index c67d23f..fe07d60 100644 --- a/miracl-sdk/src/main/java/com/miracl/trust/configuration/Configuration.kt +++ b/miracl-sdk/src/main/java/com/miracl/trust/configuration/Configuration.kt @@ -1,6 +1,7 @@ package com.miracl.trust.configuration import android.os.Build +import com.miracl.trust.MIRACLTrustAuthenticatorApi import com.miracl.trust.factory.ComponentFactory import com.miracl.trust.network.HttpRequestExecutor import com.miracl.trust.network.HttpsURLConnectionRequestExecutor @@ -19,7 +20,7 @@ import kotlin.jvm.Throws * Instance is created through its [Builder]. */ public class Configuration private constructor( - internal val projectId: String, + internal val projectId: String?, internal val projectUrl: String, internal val deviceName: String, internal val applicationInfo: String? = null, @@ -69,16 +70,12 @@ public class Configuration private constructor( ")" } - /** - * Builds a [Configuration] object. - * - * @param projectId The unique identifier for your MIRACL Trust project. - * @param projectUrl The MIRACL Trust Project URL that is used for communication with the MIRACL Trust API. - */ - public class Builder @JvmOverloads constructor( - internal val projectId: String, - internal val projectUrl: String = DEFAULT_PLATFORM_URL - ) { + /** Builds a [Configuration] object. */ + public class Builder @MIRACLTrustAuthenticatorApi public constructor() { + internal var projectId: String? = null + private set + internal var projectUrl: String = DEFAULT_PLATFORM_URL + private set internal lateinit var deviceNameValue: String private set internal var applicationInfo: String? = null @@ -100,6 +97,19 @@ public class Configuration private constructor( internal var readTimeout: Int = DEFAULT_READ_TIMEOUT_SECONDS private set + /** + * Creates a [Builder] object. + * + * @param projectId The unique identifier for your MIRACL Trust project. + * @param projectUrl The MIRACL Trust Project URL that is used for communication with the MIRACL Trust API. + */ + @OptIn(MIRACLTrustAuthenticatorApi::class) + @JvmOverloads + public constructor(projectId: String, projectUrl: String = DEFAULT_PLATFORM_URL) : this() { + this.projectId = projectId + this.projectUrl = projectUrl + } + internal fun componentFactory(componentFactory: ComponentFactory) = apply { this.componentFactory = componentFactory } @@ -172,7 +182,7 @@ public class Configuration private constructor( /** Returns a [com.miracl.trust.configuration.Configuration] object. */ @Throws(ConfigurationException::class) public fun build(): Configuration { - if (projectId.isBlank()) { + if (projectId?.isBlank() == true) { throw ConfigurationException.EmptyProjectId } @@ -184,17 +194,17 @@ public class Configuration private constructor( deviceNameValue = Build.MODEL } - if (!this::httpRequestExecutorValue.isInitialized) { - httpRequestExecutorValue = - HttpsURLConnectionRequestExecutor(connectTimeout, readTimeout) - } - if (!this::loggerValue.isInitialized) { val loggingLevel = loggingLevel ?: Logger.LoggingLevel.NONE loggerValue = DefaultLogger(loggingLevel) this.loggingLevel = loggingLevel } + if (!this::httpRequestExecutorValue.isInitialized) { + httpRequestExecutorValue = + HttpsURLConnectionRequestExecutor(loggerValue, connectTimeout, readTimeout) + } + return Configuration(this) } } diff --git a/miracl-sdk/src/main/java/com/miracl/trust/configuration/factory/ConfigurationFactory.kt b/miracl-sdk/src/main/java/com/miracl/trust/configuration/factory/ConfigurationFactory.kt new file mode 100644 index 0000000..71953df --- /dev/null +++ b/miracl-sdk/src/main/java/com/miracl/trust/configuration/factory/ConfigurationFactory.kt @@ -0,0 +1,7 @@ +package com.miracl.trust.configuration.factory + +import com.miracl.trust.configuration.Configuration + +internal interface ConfigurationFactory { + fun create(): Configuration +} \ No newline at end of file diff --git a/miracl-sdk/src/main/java/com/miracl/trust/configuration/factory/DefaultConfigurationFactory.kt b/miracl-sdk/src/main/java/com/miracl/trust/configuration/factory/DefaultConfigurationFactory.kt new file mode 100644 index 0000000..df0b1c4 --- /dev/null +++ b/miracl-sdk/src/main/java/com/miracl/trust/configuration/factory/DefaultConfigurationFactory.kt @@ -0,0 +1,11 @@ +package com.miracl.trust.configuration.factory + +import com.miracl.trust.MIRACLTrustAuthenticatorApi +import com.miracl.trust.configuration.Configuration + +internal class DefaultConfigurationFactory : ConfigurationFactory { + @OptIn(MIRACLTrustAuthenticatorApi::class) + override fun create(): Configuration { + return Configuration.Builder().build() + } +} \ No newline at end of file diff --git a/miracl-sdk/src/main/java/com/miracl/trust/crypto/Crypto.kt b/miracl-sdk/src/main/java/com/miracl/trust/crypto/Crypto.kt index d14f354..1e54e76 100644 --- a/miracl-sdk/src/main/java/com/miracl/trust/crypto/Crypto.kt +++ b/miracl-sdk/src/main/java/com/miracl/trust/crypto/Crypto.kt @@ -3,7 +3,7 @@ package com.miracl.trust.crypto import com.miracl.trust.MIRACLError import com.miracl.trust.MIRACLResult import com.miracl.trust.MIRACLSuccess -import com.miracl.trust.util.log.Loggable +import com.miracl.trust.util.log.Logger import com.miracl.trust.util.log.LoggerConstants.CRYPTO_OPERATION_FINISHED import com.miracl.trust.util.log.LoggerConstants.CRYPTO_OPERATION_STARTED import com.miracl.trust.util.log.LoggerConstants.CRYPTO_TAG @@ -15,8 +15,9 @@ internal enum class SupportedEllipticCurves { } internal class Crypto( + private val logger: Logger, private val cryptoExternal: CryptoExternalContract = CryptoExternal() -) : Loggable { +) { fun getClientPass1Proof( mpinId: ByteArray, token: ByteArray, @@ -121,10 +122,10 @@ internal class Crypto( } private fun logOperationStarted(operationName: String) { - logger?.debug(CRYPTO_TAG, CRYPTO_OPERATION_STARTED.format(operationName)) + logger.debug(CRYPTO_TAG, CRYPTO_OPERATION_STARTED.format(operationName)) } private fun logOperationFinished(operationName: String) { - logger?.debug(CRYPTO_TAG, CRYPTO_OPERATION_FINISHED.format(operationName)) + logger.debug(CRYPTO_TAG, CRYPTO_OPERATION_FINISHED.format(operationName)) } } diff --git a/miracl-sdk/src/main/java/com/miracl/trust/factory/ComponentFactory.kt b/miracl-sdk/src/main/java/com/miracl/trust/factory/ComponentFactory.kt index 66e894f..a101d6c 100644 --- a/miracl-sdk/src/main/java/com/miracl/trust/factory/ComponentFactory.kt +++ b/miracl-sdk/src/main/java/com/miracl/trust/factory/ComponentFactory.kt @@ -10,11 +10,13 @@ import com.miracl.trust.session.* import com.miracl.trust.signing.DocumentSigner import com.miracl.trust.storage.UserStorage import com.miracl.trust.storage.room.RoomDatabaseModule +import com.miracl.trust.util.log.Logger internal class ComponentFactory( - private val context: Context + private val context: Context, + private val logger: Logger ) { - private val crypto: Crypto = Crypto() + private val crypto: Crypto = Crypto(logger) fun defaultUserStorage(projectId: String): UserStorage = RoomDatabaseModule(context, projectId).userStorage() @@ -23,7 +25,7 @@ internal class ComponentFactory( authenticator: AuthenticatorContract, verificationApi: VerificationApi, userStorage: UserStorage - ): Verificator = Verificator(authenticator, verificationApi, userStorage) + ): Verificator = Verificator(authenticator, verificationApi, userStorage, logger) fun createRegistrator( registrationApi: RegistrationApi, @@ -32,7 +34,8 @@ internal class ComponentFactory( Registrator( registrationApi, crypto, - userStorage + userStorage, + logger ) fun createAuthenticator( @@ -46,7 +49,8 @@ internal class ComponentFactory( sessionApi, crypto, registrator, - userStorage + userStorage, + logger ) fun createDocumentSigner( @@ -54,15 +58,15 @@ internal class ComponentFactory( userStorage: UserStorage, crossDeviceSessionApi: CrossDeviceSessionApi ): DocumentSigner = - DocumentSigner(crypto, authenticator, userStorage, crossDeviceSessionApi) + DocumentSigner(crypto, authenticator, userStorage, crossDeviceSessionApi, logger) fun createSessionManager( sessionApi: SessionApi ): SessionManagerContract = - SessionManager(sessionApi) + SessionManager(sessionApi, logger) fun createCrossDeviceSessionManager( crossDeviceSessionApi: CrossDeviceSessionApi ): CrossDeviceSessionManagerContract = - CrossDeviceSessionManager(crossDeviceSessionApi) + CrossDeviceSessionManager(crossDeviceSessionApi, logger) } diff --git a/miracl-sdk/src/main/java/com/miracl/trust/network/HttpsURLConnectionRequestExecutor.kt b/miracl-sdk/src/main/java/com/miracl/trust/network/HttpsURLConnectionRequestExecutor.kt index 6d48eac..7dcd8f0 100644 --- a/miracl-sdk/src/main/java/com/miracl/trust/network/HttpsURLConnectionRequestExecutor.kt +++ b/miracl-sdk/src/main/java/com/miracl/trust/network/HttpsURLConnectionRequestExecutor.kt @@ -4,7 +4,7 @@ import com.miracl.trust.MIRACLError import com.miracl.trust.MIRACLResult import com.miracl.trust.MIRACLSuccess import com.miracl.trust.MIRACLTrust -import com.miracl.trust.util.log.Loggable +import com.miracl.trust.util.log.Logger import com.miracl.trust.util.log.LoggerConstants import com.miracl.trust.util.log.LoggerConstants.NETWORK_TAG import java.io.* @@ -26,9 +26,10 @@ internal class DefaultHttpConnectionBuilder : HttpURLConnectionBuilder { * Provides implementation of the HttpRequestExecutor that uses [HttpURLConnection]. */ internal class HttpsURLConnectionRequestExecutor( + private val logger: Logger, connectTimeout: Int, readTimeout: Int -) : HttpRequestExecutor, Loggable { +) : HttpRequestExecutor { companion object { private const val ENCODING = "UTF-8" private const val MEDIA_TYPE = "application/json; charset=utf-8" @@ -56,7 +57,7 @@ internal class HttpsURLConnectionRequestExecutor( try { urlConnection = buildURLConnection(apiRequest) - logger?.debug( + logger.debug( NETWORK_TAG, LoggerConstants.NETWORK_REQUEST.format( urlConnection.requestMethod, @@ -73,7 +74,7 @@ internal class HttpsURLConnectionRequestExecutor( } ) - logger?.debug( + logger.debug( NETWORK_TAG, LoggerConstants.NETWORK_RESPONSE.format( urlConnection.requestMethod, @@ -94,7 +95,7 @@ internal class HttpsURLConnectionRequestExecutor( } } catch (ex: Exception) { if (ex is IOException) { - logger?.error(NETWORK_TAG, ex.toString()) + logger.error(NETWORK_TAG, ex.toString()) } return MIRACLError(HttpRequestExecutorException.ExecutionError(cause = ex)) @@ -117,7 +118,7 @@ internal class HttpsURLConnectionRequestExecutor( apiRequest.body?.also { if (apiRequest.method == HttpMethod.GET) { - logger?.info(NETWORK_TAG, HTTP_METHOD_NOT_EXPECTED_TO_HAVE_A_BODY_LOG) + logger.info(NETWORK_TAG, HTTP_METHOD_NOT_EXPECTED_TO_HAVE_A_BODY_LOG) } urlConnection.setRequestProperty( diff --git a/miracl-sdk/src/main/java/com/miracl/trust/registration/Registration.kt b/miracl-sdk/src/main/java/com/miracl/trust/registration/Registration.kt index a7f2125..34cdb39 100644 --- a/miracl-sdk/src/main/java/com/miracl/trust/registration/Registration.kt +++ b/miracl-sdk/src/main/java/com/miracl/trust/registration/Registration.kt @@ -13,7 +13,7 @@ import com.miracl.trust.model.User import com.miracl.trust.storage.UserStorage import com.miracl.trust.util.acquirePin import com.miracl.trust.util.hexStringToByteArray -import com.miracl.trust.util.log.Loggable +import com.miracl.trust.util.log.Logger import com.miracl.trust.util.log.LoggerConstants import com.miracl.trust.util.toUserDto import com.miracl.trust.util.toHexString @@ -34,8 +34,9 @@ internal interface RegistratorContract { internal class Registrator( private val registrationApi: RegistrationApi, private val crypto: Crypto, - private val userStorage: UserStorage -) : RegistratorContract, Loggable { + private val userStorage: UserStorage, + private val logger: Logger +) : RegistratorContract { companion object { internal const val MIN_PIN_LENGTH = 4 internal const val MAX_PIN_LENGTH = 6 @@ -283,6 +284,6 @@ internal class Registrator( } private fun logOperation(operation: String) { - logger?.info(LoggerConstants.REGISTRATOR_TAG, operation) + logger.info(LoggerConstants.REGISTRATOR_TAG, operation) } } diff --git a/miracl-sdk/src/main/java/com/miracl/trust/registration/Verificator.kt b/miracl-sdk/src/main/java/com/miracl/trust/registration/Verificator.kt index 30432e3..d87ffed 100644 --- a/miracl-sdk/src/main/java/com/miracl/trust/registration/Verificator.kt +++ b/miracl-sdk/src/main/java/com/miracl/trust/registration/Verificator.kt @@ -13,15 +13,16 @@ import com.miracl.trust.model.User import com.miracl.trust.session.AuthenticationSessionDetails import com.miracl.trust.session.CrossDeviceSession import com.miracl.trust.storage.UserStorage -import com.miracl.trust.util.log.Loggable +import com.miracl.trust.util.log.Logger import com.miracl.trust.util.log.LoggerConstants import com.miracl.trust.util.toHexString internal class Verificator( private val authenticator: AuthenticatorContract, private val verificationApi: VerificationApi, - private val userStorage: UserStorage -) : Loggable { + private val userStorage: UserStorage, + private val logger: Logger +) { suspend fun sendVerificationEmail( userId: String, projectId: String, @@ -191,6 +192,6 @@ internal class Verificator( } private fun logOperation(operation: String) { - logger?.info(LoggerConstants.VERIFICATOR_TAG, operation) + logger.info(LoggerConstants.VERIFICATOR_TAG, operation) } } \ No newline at end of file diff --git a/miracl-sdk/src/main/java/com/miracl/trust/session/CrossDeviceSessionManager.kt b/miracl-sdk/src/main/java/com/miracl/trust/session/CrossDeviceSessionManager.kt index 61b0611..3add211 100644 --- a/miracl-sdk/src/main/java/com/miracl/trust/session/CrossDeviceSessionManager.kt +++ b/miracl-sdk/src/main/java/com/miracl/trust/session/CrossDeviceSessionManager.kt @@ -4,7 +4,7 @@ import android.net.Uri import com.miracl.trust.MIRACLError import com.miracl.trust.MIRACLResult import com.miracl.trust.MIRACLSuccess -import com.miracl.trust.util.log.Loggable +import com.miracl.trust.util.log.Logger import com.miracl.trust.util.log.LoggerConstants internal interface CrossDeviceSessionManagerContract { @@ -15,8 +15,9 @@ internal interface CrossDeviceSessionManagerContract { } internal class CrossDeviceSessionManager( - private val crossDeviceSessionApi: CrossDeviceSessionApi -) : CrossDeviceSessionManagerContract, Loggable { + private val crossDeviceSessionApi: CrossDeviceSessionApi, + private val logger: Logger +) : CrossDeviceSessionManagerContract { companion object { const val PUSH_NOTIFICATION_QR_URL = "qrURL" } @@ -93,6 +94,6 @@ internal class CrossDeviceSessionManager( } private fun logOperation(operation: String) { - logger?.info(LoggerConstants.CROSS_DEVICE_SESSION_MANAGER_TAG, operation) + logger.info(LoggerConstants.CROSS_DEVICE_SESSION_MANAGER_TAG, operation) } } \ No newline at end of file diff --git a/miracl-sdk/src/main/java/com/miracl/trust/session/SessionManagement.kt b/miracl-sdk/src/main/java/com/miracl/trust/session/SessionManagement.kt index 17bc14d..e5959f4 100644 --- a/miracl-sdk/src/main/java/com/miracl/trust/session/SessionManagement.kt +++ b/miracl-sdk/src/main/java/com/miracl/trust/session/SessionManagement.kt @@ -4,7 +4,7 @@ import android.net.Uri import com.miracl.trust.MIRACLError import com.miracl.trust.MIRACLResult import com.miracl.trust.MIRACLSuccess -import com.miracl.trust.util.log.Loggable +import com.miracl.trust.util.log.Logger import com.miracl.trust.util.log.LoggerConstants internal enum class SessionStatus(val value: String) { @@ -21,8 +21,9 @@ internal interface SessionManagerContract { } internal class SessionManager( - private val sessionApi: SessionApi -) : SessionManagerContract, Loggable { + private val sessionApi: SessionApi, + private val logger: Logger +) : SessionManagerContract { companion object { const val PUSH_NOTIFICATION_QR_URL = "qrURL" } @@ -106,6 +107,6 @@ internal class SessionManager( } private fun logOperation(operation: String) { - logger?.info(LoggerConstants.SESSION_MANAGER_TAG, operation) + logger.info(LoggerConstants.SESSION_MANAGER_TAG, operation) } } \ No newline at end of file diff --git a/miracl-sdk/src/main/java/com/miracl/trust/signing/DocumentSigner.kt b/miracl-sdk/src/main/java/com/miracl/trust/signing/DocumentSigner.kt index 0172a53..313a63d 100644 --- a/miracl-sdk/src/main/java/com/miracl/trust/signing/DocumentSigner.kt +++ b/miracl-sdk/src/main/java/com/miracl/trust/signing/DocumentSigner.kt @@ -16,7 +16,7 @@ import com.miracl.trust.session.CrossDeviceSessionApi import com.miracl.trust.storage.UserStorage import com.miracl.trust.util.acquirePin import com.miracl.trust.util.hexStringToByteArray -import com.miracl.trust.util.log.Loggable +import com.miracl.trust.util.log.Logger import com.miracl.trust.util.log.LoggerConstants import com.miracl.trust.util.secondsSince1970 import com.miracl.trust.util.toHexString @@ -27,8 +27,9 @@ internal class DocumentSigner( private val crypto: Crypto, private val authenticator: AuthenticatorContract, private val userStorage: UserStorage, - private val crossDeviceSessionApi: CrossDeviceSessionApi -) : Loggable { + private val crossDeviceSessionApi: CrossDeviceSessionApi, + private val logger: Logger +) { suspend fun sign( message: ByteArray, user: User, @@ -172,6 +173,6 @@ internal class DocumentSigner( } private fun logOperation(operation: String) { - logger?.info(LoggerConstants.DOCUMENT_SIGNER_TAG, operation) + logger.info(LoggerConstants.DOCUMENT_SIGNER_TAG, operation) } } \ No newline at end of file diff --git a/miracl-sdk/src/main/java/com/miracl/trust/util/log/Loggable.kt b/miracl-sdk/src/main/java/com/miracl/trust/util/log/Loggable.kt deleted file mode 100644 index dde253e..0000000 --- a/miracl-sdk/src/main/java/com/miracl/trust/util/log/Loggable.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.miracl.trust.util.log - -import com.miracl.trust.MIRACLTrust - -internal interface Loggable { - val logger: Logger? - get() = MIRACLTrust.logger -} \ No newline at end of file diff --git a/miracl-sdk/src/test/java/com/miracl/trust/MIRACLTrustUnitTest.kt b/miracl-sdk/src/test/java/com/miracl/trust/MIRACLTrustUnitTest.kt index fa8d1e6..92ae555 100644 --- a/miracl-sdk/src/test/java/com/miracl/trust/MIRACLTrustUnitTest.kt +++ b/miracl-sdk/src/test/java/com/miracl/trust/MIRACLTrustUnitTest.kt @@ -4,6 +4,7 @@ import android.net.Uri import com.miracl.trust.authentication.* import com.miracl.trust.configuration.Configuration import com.miracl.trust.configuration.ConfigurationException +import com.miracl.trust.configuration.factory.ConfigurationFactory import com.miracl.trust.delegate.PinProvider import com.miracl.trust.delegate.ResultHandler import com.miracl.trust.factory.ComponentFactory @@ -15,6 +16,7 @@ import com.miracl.trust.signing.* import com.miracl.trust.storage.UserDto import com.miracl.trust.storage.UserStorageException import com.miracl.trust.storage.UserStorage +import com.miracl.trust.storage.room.RoomDatabaseModule import com.miracl.trust.util.log.Logger import com.miracl.trust.util.log.LoggerConstants import com.miracl.trust.util.secondsSince1970 @@ -23,6 +25,7 @@ import io.mockk.* import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.runTest +import org.junit.After import org.junit.Assert import org.junit.Before import org.junit.Test @@ -31,6 +34,7 @@ import kotlin.random.Random import kotlin.random.nextInt @ExperimentalCoroutinesApi +@MIRACLTrustAuthenticatorApi class MIRACLTrustUnitTest { private val deviceName = randomUuidString() private val projectId = randomUuidString() @@ -63,14 +67,229 @@ class MIRACLTrustUnitTest { @Before fun setUp() { - clearAllMocks() - every { userStorageMock.loadStorage() } returns Unit setUpComponentFactoryMock() miraclTrust = configureMIRACLTrust() } + @After + fun tearDown() { + clearAllMocks() + MIRACLTrust.defaultConfiguration = null + MIRACLTrust.defaultUserStorage = null + } + + @Test + fun `configure creates instance`() { + // Arrange + val projectId = randomUuidString() + val config = createConfiguration(projectId = projectId) + + // Act + MIRACLTrust.configure(mockk(), config) + + // Assert + val instance = MIRACLTrust.getInstance() + Assert.assertEquals(projectId, instance.projectId) + } + + @Test(expected = IllegalArgumentException::class) + fun `configure throws exception when projectId is null`() { + // Arrange + val configuration = Configuration.Builder() + .deviceName(deviceName) + .build() + + // Act + MIRACLTrust.configure(mockk(), configuration) + } + + @Test + fun `configure loads the UserStorage from the configuration when there is one`() { + // Arrange + val userStorageMock = mockk() + val config = Configuration.Builder(projectId, projectUrl) + .deviceName(deviceName) + .userStorage(userStorageMock) + .build() + + every { userStorageMock.loadStorage() } just runs + + // Act + MIRACLTrust.configure( + context = mockk(), + configuration = config + ) + + // Assert + verify { userStorageMock.loadStorage() } + } + + @Test + fun `setDefaultConfiguration updates the default configuration`() { + // Arrange + val config = createConfiguration() + + // Act + MIRACLTrust.setDefaultConfiguration(config) + + // Assert + Assert.assertEquals(config, MIRACLTrust.defaultConfiguration) + } + + @Test + fun `setDefaultConfiguration loads the UserStorage from configuration when there is one`() { + // Arrange + val userStorageMock = mockk() + val config = Configuration.Builder(projectId, projectUrl) + .deviceName(deviceName) + .userStorage(userStorageMock) + .build() + + every { userStorageMock.loadStorage() } just runs + + // Act + MIRACLTrust.setDefaultConfiguration(config) + + // Assert + verify { userStorageMock.loadStorage() } + } + + @Test + fun `createInstance creates instance with the default configuration when there is one`() { + // Arrange + val deviceName = randomUuidString() + val config = createConfiguration(deviceName = deviceName) + MIRACLTrust.setDefaultConfiguration(config) + + // Act + val sdk = MIRACLTrust.createInstance(mockk(), projectId, projectUrl) + + // Assert + Assert.assertEquals(deviceName, sdk.deviceName) + } + + @Test + fun `createInstance creates configuration when there isn't any`() = runTest { + // Arrange + val configuration = Configuration.Builder().deviceName(deviceName).build() + val configurationFactory = mockk() + every { configurationFactory.create() } returns configuration + + MIRACLTrust.configurationFactory = configurationFactory + MIRACLTrust.defaultConfiguration = null + MIRACLTrust.defaultUserStorage = userStorageMock + + // Act + MIRACLTrust.createInstance(mockk(), projectId, projectUrl) + + // Assert + verify { configurationFactory.create() } + } + + @Test + fun `getUsers static method uses the UserStorage from configuration when there is one`() = + runTest { + // Arrange + val userStorageMock = mockk() + val config = Configuration.Builder(projectId, projectUrl) + .deviceName(deviceName) + .userStorage(userStorageMock) + .build() + + every { userStorageMock.loadStorage() } just runs + every { userStorageMock.all() } returns listOf() + + MIRACLTrust.setDefaultConfiguration(config) + + // Act + MIRACLTrust.getUsers(mockk()) + + // Assert + verify { userStorageMock.all() } + } + + @Test + fun `getUsers static method uses the default UserStorage when there is one`() = runTest { + // Arrange + val userStorageMock = mockk() + every { userStorageMock.all() } returns listOf() + + MIRACLTrust.defaultConfiguration = null + MIRACLTrust.defaultUserStorage = userStorageMock + + // Act + MIRACLTrust.getUsers(mockk()) + + // Assert + verify { userStorageMock.all() } + } + + @Test + fun `getUsers static method creates default UserStorage when there isn't one`() = runTest { + // Arrange + MIRACLTrust.defaultConfiguration = null + MIRACLTrust.defaultUserStorage = null + + val userStorageMock = mockk() + every { userStorageMock.loadStorage() } just runs + every { userStorageMock.all() } returns listOf() + + mockkConstructor(RoomDatabaseModule::class) + every { anyConstructed().userStorage() } returns userStorageMock + + // Act + MIRACLTrust.getUsers(mockk()) + + // Assert + Assert.assertEquals(userStorageMock, MIRACLTrust.defaultUserStorage) + verify { userStorageMock.loadStorage() } + verify { userStorageMock.all() } + } + + @Test + fun `getUsers static method returns list of users when there are registered users`() = runTest { + // Arrange + val userDtos = listOf(createRandomUser().toUserDto(), createRandomUser().toUserDto()) + + MIRACLTrust.defaultUserStorage = userStorageMock + every { userStorageMock.all() } returns userDtos + + // Act + val users = MIRACLTrust.getUsers(mockk()) + + // Assert + assertUsersEqualDtos(users, userDtos) + } + + @Test + fun `getUsers static method returns empty list when there aren't registered users`() = runTest { + // Arrange + val userDtos = listOf() + MIRACLTrust.defaultUserStorage = userStorageMock + every { userStorageMock.all() } returns userDtos + + // Act + val users = miraclTrust.getUsers() + + // Assert + Assert.assertTrue(users.isEmpty()) + } + + @Test(expected = UserStorageException::class) + fun `getUsers static method should wrap and rethrow the exception thrown by the userStorage`() = + runTest { + // Arrange + MIRACLTrust.defaultUserStorage = userStorageMock + every { + userStorageMock.all() + } throws Exception() + + // Act + miraclTrust.getUsers() + } + @Test fun `is created on init when no exception is thrown on configure`() = runTest { // Arrange @@ -108,6 +327,79 @@ class MIRACLTrustUnitTest { Assert.assertTrue(sdk.getUsers().isEmpty()) } + @Test + fun `uses the UserStorage from configuration when there is one`() = runTest { + // Arrange + val userStorageMock = mockk() + val config = Configuration.Builder(projectId, projectUrl) + .deviceName(deviceName) + .userStorage(userStorageMock) + .build() + + every { userStorageMock.loadStorage() } just runs + every { userStorageMock.all() } returns listOf() + + // Act + MIRACLTrust.configure( + context = mockk(), + configuration = config + ) + MIRACLTrust.getInstance().getUsers() + + // Assert + verify { userStorageMock.all() } + } + + @Test + fun `uses the default UserStorage when there is one`() = runTest { + // Arrange + val userStorageMock = mockk() + MIRACLTrust.defaultUserStorage = userStorageMock + every { userStorageMock.all() } returns listOf() + + val config = Configuration.Builder(projectId, projectUrl) + .deviceName(deviceName) + .build() + + // Act + MIRACLTrust.configure( + context = mockk(), + configuration = config + ) + MIRACLTrust.getInstance().getUsers() + + // Assert + verify { userStorageMock.all() } + } + + @Test + fun `creates default UserStorage when there isn't one`() = runTest { + // Arrange + val userStorageMock = mockk() + val config = Configuration.Builder(projectId, projectUrl) + .deviceName(deviceName) + .componentFactory(componentFactoryMock) + .build() + + every { userStorageMock.loadStorage() } just runs + every { userStorageMock.all() } returns listOf() + + every { componentFactoryMock.defaultUserStorage(projectId) } returns userStorageMock + + // Act + MIRACLTrust.configure( + context = mockk(), + configuration = config + ) + MIRACLTrust.getInstance().getUsers() + + // Assert + Assert.assertEquals(userStorageMock, MIRACLTrust.defaultUserStorage) + verify { componentFactoryMock.defaultUserStorage(projectId) } + verify { userStorageMock.loadStorage() } + verify { userStorageMock.all() } + } + @Test fun `setProjectId should update project settings`() { // Arrange @@ -3087,7 +3379,11 @@ class MIRACLTrustUnitTest { } } - private fun createConfiguration(): Configuration { + private fun createConfiguration( + projectId: String = this.projectId, + projectUrl: String = this.projectUrl, + deviceName: String = this.deviceName + ): Configuration { return Configuration.Builder(projectId, projectUrl) .deviceName(deviceName) .componentFactory(componentFactoryMock) diff --git a/miracl-sdk/src/test/java/com/miracl/trust/authentication/AuthenticatorUnitTest.kt b/miracl-sdk/src/test/java/com/miracl/trust/authentication/AuthenticatorUnitTest.kt index 1f4a3b7..bd310f3 100644 --- a/miracl-sdk/src/test/java/com/miracl/trust/authentication/AuthenticatorUnitTest.kt +++ b/miracl-sdk/src/test/java/com/miracl/trust/authentication/AuthenticatorUnitTest.kt @@ -18,6 +18,8 @@ import com.miracl.trust.session.CrossDeviceSession import com.miracl.trust.session.SessionApi import com.miracl.trust.storage.UserDto import com.miracl.trust.storage.UserStorage +import com.miracl.trust.util.log.DefaultLogger +import com.miracl.trust.util.log.Logger import com.miracl.trust.util.toUserDto import com.miracl.trust.util.toHexString import io.mockk.* @@ -41,6 +43,7 @@ class AuthenticatorUnitTest { private val pinProviderMock = PinProvider { it.consume(pin) } private val registratorMock = mockk() private val userStorageMock = mockk() + private val logger = DefaultLogger(loggingLevel = Logger.LoggingLevel.NONE) private lateinit var authenticator: Authenticator @@ -56,7 +59,8 @@ class AuthenticatorUnitTest { sessionApiMock, cryptoMock, registratorMock, - userStorageMock + userStorageMock, + logger ) } diff --git a/miracl-sdk/src/test/java/com/miracl/trust/crypto/CryptoUnitTest.kt b/miracl-sdk/src/test/java/com/miracl/trust/crypto/CryptoUnitTest.kt index 22e9da4..18410f7 100644 --- a/miracl-sdk/src/test/java/com/miracl/trust/crypto/CryptoUnitTest.kt +++ b/miracl-sdk/src/test/java/com/miracl/trust/crypto/CryptoUnitTest.kt @@ -5,6 +5,8 @@ import com.miracl.trust.MIRACLSuccess import com.miracl.trust.randomByteArray import com.miracl.trust.randomNumericPin import com.miracl.trust.randomPinLength +import com.miracl.trust.util.log.DefaultLogger +import com.miracl.trust.util.log.Logger import io.mockk.clearAllMocks import io.mockk.every import io.mockk.mockk @@ -17,6 +19,7 @@ import java.util.* @ExperimentalCoroutinesApi class CryptoUnitTest { + private val logger = DefaultLogger(loggingLevel = Logger.LoggingLevel.NONE) private val cryptoExternalMock = mockk() @Before @@ -38,7 +41,7 @@ class CryptoUnitTest { val pin = randomNumericPin(randomPinLength()).toInt() every { cryptoExternalMock.getClientPass1(mpinId, token, pin) } returns pass1Proof - val crypto = Crypto(cryptoExternalMock) + val crypto = Crypto(logger, cryptoExternalMock) // Act val pass1ProofResult = @@ -70,7 +73,7 @@ class CryptoUnitTest { pin ) } throws exception - val crypto = Crypto(cryptoExternalMock) + val crypto = Crypto(logger, cryptoExternalMock) // Act val pass1ProofResult = @@ -95,7 +98,7 @@ class CryptoUnitTest { val sec = randomByteArray() val pass2Proof = Pass2Proof(V = randomByteArray()) every { cryptoExternalMock.getClientPass2(x, y, sec) } returns pass2Proof - val crypto = Crypto(cryptoExternalMock) + val crypto = Crypto(logger, cryptoExternalMock) // Act val pass1ProofResult = @@ -114,7 +117,7 @@ class CryptoUnitTest { val sec = randomByteArray() val exception = Exception() every { cryptoExternalMock.getClientPass2(any(), any(), any()) } throws exception - val crypto = Crypto(cryptoExternalMock) + val crypto = Crypto(logger, cryptoExternalMock) // Act val pass2ProofResult = @@ -134,7 +137,7 @@ class CryptoUnitTest { randomByteArray() ) every { cryptoExternalMock.generateSigningKeyPair() } returns signingKeyPair - val crypto = Crypto(cryptoExternalMock) + val crypto = Crypto(logger, cryptoExternalMock) // Act val result = @@ -150,7 +153,7 @@ class CryptoUnitTest { // Arrange val exception = Exception() every { cryptoExternalMock.generateSigningKeyPair() } throws exception - val crypto = Crypto(cryptoExternalMock) + val crypto = Crypto(logger, cryptoExternalMock) // Act val result = @@ -178,7 +181,7 @@ class CryptoUnitTest { ) } returns dvsClientToken - val crypto = Crypto(cryptoExternalMock) + val crypto = Crypto(logger, cryptoExternalMock) // Act val result = @@ -204,7 +207,7 @@ class CryptoUnitTest { val exception = Exception() every { cryptoExternalMock.combineClientSecret(any(), any()) } throws exception - val crypto = Crypto(cryptoExternalMock) + val crypto = Crypto(logger, cryptoExternalMock) // Act val result = @@ -239,7 +242,7 @@ class CryptoUnitTest { ) } throws exception - val crypto = Crypto(cryptoExternalMock) + val crypto = Crypto(logger, cryptoExternalMock) // Act val result = @@ -277,7 +280,7 @@ class CryptoUnitTest { ) } returns signingResult - val crypto = Crypto(cryptoExternalMock) + val crypto = Crypto(logger, cryptoExternalMock) // Act val result = @@ -311,7 +314,7 @@ class CryptoUnitTest { ) } throws exception - val crypto = Crypto(cryptoExternalMock) + val crypto = Crypto(logger, cryptoExternalMock) // Act val result = diff --git a/miracl-sdk/src/test/java/com/miracl/trust/network/HttpURLConnectionApiManagerUnitTest.kt b/miracl-sdk/src/test/java/com/miracl/trust/network/HttpURLConnectionApiManagerUnitTest.kt index 901bfad..b5c26c9 100644 --- a/miracl-sdk/src/test/java/com/miracl/trust/network/HttpURLConnectionApiManagerUnitTest.kt +++ b/miracl-sdk/src/test/java/com/miracl/trust/network/HttpURLConnectionApiManagerUnitTest.kt @@ -4,6 +4,8 @@ import com.miracl.trust.MIRACLError import com.miracl.trust.MIRACLSuccess import com.miracl.trust.randomUuidString import com.miracl.trust.test_helpers.MockHttpURLConnectionBuilder +import com.miracl.trust.util.log.DefaultLogger +import com.miracl.trust.util.log.Logger import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import org.junit.Assert @@ -17,10 +19,11 @@ class HttpURLConnectionApiManagerUnitTest { private val clientSettingsUrl = "https://api.mpin.io/rps/v2/clientSettings" private lateinit var apiManager: HttpsURLConnectionRequestExecutor + private val logger = DefaultLogger(loggingLevel = Logger.LoggingLevel.NONE) @Before fun setUp() { - apiManager = HttpsURLConnectionRequestExecutor(10, 10) + apiManager = HttpsURLConnectionRequestExecutor(logger, 10, 10) } @Test diff --git a/miracl-sdk/src/test/java/com/miracl/trust/registration/RegistratorUnitTest.kt b/miracl-sdk/src/test/java/com/miracl/trust/registration/RegistratorUnitTest.kt index b97e8ae..45447bb 100644 --- a/miracl-sdk/src/test/java/com/miracl/trust/registration/RegistratorUnitTest.kt +++ b/miracl-sdk/src/test/java/com/miracl/trust/registration/RegistratorUnitTest.kt @@ -17,6 +17,8 @@ import com.miracl.trust.randomUuidString import com.miracl.trust.storage.UserDto import com.miracl.trust.storage.UserStorage import com.miracl.trust.util.hexStringToByteArray +import com.miracl.trust.util.log.DefaultLogger +import com.miracl.trust.util.log.Logger import com.miracl.trust.util.toHexString import com.miracl.trust.util.toSHA256 import com.miracl.trust.util.toUserDto @@ -40,6 +42,7 @@ class RegistratorUnitTest { private val registrationApiMock = mockk() private val cryptoMock = mockk() private val userStorageMock = mockk() + private val logger = DefaultLogger(loggingLevel = Logger.LoggingLevel.NONE) private lateinit var registrator: Registrator @@ -49,7 +52,7 @@ class RegistratorUnitTest { setUpRegistrationApiMock() setUpCryptoMock() - registrator = Registrator(registrationApiMock, cryptoMock, userStorageMock) + registrator = Registrator(registrationApiMock, cryptoMock, userStorageMock, logger) } @Test diff --git a/miracl-sdk/src/test/java/com/miracl/trust/registration/VerificatorUnitTest.kt b/miracl-sdk/src/test/java/com/miracl/trust/registration/VerificatorUnitTest.kt index 16e78b5..b62692c 100644 --- a/miracl-sdk/src/test/java/com/miracl/trust/registration/VerificatorUnitTest.kt +++ b/miracl-sdk/src/test/java/com/miracl/trust/registration/VerificatorUnitTest.kt @@ -16,6 +16,8 @@ import com.miracl.trust.session.AuthenticationSessionDetails import com.miracl.trust.session.CrossDeviceSession import com.miracl.trust.storage.UserDto import com.miracl.trust.storage.UserStorage +import com.miracl.trust.util.log.DefaultLogger +import com.miracl.trust.util.log.Logger import com.miracl.trust.util.toHexString import io.mockk.* import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -32,8 +34,10 @@ class VerificatorUnitTest { private val authenticatorMock = mockk() private val verificationApiMock = mockk() private val userStorageMock = mockk() + private val logger = DefaultLogger(loggingLevel = Logger.LoggingLevel.NONE) - private val verificator = Verificator(authenticatorMock, verificationApiMock, userStorageMock) + private val verificator = + Verificator(authenticatorMock, verificationApiMock, userStorageMock, logger) @Before fun setUp() { diff --git a/miracl-sdk/src/test/java/com/miracl/trust/session/CrossDeviceSessionManagerUnitTest.kt b/miracl-sdk/src/test/java/com/miracl/trust/session/CrossDeviceSessionManagerUnitTest.kt index 3ecdcb9..f038ec0 100644 --- a/miracl-sdk/src/test/java/com/miracl/trust/session/CrossDeviceSessionManagerUnitTest.kt +++ b/miracl-sdk/src/test/java/com/miracl/trust/session/CrossDeviceSessionManagerUnitTest.kt @@ -4,6 +4,8 @@ import android.net.Uri import com.miracl.trust.MIRACLError import com.miracl.trust.MIRACLSuccess import com.miracl.trust.randomUuidString +import com.miracl.trust.util.log.DefaultLogger +import com.miracl.trust.util.log.Logger import io.mockk.clearAllMocks import io.mockk.coEvery import io.mockk.every @@ -20,8 +22,9 @@ class CrossDeviceSessionManagerUnitTest { private val crossDeviceSessionResponse = createCrossDeviceSessionResponse() private val crossDeviceSession = createCrossDeviceSession() + private val logger = DefaultLogger(loggingLevel = Logger.LoggingLevel.NONE) private val sessionApiMock = mockk() - private val sessionManager = CrossDeviceSessionManager(sessionApiMock) + private val sessionManager = CrossDeviceSessionManager(sessionApiMock, logger) @Before fun setUp() { diff --git a/miracl-sdk/src/test/java/com/miracl/trust/session/SessionManagerUnitTest.kt b/miracl-sdk/src/test/java/com/miracl/trust/session/SessionManagerUnitTest.kt index 7395ad8..dd8a628 100644 --- a/miracl-sdk/src/test/java/com/miracl/trust/session/SessionManagerUnitTest.kt +++ b/miracl-sdk/src/test/java/com/miracl/trust/session/SessionManagerUnitTest.kt @@ -5,6 +5,8 @@ import com.miracl.trust.MIRACLError import com.miracl.trust.MIRACLSuccess import com.miracl.trust.randomPinLength import com.miracl.trust.randomUuidString +import com.miracl.trust.util.log.DefaultLogger +import com.miracl.trust.util.log.Logger import io.mockk.* import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest @@ -19,8 +21,9 @@ class SessionManagerUnitTest { private val codeStatusResponse = crateCodeStatusResponse() private val sessionDetails = createSessionDetails() + private val logger = DefaultLogger(loggingLevel = Logger.LoggingLevel.NONE) private val sessionApiMock = mockk() - private val sessionManager = SessionManager(sessionApiMock) + private val sessionManager = SessionManager(sessionApiMock, logger) @Before fun setUp() { diff --git a/miracl-sdk/src/test/java/com/miracl/trust/signing/DocumentSignerUnitTest.kt b/miracl-sdk/src/test/java/com/miracl/trust/signing/DocumentSignerUnitTest.kt index 27cd383..6924717 100644 --- a/miracl-sdk/src/test/java/com/miracl/trust/signing/DocumentSignerUnitTest.kt +++ b/miracl-sdk/src/test/java/com/miracl/trust/signing/DocumentSignerUnitTest.kt @@ -20,6 +20,8 @@ import com.miracl.trust.session.CrossDeviceSession import com.miracl.trust.session.CrossDeviceSessionApi import com.miracl.trust.storage.UserStorage import com.miracl.trust.util.hexStringToByteArray +import com.miracl.trust.util.log.DefaultLogger +import com.miracl.trust.util.log.Logger import com.miracl.trust.util.toHexString import com.miracl.trust.util.toUserDto import io.mockk.CapturingSlot @@ -50,6 +52,7 @@ class DocumentSignerUnitTest { private val pinProviderMock = PinProvider { it.consume(pin) } private val userStorageMock = mockk() private val crossDeviceSessionApiMock = mockk() + private val logger = DefaultLogger(loggingLevel = Logger.LoggingLevel.NONE) @Before fun resetMocks() { @@ -91,7 +94,8 @@ class DocumentSignerUnitTest { cryptoMock, authenticatorContractMock, userStorageMock, - crossDeviceSessionApiMock + crossDeviceSessionApiMock, + logger ) // Act @@ -125,7 +129,8 @@ class DocumentSignerUnitTest { cryptoMock, authenticatorContractMock, userStorageMock, - crossDeviceSessionApiMock + crossDeviceSessionApiMock, + logger ) // Act @@ -157,7 +162,8 @@ class DocumentSignerUnitTest { cryptoMock, authenticatorContractMock, userStorageMock, - crossDeviceSessionApiMock + crossDeviceSessionApiMock, + logger ) // Act @@ -189,7 +195,8 @@ class DocumentSignerUnitTest { cryptoMock, authenticatorContractMock, userStorageMock, - crossDeviceSessionApiMock + crossDeviceSessionApiMock, + logger ) // Act @@ -221,7 +228,8 @@ class DocumentSignerUnitTest { cryptoMock, authenticatorContractMock, userStorageMock, - crossDeviceSessionApiMock + crossDeviceSessionApiMock, + logger ) // Act @@ -265,7 +273,8 @@ class DocumentSignerUnitTest { cryptoMock, authenticatorContractMock, userStorageMock, - crossDeviceSessionApiMock + crossDeviceSessionApiMock, + logger ) // Act @@ -309,7 +318,8 @@ class DocumentSignerUnitTest { cryptoMock, authenticatorContractMock, userStorageMock, - crossDeviceSessionApiMock + crossDeviceSessionApiMock, + logger ) // Act @@ -340,7 +350,8 @@ class DocumentSignerUnitTest { cryptoMock, authenticatorContractMock, userStorageMock, - crossDeviceSessionApiMock + crossDeviceSessionApiMock, + logger ) // Act @@ -372,7 +383,8 @@ class DocumentSignerUnitTest { cryptoMock, authenticatorContractMock, userStorageMock, - crossDeviceSessionApiMock + crossDeviceSessionApiMock, + logger ) // Act @@ -402,7 +414,8 @@ class DocumentSignerUnitTest { cryptoMock, authenticatorContractMock, userStorageMock, - crossDeviceSessionApiMock + crossDeviceSessionApiMock, + logger ) // Act @@ -432,7 +445,8 @@ class DocumentSignerUnitTest { cryptoMock, authenticatorContractMock, userStorageMock, - crossDeviceSessionApiMock + crossDeviceSessionApiMock, + logger ) // Act @@ -462,7 +476,8 @@ class DocumentSignerUnitTest { cryptoMock, authenticatorContractMock, userStorageMock, - crossDeviceSessionApiMock + crossDeviceSessionApiMock, + logger ) // Act @@ -502,7 +517,8 @@ class DocumentSignerUnitTest { cryptoMock, authenticatorContractMock, userStorageMock, - crossDeviceSessionApiMock + crossDeviceSessionApiMock, + logger ) // Act @@ -542,7 +558,8 @@ class DocumentSignerUnitTest { cryptoMock, authenticatorContractMock, userStorageMock, - crossDeviceSessionApiMock + crossDeviceSessionApiMock, + logger ) // Act @@ -584,7 +601,8 @@ class DocumentSignerUnitTest { cryptoMock, authenticatorContractMock, userStorageMock, - crossDeviceSessionApiMock + crossDeviceSessionApiMock, + logger ) // Act @@ -636,7 +654,8 @@ class DocumentSignerUnitTest { cryptoMock, authenticatorContractMock, userStorageMock, - crossDeviceSessionApiMock + crossDeviceSessionApiMock, + logger ) // Act @@ -687,7 +706,8 @@ class DocumentSignerUnitTest { cryptoMock, authenticatorContractMock, userStorageMock, - crossDeviceSessionApiMock + crossDeviceSessionApiMock, + logger ) // Act @@ -737,7 +757,8 @@ class DocumentSignerUnitTest { cryptoMock, authenticatorContractMock, userStorageMock, - crossDeviceSessionApiMock + crossDeviceSessionApiMock, + logger ) // Act @@ -795,7 +816,8 @@ class DocumentSignerUnitTest { cryptoMock, authenticatorContractMock, userStorageMock, - crossDeviceSessionApiMock + crossDeviceSessionApiMock, + logger ) // Act @@ -867,7 +889,8 @@ class DocumentSignerUnitTest { cryptoMock, authenticatorContractMock, userStorageMock, - crossDeviceSessionApiMock + crossDeviceSessionApiMock, + logger ) // Act