From e65d1aa955a55e416fe05c1ee198728251985b70 Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Tue, 24 Sep 2024 02:31:13 +0000 Subject: [PATCH 1/2] CallerSdkType added --- firebase-dataconnect/CHANGELOG.md | 3 +- firebase-dataconnect/api.txt | 21 ++-- .../dataconnect/FirebaseDataConnect.kt | 42 +++++--- .../firebase/dataconnect/OperationRef.kt | 6 ++ .../dataconnect/core/DataConnectGrpcClient.kt | 8 +- .../core/DataConnectGrpcMetadata.kt | 17 ++- .../dataconnect/core/DataConnectGrpcRPCs.kt | 9 +- .../core/FirebaseDataConnectImpl.kt | 10 +- .../dataconnect/core/MutationRefImpl.kt | 14 +-- .../dataconnect/core/OperationRefImpl.kt | 18 ++-- .../firebase/dataconnect/core/QueryRefImpl.kt | 8 +- .../generated/GeneratedMutation.kt | 3 +- .../dataconnect/generated/GeneratedQuery.kt | 3 +- .../dataconnect/querymgr/LiveQuery.kt | 15 +-- .../dataconnect/querymgr/QueryManager.kt | 4 +- .../dataconnect/serializers/UUIDSerializer.kt | 15 ++- .../core/DataConnectGrpcClientUnitTest.kt | 97 +++++------------ .../core/DataConnectGrpcMetadataUnitTest.kt | 43 ++++---- .../core/FirebaseDataConnectImplUnitTest.kt | 20 ++-- .../core/MutationRefImplUnitTest.kt | 100 +++++++----------- .../core/MutationResultUnitTest.kt | 8 +- .../core/OperationRefImplUnitTest.kt | 28 ++++- .../dataconnect/core/QueryRefImplUnitTest.kt | 35 +++--- .../dataconnect/core/QueryResultUnitTest.kt | 8 +- .../firebase/dataconnect/testutil/Arbs.kt | 7 +- .../firebase/dataconnect/testutil/Stubs.kt | 13 ++- .../firebase/dataconnect/testutil/Arbs.kt | 7 ++ 27 files changed, 302 insertions(+), 260 deletions(-) diff --git a/firebase-dataconnect/CHANGELOG.md b/firebase-dataconnect/CHANGELOG.md index 242f7b8b99f..6e2e9d5c889 100644 --- a/firebase-dataconnect/CHANGELOG.md +++ b/firebase-dataconnect/CHANGELOG.md @@ -1,3 +1,4 @@ # Unreleased -* [feature] Add ability to specify SerializersModule when serializing. * [feature] initial beta release. +* [feature] Add ability to specify SerializersModule when serializing. +* [feature] CallerSdkType added, to enable tracking generated SDK usage. diff --git a/firebase-dataconnect/api.txt b/firebase-dataconnect/api.txt index 743c0c9db8c..31d114ce21c 100644 --- a/firebase-dataconnect/api.txt +++ b/firebase-dataconnect/api.txt @@ -66,30 +66,37 @@ package com.google.firebase.dataconnect { field @NonNull public static final com.google.firebase.dataconnect.FirebaseDataConnect.Companion Companion; } + public enum FirebaseDataConnect.CallerSdkType { + method @NonNull public static com.google.firebase.dataconnect.FirebaseDataConnect.CallerSdkType valueOf(@NonNull String name) throws java.lang.IllegalArgumentException; + method @NonNull public static com.google.firebase.dataconnect.FirebaseDataConnect.CallerSdkType[] values(); + enum_constant public static final com.google.firebase.dataconnect.FirebaseDataConnect.CallerSdkType Base; + enum_constant public static final com.google.firebase.dataconnect.FirebaseDataConnect.CallerSdkType Generated; + } + public static final class FirebaseDataConnect.Companion { } public static interface FirebaseDataConnect.MutationRefOptionsBuilder { + method @Nullable public com.google.firebase.dataconnect.FirebaseDataConnect.CallerSdkType getCallerSdkType(); method @Nullable public kotlinx.serialization.modules.SerializersModule getDataSerializersModule(); - method @Nullable public com.google.firebase.dataconnect.generated.GeneratedMutation getGeneratedMutation(); method @Nullable public kotlinx.serialization.modules.SerializersModule getVariablesSerializersModule(); + method public void setCallerSdkType(@Nullable com.google.firebase.dataconnect.FirebaseDataConnect.CallerSdkType); method public void setDataSerializersModule(@Nullable kotlinx.serialization.modules.SerializersModule); - method public void setGeneratedMutation(@Nullable com.google.firebase.dataconnect.generated.GeneratedMutation); method public void setVariablesSerializersModule(@Nullable kotlinx.serialization.modules.SerializersModule); + property @Nullable public abstract com.google.firebase.dataconnect.FirebaseDataConnect.CallerSdkType callerSdkType; property @Nullable public abstract kotlinx.serialization.modules.SerializersModule dataSerializersModule; - property @Nullable public abstract com.google.firebase.dataconnect.generated.GeneratedMutation generatedMutation; property @Nullable public abstract kotlinx.serialization.modules.SerializersModule variablesSerializersModule; } public static interface FirebaseDataConnect.QueryRefOptionsBuilder { + method @Nullable public com.google.firebase.dataconnect.FirebaseDataConnect.CallerSdkType getCallerSdkType(); method @Nullable public kotlinx.serialization.modules.SerializersModule getDataSerializersModule(); - method @Nullable public com.google.firebase.dataconnect.generated.GeneratedQuery getGeneratedQuery(); method @Nullable public kotlinx.serialization.modules.SerializersModule getVariablesSerializersModule(); + method public void setCallerSdkType(@Nullable com.google.firebase.dataconnect.FirebaseDataConnect.CallerSdkType); method public void setDataSerializersModule(@Nullable kotlinx.serialization.modules.SerializersModule); - method public void setGeneratedQuery(@Nullable com.google.firebase.dataconnect.generated.GeneratedQuery); method public void setVariablesSerializersModule(@Nullable kotlinx.serialization.modules.SerializersModule); + property @Nullable public abstract com.google.firebase.dataconnect.FirebaseDataConnect.CallerSdkType callerSdkType; property @Nullable public abstract kotlinx.serialization.modules.SerializersModule dataSerializersModule; - property @Nullable public abstract com.google.firebase.dataconnect.generated.GeneratedQuery generatedQuery; property @Nullable public abstract kotlinx.serialization.modules.SerializersModule variablesSerializersModule; } @@ -120,6 +127,7 @@ package com.google.firebase.dataconnect { public interface OperationRef { method public boolean equals(@Nullable Object other); method @Nullable public suspend Object execute(@NonNull kotlin.coroutines.Continuation>); + method @NonNull public com.google.firebase.dataconnect.FirebaseDataConnect.CallerSdkType getCallerSdkType(); method @NonNull public com.google.firebase.dataconnect.FirebaseDataConnect getDataConnect(); method @NonNull public kotlinx.serialization.DeserializationStrategy getDataDeserializer(); method @Nullable public kotlinx.serialization.modules.SerializersModule getDataSerializersModule(); @@ -129,6 +137,7 @@ package com.google.firebase.dataconnect { method @Nullable public kotlinx.serialization.modules.SerializersModule getVariablesSerializersModule(); method public int hashCode(); method @NonNull public String toString(); + property @NonNull public abstract com.google.firebase.dataconnect.FirebaseDataConnect.CallerSdkType callerSdkType; property @NonNull public abstract com.google.firebase.dataconnect.FirebaseDataConnect dataConnect; property @NonNull public abstract kotlinx.serialization.DeserializationStrategy dataDeserializer; property @Nullable public abstract kotlinx.serialization.modules.SerializersModule dataSerializersModule; diff --git a/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/FirebaseDataConnect.kt b/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/FirebaseDataConnect.kt index a3d450d3b10..2e5393d2b19 100644 --- a/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/FirebaseDataConnect.kt +++ b/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/FirebaseDataConnect.kt @@ -21,8 +21,6 @@ import com.google.firebase.Firebase import com.google.firebase.FirebaseApp import com.google.firebase.app import com.google.firebase.dataconnect.core.FirebaseDataConnectFactory -import com.google.firebase.dataconnect.generated.GeneratedMutation -import com.google.firebase.dataconnect.generated.GeneratedQuery import kotlinx.coroutines.CoroutineScope import kotlinx.serialization.DeserializationStrategy import kotlinx.serialization.SerializationStrategy @@ -201,12 +199,11 @@ public interface FirebaseDataConnect : AutoCloseable { public interface QueryRefOptionsBuilder { /** - * The [GeneratedQuery] object that is creating the query; may be `null` if not being created - * from an SDK that was generated by the Data Connect toolkit. The value of this property does - * not affect the runtime behavior, but is used for runtime checks and gathering metrics on - * generated SDK usage. + * The calling SDK information to apply to all operations executed by the corresponding + * [QueryRef] object. May be `null` (the default) in which case [CallerSdkType.Base] will be + * used. */ - public var generatedQuery: GeneratedQuery<*, Data, Variables>? + public var callerSdkType: CallerSdkType? /** * A [SerializersModule] to use when encoding the query's variables. May be `null` (the default) @@ -242,12 +239,11 @@ public interface FirebaseDataConnect : AutoCloseable { public interface MutationRefOptionsBuilder { /** - * The [GeneratedMutation] object that is creating the mutation; may be `null` if not being - * created from an SDK that was generated by the Data Connect toolkit. The value of this - * property does not affect the runtime behavior, but is used for runtime checks and gathering - * metrics on generated SDK usage. + * The calling SDK information to apply to all operations executed by the corresponding + * [MutationRef] object. May be `null` (the default) in which case [CallerSdkType.Base] will be + * used. */ - public var generatedMutation: GeneratedMutation<*, Data, Variables>? + public var callerSdkType: CallerSdkType? /** * A [SerializersModule] to use when encoding the mutation's variables. May be `null` (the @@ -270,7 +266,7 @@ public interface FirebaseDataConnect : AutoCloseable { * @param variablesSerializer The value for [MutationRef.variablesSerializer] of the returned * object. * @param optionsBuilder A method that will be called to provide optional information when - * creating the [MutationRef]; may be `null` (the default) to not perform any customization. + * creating the [QueryRef]; may be `null` (the default) to not perform any customization. */ public fun mutation( operationName: String, @@ -356,6 +352,26 @@ public interface FirebaseDataConnect : AutoCloseable { */ override fun toString(): String + /** + * Indicates where the usages of this object are coming from. + * + * This information is merely used for analytics and has no effects on the product's + * functionality. + */ + public enum class CallerSdkType { + /** + * The [FirebaseDataConnect] class is used directly in an application, rather than using the + * code generation done by the Firebase Data Connect toolkit. + */ + Base, + + /** + * The [FirebaseDataConnect] class is used by code generated by the Firebase Data Connect + * toolkit. + */ + Generated, + } + /** * The companion object for [FirebaseDataConnect], which provides extension methods and properties * that may be accessed qualified by the class, rather than an instance of the class. diff --git a/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/OperationRef.kt b/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/OperationRef.kt index 33d916c9825..ac624ed0553 100644 --- a/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/OperationRef.kt +++ b/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/OperationRef.kt @@ -144,6 +144,12 @@ public interface OperationRef { */ public val variablesSerializer: SerializationStrategy + /** + * The [FirebaseDataConnect.CallerSdkType] that will be associated with all operations performed + * by this object for analytics purposes. + */ + public val callerSdkType: FirebaseDataConnect.CallerSdkType + /** * A [SerializersModule] to use when encoding the variables using [variablesSerializer]. May be * `null`, to not use a [SerializersModule]. diff --git a/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/DataConnectGrpcClient.kt b/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/DataConnectGrpcClient.kt index 3e8aafa6c0b..7a545837bca 100644 --- a/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/DataConnectGrpcClient.kt +++ b/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/DataConnectGrpcClient.kt @@ -57,7 +57,7 @@ internal class DataConnectGrpcClient( requestId: String, operationName: String, variables: Struct, - isFromGeneratedSdk: Boolean, + callerSdkType: FirebaseDataConnect.CallerSdkType, ): OperationResult { val request = executeQueryRequest { this.name = requestName @@ -67,7 +67,7 @@ internal class DataConnectGrpcClient( val response = grpcRPCs.retryOnGrpcUnauthenticatedError(requestId, "executeQuery") { - executeQuery(requestId, request, isFromGeneratedSdk) + executeQuery(requestId, request, callerSdkType) } return OperationResult( @@ -80,7 +80,7 @@ internal class DataConnectGrpcClient( requestId: String, operationName: String, variables: Struct, - isFromGeneratedSdk: Boolean, + callerSdkType: FirebaseDataConnect.CallerSdkType, ): OperationResult { val request = executeMutationRequest { this.name = requestName @@ -90,7 +90,7 @@ internal class DataConnectGrpcClient( val response = grpcRPCs.retryOnGrpcUnauthenticatedError(requestId, "executeMutation") { - executeMutation(requestId, request, isFromGeneratedSdk = isFromGeneratedSdk) + executeMutation(requestId, request, callerSdkType) } return OperationResult( diff --git a/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/DataConnectGrpcMetadata.kt b/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/DataConnectGrpcMetadata.kt index 1515ae7661c..b47864d3b82 100644 --- a/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/DataConnectGrpcMetadata.kt +++ b/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/DataConnectGrpcMetadata.kt @@ -19,6 +19,7 @@ package com.google.firebase.dataconnect.core import android.os.Build import com.google.firebase.FirebaseApp import com.google.firebase.dataconnect.BuildConfig +import com.google.firebase.dataconnect.FirebaseDataConnect import com.google.firebase.dataconnect.util.buildStructProto import com.google.protobuf.Struct import io.grpc.Metadata @@ -53,25 +54,31 @@ internal class DataConnectGrpcMetadata( @Suppress("SpellCheckingInspection") private val googRequestParamsHeaderValue = "location=${connectorLocation}&frontend=data" - private fun googApiClientHeaderValue(isFromGeneratedSdk: Boolean): String { + private fun googApiClientHeaderValue(callerSdkType: FirebaseDataConnect.CallerSdkType): String { val components = buildList { add("gl-kotlin/$kotlinVersion") add("gl-android/$androidVersion") add("fire/$dataConnectSdkVersion") add("grpc/$grpcVersion") - if (isFromGeneratedSdk) { - add("kotlin/gen") + + when (callerSdkType) { + FirebaseDataConnect.CallerSdkType.Base -> { + /* nothing to add for Base */ + } + FirebaseDataConnect.CallerSdkType.Generated -> { + add("kotlin/gen") + } } } return components.joinToString(" ") } - suspend fun get(requestId: String, isFromGeneratedSdk: Boolean): Metadata { + suspend fun get(requestId: String, callerSdkType: FirebaseDataConnect.CallerSdkType): Metadata { val authToken = dataConnectAuth.getToken(requestId) val appCheckToken = dataConnectAppCheck.getToken(requestId) return Metadata().also { it.put(googRequestParamsHeader, googRequestParamsHeaderValue) - it.put(googApiClientHeader, googApiClientHeaderValue(isFromGeneratedSdk)) + it.put(googApiClientHeader, googApiClientHeaderValue(callerSdkType)) if (appId.isNotBlank()) { it.put(gmpAppIdHeader, appId) } diff --git a/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/DataConnectGrpcRPCs.kt b/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/DataConnectGrpcRPCs.kt index 0dc403e98c0..97822dbdc2e 100644 --- a/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/DataConnectGrpcRPCs.kt +++ b/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/DataConnectGrpcRPCs.kt @@ -18,6 +18,7 @@ package com.google.firebase.dataconnect.core import android.content.Context import com.google.android.gms.security.ProviderInstaller +import com.google.firebase.dataconnect.FirebaseDataConnect import com.google.firebase.dataconnect.core.DataConnectGrpcMetadata.Companion.toStructProto import com.google.firebase.dataconnect.util.SuspendingLazy import com.google.firebase.dataconnect.util.buildStructProto @@ -133,9 +134,9 @@ internal class DataConnectGrpcRPCs( suspend fun executeMutation( requestId: String, request: ExecuteMutationRequest, - isFromGeneratedSdk: Boolean, + callerSdkType: FirebaseDataConnect.CallerSdkType, ): ExecuteMutationResponse { - val metadata = grpcMetadata.get(requestId, isFromGeneratedSdk) + val metadata = grpcMetadata.get(requestId, callerSdkType) val kotlinMethodName = "executeMutation(${request.operationName})" logger.logGrpcSending( @@ -171,9 +172,9 @@ internal class DataConnectGrpcRPCs( suspend fun executeQuery( requestId: String, request: ExecuteQueryRequest, - isFromGeneratedSdk: Boolean, + callerSdkType: FirebaseDataConnect.CallerSdkType, ): ExecuteQueryResponse { - val metadata = grpcMetadata.get(requestId, isFromGeneratedSdk) + val metadata = grpcMetadata.get(requestId, callerSdkType) val kotlinMethodName = "executeQuery(${request.operationName})" logger.logGrpcSending( diff --git a/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/FirebaseDataConnectImpl.kt b/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/FirebaseDataConnectImpl.kt index 4524edc3243..85d9fa34a6b 100644 --- a/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/FirebaseDataConnectImpl.kt +++ b/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/FirebaseDataConnectImpl.kt @@ -25,8 +25,6 @@ import com.google.firebase.dataconnect.DataConnectSettings import com.google.firebase.dataconnect.FirebaseDataConnect import com.google.firebase.dataconnect.FirebaseDataConnect.MutationRefOptionsBuilder import com.google.firebase.dataconnect.FirebaseDataConnect.QueryRefOptionsBuilder -import com.google.firebase.dataconnect.generated.GeneratedMutation -import com.google.firebase.dataconnect.generated.GeneratedQuery import com.google.firebase.dataconnect.isDefaultHost import com.google.firebase.dataconnect.querymgr.LiveQueries import com.google.firebase.dataconnect.querymgr.LiveQuery @@ -327,7 +325,7 @@ internal class FirebaseDataConnectImpl( ): QueryRefImpl { val options = object : QueryRefOptionsBuilder { - override var generatedQuery: GeneratedQuery<*, Data, Variables>? = null + override var callerSdkType: FirebaseDataConnect.CallerSdkType? = null override var variablesSerializersModule: SerializersModule? = null override var dataSerializersModule: SerializersModule? = null } @@ -339,7 +337,7 @@ internal class FirebaseDataConnectImpl( variables = variables, dataDeserializer = dataDeserializer, variablesSerializer = variablesSerializer, - isFromGeneratedSdk = options.generatedQuery !== null, + callerSdkType = options.callerSdkType ?: FirebaseDataConnect.CallerSdkType.Base, variablesSerializersModule = options.variablesSerializersModule, dataSerializersModule = options.dataSerializersModule, ) @@ -354,7 +352,7 @@ internal class FirebaseDataConnectImpl( ): MutationRefImpl { val options = object : MutationRefOptionsBuilder { - override var generatedMutation: GeneratedMutation<*, Data, Variables>? = null + override var callerSdkType: FirebaseDataConnect.CallerSdkType? = null override var variablesSerializersModule: SerializersModule? = null override var dataSerializersModule: SerializersModule? = null } @@ -366,7 +364,7 @@ internal class FirebaseDataConnectImpl( variables = variables, dataDeserializer = dataDeserializer, variablesSerializer = variablesSerializer, - isFromGeneratedSdk = options.generatedMutation !== null, + callerSdkType = options.callerSdkType ?: FirebaseDataConnect.CallerSdkType.Base, variablesSerializersModule = options.variablesSerializersModule, dataSerializersModule = options.dataSerializersModule, ) diff --git a/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/MutationRefImpl.kt b/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/MutationRefImpl.kt index 3f7d3327f28..1b3d2d2edac 100644 --- a/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/MutationRefImpl.kt +++ b/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/MutationRefImpl.kt @@ -33,7 +33,7 @@ internal class MutationRefImpl( variables: Variables, dataDeserializer: DeserializationStrategy, variablesSerializer: SerializationStrategy, - val isFromGeneratedSdk: Boolean, + callerSdkType: FirebaseDataConnect.CallerSdkType, variablesSerializersModule: SerializersModule?, dataSerializersModule: SerializersModule?, ) : @@ -44,6 +44,7 @@ internal class MutationRefImpl( variables = variables, dataDeserializer = dataDeserializer, variablesSerializer = variablesSerializer, + callerSdkType = callerSdkType, variablesSerializersModule = variablesSerializersModule, dataSerializersModule = dataSerializersModule, ) { @@ -65,7 +66,7 @@ internal class MutationRefImpl( encodeToStruct(variables, variablesSerializer, variablesSerializersModule) } }, - isFromGeneratedSdk, + callerSdkType, ) .runCatching { withContext(dataConnect.blockingDispatcher) { @@ -90,6 +91,7 @@ internal class MutationRefImpl( "variables=$variables, " + "dataDeserializer=$dataDeserializer, " + "variablesSerializer=$variablesSerializer, " + + "callerSdkType=$callerSdkType, " + "variablesSerializersModule=$variablesSerializersModule, " + "dataSerializersModule=$dataSerializersModule" + ")" @@ -114,7 +116,7 @@ internal fun MutationRefImpl.copy( variables: Variables = this.variables, dataDeserializer: DeserializationStrategy = this.dataDeserializer, variablesSerializer: SerializationStrategy = this.variablesSerializer, - isFromGeneratedSdk: Boolean = this.isFromGeneratedSdk, + callerSdkType: FirebaseDataConnect.CallerSdkType = this.callerSdkType, variablesSerializersModule: SerializersModule? = this.variablesSerializersModule, dataSerializersModule: SerializersModule? = this.dataSerializersModule, ) = @@ -124,7 +126,7 @@ internal fun MutationRefImpl.copy( variables = variables, dataDeserializer = dataDeserializer, variablesSerializer = variablesSerializer, - isFromGeneratedSdk = isFromGeneratedSdk, + callerSdkType = callerSdkType, variablesSerializersModule = variablesSerializersModule, dataSerializersModule = dataSerializersModule, ) @@ -140,7 +142,7 @@ internal fun MutationRefImpl.withVariablesSerializ variables = variables, dataDeserializer = dataDeserializer, variablesSerializer = variablesSerializer, - isFromGeneratedSdk = isFromGeneratedSdk, + callerSdkType = callerSdkType, variablesSerializersModule = variablesSerializersModule, dataSerializersModule = dataSerializersModule, ) @@ -155,7 +157,7 @@ internal fun MutationRefImpl<*, Variables>.withDataDeserial variables = variables, dataDeserializer = dataDeserializer, variablesSerializer = variablesSerializer, - isFromGeneratedSdk = isFromGeneratedSdk, + callerSdkType = callerSdkType, variablesSerializersModule = variablesSerializersModule, dataSerializersModule = dataSerializersModule, ) diff --git a/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/OperationRefImpl.kt b/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/OperationRefImpl.kt index db462472ac7..592ee38f760 100644 --- a/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/OperationRefImpl.kt +++ b/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/OperationRefImpl.kt @@ -28,8 +28,9 @@ internal abstract class OperationRefImpl( override val variables: Variables, override val dataDeserializer: DeserializationStrategy, override val variablesSerializer: SerializationStrategy, - override val dataSerializersModule: SerializersModule?, + override val callerSdkType: FirebaseDataConnect.CallerSdkType, override val variablesSerializersModule: SerializersModule?, + override val dataSerializersModule: SerializersModule?, ) : OperationRef { abstract override suspend fun execute(): OperationResultImpl @@ -40,8 +41,9 @@ internal abstract class OperationRefImpl( variables, dataDeserializer, variablesSerializer, - dataSerializersModule, + callerSdkType, variablesSerializersModule, + dataSerializersModule ) override fun equals(other: Any?) = @@ -51,8 +53,9 @@ internal abstract class OperationRefImpl( other.variables == variables && other.dataDeserializer == dataDeserializer && other.variablesSerializer == variablesSerializer && - other.dataSerializersModule == dataSerializersModule && - other.variablesSerializersModule == variablesSerializersModule + other.callerSdkType == callerSdkType && + other.variablesSerializersModule == variablesSerializersModule && + other.dataSerializersModule == dataSerializersModule override fun toString() = "OperationRefImpl(" + @@ -60,9 +63,10 @@ internal abstract class OperationRefImpl( "operationName=$operationName, " + "variables=$variables, " + "dataDeserializer=$dataDeserializer, " + - "variablesSerializer=$variablesSerializer, " + - "dataSerializersModule=$dataSerializersModule, " + - "variablesSerializersModule=$variablesSerializersModule" + + "variablesSerializer=$variablesSerializer" + + "callerSdkType=$callerSdkType, " + + "variablesSerializersModule=$variablesSerializersModule, " + + "dataSerializersModule=$dataSerializersModule" + ")" abstract inner class OperationResultImpl(override val data: Data) : diff --git a/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/QueryRefImpl.kt b/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/QueryRefImpl.kt index 7b5614ff211..4f29fc88bd3 100644 --- a/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/QueryRefImpl.kt +++ b/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/QueryRefImpl.kt @@ -28,7 +28,7 @@ internal class QueryRefImpl( variables: Variables, dataDeserializer: DeserializationStrategy, variablesSerializer: SerializationStrategy, - val isFromGeneratedSdk: Boolean, + callerSdkType: FirebaseDataConnect.CallerSdkType, variablesSerializersModule: SerializersModule?, dataSerializersModule: SerializersModule?, ) : @@ -39,6 +39,7 @@ internal class QueryRefImpl( variables = variables, dataDeserializer = dataDeserializer, variablesSerializer = variablesSerializer, + callerSdkType = callerSdkType, variablesSerializersModule = variablesSerializersModule, dataSerializersModule = dataSerializersModule, ) { @@ -58,6 +59,7 @@ internal class QueryRefImpl( "variables=$variables, " + "dataDeserializer=$dataDeserializer, " + "variablesSerializer=$variablesSerializer, " + + "callerSdkType=$callerSdkType, " + "variablesSerializersModule=$variablesSerializersModule, " + "dataSerializersModule=$dataSerializersModule" + ")" @@ -82,7 +84,7 @@ internal fun QueryRefImpl.copy( variables: Variables = this.variables, dataDeserializer: DeserializationStrategy = this.dataDeserializer, variablesSerializer: SerializationStrategy = this.variablesSerializer, - isFromGeneratedSdk: Boolean = this.isFromGeneratedSdk, + callerSdkType: FirebaseDataConnect.CallerSdkType = this.callerSdkType, variablesSerializersModule: SerializersModule? = this.variablesSerializersModule, dataSerializersModule: SerializersModule? = this.dataSerializersModule, ) = @@ -92,7 +94,7 @@ internal fun QueryRefImpl.copy( variables = variables, dataDeserializer = dataDeserializer, variablesSerializer = variablesSerializer, - isFromGeneratedSdk = isFromGeneratedSdk, + callerSdkType = callerSdkType, variablesSerializersModule = variablesSerializersModule, dataSerializersModule = dataSerializersModule, ) diff --git a/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/generated/GeneratedMutation.kt b/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/generated/GeneratedMutation.kt index 109ed438b19..3c4974eff68 100644 --- a/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/generated/GeneratedMutation.kt +++ b/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/generated/GeneratedMutation.kt @@ -16,6 +16,7 @@ package com.google.firebase.dataconnect.generated +import com.google.firebase.dataconnect.FirebaseDataConnect import com.google.firebase.dataconnect.MutationRef /** @@ -43,6 +44,6 @@ public interface GeneratedMutation : dataDeserializer, variablesSerializer, ) { - generatedMutation = this@GeneratedMutation + callerSdkType = FirebaseDataConnect.CallerSdkType.Generated } } diff --git a/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/generated/GeneratedQuery.kt b/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/generated/GeneratedQuery.kt index c1ab9000396..eb5f8a5be5b 100644 --- a/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/generated/GeneratedQuery.kt +++ b/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/generated/GeneratedQuery.kt @@ -16,6 +16,7 @@ package com.google.firebase.dataconnect.generated +import com.google.firebase.dataconnect.FirebaseDataConnect import com.google.firebase.dataconnect.QueryRef /** @@ -43,6 +44,6 @@ public interface GeneratedQuery : dataDeserializer, variablesSerializer, ) { - generatedQuery = this@GeneratedQuery + callerSdkType = FirebaseDataConnect.CallerSdkType.Generated } } diff --git a/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/querymgr/LiveQuery.kt b/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/querymgr/LiveQuery.kt index 461fc9b31c4..252e072d509 100644 --- a/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/querymgr/LiveQuery.kt +++ b/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/querymgr/LiveQuery.kt @@ -16,6 +16,7 @@ package com.google.firebase.dataconnect.querymgr +import com.google.firebase.dataconnect.FirebaseDataConnect import com.google.firebase.dataconnect.core.DataConnectGrpcClient import com.google.firebase.dataconnect.core.DataConnectGrpcClient.OperationResult import com.google.firebase.dataconnect.core.Logger @@ -91,7 +92,7 @@ internal class LiveQuery( suspend fun execute( dataDeserializer: DeserializationStrategy, dataSerializersModule: SerializersModule?, - isFromGeneratedSdk: Boolean, + callerSdkType: FirebaseDataConnect.CallerSdkType, ): SequencedReference> { // Register the data deserializer _before_ waiting for the current job to complete. This // guarantees that the deserializer will be registered by the time the subsequent job (`newJob` @@ -115,7 +116,7 @@ internal class LiveQuery( currentJob } else { logger.debug { "creating new job to execute query" } - coroutineScope.async { doExecute(isFromGeneratedSdk) }.also { newJob -> job = newJob } + coroutineScope.async { doExecute(callerSdkType) }.also { newJob -> job = newJob } } } } @@ -129,7 +130,7 @@ internal class LiveQuery( dataDeserializer: DeserializationStrategy, dataSerializersModule: SerializersModule?, executeQuery: Boolean, - isFromGeneratedSdk: Boolean, + callerSdkType: FirebaseDataConnect.CallerSdkType, callback: suspend (SequencedReference>) -> Unit, ): Nothing { val registeredDataDeserializer = @@ -151,7 +152,7 @@ internal class LiveQuery( // executes. if (executeQuery) { coroutineScope.launch { - runCatching { execute(dataDeserializer, dataSerializersModule, isFromGeneratedSdk) } + runCatching { execute(dataDeserializer, dataSerializersModule, callerSdkType) } } } @@ -162,20 +163,20 @@ internal class LiveQuery( } } - private suspend fun doExecute(isFromGeneratedSdk: Boolean) { + private suspend fun doExecute(callerSdkType: FirebaseDataConnect.CallerSdkType) { val requestId = "qry" + Random.nextAlphanumericString(length = 10) val sequenceNumber = nextSequenceNumber() val executeQueryResult = grpcClient.runCatching { logger.debug( - "Calling executeQuery() with requestId=$requestId isFromGeneratedSdk=$isFromGeneratedSdk" + "Calling executeQuery() with requestId=$requestId callerSdkType=$callerSdkType" ) executeQuery( requestId = requestId, operationName = operationName, variables = variables, - isFromGeneratedSdk = isFromGeneratedSdk, + callerSdkType = callerSdkType, ) } diff --git a/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/querymgr/QueryManager.kt b/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/querymgr/QueryManager.kt index 7d2eae87447..79e481d8819 100644 --- a/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/querymgr/QueryManager.kt +++ b/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/querymgr/QueryManager.kt @@ -27,7 +27,7 @@ internal class QueryManager(private val liveQueries: LiveQueries) { it.execute( dataDeserializer = query.dataDeserializer, dataSerializersModule = query.dataSerializersModule, - isFromGeneratedSdk = query.isFromGeneratedSdk, + callerSdkType = query.callerSdkType, ) } @@ -41,7 +41,7 @@ internal class QueryManager(private val liveQueries: LiveQueries) { dataDeserializer = query.dataDeserializer, dataSerializersModule = query.dataSerializersModule, executeQuery = executeQuery, - isFromGeneratedSdk = query.isFromGeneratedSdk, + callerSdkType = query.callerSdkType, callback = callback, ) } diff --git a/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/serializers/UUIDSerializer.kt b/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/serializers/UUIDSerializer.kt index 5c22281b630..5dbcceef892 100644 --- a/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/serializers/UUIDSerializer.kt +++ b/firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/serializers/UUIDSerializer.kt @@ -16,6 +16,7 @@ package com.google.firebase.dataconnect.serializers +import androidx.annotation.VisibleForTesting import java.util.UUID import kotlinx.serialization.KSerializer import kotlinx.serialization.descriptors.PrimitiveKind @@ -33,13 +34,23 @@ public object UUIDSerializer : KSerializer { PrimitiveSerialDescriptor("UUID", PrimitiveKind.STRING) override fun serialize(encoder: Encoder, value: UUID) { - // Remove dashes from the UUID since the server will remove them anyways (see cl/629562890). - val uuidString = value.toString().replace("-", "") + val uuidString = serialize(value) encoder.encodeString(uuidString) } + @VisibleForTesting + internal fun serialize(value: UUID): String { + // Remove dashes from the UUID since the server will remove them anyways (see cl/629562890). + return value.toString().replace("-", "") + } + override fun deserialize(decoder: Decoder): UUID { val decodedString = decoder.decodeString() + return deserialize(decodedString) + } + + @VisibleForTesting + internal fun deserialize(decodedString: String): UUID { require(decodedString.length == 32) { "invalid UUID string: $decodedString (length=${decodedString.length}, expected=32)" } diff --git a/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/DataConnectGrpcClientUnitTest.kt b/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/DataConnectGrpcClientUnitTest.kt index 17ee6e4d7b4..6b43c1ba8bc 100644 --- a/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/DataConnectGrpcClientUnitTest.kt +++ b/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/DataConnectGrpcClientUnitTest.kt @@ -20,6 +20,7 @@ import com.google.firebase.dataconnect.DataConnectException import com.google.firebase.dataconnect.DataConnectUntypedData import com.google.firebase.dataconnect.core.DataConnectGrpcClient.OperationResult import com.google.firebase.dataconnect.testutil.DataConnectLogLevelRule +import com.google.firebase.dataconnect.testutil.callerSdkType import com.google.firebase.dataconnect.testutil.connectorConfig import com.google.firebase.dataconnect.testutil.dataConnectError import com.google.firebase.dataconnect.testutil.iterator @@ -53,7 +54,6 @@ import io.kotest.property.Arb import io.kotest.property.RandomSource import io.kotest.property.arbitrary.Codepoint import io.kotest.property.arbitrary.alphanumeric -import io.kotest.property.arbitrary.boolean import io.kotest.property.arbitrary.egyptianHieroglyphs import io.kotest.property.arbitrary.filter import io.kotest.property.arbitrary.int @@ -92,7 +92,7 @@ class DataConnectGrpcClientUnitTest { private val requestId = Arb.requestId(key).next(rs) private val operationName = Arb.operationName(key).next(rs) private val variables = buildStructProto { put("dhxpwjtb6s", key) } - private val isFromGeneratedSdk = Arb.boolean().next(rs) + private val callerSdkType = Arb.callerSdkType().next(rs) private val mockDataConnectAuth: DataConnectAuth = mockk(relaxed = true, name = "mockDataConnectAuth-$key") @@ -121,7 +121,7 @@ class DataConnectGrpcClientUnitTest { @Test fun `executeQuery() should send the right request`() = runTest { - dataConnectGrpcClient.executeQuery(requestId, operationName, variables, isFromGeneratedSdk) + dataConnectGrpcClient.executeQuery(requestId, operationName, variables, callerSdkType) val expectedName = "projects/${projectId}" + @@ -134,14 +134,12 @@ class DataConnectGrpcClientUnitTest { .setOperationName(operationName) .setVariables(variables) .build() - coVerify { - mockDataConnectGrpcRPCs.executeQuery(requestId, expectedRequest, isFromGeneratedSdk) - } + coVerify { mockDataConnectGrpcRPCs.executeQuery(requestId, expectedRequest, callerSdkType) } } @Test fun `executeMutation() should send the right request`() = runTest { - dataConnectGrpcClient.executeMutation(requestId, operationName, variables, isFromGeneratedSdk) + dataConnectGrpcClient.executeMutation(requestId, operationName, variables, callerSdkType) val expectedName = "projects/${projectId}" + @@ -154,9 +152,7 @@ class DataConnectGrpcClientUnitTest { .setOperationName(operationName) .setVariables(variables) .build() - coVerify { - mockDataConnectGrpcRPCs.executeMutation(requestId, expectedRequest, isFromGeneratedSdk) - } + coVerify { mockDataConnectGrpcRPCs.executeMutation(requestId, expectedRequest, callerSdkType) } } @Test @@ -165,7 +161,7 @@ class DataConnectGrpcClientUnitTest { ExecuteQueryResponse.getDefaultInstance() val operationResult = - dataConnectGrpcClient.executeQuery(requestId, operationName, variables, isFromGeneratedSdk) + dataConnectGrpcClient.executeQuery(requestId, operationName, variables, callerSdkType) operationResult shouldBe OperationResult(data = null, errors = emptyList()) } @@ -177,12 +173,7 @@ class DataConnectGrpcClientUnitTest { ExecuteMutationResponse.getDefaultInstance() val operationResult = - dataConnectGrpcClient.executeMutation( - requestId, - operationName, - variables, - isFromGeneratedSdk - ) + dataConnectGrpcClient.executeMutation(requestId, operationName, variables, callerSdkType) operationResult shouldBe OperationResult(data = null, errors = emptyList()) } @@ -198,7 +189,7 @@ class DataConnectGrpcClientUnitTest { .build() val operationResult = - dataConnectGrpcClient.executeQuery(requestId, operationName, variables, isFromGeneratedSdk) + dataConnectGrpcClient.executeQuery(requestId, operationName, variables, callerSdkType) operationResult shouldBe OperationResult(data = responseData, errors = responseErrors.map { it.dataConnectError }) @@ -215,7 +206,7 @@ class DataConnectGrpcClientUnitTest { .build() val operationResult = - dataConnectGrpcClient.executeMutation(requestId, operationName, variables, isFromGeneratedSdk) + dataConnectGrpcClient.executeMutation(requestId, operationName, variables, callerSdkType) operationResult shouldBe OperationResult(data = responseData, errors = responseErrors.map { it.dataConnectError }) @@ -228,7 +219,7 @@ class DataConnectGrpcClientUnitTest { val thrownException = shouldThrow { - dataConnectGrpcClient.executeQuery(requestId, operationName, variables, isFromGeneratedSdk) + dataConnectGrpcClient.executeQuery(requestId, operationName, variables, callerSdkType) } thrownException shouldBe exception @@ -241,12 +232,7 @@ class DataConnectGrpcClientUnitTest { val thrownException = shouldThrow { - dataConnectGrpcClient.executeMutation( - requestId, - operationName, - variables, - isFromGeneratedSdk - ) + dataConnectGrpcClient.executeMutation(requestId, operationName, variables, callerSdkType) } thrownException shouldBe exception @@ -273,7 +259,7 @@ class DataConnectGrpcClientUnitTest { } val result = - dataConnectGrpcClient.executeQuery(requestId, operationName, variables, isFromGeneratedSdk) + dataConnectGrpcClient.executeQuery(requestId, operationName, variables, callerSdkType) result shouldBe OperationResult(data = responseData, errors = emptyList()) coVerify(exactly = 2) { mockDataConnectGrpcRPCs.executeQuery(any(), any(), any()) } @@ -304,7 +290,7 @@ class DataConnectGrpcClientUnitTest { } val result = - dataConnectGrpcClient.executeMutation(requestId, operationName, variables, isFromGeneratedSdk) + dataConnectGrpcClient.executeMutation(requestId, operationName, variables, callerSdkType) result shouldBe OperationResult(data = responseData, errors = emptyList()) coVerify(exactly = 2) { mockDataConnectGrpcRPCs.executeMutation(any(), any(), any()) } @@ -335,7 +321,7 @@ class DataConnectGrpcClientUnitTest { } val result = - dataConnectGrpcClient.executeQuery(requestId, operationName, variables, isFromGeneratedSdk) + dataConnectGrpcClient.executeQuery(requestId, operationName, variables, callerSdkType) result shouldBe OperationResult(data = responseData, errors = emptyList()) coVerify(exactly = 2) { mockDataConnectGrpcRPCs.executeQuery(any(), any(), any()) } @@ -366,7 +352,7 @@ class DataConnectGrpcClientUnitTest { } val result = - dataConnectGrpcClient.executeMutation(requestId, operationName, variables, isFromGeneratedSdk) + dataConnectGrpcClient.executeMutation(requestId, operationName, variables, callerSdkType) result shouldBe OperationResult(data = responseData, errors = emptyList()) coVerify(exactly = 2) { mockDataConnectGrpcRPCs.executeMutation(any(), any(), any()) } @@ -383,7 +369,7 @@ class DataConnectGrpcClientUnitTest { val thrownException = shouldThrow { - dataConnectGrpcClient.executeQuery(requestId, operationName, variables, isFromGeneratedSdk) + dataConnectGrpcClient.executeQuery(requestId, operationName, variables, callerSdkType) } thrownException shouldBeSameInstanceAs exception @@ -398,12 +384,7 @@ class DataConnectGrpcClientUnitTest { val thrownException = shouldThrow { - dataConnectGrpcClient.executeMutation( - requestId, - operationName, - variables, - isFromGeneratedSdk - ) + dataConnectGrpcClient.executeMutation(requestId, operationName, variables, callerSdkType) } thrownException shouldBeSameInstanceAs exception @@ -421,12 +402,7 @@ class DataConnectGrpcClientUnitTest { val thrownException = shouldThrow { - dataConnectGrpcClient.executeQuery( - requestId, - operationName, - variables, - isFromGeneratedSdk - ) + dataConnectGrpcClient.executeQuery(requestId, operationName, variables, callerSdkType) } thrownException shouldBeSameInstanceAs exception2 @@ -442,12 +418,7 @@ class DataConnectGrpcClientUnitTest { val thrownException = shouldThrow { - dataConnectGrpcClient.executeMutation( - requestId, - operationName, - variables, - isFromGeneratedSdk - ) + dataConnectGrpcClient.executeMutation(requestId, operationName, variables, callerSdkType) } thrownException shouldBeSameInstanceAs exception2 @@ -463,12 +434,7 @@ class DataConnectGrpcClientUnitTest { val thrownException = shouldThrow { - dataConnectGrpcClient.executeQuery( - requestId, - operationName, - variables, - isFromGeneratedSdk - ) + dataConnectGrpcClient.executeQuery(requestId, operationName, variables, callerSdkType) } thrownException shouldBeSameInstanceAs exception2 @@ -484,12 +450,7 @@ class DataConnectGrpcClientUnitTest { val thrownException = shouldThrow { - dataConnectGrpcClient.executeMutation( - requestId, - operationName, - variables, - isFromGeneratedSdk - ) + dataConnectGrpcClient.executeMutation(requestId, operationName, variables, callerSdkType) } thrownException shouldBeSameInstanceAs exception2 @@ -505,12 +466,7 @@ class DataConnectGrpcClientUnitTest { val thrownException = shouldThrow { - dataConnectGrpcClient.executeQuery( - requestId, - operationName, - variables, - isFromGeneratedSdk - ) + dataConnectGrpcClient.executeQuery(requestId, operationName, variables, callerSdkType) } thrownException shouldBeSameInstanceAs exception2 @@ -526,12 +482,7 @@ class DataConnectGrpcClientUnitTest { val thrownException = shouldThrow { - dataConnectGrpcClient.executeMutation( - requestId, - operationName, - variables, - isFromGeneratedSdk - ) + dataConnectGrpcClient.executeMutation(requestId, operationName, variables, callerSdkType) } thrownException shouldBeSameInstanceAs exception2 diff --git a/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/DataConnectGrpcMetadataUnitTest.kt b/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/DataConnectGrpcMetadataUnitTest.kt index c18d2a7c004..3ae47f85a38 100644 --- a/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/DataConnectGrpcMetadataUnitTest.kt +++ b/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/DataConnectGrpcMetadataUnitTest.kt @@ -19,8 +19,10 @@ import android.os.Build import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.firebase.dataconnect.BuildConfig import com.google.firebase.dataconnect.ConnectorConfig +import com.google.firebase.dataconnect.FirebaseDataConnect.CallerSdkType import com.google.firebase.dataconnect.testutil.FirebaseAppUnitTestingRule import com.google.firebase.dataconnect.testutil.accessToken +import com.google.firebase.dataconnect.testutil.callerSdkType import com.google.firebase.dataconnect.testutil.connectorConfig import com.google.firebase.dataconnect.testutil.requestId import io.grpc.Metadata @@ -31,7 +33,6 @@ import io.kotest.matchers.shouldBe import io.kotest.matchers.types.shouldBeSameInstanceAs import io.kotest.property.Arb import io.kotest.property.RandomSource -import io.kotest.property.arbitrary.boolean import io.kotest.property.arbitrary.next import io.mockk.CapturingSlot import io.mockk.coEvery @@ -54,7 +55,7 @@ class DataConnectGrpcMetadataUnitTest { ) @Test - fun `should include x-goog-api-client when isFromGeneratedSdk is true`() = runTest { + fun `should include x-goog-api-client when callerSdkType is Generated`() = runTest { val key = "pkprzbns45" val testValues = DataConnectGrpcMetadataTestValues.fromKey(key) val dataConnectGrpcMetadata = @@ -66,7 +67,7 @@ class DataConnectGrpcMetadataUnitTest { ) val requestId = Arb.requestId(key).next() - val metadata = dataConnectGrpcMetadata.get(requestId, isFromGeneratedSdk = true) + val metadata = dataConnectGrpcMetadata.get(requestId, callerSdkType = CallerSdkType.Generated) metadata.asClue { it.keys() shouldContain "x-goog-api-client" @@ -77,7 +78,7 @@ class DataConnectGrpcMetadataUnitTest { } @Test - fun `should include x-goog-api-client when isFromGeneratedSdk is false`() = runTest { + fun `should include x-goog-api-client when callerSdkType is Base`() = runTest { val key = "pkprzbns45" val testValues = DataConnectGrpcMetadataTestValues.fromKey(key) val dataConnectGrpcMetadata = @@ -89,7 +90,7 @@ class DataConnectGrpcMetadataUnitTest { ) val requestId = Arb.requestId(key).next() - val metadata = dataConnectGrpcMetadata.get(requestId, isFromGeneratedSdk = false) + val metadata = dataConnectGrpcMetadata.get(requestId, callerSdkType = CallerSdkType.Base) metadata.asClue { it.keys() shouldContain "x-goog-api-client" @@ -106,9 +107,9 @@ class DataConnectGrpcMetadataUnitTest { val location = testValues.connectorConfig.location val dataConnectGrpcMetadata = testValues.newDataConnectGrpcMetadata() val requestId = Arb.requestId(key).next() - val isFromGeneratedSdk = Arb.boolean().next() + val callerSdkType = Arb.callerSdkType().next() - val metadata = dataConnectGrpcMetadata.get(requestId, isFromGeneratedSdk) + val metadata = dataConnectGrpcMetadata.get(requestId, callerSdkType) metadata.asClue { it.keys() shouldContain "x-goog-request-params" @@ -123,9 +124,9 @@ class DataConnectGrpcMetadataUnitTest { val testValues = DataConnectGrpcMetadataTestValues.fromKey(key) val dataConnectGrpcMetadata = testValues.newDataConnectGrpcMetadata(appId = "tvsxjeb745.appId") val requestId = Arb.requestId(key).next() - val isFromGeneratedSdk = Arb.boolean().next() + val callerSdkType = Arb.callerSdkType().next() - val metadata = dataConnectGrpcMetadata.get(requestId, isFromGeneratedSdk) + val metadata = dataConnectGrpcMetadata.get(requestId, callerSdkType) metadata.asClue { it.keys() shouldContain "x-firebase-gmpid" @@ -140,9 +141,9 @@ class DataConnectGrpcMetadataUnitTest { val testValues = DataConnectGrpcMetadataTestValues.fromKey(key) val dataConnectGrpcMetadata = testValues.newDataConnectGrpcMetadata(appId = "") val requestId = Arb.requestId(key).next() - val isFromGeneratedSdk = Arb.boolean().next() + val callerSdkType = Arb.callerSdkType().next() - val metadata = dataConnectGrpcMetadata.get(requestId, isFromGeneratedSdk) + val metadata = dataConnectGrpcMetadata.get(requestId, callerSdkType) metadata.asClue { it.keys() shouldNotContain "x-firebase-gmpid" } } @@ -153,9 +154,9 @@ class DataConnectGrpcMetadataUnitTest { val testValues = DataConnectGrpcMetadataTestValues.fromKey(key) val dataConnectGrpcMetadata = testValues.newDataConnectGrpcMetadata(appId = " \r\n\t ") val requestId = Arb.requestId(key).next() - val isFromGeneratedSdk = Arb.boolean().next() + val callerSdkType = Arb.callerSdkType().next() - val metadata = dataConnectGrpcMetadata.get(requestId, isFromGeneratedSdk) + val metadata = dataConnectGrpcMetadata.get(requestId, callerSdkType) metadata.asClue { it.keys() shouldNotContain "x-firebase-gmpid" } } @@ -167,9 +168,9 @@ class DataConnectGrpcMetadataUnitTest { coEvery { testValues.dataConnectAuth.getToken(any()) } returns null val dataConnectGrpcMetadata = testValues.newDataConnectGrpcMetadata() val requestId = Arb.requestId(key).next() - val isFromGeneratedSdk = Arb.boolean().next() + val callerSdkType = Arb.callerSdkType().next() - val metadata = dataConnectGrpcMetadata.get(requestId, isFromGeneratedSdk) + val metadata = dataConnectGrpcMetadata.get(requestId, callerSdkType) metadata.asClue { it.keys() shouldNotContain "x-firebase-auth-token" } } @@ -182,9 +183,9 @@ class DataConnectGrpcMetadataUnitTest { coEvery { testValues.dataConnectAuth.getToken(any()) } returns accessToken val dataConnectGrpcMetadata = testValues.newDataConnectGrpcMetadata() val requestId = Arb.requestId(key).next() - val isFromGeneratedSdk = Arb.boolean().next() + val callerSdkType = Arb.callerSdkType().next() - val metadata = dataConnectGrpcMetadata.get(requestId, isFromGeneratedSdk) + val metadata = dataConnectGrpcMetadata.get(requestId, callerSdkType) metadata.asClue { it.keys() shouldContain "x-firebase-auth-token" @@ -200,9 +201,9 @@ class DataConnectGrpcMetadataUnitTest { coEvery { testValues.dataConnectAppCheck.getToken(any()) } returns null val dataConnectGrpcMetadata = testValues.newDataConnectGrpcMetadata() val requestId = Arb.requestId(key).next() - val isFromGeneratedSdk = Arb.boolean().next() + val callerSdkType = Arb.callerSdkType().next() - val metadata = dataConnectGrpcMetadata.get(requestId, isFromGeneratedSdk) + val metadata = dataConnectGrpcMetadata.get(requestId, callerSdkType) metadata.asClue { it.keys() shouldNotContain "x-firebase-appcheck" } } @@ -215,9 +216,9 @@ class DataConnectGrpcMetadataUnitTest { coEvery { testValues.dataConnectAppCheck.getToken(any()) } returns accessToken val dataConnectGrpcMetadata = testValues.newDataConnectGrpcMetadata() val requestId = Arb.requestId(key).next() - val isFromGeneratedSdk = Arb.boolean().next() + val callerSdkType = Arb.callerSdkType().next() - val metadata = dataConnectGrpcMetadata.get(requestId, isFromGeneratedSdk) + val metadata = dataConnectGrpcMetadata.get(requestId, callerSdkType) metadata.asClue { it.keys() shouldContain "x-firebase-appcheck" diff --git a/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/FirebaseDataConnectImplUnitTest.kt b/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/FirebaseDataConnectImplUnitTest.kt index 3b306b4e923..f14cf1abbdf 100644 --- a/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/FirebaseDataConnectImplUnitTest.kt +++ b/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/FirebaseDataConnectImplUnitTest.kt @@ -16,8 +16,10 @@ package com.google.firebase.dataconnect.core import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.google.firebase.dataconnect.FirebaseDataConnect.CallerSdkType import com.google.firebase.dataconnect.testutil.DataConnectLogLevelRule import com.google.firebase.dataconnect.testutil.FirebaseAppUnitTestingRule +import com.google.firebase.dataconnect.testutil.callerSdkType import com.google.firebase.dataconnect.testutil.connectorConfig import com.google.firebase.dataconnect.testutil.dataConnectSettings import com.google.firebase.dataconnect.testutil.operationName @@ -77,7 +79,7 @@ class FirebaseDataConnectImplUnitTest { } @Test - fun `query() with no options set should use default values for each option`() = runTest { + fun `query() with no options set should use null for each option`() = runTest { val operationName = Arb.operationName(key).next(rs) val variables = TestVariables(Arb.string(size = 8).next(rs)) val dataDeserializer: DeserializationStrategy = mockk() @@ -96,7 +98,7 @@ class FirebaseDataConnectImplUnitTest { queryRef.variables shouldBeSameInstanceAs variables queryRef.dataDeserializer shouldBeSameInstanceAs dataDeserializer queryRef.variablesSerializer shouldBeSameInstanceAs variablesSerializer - queryRef.isFromGeneratedSdk shouldBe false + queryRef.callerSdkType shouldBe CallerSdkType.Base queryRef.variablesSerializersModule.shouldBeNull() queryRef.dataSerializersModule.shouldBeNull() } @@ -108,6 +110,7 @@ class FirebaseDataConnectImplUnitTest { val variables = TestVariables(Arb.string(size = 8).next(rs)) val dataDeserializer: DeserializationStrategy = mockk() val variablesSerializer: SerializationStrategy = mockk() + val callerSdkType = Arb.callerSdkType().next() val dataSerializersModule: SerializersModule = mockk() val variablesSerializersModule: SerializersModule = mockk() @@ -118,7 +121,7 @@ class FirebaseDataConnectImplUnitTest { dataDeserializer = dataDeserializer, variablesSerializer = variablesSerializer, ) { - this.generatedQuery = mockk() + this.callerSdkType = callerSdkType this.dataSerializersModule = dataSerializersModule this.variablesSerializersModule = variablesSerializersModule } @@ -128,14 +131,14 @@ class FirebaseDataConnectImplUnitTest { queryRef.variables shouldBeSameInstanceAs variables queryRef.dataDeserializer shouldBeSameInstanceAs dataDeserializer queryRef.variablesSerializer shouldBeSameInstanceAs variablesSerializer - queryRef.isFromGeneratedSdk shouldBe true + queryRef.callerSdkType shouldBe callerSdkType queryRef.dataSerializersModule shouldBeSameInstanceAs dataSerializersModule queryRef.variablesSerializersModule shouldBeSameInstanceAs variablesSerializersModule } } @Test - fun `mutation() with no options set should use default values for each option`() = runTest { + fun `mutation() with no options set should use null for each option`() = runTest { val operationName = Arb.operationName(key).next(rs) val variables = TestVariables(Arb.string(size = 8).next(rs)) val dataDeserializer: DeserializationStrategy = mockk() @@ -154,7 +157,7 @@ class FirebaseDataConnectImplUnitTest { mutationRef.variables shouldBeSameInstanceAs variables mutationRef.dataDeserializer shouldBeSameInstanceAs dataDeserializer mutationRef.variablesSerializer shouldBeSameInstanceAs variablesSerializer - mutationRef.isFromGeneratedSdk shouldBe false + mutationRef.callerSdkType shouldBe CallerSdkType.Base mutationRef.variablesSerializersModule.shouldBeNull() mutationRef.dataSerializersModule.shouldBeNull() } @@ -166,6 +169,7 @@ class FirebaseDataConnectImplUnitTest { val variables = TestVariables(Arb.string(size = 8).next(rs)) val dataDeserializer: DeserializationStrategy = mockk() val variablesSerializer: SerializationStrategy = mockk() + val callerSdkType = Arb.callerSdkType().next() val dataSerializersModule: SerializersModule = mockk() val variablesSerializersModule: SerializersModule = mockk() @@ -176,7 +180,7 @@ class FirebaseDataConnectImplUnitTest { dataDeserializer = dataDeserializer, variablesSerializer = variablesSerializer, ) { - this.generatedMutation = mockk() + this.callerSdkType = callerSdkType this.dataSerializersModule = dataSerializersModule this.variablesSerializersModule = variablesSerializersModule } @@ -186,7 +190,7 @@ class FirebaseDataConnectImplUnitTest { mutationRef.variables shouldBeSameInstanceAs variables mutationRef.dataDeserializer shouldBeSameInstanceAs dataDeserializer mutationRef.variablesSerializer shouldBeSameInstanceAs variablesSerializer - mutationRef.isFromGeneratedSdk shouldBe true + mutationRef.callerSdkType shouldBe callerSdkType mutationRef.dataSerializersModule shouldBeSameInstanceAs dataSerializersModule mutationRef.variablesSerializersModule shouldBeSameInstanceAs variablesSerializersModule } diff --git a/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/MutationRefImplUnitTest.kt b/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/MutationRefImplUnitTest.kt index e289fffcd3e..3f609b62fae 100644 --- a/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/MutationRefImplUnitTest.kt +++ b/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/MutationRefImplUnitTest.kt @@ -19,8 +19,11 @@ package com.google.firebase.dataconnect.core import com.google.firebase.dataconnect.DataConnectException import com.google.firebase.dataconnect.DataConnectUntypedData import com.google.firebase.dataconnect.DataConnectUntypedVariables +import com.google.firebase.dataconnect.FirebaseDataConnect.CallerSdkType import com.google.firebase.dataconnect.core.DataConnectGrpcClient.OperationResult +import com.google.firebase.dataconnect.testutil.callerSdkType import com.google.firebase.dataconnect.testutil.dataConnectError +import com.google.firebase.dataconnect.testutil.filterNotEqual import com.google.firebase.dataconnect.testutil.mutationRefImpl import com.google.firebase.dataconnect.util.SuspendingLazy import com.google.firebase.dataconnect.util.buildStructProto @@ -31,7 +34,6 @@ import io.kotest.assertions.asClue import io.kotest.assertions.assertSoftly import io.kotest.assertions.retry import io.kotest.assertions.throwables.shouldThrow -import io.kotest.assertions.withClue import io.kotest.matchers.nulls.shouldBeNull import io.kotest.matchers.shouldBe import io.kotest.matchers.shouldNotBe @@ -89,12 +91,14 @@ class MutationRefImplUnitTest { val requestIdSlot: CapturingSlot = slot() val operationNameSlot: CapturingSlot = slot() val variablesSlot: CapturingSlot = slot() + val callerSdkTypeSlot: CapturingSlot = slot() val dataConnect = dataConnectWithMutationResult( Result.success(operationResult), requestIdSlot, operationNameSlot, - variablesSlot + variablesSlot, + callerSdkTypeSlot, ) val mutationRefImpl = Arb.mutationRefImpl().next().copy(dataConnect = dataConnect) @@ -102,14 +106,17 @@ class MutationRefImplUnitTest { val requestId1 = requestIdSlot.captured val operationName1 = operationNameSlot.captured val variables1 = variablesSlot.captured + val callerSdkType1 = callerSdkTypeSlot.captured requestIdSlot.clear() operationNameSlot.clear() variablesSlot.clear() + callerSdkTypeSlot.clear() mutationRefImpl.execute() val requestId2 = requestIdSlot.captured val operationName2 = operationNameSlot.captured val variables2 = variablesSlot.captured + val callerSdkType2 = callerSdkTypeSlot.captured assertSoftly { requestId1.shouldNotBeBlank() @@ -119,43 +126,8 @@ class MutationRefImplUnitTest { operationName2 shouldBe operationName1 variables1 shouldBe encodeToStruct(mutationRefImpl.variables) variables2 shouldBe variables1 - } - } - - @Test - fun `execute() calls executeMutation with the correct isFromGeneratedSdk`() { - assertSoftly { - for (isFromGeneratedSdk in listOf(true, false)) { - withClue("isFromGeneratedSdk=$isFromGeneratedSdk") { - verifyIsFromGeneratedSdkRoundTrip(isFromGeneratedSdk) - } - } - } - } - - private fun verifyIsFromGeneratedSdkRoundTrip(isFromGeneratedSdk: Boolean) = runTest { - val data = Arb.testData().next() - val operationResult = OperationResult(encodeToStruct(data), errors = emptyList()) - val isFromGeneratedSdkSlot: CapturingSlot = slot() - val dataConnect = - dataConnectWithMutationResult( - Result.success(operationResult), - isFromGeneratedSdkSlot = isFromGeneratedSdkSlot - ) - val mutationRefImpl = - Arb.mutationRefImpl() - .next() - .copy(dataConnect = dataConnect, isFromGeneratedSdk = isFromGeneratedSdk) - - mutationRefImpl.execute() - val isFromGeneratedSdk1 = isFromGeneratedSdkSlot.captured - isFromGeneratedSdkSlot.clear() - mutationRefImpl.execute() - val isFromGeneratedSdk2 = isFromGeneratedSdkSlot.captured - - assertSoftly { - isFromGeneratedSdk1 shouldBe isFromGeneratedSdk - isFromGeneratedSdk2 shouldBe isFromGeneratedSdk + callerSdkType1 shouldBe mutationRefImpl.callerSdkType + callerSdkType2 shouldBe mutationRefImpl.callerSdkType } } @@ -194,7 +166,7 @@ class MutationRefImplUnitTest { } @Test - fun `constructor assigns public properties to the given arguments`() { + fun `constructor accepts non-null values`() { val values = Arb.mutationRefImpl().next() val mutationRefImpl = MutationRefImpl( @@ -203,7 +175,7 @@ class MutationRefImplUnitTest { variables = values.variables, dataDeserializer = values.dataDeserializer, variablesSerializer = values.variablesSerializer, - isFromGeneratedSdk = values.isFromGeneratedSdk, + callerSdkType = values.callerSdkType, variablesSerializersModule = values.variablesSerializersModule, dataSerializersModule = values.dataSerializersModule, ) @@ -215,7 +187,7 @@ class MutationRefImplUnitTest { it.variables shouldBeSameInstanceAs values.variables it.dataDeserializer shouldBeSameInstanceAs values.dataDeserializer it.variablesSerializer shouldBeSameInstanceAs values.variablesSerializer - it.isFromGeneratedSdk shouldBe values.isFromGeneratedSdk + it.callerSdkType shouldBe values.callerSdkType it.variablesSerializersModule shouldBeSameInstanceAs values.variablesSerializersModule it.dataSerializersModule shouldBeSameInstanceAs values.dataSerializersModule } @@ -232,7 +204,7 @@ class MutationRefImplUnitTest { variables = values.variables, dataDeserializer = values.dataDeserializer, variablesSerializer = values.variablesSerializer, - isFromGeneratedSdk = values.isFromGeneratedSdk, + callerSdkType = values.callerSdkType, variablesSerializersModule = null, dataSerializersModule = null, ) @@ -244,7 +216,7 @@ class MutationRefImplUnitTest { it.variables shouldBeSameInstanceAs values.variables it.dataDeserializer shouldBeSameInstanceAs values.dataDeserializer it.variablesSerializer shouldBeSameInstanceAs values.variablesSerializer - it.isFromGeneratedSdk shouldBe values.isFromGeneratedSdk + it.callerSdkType shouldBe values.callerSdkType it.variablesSerializersModule.shouldBeNull() it.dataSerializersModule.shouldBeNull() } @@ -294,10 +266,10 @@ class MutationRefImplUnitTest { } @Test - fun `hashCode() should NOT incorporate isFromGeneratedSdk`() = runTest { - val mutationRef1 = Arb.mutationRefImpl().next() - val mutationRef2 = mutationRef1.copy(isFromGeneratedSdk = !mutationRef1.isFromGeneratedSdk) - mutationRef1.hashCode() shouldBe mutationRef2.hashCode() + fun `hashCode() should incorporate callerSdkType`() = runTest { + verifyHashCodeEventuallyDiffers { + it.copy(callerSdkType = Arb.callerSdkType().filterNotEqual(it.callerSdkType).next()) + } } @Test @@ -401,29 +373,29 @@ class MutationRefImplUnitTest { } @Test - fun `equals() should return _TRUE_ when only isFromGeneratedSdk differs`() = runTest { + fun `equals() should return false when only callerSdkType differs`() = runTest { val mutationRefImpl1: MutationRefImpl = Arb.mutationRefImpl().next() - val mutationRefImpl2 = - mutationRefImpl1.copy(isFromGeneratedSdk = !mutationRefImpl1.isFromGeneratedSdk) - mutationRefImpl1.equals(mutationRefImpl2) shouldBe true + val callerSdkType2 = Arb.callerSdkType().filterNotEqual(mutationRefImpl1.callerSdkType).next() + val mutationRefImpl2 = mutationRefImpl1.copy(callerSdkType = callerSdkType2) + mutationRefImpl1.equals(mutationRefImpl2) shouldBe false } @Test - fun `equals() should return false when only dataSerializersModule differs`() = runTest { + fun `equals() should return false when only variablesSerializersModule differs`() = runTest { val mutationRefImpl1: MutationRefImpl = Arb.mutationRefImpl().next() - val mutationRefImpl2 = mutationRefImpl1.copy(dataSerializersModule = mockk(stringArb.next())) - val mutationRefImplNull = mutationRefImpl1.copy(dataSerializersModule = null) + val mutationRefImpl2 = + mutationRefImpl1.copy(variablesSerializersModule = mockk(stringArb.next())) + val mutationRefImplNull = mutationRefImpl1.copy(variablesSerializersModule = null) mutationRefImpl1.equals(mutationRefImpl2) shouldBe false mutationRefImplNull.equals(mutationRefImpl1) shouldBe false mutationRefImpl1.equals(mutationRefImplNull) shouldBe false } @Test - fun `equals() should return false when only variablesSerializersModule differs`() = runTest { + fun `equals() should return false when only dataSerializersModule differs`() = runTest { val mutationRefImpl1: MutationRefImpl = Arb.mutationRefImpl().next() - val mutationRefImpl2 = - mutationRefImpl1.copy(variablesSerializersModule = mockk(stringArb.next())) - val mutationRefImplNull = mutationRefImpl1.copy(variablesSerializersModule = null) + val mutationRefImpl2 = mutationRefImpl1.copy(dataSerializersModule = mockk(stringArb.next())) + val mutationRefImplNull = mutationRefImpl1.copy(dataSerializersModule = null) mutationRefImpl1.equals(mutationRefImpl2) shouldBe false mutationRefImplNull.equals(mutationRefImpl1) shouldBe false mutationRefImpl1.equals(mutationRefImplNull) shouldBe false @@ -432,10 +404,11 @@ class MutationRefImplUnitTest { @Test fun `toString() should incorporate the string representations of public properties`() = runTest { val mutationRefImpl: MutationRefImpl = Arb.mutationRefImpl().next() + val callerSdkType2 = Arb.callerSdkType().filterNotEqual(mutationRefImpl.callerSdkType).next() val mutationRefImpls = listOf( mutationRefImpl, - mutationRefImpl.copy(isFromGeneratedSdk = !mutationRefImpl.isFromGeneratedSdk), + mutationRefImpl.copy(callerSdkType = callerSdkType2), mutationRefImpl.copy(dataSerializersModule = null), mutationRefImpl.copy(variablesSerializersModule = null), ) @@ -449,6 +422,7 @@ class MutationRefImplUnitTest { toStringResult.shouldContain("variables=${mutationRefImpl.variables}") toStringResult.shouldContain("dataDeserializer=${mutationRefImpl.dataDeserializer}") toStringResult.shouldContain("variablesSerializer=${mutationRefImpl.variablesSerializer}") + toStringResult.shouldContain("callerSdkType=${mutationRefImpl.callerSdkType}") toStringResult.shouldContain( "dataSerializersModule=${mutationRefImpl.dataSerializersModule}" ) @@ -472,6 +446,7 @@ class MutationRefImplUnitTest { toStringResult.shouldContain("variables=${mutationRefImpl.variables}") toStringResult.shouldContain("dataDeserializer=${mutationRefImpl.dataDeserializer}") toStringResult.shouldContain("variablesSerializer=${mutationRefImpl.variablesSerializer}") + toStringResult.shouldContain("callerSdkType=${mutationRefImpl.callerSdkType}") toStringResult.shouldContain("dataSerializersModule=null") toStringResult.shouldContain( "variablesSerializersModule=${mutationRefImpl.variablesSerializersModule}" @@ -491,6 +466,7 @@ class MutationRefImplUnitTest { toStringResult.shouldContain("variables=${mutationRefImpl.variables}") toStringResult.shouldContain("dataDeserializer=${mutationRefImpl.dataDeserializer}") toStringResult.shouldContain("variablesSerializer=${mutationRefImpl.variablesSerializer}") + toStringResult.shouldContain("callerSdkType=${mutationRefImpl.callerSdkType}") toStringResult.shouldContain("dataSerializersModule=${mutationRefImpl.dataSerializersModule}") toStringResult.shouldContain("variablesSerializersModule=null") } @@ -522,7 +498,7 @@ class MutationRefImplUnitTest { requestIdSlot: CapturingSlot = slot(), operationNameSlot: CapturingSlot = slot(), variablesSlot: CapturingSlot = slot(), - isFromGeneratedSdkSlot: CapturingSlot = slot(), + callerSdkTypeSlot: CapturingSlot = slot(), ): FirebaseDataConnectInternal = mockk(relaxed = true) { every { blockingDispatcher } returns UnconfinedTestDispatcher(testScheduler) @@ -534,7 +510,7 @@ class MutationRefImplUnitTest { capture(requestIdSlot), capture(operationNameSlot), capture(variablesSlot), - capture(isFromGeneratedSdkSlot), + capture(callerSdkTypeSlot), ) } returns result.getOrThrow() } diff --git a/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/MutationResultUnitTest.kt b/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/MutationResultUnitTest.kt index 94acc9a0b37..af14bc175ad 100644 --- a/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/MutationResultUnitTest.kt +++ b/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/MutationResultUnitTest.kt @@ -17,7 +17,9 @@ package com.google.firebase.dataconnect.core import com.google.common.truth.Truth.assertThat +import com.google.firebase.dataconnect.testutil.callerSdkType import com.google.firebase.dataconnect.testutil.containsWithNonAdjacentText +import io.kotest.property.Arb import io.kotest.property.arbitrary.next import io.mockk.mockk import kotlinx.serialization.DeserializationStrategy @@ -40,7 +42,7 @@ class MutationResultImplUnitTest { variables = TestVariables("sampleMutationTestData"), dataDeserializer = mockDataDeserializer, variablesSerializer = mockVariablesSerializer, - isFromGeneratedSdk = true, + callerSdkType = Arb.callerSdkType().next(), dataSerializersModule = mockSerializersModule, variablesSerializersModule = mockSerializersModule, ) @@ -52,7 +54,7 @@ class MutationResultImplUnitTest { variables = TestVariables("sampleMutationTestData1"), dataDeserializer = mockDataDeserializer, variablesSerializer = mockVariablesSerializer, - isFromGeneratedSdk = false, + callerSdkType = Arb.callerSdkType().next(), dataSerializersModule = mockSerializersModule, variablesSerializersModule = mockSerializersModule, ) @@ -64,7 +66,7 @@ class MutationResultImplUnitTest { variables = TestVariables("sampleMutationTestData2"), dataDeserializer = mockDataDeserializer, variablesSerializer = mockVariablesSerializer, - isFromGeneratedSdk = true, + callerSdkType = Arb.callerSdkType().next(), dataSerializersModule = mockSerializersModule, variablesSerializersModule = mockSerializersModule, ) diff --git a/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/OperationRefImplUnitTest.kt b/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/OperationRefImplUnitTest.kt index 3ccfe4d2fe3..a7f9f2ed784 100644 --- a/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/OperationRefImplUnitTest.kt +++ b/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/OperationRefImplUnitTest.kt @@ -17,7 +17,9 @@ package com.google.firebase.dataconnect.core import com.google.firebase.dataconnect.testutil.StubOperationRefImpl +import com.google.firebase.dataconnect.testutil.callerSdkType import com.google.firebase.dataconnect.testutil.copy +import com.google.firebase.dataconnect.testutil.filterNotEqual import com.google.firebase.dataconnect.testutil.operationRefImpl import io.kotest.assertions.asClue import io.kotest.assertions.assertSoftly @@ -46,7 +48,7 @@ class OperationRefImplUnitTest { private class TestVariables(val bar: String) @Test - fun `constructor assigns public properties to the given arguments`() { + fun `constructor accepts non-null values`() { val values = Arb.operationRefImpl().next() val operationRefImpl = object : @@ -56,6 +58,7 @@ class OperationRefImplUnitTest { variables = values.variables, dataDeserializer = values.dataDeserializer, variablesSerializer = values.variablesSerializer, + callerSdkType = values.callerSdkType, variablesSerializersModule = values.variablesSerializersModule, dataSerializersModule = values.dataSerializersModule, ) { @@ -69,6 +72,7 @@ class OperationRefImplUnitTest { it.variables shouldBeSameInstanceAs values.variables it.dataDeserializer shouldBeSameInstanceAs values.dataDeserializer it.variablesSerializer shouldBeSameInstanceAs values.variablesSerializer + it.callerSdkType shouldBe values.callerSdkType it.variablesSerializersModule shouldBeSameInstanceAs values.variablesSerializersModule it.dataSerializersModule shouldBeSameInstanceAs values.dataSerializersModule } @@ -86,6 +90,7 @@ class OperationRefImplUnitTest { variables = values.variables, dataDeserializer = values.dataDeserializer, variablesSerializer = values.variablesSerializer, + callerSdkType = values.callerSdkType, variablesSerializersModule = null, dataSerializersModule = null, ) { @@ -98,6 +103,7 @@ class OperationRefImplUnitTest { it.variables shouldBeSameInstanceAs values.variables it.dataDeserializer shouldBeSameInstanceAs values.dataDeserializer it.variablesSerializer shouldBeSameInstanceAs values.variablesSerializer + it.callerSdkType shouldBe values.callerSdkType it.variablesSerializersModule.shouldBeNull() it.dataSerializersModule.shouldBeNull() } @@ -146,6 +152,13 @@ class OperationRefImplUnitTest { } } + @Test + fun `hashCode() should incorporate callerSdkType`() = runTest { + verifyHashCodeEventuallyDiffers { + it.copy(callerSdkType = Arb.callerSdkType().filterNotEqual(it.callerSdkType).next()) + } + } + @Test fun `hashCode() should incorporate variablesSerializersModule`() = runTest { verifyHashCodeEventuallyDiffers { @@ -248,6 +261,14 @@ class OperationRefImplUnitTest { operationRefImpl1.equals(operationRefImpl2) shouldBe false } + @Test + fun `equals() should return false when only callerSdkType differs`() = runTest { + val operationRefImpl1 = Arb.operationRefImpl().next() + val callerSdkType2 = Arb.callerSdkType().filterNotEqual(operationRefImpl1.callerSdkType).next() + val operationRefImpl2 = operationRefImpl1.copy(callerSdkType = callerSdkType2) + operationRefImpl1.equals(operationRefImpl2) shouldBe false + } + @Test fun `equals() should return false when only variablesSerializersModule differs`() = runTest { val operationRefImpl1 = Arb.operationRefImpl().next() @@ -272,9 +293,11 @@ class OperationRefImplUnitTest { @Test fun `toString() should incorporate the string representations of public properties`() = runTest { val operationRefImpl = Arb.operationRefImpl().next() + val callerSdkType2 = Arb.callerSdkType().filterNotEqual(operationRefImpl.callerSdkType).next() val operationRefImpls = listOf( operationRefImpl, + operationRefImpl.copy(callerSdkType = callerSdkType2), operationRefImpl.copy(dataSerializersModule = null), operationRefImpl.copy(variablesSerializersModule = null), ) @@ -290,6 +313,7 @@ class OperationRefImplUnitTest { toStringResult.shouldContain( "variablesSerializer=${operationRefImpl.variablesSerializer}" ) + toStringResult.shouldContain("callerSdkType=${operationRefImpl.callerSdkType}") toStringResult.shouldContain( "dataSerializersModule=${operationRefImpl.dataSerializersModule}" ) @@ -312,6 +336,7 @@ class OperationRefImplUnitTest { toStringResult.shouldContain("variables=${operationRefImpl.variables}") toStringResult.shouldContain("dataDeserializer=${operationRefImpl.dataDeserializer}") toStringResult.shouldContain("variablesSerializer=${operationRefImpl.variablesSerializer}") + toStringResult.shouldContain("callerSdkType=${operationRefImpl.callerSdkType}") toStringResult.shouldContain("dataSerializersModule=null") toStringResult.shouldContain( "variablesSerializersModule=${operationRefImpl.variablesSerializersModule}" @@ -330,6 +355,7 @@ class OperationRefImplUnitTest { toStringResult.shouldContain("variables=${operationRefImpl.variables}") toStringResult.shouldContain("dataDeserializer=${operationRefImpl.dataDeserializer}") toStringResult.shouldContain("variablesSerializer=${operationRefImpl.variablesSerializer}") + toStringResult.shouldContain("callerSdkType=${operationRefImpl.callerSdkType}") toStringResult.shouldContain( "dataSerializersModule=${operationRefImpl.dataSerializersModule}" ) diff --git a/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/QueryRefImplUnitTest.kt b/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/QueryRefImplUnitTest.kt index fdc01238059..5fe4d2b814c 100644 --- a/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/QueryRefImplUnitTest.kt +++ b/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/QueryRefImplUnitTest.kt @@ -17,6 +17,8 @@ package com.google.firebase.dataconnect.core import com.google.firebase.dataconnect.querymgr.QueryManager +import com.google.firebase.dataconnect.testutil.callerSdkType +import com.google.firebase.dataconnect.testutil.filterNotEqual import com.google.firebase.dataconnect.testutil.queryRefImpl import com.google.firebase.dataconnect.util.SequencedReference import com.google.firebase.dataconnect.util.SuspendingLazy @@ -102,7 +104,7 @@ class QueryRefImplUnitTest { } @Test - fun `constructor assigns public properties to the given arguments`() { + fun `constructor accepts non-null values`() { val values = Arb.queryRefImpl().next() val queryRefImpl = QueryRefImpl( @@ -111,7 +113,7 @@ class QueryRefImplUnitTest { variables = values.variables, dataDeserializer = values.dataDeserializer, variablesSerializer = values.variablesSerializer, - isFromGeneratedSdk = values.isFromGeneratedSdk, + callerSdkType = values.callerSdkType, variablesSerializersModule = values.variablesSerializersModule, dataSerializersModule = values.dataSerializersModule, ) @@ -123,7 +125,7 @@ class QueryRefImplUnitTest { it.variables shouldBeSameInstanceAs values.variables it.dataDeserializer shouldBeSameInstanceAs values.dataDeserializer it.variablesSerializer shouldBeSameInstanceAs values.variablesSerializer - it.isFromGeneratedSdk shouldBe values.isFromGeneratedSdk + it.callerSdkType shouldBe values.callerSdkType it.variablesSerializersModule shouldBeSameInstanceAs values.variablesSerializersModule it.dataSerializersModule shouldBeSameInstanceAs values.dataSerializersModule } @@ -140,9 +142,9 @@ class QueryRefImplUnitTest { variables = values.variables, dataDeserializer = values.dataDeserializer, variablesSerializer = values.variablesSerializer, - isFromGeneratedSdk = values.isFromGeneratedSdk, - dataSerializersModule = null, + callerSdkType = values.callerSdkType, variablesSerializersModule = null, + dataSerializersModule = null, ) queryRefImpl.asClue { @@ -152,7 +154,7 @@ class QueryRefImplUnitTest { it.variables shouldBeSameInstanceAs values.variables it.dataDeserializer shouldBeSameInstanceAs values.dataDeserializer it.variablesSerializer shouldBeSameInstanceAs values.variablesSerializer - it.isFromGeneratedSdk shouldBe values.isFromGeneratedSdk + it.callerSdkType shouldBe values.callerSdkType it.variablesSerializersModule.shouldBeNull() it.dataSerializersModule.shouldBeNull() } @@ -202,10 +204,10 @@ class QueryRefImplUnitTest { } @Test - fun `hashCode() should NOT incorporate isFromGeneratedSdk`() = runTest { - val queryRef1 = Arb.queryRefImpl().next() - val queryRef2 = queryRef1.copy(isFromGeneratedSdk = !queryRef1.isFromGeneratedSdk) - queryRef1.hashCode() shouldBe queryRef2.hashCode() + fun `hashCode() should incorporate callerSdkType`() = runTest { + verifyHashCodeEventuallyDiffers { + it.copy(callerSdkType = Arb.callerSdkType().filterNotEqual(it.callerSdkType).next()) + } } @Test @@ -308,10 +310,11 @@ class QueryRefImplUnitTest { } @Test - fun `equals() should return _TRUE_ when only isFromGeneratedSdk differs`() = runTest { + fun `equals() should return false when only callerSdkType differs`() = runTest { val queryRefImpl1: QueryRefImpl = Arb.queryRefImpl().next() - val queryRefImpl2 = queryRefImpl1.copy(isFromGeneratedSdk = !queryRefImpl1.isFromGeneratedSdk) - queryRefImpl1.equals(queryRefImpl2) shouldBe true + val callerSdkType2 = Arb.callerSdkType().filterNotEqual(queryRefImpl1.callerSdkType).next() + val queryRefImpl2 = queryRefImpl1.copy(callerSdkType = callerSdkType2) + queryRefImpl1.equals(queryRefImpl2) shouldBe false } @Test @@ -337,10 +340,11 @@ class QueryRefImplUnitTest { @Test fun `toString() should incorporate the string representations of public properties`() = runTest { val queryRefImpl: QueryRefImpl = Arb.queryRefImpl().next() + val callerSdkType2 = Arb.callerSdkType().filterNotEqual(queryRefImpl.callerSdkType).next() val queryRefImpls = listOf( queryRefImpl, - queryRefImpl.copy(isFromGeneratedSdk = !queryRefImpl.isFromGeneratedSdk), + queryRefImpl.copy(callerSdkType = callerSdkType2), queryRefImpl.copy(dataSerializersModule = null), queryRefImpl.copy(variablesSerializersModule = null), ) @@ -354,6 +358,7 @@ class QueryRefImplUnitTest { toStringResult.shouldContain("variables=${queryRefImpl.variables}") toStringResult.shouldContain("dataDeserializer=${queryRefImpl.dataDeserializer}") toStringResult.shouldContain("variablesSerializer=${queryRefImpl.variablesSerializer}") + toStringResult.shouldContain("callerSdkType=${queryRefImpl.callerSdkType}") toStringResult.shouldContain( "dataSerializersModule=${queryRefImpl.dataSerializersModule}" ) @@ -377,6 +382,7 @@ class QueryRefImplUnitTest { toStringResult.shouldContain("variables=${queryRefImpl.variables}") toStringResult.shouldContain("dataDeserializer=${queryRefImpl.dataDeserializer}") toStringResult.shouldContain("variablesSerializer=${queryRefImpl.variablesSerializer}") + toStringResult.shouldContain("callerSdkType=${queryRefImpl.callerSdkType}") toStringResult.shouldContain("dataSerializersModule=null") toStringResult.shouldContain( "variablesSerializersModule=${queryRefImpl.variablesSerializersModule}" @@ -396,6 +402,7 @@ class QueryRefImplUnitTest { toStringResult.shouldContain("variables=${queryRefImpl.variables}") toStringResult.shouldContain("dataDeserializer=${queryRefImpl.dataDeserializer}") toStringResult.shouldContain("variablesSerializer=${queryRefImpl.variablesSerializer}") + toStringResult.shouldContain("callerSdkType=${queryRefImpl.callerSdkType}") toStringResult.shouldContain("dataSerializersModule=${queryRefImpl.dataSerializersModule}") toStringResult.shouldContain("variablesSerializersModule=null") } diff --git a/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/QueryResultUnitTest.kt b/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/QueryResultUnitTest.kt index 2771dd4fa98..7696b23560a 100644 --- a/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/QueryResultUnitTest.kt +++ b/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/QueryResultUnitTest.kt @@ -17,7 +17,9 @@ package com.google.firebase.dataconnect.core import com.google.common.truth.Truth.assertThat +import com.google.firebase.dataconnect.testutil.callerSdkType import com.google.firebase.dataconnect.testutil.containsWithNonAdjacentText +import io.kotest.property.Arb import io.kotest.property.arbitrary.next import io.mockk.mockk import kotlinx.serialization.DeserializationStrategy @@ -40,7 +42,7 @@ class QueryResultImplUnitTest { variables = TestVariables("sampleQueryTestData"), dataDeserializer = mockDataDeserializer, variablesSerializer = mockVariablesSerializer, - isFromGeneratedSdk = true, + callerSdkType = Arb.callerSdkType().next(), dataSerializersModule = mockSerializersModule, variablesSerializersModule = mockSerializersModule, ) @@ -52,7 +54,7 @@ class QueryResultImplUnitTest { variables = TestVariables("sampleQueryTestData1"), dataDeserializer = mockDataDeserializer, variablesSerializer = mockVariablesSerializer, - isFromGeneratedSdk = false, + callerSdkType = Arb.callerSdkType().next(), dataSerializersModule = mockSerializersModule, variablesSerializersModule = mockSerializersModule, ) @@ -64,7 +66,7 @@ class QueryResultImplUnitTest { variables = TestVariables("sampleQueryTestData2"), dataDeserializer = mockDataDeserializer, variablesSerializer = mockVariablesSerializer, - isFromGeneratedSdk = true, + callerSdkType = Arb.callerSdkType().next(), dataSerializersModule = mockSerializersModule, variablesSerializersModule = mockSerializersModule, ) diff --git a/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/testutil/Arbs.kt b/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/testutil/Arbs.kt index 0ce9dcebaca..93e633269cb 100644 --- a/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/testutil/Arbs.kt +++ b/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/testutil/Arbs.kt @@ -90,7 +90,7 @@ internal fun Arb.Companion.queryRefImpl( variables = variablesArb.bind(), dataDeserializer = mockk(stringArb.bind()), variablesSerializer = mockk(stringArb.bind()), - isFromGeneratedSdk = boolean().bind(), + callerSdkType = callerSdkType().bind(), variablesSerializersModule = mockk(stringArb.bind()), dataSerializersModule = mockk(stringArb.bind()), ) @@ -106,7 +106,7 @@ internal fun Arb.Companion.mutationRefImpl( variables = variablesArb.bind(), dataDeserializer = mockk(stringArb.bind()), variablesSerializer = mockk(stringArb.bind()), - isFromGeneratedSdk = boolean().bind(), + callerSdkType = callerSdkType().bind(), variablesSerializersModule = mockk(stringArb.bind()), dataSerializersModule = mockk(stringArb.bind()), ) @@ -122,7 +122,8 @@ internal fun Arb.Companion.operationRefImpl( variables = variablesArb.bind(), dataDeserializer = mockk(stringArb.bind()), variablesSerializer = mockk(stringArb.bind()), - dataSerializersModule = mockk(stringArb.bind()), + callerSdkType = callerSdkType().bind(), variablesSerializersModule = mockk(stringArb.bind()), + dataSerializersModule = mockk(stringArb.bind()), ) } diff --git a/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/testutil/Stubs.kt b/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/testutil/Stubs.kt index 8d7b27a13ff..bdba941d00f 100644 --- a/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/testutil/Stubs.kt +++ b/firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/testutil/Stubs.kt @@ -15,6 +15,7 @@ */ package com.google.firebase.dataconnect.testutil +import com.google.firebase.dataconnect.FirebaseDataConnect import com.google.firebase.dataconnect.core.FirebaseDataConnectInternal import com.google.firebase.dataconnect.core.OperationRefImpl import kotlinx.serialization.DeserializationStrategy @@ -27,8 +28,9 @@ internal class StubOperationRefImpl( variables: Variables, dataDeserializer: DeserializationStrategy, variablesSerializer: SerializationStrategy, - dataSerializersModule: SerializersModule?, + callerSdkType: FirebaseDataConnect.CallerSdkType, variablesSerializersModule: SerializersModule?, + dataSerializersModule: SerializersModule?, ) : OperationRefImpl( dataConnect = dataConnect, @@ -36,8 +38,9 @@ internal class StubOperationRefImpl( variables = variables, dataDeserializer = dataDeserializer, variablesSerializer = variablesSerializer, - dataSerializersModule = dataSerializersModule, + callerSdkType = callerSdkType, variablesSerializersModule = variablesSerializersModule, + dataSerializersModule = dataSerializersModule, ) { override suspend fun execute(): OperationResultImpl { throw UnsupportedOperationException("this stub method is not supported") @@ -50,8 +53,9 @@ internal fun StubOperationRefImpl.copy( variables: Variables = this.variables, dataDeserializer: DeserializationStrategy = this.dataDeserializer, variablesSerializer: SerializationStrategy = this.variablesSerializer, - dataSerializersModule: SerializersModule? = this.dataSerializersModule, + callerSdkType: FirebaseDataConnect.CallerSdkType = this.callerSdkType, variablesSerializersModule: SerializersModule? = this.variablesSerializersModule, + dataSerializersModule: SerializersModule? = this.dataSerializersModule, ): StubOperationRefImpl = StubOperationRefImpl( dataConnect = dataConnect, @@ -59,6 +63,7 @@ internal fun StubOperationRefImpl.copy( variables = variables, dataDeserializer = dataDeserializer, variablesSerializer = variablesSerializer, - dataSerializersModule = dataSerializersModule, + callerSdkType = callerSdkType, variablesSerializersModule = variablesSerializersModule, + dataSerializersModule = dataSerializersModule, ) diff --git a/firebase-dataconnect/testutil/src/main/kotlin/com/google/firebase/dataconnect/testutil/Arbs.kt b/firebase-dataconnect/testutil/src/main/kotlin/com/google/firebase/dataconnect/testutil/Arbs.kt index a316fb1f6ab..836e3d99b2e 100644 --- a/firebase-dataconnect/testutil/src/main/kotlin/com/google/firebase/dataconnect/testutil/Arbs.kt +++ b/firebase-dataconnect/testutil/src/main/kotlin/com/google/firebase/dataconnect/testutil/Arbs.kt @@ -18,6 +18,7 @@ package com.google.firebase.dataconnect.testutil import com.google.firebase.dataconnect.ConnectorConfig import com.google.firebase.dataconnect.DataConnectSettings +import com.google.firebase.dataconnect.FirebaseDataConnect.CallerSdkType import com.google.firebase.util.nextAlphanumericString import io.kotest.property.Arb import io.kotest.property.arbitrary.Codepoint @@ -41,6 +42,8 @@ import io.kotest.property.arbitrary.string fun Arb.filterNotNull(): Arb = filter { it !== null }.map { it!! } +fun Arb.filterNotEqual(other: A) = filter { it != other } + fun Arb.Companion.keyedString(id: String, key: String, length: Int = 8): Arb = arbitrary { rs -> "${id}_${key}_${rs.random.nextAlphanumericString(length = length)}" @@ -156,3 +159,7 @@ fun Arb>.filterNotIncludesAllMatchingAnyScalars(values: List) .map { allValues.contains(it.first) || allValues.contains(it.second) } .reduce { acc, contained -> acc && contained } } + +fun Arb.Companion.callerSdkType(): Arb = arbitrary { + if (Arb.boolean().bind()) CallerSdkType.Base else CallerSdkType.Generated +} From 0e9e0a1430eb9ba28f1acf468e6c9b48004ec613 Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Tue, 24 Sep 2024 02:37:52 +0000 Subject: [PATCH 2/2] v1alpha -> v1beta --- firebase-dataconnect/CHANGELOG.md | 1 + firebase-dataconnect/emulator/dataconnect/dataconnect.yaml | 2 +- .../google/firebase/dataconnect/proto/connector_service.proto | 2 +- .../proto/google/firebase/dataconnect/proto/graphql_error.proto | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/firebase-dataconnect/CHANGELOG.md b/firebase-dataconnect/CHANGELOG.md index 6e2e9d5c889..fcc3fe32555 100644 --- a/firebase-dataconnect/CHANGELOG.md +++ b/firebase-dataconnect/CHANGELOG.md @@ -2,3 +2,4 @@ * [feature] initial beta release. * [feature] Add ability to specify SerializersModule when serializing. * [feature] CallerSdkType added, to enable tracking generated SDK usage. +* [change] Changed gRPC proto package to v1beta (was v1alpha). diff --git a/firebase-dataconnect/emulator/dataconnect/dataconnect.yaml b/firebase-dataconnect/emulator/dataconnect/dataconnect.yaml index 742d96e73dc..a17c5213bc0 100644 --- a/firebase-dataconnect/emulator/dataconnect/dataconnect.yaml +++ b/firebase-dataconnect/emulator/dataconnect/dataconnect.yaml @@ -1,4 +1,4 @@ -specVersion: "v1alpha" +specVersion: "v1beta" serviceId: "sid2ehn9ct8te" location: "us-central1" schema: diff --git a/firebase-dataconnect/src/main/proto/google/firebase/dataconnect/proto/connector_service.proto b/firebase-dataconnect/src/main/proto/google/firebase/dataconnect/proto/connector_service.proto index 647db3aa2bf..6ae301b559a 100644 --- a/firebase-dataconnect/src/main/proto/google/firebase/dataconnect/proto/connector_service.proto +++ b/firebase-dataconnect/src/main/proto/google/firebase/dataconnect/proto/connector_service.proto @@ -18,7 +18,7 @@ syntax = "proto3"; -package google.firebase.dataconnect.v1alpha; +package google.firebase.dataconnect.v1beta; import "google/api/field_behavior.proto"; import "google/firebase/dataconnect/proto/graphql_error.proto"; diff --git a/firebase-dataconnect/src/main/proto/google/firebase/dataconnect/proto/graphql_error.proto b/firebase-dataconnect/src/main/proto/google/firebase/dataconnect/proto/graphql_error.proto index 84586a4081e..f2ca45e9f66 100644 --- a/firebase-dataconnect/src/main/proto/google/firebase/dataconnect/proto/graphql_error.proto +++ b/firebase-dataconnect/src/main/proto/google/firebase/dataconnect/proto/graphql_error.proto @@ -18,7 +18,7 @@ syntax = "proto3"; -package google.firebase.dataconnect.v1alpha; +package google.firebase.dataconnect.v1beta; import "google/protobuf/struct.proto";