diff --git a/src/main/java/com/google/api/generator/gapic/composer/BUILD.bazel b/src/main/java/com/google/api/generator/gapic/composer/BUILD.bazel index 58993a3eae..ae08ecda8b 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/BUILD.bazel +++ b/src/main/java/com/google/api/generator/gapic/composer/BUILD.bazel @@ -18,7 +18,9 @@ java_library( "//src/main/java/com/google/api/generator/engine/writer", "//src/main/java/com/google/api/generator/gapic:status_java_proto", "//src/main/java/com/google/api/generator/gapic/composer/comment", + "//src/main/java/com/google/api/generator/gapic/composer/common", "//src/main/java/com/google/api/generator/gapic/composer/defaultvalue", + "//src/main/java/com/google/api/generator/gapic/composer/grpc", "//src/main/java/com/google/api/generator/gapic/composer/resourcename", "//src/main/java/com/google/api/generator/gapic/composer/samplecode", "//src/main/java/com/google/api/generator/gapic/composer/store", diff --git a/src/main/java/com/google/api/generator/gapic/composer/ClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ClassComposer.java index e7bcbc014f..56900ba5ec 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ClassComposer.java @@ -14,10 +14,5 @@ package com.google.api.generator.gapic.composer; -import com.google.api.generator.gapic.model.GapicClass; -import com.google.api.generator.gapic.model.GapicContext; -import com.google.api.generator.gapic.model.Service; - -public interface ClassComposer { - GapicClass generate(GapicContext context, Service serivce); -} +public interface ClassComposer + extends com.google.api.generator.gapic.composer.common.ClassComposer {} diff --git a/src/main/java/com/google/api/generator/gapic/composer/Composer.java b/src/main/java/com/google/api/generator/gapic/composer/Composer.java index 85f5e80ce2..1d9c04b27d 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/Composer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/Composer.java @@ -17,6 +17,7 @@ import com.google.api.generator.engine.ast.ClassDefinition; import com.google.api.generator.engine.ast.ScopeNode; import com.google.api.generator.gapic.composer.comment.CommentComposer; +import com.google.api.generator.gapic.composer.grpc.ServiceSettingsClassComposer; import com.google.api.generator.gapic.composer.resourcename.ResourceNameHelperClassComposer; import com.google.api.generator.gapic.model.GapicClass; import com.google.api.generator.gapic.model.GapicClass.Kind; diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceStubSettingsClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceStubSettingsClassComposer.java index 2b9694c298..bc42060de9 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceStubSettingsClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceStubSettingsClassComposer.java @@ -983,7 +983,7 @@ private static List createDefaultHelperAndGetterMethods( javaMethods.add( MethodDefinition.builder() .setHeaderCommentStatements( - SettingsCommentComposer.DEFAULT_GRPC_TRANSPORT_PROVIDER_BUILDER_METHOD_COMMENT) + SettingsCommentComposer.DEFAULT_TRANSPORT_PROVIDER_BUILDER_METHOD_COMMENT) .setScope(ScopeNode.PUBLIC) .setIsStatic(true) .setReturnType(returnType) diff --git a/src/main/java/com/google/api/generator/gapic/composer/comment/SettingsCommentComposer.java b/src/main/java/com/google/api/generator/gapic/composer/comment/SettingsCommentComposer.java index 8ae59bb055..5e10eb9cd5 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/comment/SettingsCommentComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/comment/SettingsCommentComposer.java @@ -67,7 +67,7 @@ public class SettingsCommentComposer { public static final CommentStatement DEFAULT_CREDENTIALS_PROVIDER_BUILDER_METHOD_COMMENT = toSimpleComment("Returns a builder for the default credentials for this service."); - public static final CommentStatement DEFAULT_GRPC_TRANSPORT_PROVIDER_BUILDER_METHOD_COMMENT = + public static final CommentStatement DEFAULT_TRANSPORT_PROVIDER_BUILDER_METHOD_COMMENT = toSimpleComment("Returns a builder for the default ChannelProvider for this service."); public static final CommentStatement NEW_BUILDER_METHOD_COMMENT = diff --git a/src/main/java/com/google/api/generator/gapic/composer/comment/StubCommentComposer.java b/src/main/java/com/google/api/generator/gapic/composer/comment/StubCommentComposer.java index ac20d5845c..01ecd36e66 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/comment/StubCommentComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/comment/StubCommentComposer.java @@ -22,44 +22,69 @@ public class StubCommentComposer { private static final String STUB_CLASS_HEADER_SUMMARY_PATTERN = "Base stub class for the %s service API."; - private static final String GRPC_CALLABLE_FACTORY_CLASS_HEADER_SUMMARY_PATTERN = - "gRPC callable factory implementation for the %s service API."; - private static final String GRPC_STUB_CLASS_HEADER_SUMMARY_PATTERN = - "gRPC stub implementation for the %s service API."; + private static final String TRANSPORT_CALLABLE_FACTORY_CLASS_HEADER_SUMMARY_PATTERN = + "%s callable factory implementation for the %s service API."; + private static final String TRANSPORT_STUB_CLASS_HEADER_SUMMARY_PATTERN = + "%s stub implementation for the %s service API."; private static final String ADVANCED_USAGE_DESCRIPTION = "This class is for advanced usage."; private static final String ADVANCED_USAGE_API_REFLECTION_DESCRIPTION = "This class is for advanced usage and reflects the underlying API directly."; + // TODO: remove after Pre-DIREGAPIC refactoring is fully merged + private static final StubCommentComposer GRPC_INSTANCE = new StubCommentComposer("gRPC"); + + private final String transportPrefix; + + public StubCommentComposer(String transportPrefix) { + this.transportPrefix = transportPrefix; + } + + // TODO: remove after Pre-DIREGAPIC refactoring is fully merged public static List createGrpcServiceStubClassHeaderComments( String serviceName, boolean isDeprecated) { + return GRPC_INSTANCE.createTransportServiceStubClassHeaderComments(serviceName, isDeprecated); + } + + public List createTransportServiceStubClassHeaderComments( + String serviceName, boolean isDeprecated) { JavaDocComment.Builder javaDocBuilder = JavaDocComment.builder(); if (isDeprecated) { javaDocBuilder = javaDocBuilder.setDeprecated(CommentComposer.DEPRECATED_CLASS_STRING); } - return Arrays.asList( CommentComposer.AUTO_GENERATED_CLASS_COMMENT, CommentStatement.withComment( javaDocBuilder - .addComment(String.format(GRPC_STUB_CLASS_HEADER_SUMMARY_PATTERN, serviceName)) + .addComment( + String.format( + TRANSPORT_STUB_CLASS_HEADER_SUMMARY_PATTERN, transportPrefix, serviceName)) .addParagraph(ADVANCED_USAGE_API_REFLECTION_DESCRIPTION) .build())); } + // TODO: remove after Pre-DIREGAPIC refactoring is fully merged public static List createGrpcServiceCallableFactoryClassHeaderComments( String serviceName, boolean isDeprecated) { + return GRPC_INSTANCE.createTransportServiceCallableFactoryClassHeaderComments( + serviceName, isDeprecated); + } + + public List createTransportServiceCallableFactoryClassHeaderComments( + String serviceName, boolean isDeprecated) { JavaDocComment.Builder javaDocBuilder = JavaDocComment.builder(); if (isDeprecated) { javaDocBuilder = javaDocBuilder.setDeprecated(CommentComposer.DEPRECATED_CLASS_STRING); } - return Arrays.asList( CommentComposer.AUTO_GENERATED_CLASS_COMMENT, CommentStatement.withComment( javaDocBuilder .addComment( - String.format(GRPC_CALLABLE_FACTORY_CLASS_HEADER_SUMMARY_PATTERN, serviceName)) + String.format( + TRANSPORT_CALLABLE_FACTORY_CLASS_HEADER_SUMMARY_PATTERN, + transportPrefix, + serviceName)) .addParagraph(ADVANCED_USAGE_DESCRIPTION) .build())); } diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceSettingsClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceSettingsClassComposer.java similarity index 96% rename from src/main/java/com/google/api/generator/gapic/composer/ServiceSettingsClassComposer.java rename to src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceSettingsClassComposer.java index 28d4355cc4..fdfa9c7177 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceSettingsClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceSettingsClassComposer.java @@ -12,13 +12,12 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.api.generator.gapic.composer; +package com.google.api.generator.gapic.composer.common; import com.google.api.core.ApiFunction; import com.google.api.core.BetaApi; import com.google.api.gax.core.GoogleCredentialsProvider; import com.google.api.gax.core.InstantiatingExecutorProvider; -import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider; import com.google.api.gax.rpc.ApiClientHeaderProvider; import com.google.api.gax.rpc.BatchingCallSettings; import com.google.api.gax.rpc.ClientContext; @@ -61,6 +60,7 @@ import com.google.api.generator.gapic.model.Method; import com.google.api.generator.gapic.model.Method.Stream; import com.google.api.generator.gapic.model.Service; +import com.google.api.generator.gapic.model.TransportContext; import com.google.api.generator.gapic.utils.JavaStyle; import com.google.common.base.Preconditions; import com.google.longrunning.Operation; @@ -75,26 +75,16 @@ import java.util.stream.Collectors; import javax.annotation.Generated; -public class ServiceSettingsClassComposer implements ClassComposer { +public abstract class AbstractServiceSettingsClassComposer implements ClassComposer { private static final String BUILDER_CLASS_NAME = "Builder"; - private static final String CALL_SETTINGS_TYPE_NAME_PATTERN = "%sCallSettings"; private static final String PAGED_RESPONSE_TYPE_NAME_PATTERN = "%sPagedResponse"; private static final String OPERATION_SETTINGS_LITERAL = "OperationSettings"; private static final String SETTINGS_LITERAL = "Settings"; - - private static final ServiceSettingsClassComposer INSTANCE = new ServiceSettingsClassComposer(); - private static final TypeStore FIXED_TYPESTORE = createStaticTypes(); - private ServiceSettingsClassComposer() {} - - public static ServiceSettingsClassComposer instance() { - return INSTANCE; - } - @Override - public GapicClass generate(GapicContext ignored, Service service) { + public GapicClass generate(GapicContext context, Service service) { String pakkage = service.pakkage(); TypeStore typeStore = createDynamicTypes(service); String className = ClassNames.getServiceSettingsClassName(service); @@ -118,7 +108,7 @@ public GapicClass generate(GapicContext ignored, Service service) { typeStore .get(ClassNames.getServiceSettingsClassName(service)) .reference())))) - .setMethods(createClassMethods(service, typeStore)) + .setMethods(createClassMethods(context.transportContext(), service, typeStore)) .setNestedClasses(Arrays.asList(createNestedBuilderClass(service, typeStore))) .build(); return GapicClass.create(kind, classDef); @@ -168,11 +158,12 @@ private static List createClassAnnotations(Service service) { return annotations; } - private static List createClassMethods(Service service, TypeStore typeStore) { + private static List createClassMethods( + TransportContext transportContext, Service service, TypeStore typeStore) { List javaMethods = new ArrayList<>(); javaMethods.addAll(createSettingsGetterMethods(service, typeStore)); javaMethods.add(createCreatorMethod(service, typeStore)); - javaMethods.addAll(createDefaultGetterMethods(service, typeStore)); + javaMethods.addAll(createDefaultGetterMethods(transportContext, service, typeStore)); javaMethods.addAll(createBuilderHelperMethods(service, typeStore)); javaMethods.add(createConstructorMethod(service, typeStore)); return javaMethods; @@ -202,8 +193,7 @@ private static MethodDefinition createConstructorMethod(Service service, TypeSto } // TODO(miraleung): Consider merging this with createNestedBuilderSettingsGetterMethods. - private static List createSettingsGetterMethods( - Service service, TypeStore typeStore) { + private static List createSettingsGetterMethods(Service service, TypeStore typeStore) { TypeNode stubSettingsType = typeStore.get(ClassNames.getServiceStubSettingsClassName(service)); BiFunction methodMakerFn = (retType, javaMethodName) -> @@ -306,7 +296,7 @@ private static MethodDefinition createCreatorMethod(Service service, TypeStore t } private static List createDefaultGetterMethods( - Service service, TypeStore typeStore) { + TransportContext transportContext, Service service, TypeStore typeStore) { BiFunction methodStarterFn = (mName, retType) -> MethodDefinition.builder() @@ -356,9 +346,9 @@ private static List createDefaultGetterMethods( javaMethods.add( methodMakerFn.apply( methodStarterFn.apply( - "defaultGrpcTransportProviderBuilder", - typeMakerFn.apply(InstantiatingGrpcChannelProvider.Builder.class)), - SettingsCommentComposer.DEFAULT_GRPC_TRANSPORT_PROVIDER_BUILDER_METHOD_COMMENT)); + transportContext.defaultTransportProviderBuilderName(), + typeMakerFn.apply(transportContext.instantiatingChannelProviderClass())), + SettingsCommentComposer.DEFAULT_TRANSPORT_PROVIDER_BUILDER_METHOD_COMMENT)); javaMethods.add( methodStarterFn @@ -385,8 +375,7 @@ private static List createDefaultGetterMethods( return javaMethods; } - private static List createBuilderHelperMethods( - Service service, TypeStore typeStore) { + private static List createBuilderHelperMethods(Service service, TypeStore typeStore) { TypeNode builderType = typeStore.get(BUILDER_CLASS_NAME); MethodDefinition newBuilderMethodOne = MethodDefinition.builder() @@ -740,7 +729,6 @@ private static TypeStore createStaticTypes() { Generated.class, GoogleCredentialsProvider.class, InstantiatingExecutorProvider.class, - InstantiatingGrpcChannelProvider.class, IOException.class, Operation.class, OperationCallSettings.class, diff --git a/src/main/java/com/google/api/generator/gapic/composer/common/BUILD.bazel b/src/main/java/com/google/api/generator/gapic/composer/common/BUILD.bazel new file mode 100644 index 0000000000..be2ec575c3 --- /dev/null +++ b/src/main/java/com/google/api/generator/gapic/composer/common/BUILD.bazel @@ -0,0 +1,50 @@ +load("@rules_java//java:defs.bzl", "java_library") + +package(default_visibility = ["//visibility:public"]) + +filegroup( + name = "common_files", + srcs = glob(["*.java"]), +) + +java_library( + name = "common", + srcs = [ + ":common_files", + ], + deps = [ + "//:service_config_java_proto", + "//src/main/java/com/google/api/generator/engine/ast", + "//src/main/java/com/google/api/generator/engine/writer", + "//src/main/java/com/google/api/generator/gapic:status_java_proto", + "//src/main/java/com/google/api/generator/gapic/composer/comment", + "//src/main/java/com/google/api/generator/gapic/composer/defaultvalue", + "//src/main/java/com/google/api/generator/gapic/composer/resourcename", + "//src/main/java/com/google/api/generator/gapic/composer/samplecode", + "//src/main/java/com/google/api/generator/gapic/composer/store", + "//src/main/java/com/google/api/generator/gapic/composer/utils", + "//src/main/java/com/google/api/generator/gapic/model", + "//src/main/java/com/google/api/generator/gapic/utils", + "//src/main/java/com/google/api/generator/util", + "@com_google_api_api_common//jar", + "@com_google_api_gax_java//gax:gax", + "@com_google_api_gax_java//gax:gax_testlib", + "@com_google_api_gax_java//gax-grpc:gax_grpc", + "@com_google_api_gax_java//gax-grpc:gax_grpc_testlib", + "@com_google_code_findbugs_jsr305//jar", + "@com_google_googleapis//gapic/metadata:metadata_java_proto", + "@com_google_googleapis//google/api:api_java_proto", + "@com_google_googleapis//google/longrunning:longrunning_java_proto", + "@com_google_googleapis//google/rpc:rpc_java_proto", + "@com_google_guava_guava//jar", + "@com_google_protobuf//:protobuf_java", + "@com_google_protobuf//:protobuf_java_util", + "@com_google_protobuf//java/core", + "@io_grpc_grpc_java//api", + "@io_grpc_grpc_java//protobuf", + "@io_grpc_grpc_java//stub", + "@javax_annotation_javax_annotation_api//jar", + "@junit_junit//jar", + "@org_threeten_threetenbp//jar", + ], +) diff --git a/src/main/java/com/google/api/generator/gapic/composer/common/ClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/common/ClassComposer.java new file mode 100644 index 0000000000..5ebb6ca31e --- /dev/null +++ b/src/main/java/com/google/api/generator/gapic/composer/common/ClassComposer.java @@ -0,0 +1,24 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.api.generator.gapic.composer.common; + +import com.google.api.generator.gapic.model.GapicClass; +import com.google.api.generator.gapic.model.GapicContext; +import com.google.api.generator.gapic.model.Service; + +// TODO: remove after Pre-DIREGAPIC refactoring is fully merged +public interface ClassComposer { + GapicClass generate(GapicContext context, Service serivce); +} diff --git a/src/main/java/com/google/api/generator/gapic/composer/grpc/BUILD.bazel b/src/main/java/com/google/api/generator/gapic/composer/grpc/BUILD.bazel new file mode 100644 index 0000000000..daabba93e6 --- /dev/null +++ b/src/main/java/com/google/api/generator/gapic/composer/grpc/BUILD.bazel @@ -0,0 +1,51 @@ +load("@rules_java//java:defs.bzl", "java_library") + +package(default_visibility = ["//visibility:public"]) + +filegroup( + name = "grpc_files", + srcs = glob(["*.java"]), +) + +java_library( + name = "grpc", + srcs = [ + ":grpc_files", + ], + deps = [ + "//:service_config_java_proto", + "//src/main/java/com/google/api/generator/engine/ast", + "//src/main/java/com/google/api/generator/engine/writer", + "//src/main/java/com/google/api/generator/gapic:status_java_proto", + "//src/main/java/com/google/api/generator/gapic/composer/comment", + "//src/main/java/com/google/api/generator/gapic/composer/common", + "//src/main/java/com/google/api/generator/gapic/composer/defaultvalue", + "//src/main/java/com/google/api/generator/gapic/composer/resourcename", + "//src/main/java/com/google/api/generator/gapic/composer/samplecode", + "//src/main/java/com/google/api/generator/gapic/composer/store", + "//src/main/java/com/google/api/generator/gapic/composer/utils", + "//src/main/java/com/google/api/generator/gapic/model", + "//src/main/java/com/google/api/generator/gapic/utils", + "//src/main/java/com/google/api/generator/util", + "@com_google_api_api_common//jar", + "@com_google_api_gax_java//gax", + "@com_google_api_gax_java//gax:gax_testlib", + "@com_google_api_gax_java//gax-grpc:gax_grpc", + "@com_google_api_gax_java//gax-grpc:gax_grpc_testlib", + "@com_google_code_findbugs_jsr305//jar", + "@com_google_googleapis//gapic/metadata:metadata_java_proto", + "@com_google_googleapis//google/api:api_java_proto", + "@com_google_googleapis//google/longrunning:longrunning_java_proto", + "@com_google_googleapis//google/rpc:rpc_java_proto", + "@com_google_guava_guava//jar", + "@com_google_protobuf//:protobuf_java", + "@com_google_protobuf//:protobuf_java_util", + "@com_google_protobuf//java/core", + "@io_grpc_grpc_java//api", + "@io_grpc_grpc_java//protobuf", + "@io_grpc_grpc_java//stub", + "@javax_annotation_javax_annotation_api//jar", + "@junit_junit//jar", + "@org_threeten_threetenbp//jar", + ], +) diff --git a/src/main/java/com/google/api/generator/gapic/composer/grpc/GrpcContext.java b/src/main/java/com/google/api/generator/gapic/composer/grpc/GrpcContext.java new file mode 100644 index 0000000000..494e0ffd8f --- /dev/null +++ b/src/main/java/com/google/api/generator/gapic/composer/grpc/GrpcContext.java @@ -0,0 +1,52 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.api.generator.gapic.composer.grpc; + +import com.google.api.gax.grpc.GrpcCallSettings; +import com.google.api.gax.grpc.GrpcCallableFactory; +import com.google.api.gax.grpc.GrpcStubCallableFactory; +import com.google.api.gax.grpc.GrpcTransportChannel; +import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider; +import com.google.api.generator.gapic.model.TransportContext; +import com.google.longrunning.stub.GrpcOperationsStub; +import com.google.longrunning.stub.OperationsStub; +import io.grpc.MethodDescriptor; + +public abstract class GrpcContext extends TransportContext { + private static final TransportContext INSTANCE = + GrpcContext.builder() + .setTransport(Transport.GRPC) + // For grpc.GrpcServiceStubClassComposer + .setCallSettingsClass(GrpcCallSettings.class) + .setStubCallableFactoryType(classToType(GrpcStubCallableFactory.class)) + .setMethodDescriptorClass(MethodDescriptor.class) + .setTransportOperationsStubType(classToType(GrpcOperationsStub.class)) + // For grpc.ServiceSettingsClassComposer + .setInstantiatingChannelProviderClass(InstantiatingGrpcChannelProvider.Builder.class) + .setDefaultTransportProviderBuilderName("defaultGrpcTransportProviderBuilder") + // For grpc.ServiceStubSettingsClassComposer + .setTransportChannelType(classToType(GrpcTransportChannel.class)) + .setTransportGetterName("getGrpcTransportName") + // For grpc.GrpcServiceCallableFactoryClassComposer + .setTransportCallSettingsType(classToType(GrpcCallSettings.class)) + .setTransportCallableFactoryType(classToType(GrpcCallableFactory.class)) + .setOperationsStubType(classToType(OperationsStub.class)) + .setTransportCallSettingsName("grpcCallSettings") + .build(); + + public static TransportContext instance() { + return INSTANCE; + } +} diff --git a/src/main/java/com/google/api/generator/gapic/composer/grpc/ServiceSettingsClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/grpc/ServiceSettingsClassComposer.java new file mode 100644 index 0000000000..6ac112f2ec --- /dev/null +++ b/src/main/java/com/google/api/generator/gapic/composer/grpc/ServiceSettingsClassComposer.java @@ -0,0 +1,26 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.api.generator.gapic.composer.grpc; + +import com.google.api.generator.gapic.composer.common.AbstractServiceSettingsClassComposer; + +public class ServiceSettingsClassComposer extends AbstractServiceSettingsClassComposer { + private static final ServiceSettingsClassComposer INSTANCE = + new ServiceSettingsClassComposer(); + + public static ServiceSettingsClassComposer instance() { + return INSTANCE; + } +} diff --git a/src/main/java/com/google/api/generator/gapic/composer/store/TypeStore.java b/src/main/java/com/google/api/generator/gapic/composer/store/TypeStore.java index aa7ff06647..061c42a67c 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/store/TypeStore.java +++ b/src/main/java/com/google/api/generator/gapic/composer/store/TypeStore.java @@ -24,7 +24,7 @@ import java.util.stream.Collectors; public class TypeStore { - private Map store = new HashMap<>(); + private final Map store = new HashMap<>(); public TypeStore() {} @@ -33,7 +33,7 @@ public TypeStore(List concreteClasses) { concreteClasses.stream() .collect( Collectors.toMap( - c -> c.getSimpleName(), + Class::getSimpleName, c -> TypeNode.withReference(ConcreteReference.withClazz(c))))); } diff --git a/src/main/java/com/google/api/generator/gapic/composer/utils/ClassNames.java b/src/main/java/com/google/api/generator/gapic/composer/utils/ClassNames.java index fb54e3f4d4..50e8a8ce4a 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/utils/ClassNames.java +++ b/src/main/java/com/google/api/generator/gapic/composer/utils/ClassNames.java @@ -26,9 +26,21 @@ public class ClassNames { private static final String SERVICE_SETTINGS_CLASS_NAME_PATTERN = "%sSettings"; private static final String SERVICE_STUB_SETTINGS_CLASS_NAME_PATTERN = "%sStubSettings"; private static final String SERVICE_STUB_CLASS_NAME_PATTERN = "%sStub"; + + // TODO: remove after Pre-DIREGAPIC refactoring is fully merged private static final String GRPC_SERVICE_STUB_CLASS_NAME_PATTERN = "Grpc%sStub"; + // TODO: remove after Pre-DIREGAPIC refactoring is fully merged private static final String GRPC_SERVICE_CALLABLE_FACTORY_CLASS_NAME_PATTERN = "Grpc%sCallableFactory"; + private static final String TRANSPORT_SERVICE_STUB_CLASS_NAME_PATTERN = "%s%sStub"; + private static final String TRANSPORT_SERVICE_CALLABLE_FACTORY_CLASS_NAME_PATTERN = + "%s%sCallableFactory"; + + private final String transportPrefix; + + public ClassNames(String transportPrefix) { + this.transportPrefix = transportPrefix; + } public static String getServiceClientClassName(Service service) { return String.format( @@ -52,17 +64,33 @@ public static String getServiceStubClassName(Service service) { SERVICE_STUB_CLASS_NAME_PATTERN, monolithBackwardsCompatibleName(service.name())); } + // TODO: remove after Pre-DIREGAPIC refactoring is fully merged public static String getGrpcServiceCallableFactoryClassName(Service service) { return String.format( GRPC_SERVICE_CALLABLE_FACTORY_CLASS_NAME_PATTERN, monolithBackwardsCompatibleName(service.name())); } + public String getTransportServiceCallableFactoryClassName(Service service) { + return String.format( + TRANSPORT_SERVICE_CALLABLE_FACTORY_CLASS_NAME_PATTERN, + transportPrefix, + monolithBackwardsCompatibleName(service.name())); + } + + // TODO: remove after Pre-DIREGAPIC refactoring is fully merged public static String getGrpcServiceStubClassName(Service service) { return String.format( GRPC_SERVICE_STUB_CLASS_NAME_PATTERN, monolithBackwardsCompatibleName(service.name())); } + public String getTransportServiceStubClassName(Service service) { + return String.format( + TRANSPORT_SERVICE_STUB_CLASS_NAME_PATTERN, + transportPrefix, + monolithBackwardsCompatibleName(service.name())); + } + public static String getServiceClientTestClassName(Service service) { return String.format(SERVICE_CLIENT_TEST_CLASS_NAME_PATTERN, service.overriddenName()); } diff --git a/src/main/java/com/google/api/generator/gapic/model/GapicContext.java b/src/main/java/com/google/api/generator/gapic/model/GapicContext.java index bc4561a0ad..0cc3186e51 100644 --- a/src/main/java/com/google/api/generator/gapic/model/GapicContext.java +++ b/src/main/java/com/google/api/generator/gapic/model/GapicContext.java @@ -75,6 +75,8 @@ static GapicMetadata defaultGapicMetadata() { public abstract Builder toBuilder(); + public abstract TransportContext transportContext(); + public static Builder builder() { return new AutoValue_GapicContext.Builder() .setMixinServices(Collections.emptyList()) @@ -106,6 +108,8 @@ public Builder setHelperResourceNames(Set helperResourceNames) { public abstract Builder setGapicMetadataEnabled(boolean gapicMetadataEnabled); + public abstract Builder setTransportContext(TransportContext transportContext); + public abstract GapicContext build(); } } diff --git a/src/main/java/com/google/api/generator/gapic/model/TransportContext.java b/src/main/java/com/google/api/generator/gapic/model/TransportContext.java new file mode 100644 index 0000000000..c88cfadc69 --- /dev/null +++ b/src/main/java/com/google/api/generator/gapic/model/TransportContext.java @@ -0,0 +1,103 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.api.generator.gapic.model; + +import com.google.api.generator.engine.ast.ConcreteReference; +import com.google.api.generator.engine.ast.TypeNode; +import com.google.auto.value.AutoValue; + +@AutoValue +public abstract class TransportContext { + public enum Transport { + REST, + GRPC, + GRPC_REST; + + public static Transport parse(String name) { + return valueOf(name.replace('+', '_').toUpperCase()); + } + } + + // For AbstractServiceStubClassComposer + public abstract Transport transport(); + + public abstract Class callSettingsClass(); + + public abstract TypeNode stubCallableFactoryType(); + + public abstract Class methodDescriptorClass(); + + public abstract TypeNode transportOperationsStubType(); + + // For AbstractServiceSettingsClassComposer + public abstract Class instantiatingChannelProviderClass(); + + public abstract String defaultTransportProviderBuilderName(); + + // For AbstractServiceStubSettingsClassComposer + public abstract TypeNode transportChannelType(); + + public abstract String transportGetterName(); + + // For AbstractServiceCallableFactoryClassComposer + public abstract TypeNode transportCallSettingsType(); + + public abstract TypeNode transportCallableFactoryType(); + + public abstract TypeNode operationsStubType(); + + public abstract String transportCallSettingsName(); + + protected static TypeNode classToType(Class clazz) { + return TypeNode.withReference(ConcreteReference.withClazz(clazz)); + } + + public static TransportContext.Builder builder() { + return new AutoValue_TransportContext.Builder(); + } + + @AutoValue.Builder + public abstract static class Builder { + public abstract Builder setTransport(Transport transport); + + public abstract Builder setCallSettingsClass(Class callSettingsClass); + + public abstract Builder setStubCallableFactoryType(TypeNode stubCallableFactoryType); + + public abstract Builder setMethodDescriptorClass(Class methodDescriptorClass); + + public abstract Builder setInstantiatingChannelProviderClass( + Class instantiatingChannelProviderClass); + + public abstract Builder setDefaultTransportProviderBuilderName( + String defaultTransportProviderBuilderName); + + public abstract Builder setTransportChannelType(TypeNode transportChannelType); + + public abstract Builder setTransportGetterName(String transportGetterName); + + public abstract Builder setTransportCallSettingsType(TypeNode transportCallSettingsType); + + public abstract Builder setTransportCallableFactoryType(TypeNode transportCallableFactoryType); + + public abstract Builder setTransportCallSettingsName(String transportCallSettingsName); + + public abstract Builder setTransportOperationsStubType(TypeNode transportOperationsStubType); + + public abstract Builder setOperationsStubType(TypeNode operationsStubType); + + public abstract TransportContext build(); + } +} diff --git a/src/main/java/com/google/api/generator/gapic/protoparser/BUILD.bazel b/src/main/java/com/google/api/generator/gapic/protoparser/BUILD.bazel index c67204e22b..6cccdd373a 100644 --- a/src/main/java/com/google/api/generator/gapic/protoparser/BUILD.bazel +++ b/src/main/java/com/google/api/generator/gapic/protoparser/BUILD.bazel @@ -23,6 +23,7 @@ java_library( deps = [ "//:service_config_java_proto", "//src/main/java/com/google/api/generator/engine/ast", + "//src/main/java/com/google/api/generator/gapic/composer/grpc", "//src/main/java/com/google/api/generator/gapic/model", "//src/main/java/com/google/api/generator/gapic/utils", "@com_google_api_api_common//jar", diff --git a/src/main/java/com/google/api/generator/gapic/protoparser/Parser.java b/src/main/java/com/google/api/generator/gapic/protoparser/Parser.java index cf74a492ea..37f4627b52 100644 --- a/src/main/java/com/google/api/generator/gapic/protoparser/Parser.java +++ b/src/main/java/com/google/api/generator/gapic/protoparser/Parser.java @@ -18,6 +18,7 @@ import com.google.api.ResourceDescriptor; import com.google.api.ResourceProto; import com.google.api.generator.engine.ast.TypeNode; +import com.google.api.generator.gapic.composer.grpc.GrpcContext; import com.google.api.generator.gapic.model.Field; import com.google.api.generator.gapic.model.GapicBatchingSettings; import com.google.api.generator.gapic.model.GapicContext; @@ -183,6 +184,7 @@ public static GapicContext parse(CodeGeneratorRequest request) { .setServiceConfig(serviceConfigOpt.isPresent() ? serviceConfigOpt.get() : null) .setGapicMetadataEnabled(willGenerateMetadata) .setServiceYamlProto(serviceYamlProtoOpt.isPresent() ? serviceYamlProtoOpt.get() : null) + .setTransportContext(GrpcContext.instance()) .build(); } diff --git a/src/test/java/com/google/api/generator/gapic/composer/BUILD.bazel b/src/test/java/com/google/api/generator/gapic/composer/BUILD.bazel index b243a6e012..73ea3d0a82 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/BUILD.bazel +++ b/src/test/java/com/google/api/generator/gapic/composer/BUILD.bazel @@ -12,7 +12,6 @@ UPDATE_GOLDENS_TESTS = [ "MockServiceImplClassComposerTest", "ServiceClientClassComposerTest", "ServiceClientTestClassComposerTest", - "ServiceSettingsClassComposerTest", "ServiceStubSettingsClassComposerTest", "ServiceStubClassComposerTest", ] @@ -31,6 +30,7 @@ TEST_DEPS = [ "//src/main/java/com/google/api/generator/engine/ast", "//src/main/java/com/google/api/generator/engine/writer", "//src/main/java/com/google/api/generator/gapic/composer", + "//src/main/java/com/google/api/generator/gapic/composer/common", "//src/test/java/com/google/api/generator/test/framework:asserts", "//src/test/java/com/google/api/generator/test/framework:utils", "//src/main/java/com/google/api/generator/gapic/composer/samplecode", @@ -41,6 +41,7 @@ TEST_DEPS = [ "//src/test/java/com/google/api/generator/gapic/testdata:deprecated_service_java_proto", "//src/test/java/com/google/api/generator/gapic/testdata:showcase_java_proto", "//src/test/java/com/google/api/generator/gapic/testdata:testgapic_java_proto", + "//src/test/java/com/google/api/generator/gapic/composer/common", "//src/test/java/com/google/api/generator/gapic/composer/constants", "@com_google_api_api_common//jar", "@com_google_api_gax_java//gax", diff --git a/src/test/java/com/google/api/generator/gapic/composer/TestProtoLoaderUtil.java b/src/test/java/com/google/api/generator/gapic/composer/TestProtoLoaderUtil.java index 88c9360de1..03beb05955 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/TestProtoLoaderUtil.java +++ b/src/test/java/com/google/api/generator/gapic/composer/TestProtoLoaderUtil.java @@ -14,233 +14,32 @@ package com.google.api.generator.gapic.composer; -import static junit.framework.Assert.assertEquals; -import static junit.framework.Assert.assertTrue; - -import com.google.api.generator.gapic.composer.constants.ComposerConstants; -import com.google.api.generator.gapic.model.GapicBatchingSettings; +import com.google.api.generator.gapic.composer.common.TestProtoLoader; import com.google.api.generator.gapic.model.GapicContext; -import com.google.api.generator.gapic.model.GapicServiceConfig; -import com.google.api.generator.gapic.model.Message; -import com.google.api.generator.gapic.model.ResourceName; -import com.google.api.generator.gapic.model.Service; -import com.google.api.generator.gapic.protoparser.BatchingSettingsConfigParser; -import com.google.api.generator.gapic.protoparser.Parser; -import com.google.api.generator.gapic.protoparser.ServiceConfigParser; -import com.google.logging.v2.LogEntryProto; -import com.google.logging.v2.LoggingConfigProto; -import com.google.logging.v2.LoggingMetricsProto; -import com.google.logging.v2.LoggingProto; -import com.google.protobuf.Descriptors.FileDescriptor; -import com.google.protobuf.Descriptors.ServiceDescriptor; -import com.google.pubsub.v1.PubsubProto; -import com.google.showcase.v1beta1.EchoOuterClass; -import com.google.showcase.v1beta1.IdentityOuterClass; -import com.google.showcase.v1beta1.TestingOuterClass; -import com.google.testdata.v1.DeprecatedServiceOuterClass; -import google.cloud.CommonResources; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; +// TODO: remove after Pre-DIREGAPIC refactoring is fully merged public class TestProtoLoaderUtil { public static GapicContext parseDeprecatedService() { - FileDescriptor fileDescriptor = DeprecatedServiceOuterClass.getDescriptor(); - ServiceDescriptor serviceDescriptor = fileDescriptor.getServices().get(0); - assertEquals(serviceDescriptor.getName(), "DeprecatedService"); - - Map messageTypes = Parser.parseMessages(fileDescriptor); - Map resourceNames = new HashMap<>(); - Set outputResourceNames = new HashSet<>(); - List services = - Parser.parseService( - fileDescriptor, messageTypes, resourceNames, Optional.empty(), outputResourceNames); - - String jsonFilename = "deprecated_service_grpc_service_config.json"; - Path jsonPath = Paths.get(ComposerConstants.TESTFILES_DIRECTORY, jsonFilename); - Optional configOpt = ServiceConfigParser.parse(jsonPath.toString()); - assertTrue(configOpt.isPresent()); - GapicServiceConfig config = configOpt.get(); - - return GapicContext.builder() - .setMessages(messageTypes) - .setResourceNames(resourceNames) - .setServices(services) - .setServiceConfig(config) - .setHelperResourceNames(outputResourceNames) - .build(); + return TestProtoLoader.instance().parseDeprecatedService(); } public static GapicContext parseShowcaseEcho() { - FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor(); - ServiceDescriptor echoServiceDescriptor = echoFileDescriptor.getServices().get(0); - assertEquals(echoServiceDescriptor.getName(), "Echo"); - - Map messageTypes = Parser.parseMessages(echoFileDescriptor); - Map resourceNames = Parser.parseResourceNames(echoFileDescriptor); - Set outputResourceNames = new HashSet<>(); - List services = - Parser.parseService( - echoFileDescriptor, messageTypes, resourceNames, Optional.empty(), outputResourceNames); - - String jsonFilename = "showcase_grpc_service_config.json"; - Path jsonPath = Paths.get(ComposerConstants.TESTFILES_DIRECTORY, jsonFilename); - Optional configOpt = ServiceConfigParser.parse(jsonPath.toString()); - assertTrue(configOpt.isPresent()); - GapicServiceConfig config = configOpt.get(); - - return GapicContext.builder() - .setMessages(messageTypes) - .setResourceNames(resourceNames) - .setServices(services) - .setServiceConfig(config) - .setHelperResourceNames(outputResourceNames) - .build(); + return TestProtoLoader.instance().parseShowcaseEcho(); } public static GapicContext parseShowcaseIdentity() { - FileDescriptor fileDescriptor = IdentityOuterClass.getDescriptor(); - ServiceDescriptor identityService = fileDescriptor.getServices().get(0); - assertEquals(identityService.getName(), "Identity"); - - Map messageTypes = Parser.parseMessages(fileDescriptor); - Map resourceNames = Parser.parseResourceNames(fileDescriptor); - Set outputResourceNames = new HashSet<>(); - List services = - Parser.parseService( - fileDescriptor, messageTypes, resourceNames, Optional.empty(), outputResourceNames); - - return GapicContext.builder() - .setMessages(messageTypes) - .setResourceNames(resourceNames) - .setServices(services) - .setHelperResourceNames(outputResourceNames) - .build(); + return TestProtoLoader.instance().parseShowcaseIdentity(); } public static GapicContext parseShowcaseTesting() { - FileDescriptor testingFileDescriptor = TestingOuterClass.getDescriptor(); - ServiceDescriptor testingService = testingFileDescriptor.getServices().get(0); - assertEquals(testingService.getName(), "Testing"); - - Map messageTypes = Parser.parseMessages(testingFileDescriptor); - Map resourceNames = Parser.parseResourceNames(testingFileDescriptor); - Set outputResourceNames = new HashSet<>(); - List services = - Parser.parseService( - testingFileDescriptor, - messageTypes, - resourceNames, - Optional.empty(), - outputResourceNames); - - return GapicContext.builder() - .setMessages(messageTypes) - .setResourceNames(resourceNames) - .setServices(services) - .setHelperResourceNames(outputResourceNames) - .build(); + return TestProtoLoader.instance().parseShowcaseTesting(); } public static GapicContext parsePubSubPublisher() { - FileDescriptor serviceFileDescriptor = PubsubProto.getDescriptor(); - FileDescriptor commonResourcesFileDescriptor = CommonResources.getDescriptor(); - ServiceDescriptor serviceDescriptor = serviceFileDescriptor.getServices().get(0); - assertEquals("Publisher", serviceDescriptor.getName()); - - Map resourceNames = new HashMap<>(); - resourceNames.putAll(Parser.parseResourceNames(serviceFileDescriptor)); - resourceNames.putAll(Parser.parseResourceNames(commonResourcesFileDescriptor)); - Map messageTypes = Parser.parseMessages(serviceFileDescriptor); - - Set outputResourceNames = new HashSet<>(); - List services = - Parser.parseService( - serviceFileDescriptor, - messageTypes, - resourceNames, - Optional.empty(), - outputResourceNames); - - String filename = "pubsub_gapic.yaml"; - Path path = Paths.get(ComposerConstants.TESTFILES_DIRECTORY, filename); - Optional> batchingSettingsOpt = - BatchingSettingsConfigParser.parse(Optional.of(path.toString())); - assertTrue(batchingSettingsOpt.isPresent()); - - String jsonFilename = "pubsub_grpc_service_config.json"; - Path jsonPath = Paths.get(ComposerConstants.TESTFILES_DIRECTORY, jsonFilename); - Optional configOpt = ServiceConfigParser.parse(jsonPath.toString()); - assertTrue(configOpt.isPresent()); - GapicServiceConfig config = configOpt.get(); - config.setBatchingSettings(batchingSettingsOpt); - - return GapicContext.builder() - .setMessages(messageTypes) - .setResourceNames(resourceNames) - .setServices(services) - .setServiceConfig(config) - .setHelperResourceNames(outputResourceNames) - .build(); + return TestProtoLoader.instance().parsePubSubPublisher(); } public static GapicContext parseLogging() { - FileDescriptor serviceFileDescriptor = LoggingProto.getDescriptor(); - ServiceDescriptor serviceDescriptor = serviceFileDescriptor.getServices().get(0); - assertEquals(serviceDescriptor.getName(), "LoggingServiceV2"); - - List protoFiles = - Arrays.asList( - serviceFileDescriptor, - LogEntryProto.getDescriptor(), - LoggingConfigProto.getDescriptor(), - LoggingMetricsProto.getDescriptor()); - - Map resourceNames = new HashMap<>(); - Map messageTypes = new HashMap<>(); - for (FileDescriptor fileDescriptor : protoFiles) { - resourceNames.putAll(Parser.parseResourceNames(fileDescriptor)); - messageTypes.putAll(Parser.parseMessages(fileDescriptor)); - } - - // Additional resource names. - FileDescriptor commonResourcesFileDescriptor = CommonResources.getDescriptor(); - resourceNames.putAll(Parser.parseResourceNames(commonResourcesFileDescriptor)); - - Set outputResourceNames = new HashSet<>(); - List services = - Parser.parseService( - serviceFileDescriptor, - messageTypes, - resourceNames, - Optional.empty(), - outputResourceNames); - - String filename = "logging_gapic.yaml"; - Path path = Paths.get(ComposerConstants.TESTFILES_DIRECTORY, filename); - Optional> batchingSettingsOpt = - BatchingSettingsConfigParser.parse(Optional.of(path.toString())); - assertTrue(batchingSettingsOpt.isPresent()); - - String jsonFilename = "logging_grpc_service_config.json"; - Path jsonPath = Paths.get(ComposerConstants.TESTFILES_DIRECTORY, jsonFilename); - Optional configOpt = ServiceConfigParser.parse(jsonPath.toString()); - assertTrue(configOpt.isPresent()); - GapicServiceConfig config = configOpt.get(); - config.setBatchingSettings(batchingSettingsOpt); - - return GapicContext.builder() - .setMessages(messageTypes) - .setResourceNames(resourceNames) - .setServices(services) - .setServiceConfig(config) - .setHelperResourceNames(outputResourceNames) - .build(); + return TestProtoLoader.instance().parseLogging(); } } diff --git a/src/test/java/com/google/api/generator/gapic/composer/common/BUILD.bazel b/src/test/java/com/google/api/generator/gapic/composer/common/BUILD.bazel new file mode 100644 index 0000000000..e8d4fce1e9 --- /dev/null +++ b/src/test/java/com/google/api/generator/gapic/composer/common/BUILD.bazel @@ -0,0 +1,95 @@ +load("@rules_java//java:defs.bzl", "java_proto_library", "java_test") +load("//:rules_bazel/java/java_diff_test.bzl", "golden_update") + +package(default_visibility = ["//visibility:public"]) + +UPDATE_GOLDENS_TESTS = [ +] + +TESTS = UPDATE_GOLDENS_TESTS + [ +] + +TEST_DEPS = [ + ":common_resources_java_proto", + "//:service_config_java_proto", + "//src/main/java/com/google/api/generator/engine/ast", + "//src/main/java/com/google/api/generator/engine/writer", + "//src/main/java/com/google/api/generator/gapic/composer", + "//src/main/java/com/google/api/generator/gapic/composer/common", + "//src/main/java/com/google/api/generator/gapic/composer/grpc", + "//src/test/java/com/google/api/generator/test/framework:asserts", + "//src/test/java/com/google/api/generator/test/framework:utils", + "//src/main/java/com/google/api/generator/gapic/composer/samplecode", + "//src/test/java/com/google/api/generator/testutils", + "//src/main/java/com/google/api/generator/gapic/model", + "//src/main/java/com/google/api/generator/gapic/protoparser", + "//src/main/java/com/google/api/generator/gapic/composer/defaultvalue", + "//src/test/java/com/google/api/generator/gapic/testdata:deprecated_service_java_proto", + "//src/test/java/com/google/api/generator/gapic/testdata:showcase_java_proto", + "//src/test/java/com/google/api/generator/gapic/testdata:testgapic_java_proto", + "@com_google_api_api_common//jar", + "@com_google_api_gax_java//gax", + "@com_google_api_api_common", + "@com_google_googleapis//google/logging/v2:logging_java_proto", + "@com_google_googleapis//google/pubsub/v1:pubsub_java_proto", + "@com_google_googleapis//google/rpc:rpc_java_proto", + "@com_google_guava_guava", + "@com_google_protobuf//:protobuf_java", + "@com_google_truth_truth//jar", + "@junit_junit//jar", +] + +java_library( + name = "common", + srcs = ["TestProtoLoader.java"], + deps = TEST_DEPS, +) + +filegroup( + name = "common_files", + srcs = glob(["*.java"]), +) + +java_proto_library( + name = "pubsub_java_proto", + deps = [ + "@com_google_googleapis//google/pubsub/v1:pubsub_proto", + ], +) + +java_proto_library( + name = "common_resources_java_proto", + deps = [ + "@com_google_googleapis//google/cloud:common_resources_proto", + ], +) + +[java_test( + name = test_name, + srcs = [ + "{0}.java".format(test_name), + ], + data = [ + "//src/test/java/com/google/api/generator/gapic/testdata:gapic_config_files", + "//src/test/java/com/google/api/generator/gapic/testdata:service_config_files", + ], + test_class = "com.google.api.generator.gapic.composer.common.{0}".format(test_name), + deps = TEST_DEPS + [":common"], +) for test_name in TESTS] + +# Run `bazel run src/test/java/com/google/api/generator/gapic/composer/common:testTargetName_update` +# to update goldens as expected generated code. +# `ServiceClient*` tests are not supported now since they are still in active development. + +[golden_update( + name = "{0}_update".format(test_name), + srcs = [ + "{0}.java".format(test_name), + ], + data = [ + "//src/test/java/com/google/api/generator/gapic/testdata:gapic_config_files", + "//src/test/java/com/google/api/generator/gapic/testdata:service_config_files", + ], + test_class = "com.google.api.generator.gapic.composer.common.{0}".format(test_name), + deps = TEST_DEPS + [":common"], +) for test_name in UPDATE_GOLDENS_TESTS] diff --git a/src/test/java/com/google/api/generator/gapic/composer/common/TestProtoLoader.java b/src/test/java/com/google/api/generator/gapic/composer/common/TestProtoLoader.java new file mode 100644 index 0000000000..681bcb9bef --- /dev/null +++ b/src/test/java/com/google/api/generator/gapic/composer/common/TestProtoLoader.java @@ -0,0 +1,272 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.api.generator.gapic.composer.common; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertTrue; + +import com.google.api.generator.gapic.composer.grpc.GrpcContext; +import com.google.api.generator.gapic.model.GapicBatchingSettings; +import com.google.api.generator.gapic.model.GapicContext; +import com.google.api.generator.gapic.model.GapicServiceConfig; +import com.google.api.generator.gapic.model.Message; +import com.google.api.generator.gapic.model.ResourceName; +import com.google.api.generator.gapic.model.Service; +import com.google.api.generator.gapic.model.TransportContext; +import com.google.api.generator.gapic.protoparser.BatchingSettingsConfigParser; +import com.google.api.generator.gapic.protoparser.Parser; +import com.google.api.generator.gapic.protoparser.ServiceConfigParser; +import com.google.logging.v2.LogEntryProto; +import com.google.logging.v2.LoggingConfigProto; +import com.google.logging.v2.LoggingMetricsProto; +import com.google.logging.v2.LoggingProto; +import com.google.protobuf.Descriptors.FileDescriptor; +import com.google.protobuf.Descriptors.ServiceDescriptor; +import com.google.pubsub.v1.PubsubProto; +import com.google.showcase.v1beta1.EchoOuterClass; +import com.google.showcase.v1beta1.IdentityOuterClass; +import com.google.showcase.v1beta1.TestingOuterClass; +import com.google.testdata.v1.DeprecatedServiceOuterClass; +import google.cloud.CommonResources; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +public class TestProtoLoader { + private static final TestProtoLoader INSTANCE = + new TestProtoLoader( + GrpcContext.instance(), "src/test/java/com/google/api/generator/gapic/testdata/"); + private final String testFilesDirectory; + private final TransportContext transportContext; + + protected TestProtoLoader(TransportContext transportContext, String testFilesDirectory) { + this.testFilesDirectory = testFilesDirectory; + this.transportContext = transportContext; + } + + public static TestProtoLoader instance() { + return INSTANCE; + } + + public GapicContext parseDeprecatedService() { + FileDescriptor fileDescriptor = DeprecatedServiceOuterClass.getDescriptor(); + ServiceDescriptor serviceDescriptor = fileDescriptor.getServices().get(0); + assertEquals(serviceDescriptor.getName(), "DeprecatedService"); + + Map messageTypes = Parser.parseMessages(fileDescriptor); + Map resourceNames = new HashMap<>(); + Set outputResourceNames = new HashSet<>(); + List services = + Parser.parseService( + fileDescriptor, messageTypes, resourceNames, Optional.empty(), outputResourceNames); + + String jsonFilename = "deprecated_service_grpc_service_config.json"; + Path jsonPath = Paths.get(testFilesDirectory, jsonFilename); + Optional configOpt = ServiceConfigParser.parse(jsonPath.toString()); + assertTrue(configOpt.isPresent()); + GapicServiceConfig config = configOpt.get(); + + return GapicContext.builder() + .setMessages(messageTypes) + .setResourceNames(resourceNames) + .setServices(services) + .setServiceConfig(config) + .setHelperResourceNames(outputResourceNames) + .setTransportContext(transportContext) + .build(); + } + + public GapicContext parseShowcaseEcho() { + FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor(); + ServiceDescriptor echoServiceDescriptor = echoFileDescriptor.getServices().get(0); + assertEquals(echoServiceDescriptor.getName(), "Echo"); + + Map messageTypes = Parser.parseMessages(echoFileDescriptor); + Map resourceNames = Parser.parseResourceNames(echoFileDescriptor); + Set outputResourceNames = new HashSet<>(); + List services = + Parser.parseService( + echoFileDescriptor, messageTypes, resourceNames, Optional.empty(), outputResourceNames); + + String jsonFilename = "showcase_grpc_service_config.json"; + Path jsonPath = Paths.get(testFilesDirectory, jsonFilename); + Optional configOpt = ServiceConfigParser.parse(jsonPath.toString()); + assertTrue(configOpt.isPresent()); + GapicServiceConfig config = configOpt.get(); + + return GapicContext.builder() + .setMessages(messageTypes) + .setResourceNames(resourceNames) + .setServices(services) + .setServiceConfig(config) + .setHelperResourceNames(outputResourceNames) + .setTransportContext(transportContext) + .build(); + } + + public GapicContext parseShowcaseIdentity() { + FileDescriptor fileDescriptor = IdentityOuterClass.getDescriptor(); + ServiceDescriptor identityService = fileDescriptor.getServices().get(0); + assertEquals(identityService.getName(), "Identity"); + + Map messageTypes = Parser.parseMessages(fileDescriptor); + Map resourceNames = Parser.parseResourceNames(fileDescriptor); + Set outputResourceNames = new HashSet<>(); + List services = + Parser.parseService( + fileDescriptor, messageTypes, resourceNames, Optional.empty(), outputResourceNames); + + return GapicContext.builder() + .setMessages(messageTypes) + .setResourceNames(resourceNames) + .setServices(services) + .setHelperResourceNames(outputResourceNames) + .setTransportContext(transportContext) + .build(); + } + + public GapicContext parseShowcaseTesting() { + FileDescriptor testingFileDescriptor = TestingOuterClass.getDescriptor(); + ServiceDescriptor testingService = testingFileDescriptor.getServices().get(0); + assertEquals(testingService.getName(), "Testing"); + + Map messageTypes = Parser.parseMessages(testingFileDescriptor); + Map resourceNames = Parser.parseResourceNames(testingFileDescriptor); + Set outputResourceNames = new HashSet<>(); + List services = + Parser.parseService( + testingFileDescriptor, + messageTypes, + resourceNames, + Optional.empty(), + outputResourceNames); + + return GapicContext.builder() + .setMessages(messageTypes) + .setResourceNames(resourceNames) + .setServices(services) + .setHelperResourceNames(outputResourceNames) + .setTransportContext(transportContext) + .build(); + } + + public GapicContext parsePubSubPublisher() { + FileDescriptor serviceFileDescriptor = PubsubProto.getDescriptor(); + FileDescriptor commonResourcesFileDescriptor = CommonResources.getDescriptor(); + ServiceDescriptor serviceDescriptor = serviceFileDescriptor.getServices().get(0); + assertEquals("Publisher", serviceDescriptor.getName()); + + Map resourceNames = new HashMap<>(); + resourceNames.putAll(Parser.parseResourceNames(serviceFileDescriptor)); + resourceNames.putAll(Parser.parseResourceNames(commonResourcesFileDescriptor)); + Map messageTypes = Parser.parseMessages(serviceFileDescriptor); + + Set outputResourceNames = new HashSet<>(); + List services = + Parser.parseService( + serviceFileDescriptor, + messageTypes, + resourceNames, + Optional.empty(), + outputResourceNames); + + String filename = "pubsub_gapic.yaml"; + Path path = Paths.get(getTestFilesDirectory(), filename); + Optional> batchingSettingsOpt = + BatchingSettingsConfigParser.parse(Optional.of(path.toString())); + assertTrue(batchingSettingsOpt.isPresent()); + + String jsonFilename = "pubsub_grpc_service_config.json"; + Path jsonPath = Paths.get(getTestFilesDirectory(), jsonFilename); + Optional configOpt = ServiceConfigParser.parse(jsonPath.toString()); + assertTrue(configOpt.isPresent()); + GapicServiceConfig config = configOpt.get(); + config.setBatchingSettings(batchingSettingsOpt); + + return GapicContext.builder() + .setMessages(messageTypes) + .setResourceNames(resourceNames) + .setServices(services) + .setServiceConfig(config) + .setHelperResourceNames(outputResourceNames) + .setTransportContext(transportContext) + .build(); + } + + public GapicContext parseLogging() { + FileDescriptor serviceFileDescriptor = LoggingProto.getDescriptor(); + ServiceDescriptor serviceDescriptor = serviceFileDescriptor.getServices().get(0); + assertEquals(serviceDescriptor.getName(), "LoggingServiceV2"); + + List protoFiles = + Arrays.asList( + serviceFileDescriptor, + LogEntryProto.getDescriptor(), + LoggingConfigProto.getDescriptor(), + LoggingMetricsProto.getDescriptor()); + + Map resourceNames = new HashMap<>(); + Map messageTypes = new HashMap<>(); + for (FileDescriptor fileDescriptor : protoFiles) { + resourceNames.putAll(Parser.parseResourceNames(fileDescriptor)); + messageTypes.putAll(Parser.parseMessages(fileDescriptor)); + } + + // Additional resource names. + FileDescriptor commonResourcesFileDescriptor = CommonResources.getDescriptor(); + resourceNames.putAll(Parser.parseResourceNames(commonResourcesFileDescriptor)); + + Set outputResourceNames = new HashSet<>(); + List services = + Parser.parseService( + serviceFileDescriptor, + messageTypes, + resourceNames, + Optional.empty(), + outputResourceNames); + + String filename = "logging_gapic.yaml"; + Path path = Paths.get(getTestFilesDirectory(), filename); + Optional> batchingSettingsOpt = + BatchingSettingsConfigParser.parse(Optional.of(path.toString())); + assertTrue(batchingSettingsOpt.isPresent()); + + String jsonFilename = "logging_grpc_service_config.json"; + Path jsonPath = Paths.get(getTestFilesDirectory(), jsonFilename); + Optional configOpt = ServiceConfigParser.parse(jsonPath.toString()); + assertTrue(configOpt.isPresent()); + GapicServiceConfig config = configOpt.get(); + config.setBatchingSettings(batchingSettingsOpt); + + return GapicContext.builder() + .setMessages(messageTypes) + .setResourceNames(resourceNames) + .setServices(services) + .setServiceConfig(config) + .setHelperResourceNames(outputResourceNames) + .setTransportContext(transportContext) + .build(); + } + + public String getTestFilesDirectory() { + return testFilesDirectory; + } +} diff --git a/src/test/java/com/google/api/generator/gapic/composer/grpc/BUILD.bazel b/src/test/java/com/google/api/generator/gapic/composer/grpc/BUILD.bazel new file mode 100644 index 0000000000..3c86b19ea2 --- /dev/null +++ b/src/test/java/com/google/api/generator/gapic/composer/grpc/BUILD.bazel @@ -0,0 +1,94 @@ +load("@rules_java//java:defs.bzl", "java_proto_library", "java_test") +load("//:rules_bazel/java/java_diff_test.bzl", "golden_update") + +package(default_visibility = ["//visibility:public"]) + +TESTS = [ + "ServiceSettingsClassComposerTest", +] + +COMMON_SRCS = [ + "GrpcTestProtoLoader.java", +] + +TEST_DEPS = [ + ":common_resources_java_proto", + "//:service_config_java_proto", + "//src/main/java/com/google/api/generator/engine/ast", + "//src/main/java/com/google/api/generator/engine/writer", + "//src/main/java/com/google/api/generator/gapic/composer", + "//src/main/java/com/google/api/generator/gapic/composer/common", + "//src/main/java/com/google/api/generator/gapic/composer/grpc", + "//src/test/java/com/google/api/generator/gapic/composer/common", + "//src/test/java/com/google/api/generator/test/framework:asserts", + "//src/test/java/com/google/api/generator/test/framework:utils", + "//src/main/java/com/google/api/generator/gapic/composer/samplecode", + "//src/test/java/com/google/api/generator/testutils", + "//src/main/java/com/google/api/generator/gapic/model", + "//src/main/java/com/google/api/generator/gapic/protoparser", + "//src/main/java/com/google/api/generator/gapic/composer/defaultvalue", + "//src/test/java/com/google/api/generator/gapic/testdata:deprecated_service_java_proto", + "//src/test/java/com/google/api/generator/gapic/testdata:showcase_java_proto", + "//src/test/java/com/google/api/generator/gapic/testdata:testgapic_java_proto", + "@com_google_api_api_common//jar", + "@com_google_api_gax_java//gax", + "@com_google_api_api_common", + "@com_google_googleapis//google/logging/v2:logging_java_proto", + "@com_google_googleapis//google/pubsub/v1:pubsub_java_proto", + "@com_google_googleapis//google/rpc:rpc_java_proto", + "@com_google_guava_guava", + "@com_google_protobuf//:protobuf_java", + "@com_google_truth_truth//jar", + "@junit_junit//jar", +] + +filegroup( + name = "composer_files", + srcs = glob(["*.java"]), +) + +java_proto_library( + name = "pubsub_java_proto", + deps = [ + "@com_google_googleapis//google/pubsub/v1:pubsub_proto", + ], +) + +java_proto_library( + name = "common_resources_java_proto", + deps = [ + "@com_google_googleapis//google/cloud:common_resources_proto", + ], +) + +[java_test( + name = test_name, + srcs = [ + "{0}.java".format(test_name), + ] + COMMON_SRCS, + data = [ + "//src/test/java/com/google/api/generator/gapic/composer/grpc/goldens:goldens_files", + "//src/test/java/com/google/api/generator/gapic/testdata:gapic_config_files", + "//src/test/java/com/google/api/generator/gapic/testdata:service_config_files", + ], + test_class = "com.google.api.generator.gapic.composer.grpc.{0}".format(test_name), + deps = TEST_DEPS, +) for test_name in TESTS] + +# Run `bazel run src/test/java/com/google/api/generator/gapic/composer/grpc:testTargetName_update` +# to update goldens as expected generated code. +# `ServiceClient*` tests are not supported now since they are still in active development. + +[golden_update( + name = "{0}_update".format(test_name), + srcs = [ + "{0}.java".format(test_name), + ] + COMMON_SRCS, + data = [ + "//src/test/java/com/google/api/generator/gapic/composer/grpc/goldens:goldens_files", + "//src/test/java/com/google/api/generator/gapic/testdata:gapic_config_files", + "//src/test/java/com/google/api/generator/gapic/testdata:service_config_files", + ], + test_class = "com.google.api.generator.gapic.composer.grpc.{0}".format(test_name), + deps = TEST_DEPS, +) for test_name in TESTS] diff --git a/src/test/java/com/google/api/generator/gapic/composer/grpc/GrpcTestProtoLoader.java b/src/test/java/com/google/api/generator/gapic/composer/grpc/GrpcTestProtoLoader.java new file mode 100644 index 0000000000..f9c261ce60 --- /dev/null +++ b/src/test/java/com/google/api/generator/gapic/composer/grpc/GrpcTestProtoLoader.java @@ -0,0 +1,29 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.api.generator.gapic.composer.grpc; + +import com.google.api.generator.gapic.composer.common.TestProtoLoader; + +public class GrpcTestProtoLoader extends TestProtoLoader { + private static GrpcTestProtoLoader INSTANCE = new GrpcTestProtoLoader(); + + protected GrpcTestProtoLoader() { + super(GrpcContext.instance(), "src/test/java/com/google/api/generator/gapic/testdata/"); + } + + public static GrpcTestProtoLoader instance() { + return INSTANCE; + } +} diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceSettingsClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/grpc/ServiceSettingsClassComposerTest.java similarity index 81% rename from src/test/java/com/google/api/generator/gapic/composer/ServiceSettingsClassComposerTest.java rename to src/test/java/com/google/api/generator/gapic/composer/grpc/ServiceSettingsClassComposerTest.java index 9075e0dd95..622cf85f9c 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/ServiceSettingsClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/grpc/ServiceSettingsClassComposerTest.java @@ -12,10 +12,9 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.api.generator.gapic.composer; +package com.google.api.generator.gapic.composer.grpc; import com.google.api.generator.engine.writer.JavaWriterVisitor; -import com.google.api.generator.gapic.composer.constants.ComposerConstants; import com.google.api.generator.gapic.model.GapicClass; import com.google.api.generator.gapic.model.GapicContext; import com.google.api.generator.gapic.model.Service; @@ -28,20 +27,20 @@ public class ServiceSettingsClassComposerTest { @Test public void generateServiceClasses() { - GapicContext context = TestProtoLoaderUtil.parseShowcaseEcho(); + GapicContext context = GrpcTestProtoLoader.instance().parseShowcaseEcho(); Service echoProtoService = context.services().get(0); GapicClass clazz = ServiceSettingsClassComposer.instance().generate(context, echoProtoService); JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); Utils.saveCodegenToFile(this.getClass(), "EchoSettings.golden", visitor.write()); - Path goldenFilePath = Paths.get(ComposerConstants.GOLDENFILES_DIRECTORY, "EchoSettings.golden"); + Path goldenFilePath = Paths.get(Utils.getGoldenDir(this.getClass()), "EchoSettings.golden"); Assert.assertCodeEquals(goldenFilePath, visitor.write()); } @Test public void generateServiceClasses_deprecated() { - GapicContext context = TestProtoLoaderUtil.parseDeprecatedService(); + GapicContext context = GrpcTestProtoLoader.instance().parseDeprecatedService(); Service protoService = context.services().get(0); GapicClass clazz = ServiceSettingsClassComposer.instance().generate(context, protoService); @@ -49,7 +48,7 @@ public void generateServiceClasses_deprecated() { clazz.classDefinition().accept(visitor); Utils.saveCodegenToFile(this.getClass(), "DeprecatedServiceSettings.golden", visitor.write()); Path goldenFilePath = - Paths.get(ComposerConstants.GOLDENFILES_DIRECTORY, "DeprecatedServiceSettings.golden"); + Paths.get(Utils.getGoldenDir(this.getClass()), "DeprecatedServiceSettings.golden"); Assert.assertCodeEquals(goldenFilePath, visitor.write()); } } diff --git a/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/BUILD.bazel b/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/BUILD.bazel new file mode 100644 index 0000000000..85ac1a519e --- /dev/null +++ b/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/BUILD.bazel @@ -0,0 +1,6 @@ +package(default_visibility = ["//visibility:public"]) + +filegroup( + name = "goldens_files", + srcs = glob(["*.golden"]), +) diff --git a/src/test/java/com/google/api/generator/gapic/composer/goldens/DeprecatedServiceSettings.golden b/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/DeprecatedServiceSettings.golden similarity index 100% rename from src/test/java/com/google/api/generator/gapic/composer/goldens/DeprecatedServiceSettings.golden rename to src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/DeprecatedServiceSettings.golden diff --git a/src/test/java/com/google/api/generator/gapic/composer/goldens/EchoSettings.golden b/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/EchoSettings.golden similarity index 100% rename from src/test/java/com/google/api/generator/gapic/composer/goldens/EchoSettings.golden rename to src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/EchoSettings.golden diff --git a/src/test/java/com/google/api/generator/test/framework/Differ.java b/src/test/java/com/google/api/generator/test/framework/Differ.java index 6a3c364d33..488282c070 100644 --- a/src/test/java/com/google/api/generator/test/framework/Differ.java +++ b/src/test/java/com/google/api/generator/test/framework/Differ.java @@ -34,7 +34,7 @@ public static List diff(Path goldenFilePath, String codegen) { original = Files.readAllLines(goldenFilePath); } catch (IOException e) { throw new GoldenFileReadException( - String.format("Error occurs when reading golden file %s", goldenFilePath)); + String.format("Error occurs when reading golden file %s", goldenFilePath), e); } return diffTwoStringLists(original, revised); } @@ -50,7 +50,7 @@ private static List diffTwoStringLists(List original, List unifiedDiff = UnifiedDiffUtils.generateUnifiedDiff("golden", "codegen", original, diff, 2); @@ -58,14 +58,20 @@ private static List diffTwoStringLists(List original, List