From 589c6a6aecf76602033d1cc3f55043f671028d57 Mon Sep 17 00:00:00 2001 From: Chanseok Oh Date: Thu, 21 Oct 2021 16:58:39 -0400 Subject: [PATCH 1/4] fix: gax batching regression --- .../google/api/generator/gapic/Generator.java | 3 +- .../generator/gapic/composer/Composer.java | 8 +- ...ractTransportServiceStubClassComposer.java | 110 +++++++++++------- .../com/google/api/generator/util/Trie.java | 4 +- .../GrpcServiceStubClassComposerTest.java | 5 +- 5 files changed, 74 insertions(+), 56 deletions(-) diff --git a/src/main/java/com/google/api/generator/gapic/Generator.java b/src/main/java/com/google/api/generator/gapic/Generator.java index a894c3b351..30658ff6a5 100644 --- a/src/main/java/com/google/api/generator/gapic/Generator.java +++ b/src/main/java/com/google/api/generator/gapic/Generator.java @@ -30,7 +30,6 @@ public static CodeGeneratorResponse generateGapic(CodeGeneratorRequest request) List clazzes = Composer.composeServiceClasses(context); GapicPackageInfo packageInfo = Composer.composePackageInfo(context); String outputFilename = "temp-codegen.srcjar"; - CodeGeneratorResponse response = Writer.write(context, clazzes, packageInfo, outputFilename); - return response; + return Writer.write(context, clazzes, packageInfo, outputFilename); } } 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 4eefc2845a..b291449b2c 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 @@ -152,11 +152,9 @@ public static List generateMockClasses(GapicContext context, List { if (context.transport() == Transport.REST) { - // REST transport tests donot not use mock services. - } else if (context.transport() == Transport.GRPC) { - clazzes.add(MockServiceClassComposer.instance().generate(context, s)); - clazzes.add(MockServiceImplClassComposer.instance().generate(context, s)); - } else if (context.transport() == Transport.GRPC_REST) { + // REST transport tests do not use mock services. + } else if (context.transport() == Transport.GRPC + || context.transport() == Transport.GRPC_REST) { clazzes.add(MockServiceClassComposer.instance().generate(context, s)); clazzes.add(MockServiceImplClassComposer.instance().generate(context, s)); } diff --git a/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java index 0d190273a3..c188157b3d 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java @@ -51,10 +51,12 @@ import com.google.api.generator.engine.ast.VariableExpr; import com.google.api.generator.gapic.composer.comment.StubCommentComposer; import com.google.api.generator.gapic.composer.store.TypeStore; +import com.google.api.generator.gapic.composer.utils.ClassNames; import com.google.api.generator.gapic.composer.utils.PackageChecker; import com.google.api.generator.gapic.model.GapicClass; import com.google.api.generator.gapic.model.GapicClass.Kind; 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.Method; import com.google.api.generator.gapic.model.Service; @@ -200,11 +202,11 @@ public GapicClass generate(GapicContext context, Service service) { .setAnnotations(createClassAnnotations(service)) .setScope(ScopeNode.PUBLIC) .setName(className) - .setExtendsType( - typeStore.get(getTransportContext().classNames().getServiceStubClassName(service))) + .setExtendsType(typeStore.get(ClassNames.getServiceStubClassName(service))) .setStatements(classStatements) .setMethods( createClassMethods( + context, service, typeStore, classMemberVarExprs, @@ -422,6 +424,7 @@ protected List createClassAnnotations(Service service) { } protected List createClassMethods( + GapicContext context, Service service, TypeStore typeStore, Map classMemberVarExprs, @@ -431,6 +434,7 @@ protected List createClassMethods( javaMethods.addAll(createStaticCreatorMethods(service, typeStore, "newBuilder")); javaMethods.addAll( createConstructorMethods( + context, service, typeStore, classMemberVarExprs, @@ -473,8 +477,7 @@ protected List createStaticCreatorMethods( argList -> NewObjectExpr.builder().setType(creatorMethodReturnType).setArguments(argList).build(); - TypeNode stubSettingsType = - typeStore.get(getTransportContext().classNames().getServiceStubSettingsClassName(service)); + TypeNode stubSettingsType = typeStore.get(ClassNames.getServiceStubSettingsClassName(service)); VariableExpr settingsVarExpr = VariableExpr.withVariable( Variable.builder().setName("settings").setType(stubSettingsType).build()); @@ -531,13 +534,13 @@ protected List createStaticCreatorMethods( } protected List createConstructorMethods( + GapicContext context, Service service, TypeStore typeStore, Map classMemberVarExprs, Map callableClassMemberVarExprs, Map protoMethodNameToDescriptorVarExprs) { - TypeNode stubSettingsType = - typeStore.get(getTransportContext().classNames().getServiceStubSettingsClassName(service)); + TypeNode stubSettingsType = typeStore.get(ClassNames.getServiceStubSettingsClassName(service)); VariableExpr settingsVarExpr = VariableExpr.withVariable( Variable.builder().setName("settings").setType(stubSettingsType).build()); @@ -604,7 +607,9 @@ protected List createConstructorMethods( secondCtorExprs.add( AssignmentExpr.builder() .setVariableExpr( - classMemberVarExprs.get("callableFactory").toBuilder() + classMemberVarExprs + .get("callableFactory") + .toBuilder() .setExprReferenceExpr(thisExpr) .build()) .setValueExpr(callableFactoryVarExpr) @@ -613,15 +618,16 @@ protected List createConstructorMethods( classMemberVarExprs.get(getTransportContext().transportOperationsStubNames().get(0)); // TODO: refactor this if (generateOperationsStubLogic(service)) { - secondCtorExprs.addAll(createOperationsStubInitExpr( - service, - thisExpr, - operationsStubClassVarExpr, - clientContextVarExpr, - callableFactoryVarExpr)); + secondCtorExprs.addAll( + createOperationsStubInitExpr( + service, + thisExpr, + operationsStubClassVarExpr, + clientContextVarExpr, + callableFactoryVarExpr)); } secondCtorStatements.addAll( - secondCtorExprs.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList())); + secondCtorExprs.stream().map(ExprStatement::withExpr).collect(Collectors.toList())); secondCtorExprs.clear(); secondCtorStatements.add(EMPTY_LINE_STATEMENT); @@ -660,7 +666,7 @@ protected List createConstructorMethods( protoMethodNameToDescriptorVarExprs.get(m.name()))) .collect(Collectors.toList())); secondCtorStatements.addAll( - secondCtorExprs.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList())); + secondCtorExprs.stream().map(ExprStatement::withExpr).collect(Collectors.toList())); secondCtorExprs.clear(); secondCtorStatements.add(EMPTY_LINE_STATEMENT); @@ -670,6 +676,8 @@ protected List createConstructorMethods( .map( e -> createCallableInitExpr( + context, + service, e.getKey(), e.getValue(), callableFactoryVarExpr, @@ -680,7 +688,7 @@ protected List createConstructorMethods( javaStyleMethodNameToTransportSettingsVarExprs)) .collect(Collectors.toList())); secondCtorStatements.addAll( - secondCtorExprs.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList())); + secondCtorExprs.stream().map(ExprStatement::withExpr).collect(Collectors.toList())); secondCtorExprs.clear(); secondCtorStatements.add(EMPTY_LINE_STATEMENT); @@ -705,7 +713,7 @@ protected List createConstructorMethods( .build()) .build()); secondCtorStatements.addAll( - secondCtorExprs.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList())); + secondCtorExprs.stream().map(ExprStatement::withExpr).collect(Collectors.toList())); secondCtorExprs.clear(); // Second constructor method. @@ -723,14 +731,14 @@ protected List createOperationsStubInitExpr( VariableExpr operationsStubClassVarExpr, VariableExpr clientContextVarExpr, VariableExpr callableFactoryVarExpr) { - TypeNode opeationsStubType = getTransportOperationsStubType(service); + TypeNode operationsStubType = getTransportOperationsStubType(service); return Collections.singletonList( AssignmentExpr.builder() .setVariableExpr( operationsStubClassVarExpr.toBuilder().setExprReferenceExpr(thisExpr).build()) .setValueExpr( MethodInvocationExpr.builder() - .setStaticReferenceType(opeationsStubType) + .setStaticReferenceType(operationsStubType) .setMethodName("create") .setArguments(Arrays.asList(clientContextVarExpr, callableFactoryVarExpr)) .setReturnType(operationsStubClassVarExpr.type()) @@ -748,6 +756,8 @@ protected VariableExpr declareLongRunningClient() { } private Expr createCallableInitExpr( + GapicContext context, + Service service, String callableVarName, VariableExpr callableVarExpr, VariableExpr callableFactoryVarExpr, @@ -758,7 +768,7 @@ private Expr createCallableInitExpr( Map javaStyleMethodNameToTransportSettingsVarExprs) { boolean isOperation = callableVarName.endsWith(OPERATION_CALLABLE_NAME); boolean isPaged = callableVarName.endsWith(PAGED_CALLABLE_NAME); - int sublength = 0; + int sublength; if (isOperation) { sublength = OPERATION_CALLABLE_NAME.length(); } else if (isPaged) { @@ -767,11 +777,11 @@ private Expr createCallableInitExpr( sublength = CALLABLE_NAME.length(); } String javaStyleMethodName = callableVarName.substring(0, callableVarName.length() - sublength); - List creatorMethodArgVarExprs = null; + List creatorMethodArgVarExprs; Expr transportSettingsVarExpr = javaStyleMethodNameToTransportSettingsVarExprs.get(javaStyleMethodName); if (transportSettingsVarExpr == null && isOperation) { - // Try again, in case the name dtection above was inaccurate. + // Try again, in case the name detection above was inaccurate. isOperation = false; sublength = CALLABLE_NAME.length(); javaStyleMethodName = callableVarName.substring(0, callableVarName.length() - sublength); @@ -804,7 +814,7 @@ private Expr createCallableInitExpr( } Optional callableCreatorMethodName = - getCallableCreatorMethodName(callableVarExpr.type()); + getCallableCreatorMethodName(context, service, callableVarExpr.type(), javaStyleMethodName); Expr initExpr; if (callableCreatorMethodName.isPresent()) { @@ -825,26 +835,38 @@ private Expr createCallableInitExpr( .build(); } - protected Optional getCallableCreatorMethodName(TypeNode callableVarExprType) { - final String typeName = callableVarExprType.reference().name(); - String streamName = "Unary"; - + protected Optional getCallableCreatorMethodName( + GapicContext context, + Service service, + TypeNode callableVarExprType, + String javaStyleServiceMethodName) { + GapicServiceConfig serviceConfig = context.serviceConfig(); + if (serviceConfig != null + && serviceConfig.hasBatchingSetting( + service.protoPakkage(), service.name(), javaStyleServiceMethodName)) { + if (true) throw new UnsupportedOperationException(); + return Optional.of("createBatchingCallable"); + } // Special handling for pagination methods. if (callableVarExprType.reference().generics().size() == 2 && callableVarExprType.reference().generics().get(1).name().endsWith("PagedResponse")) { - streamName = "Paged"; - } else { - if (typeName.startsWith("Client")) { - streamName = "ClientStreaming"; - } else if (typeName.startsWith("Server")) { - streamName = "ServerStreaming"; - } else if (typeName.startsWith("Bidi")) { - streamName = "BidiStreaming"; - } else if (typeName.startsWith("Operation")) { - streamName = "Operation"; - } + return Optional.of("createPagedCallable"); + } + + String typeName = callableVarExprType.reference().name(); + if (typeName.startsWith("Client")) { + return Optional.of("createClientStreamingCallable"); + } + if (typeName.startsWith("Server")) { + return Optional.of("createServerStreamingCallable"); + } + if (typeName.startsWith("Bidi")) { + return Optional.of("createBidiStreamingCallable"); + } + if (typeName.startsWith("Operation")) { + return Optional.of("createOperationCallable"); } - return Optional.of(String.format("create%sCallable", streamName)); + return Optional.of("createUnaryCallable"); } private static List createCallableGetterMethods( @@ -960,7 +982,7 @@ private List createStubOverrideMethods( .setType( TypeNode.withExceptionClazz( IllegalStateException.class)) - .setMessageExpr(String.format("Failed to close resource")) + .setMessageExpr("Failed to close resource") .setCauseExpr(catchExceptionVarExpr) .build()))) .build())) @@ -1032,8 +1054,8 @@ private TypeStore createDynamicTypes(Service service, String stubPakkage) { stubPakkage, Arrays.asList( getTransportContext().classNames().getTransportServiceStubClassName(service), - getTransportContext().classNames().getServiceStubSettingsClassName(service), - getTransportContext().classNames().getServiceStubClassName(service), + ClassNames.getServiceStubSettingsClassName(service), + ClassNames.getServiceStubClassName(service), getTransportContext() .classNames() .getTransportServiceCallableFactoryClassName(service))); @@ -1041,11 +1063,11 @@ private TypeStore createDynamicTypes(Service service, String stubPakkage) { typeStore.putAll( service.pakkage(), service.methods().stream() - .filter(m -> m.isPaged()) + .filter(Method::isPaged) .map(m -> String.format(PAGED_RESPONSE_TYPE_NAME_PATTERN, m.name())) .collect(Collectors.toList()), true, - getTransportContext().classNames().getServiceClientClassName(service)); + ClassNames.getServiceClientClassName(service)); return typeStore; } diff --git a/src/main/java/com/google/api/generator/util/Trie.java b/src/main/java/com/google/api/generator/util/Trie.java index 4134b3f543..90ff419c52 100644 --- a/src/main/java/com/google/api/generator/util/Trie.java +++ b/src/main/java/com/google/api/generator/util/Trie.java @@ -24,7 +24,7 @@ * A common-prefix trie. T represents the type of each "char" in a word (which is a T-typed list). */ public class Trie { - private class Node { + private static class Node { final U chr; // Maintain insertion order to enable deterministic test output. Map> children = new LinkedHashMap<>(); @@ -39,7 +39,7 @@ private class Node { } } - private Node root; + private final Node root; public Trie() { root = new Node<>(); diff --git a/src/test/java/com/google/api/generator/gapic/composer/grpc/GrpcServiceStubClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/grpc/GrpcServiceStubClassComposerTest.java index 9bdb460f96..788d9b27c5 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/grpc/GrpcServiceStubClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/grpc/GrpcServiceStubClassComposerTest.java @@ -55,9 +55,8 @@ public void generateGrpcServiceStubClass_deprecated() { @Test public void generateGrpcServiceStubClass_httpBindings() { GapicContext context = GrpcTestProtoLoader.instance().parseShowcaseTesting(); - Service testingProtoService = context.services().get(0); - GapicClass clazz = - GrpcServiceStubClassComposer.instance().generate(context, testingProtoService); + Service service = context.services().get(0); + GapicClass clazz = GrpcServiceStubClassComposer.instance().generate(context, service); JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); From 354a7574f5c97eda451e065d7095605a859ccc83 Mon Sep 17 00:00:00 2001 From: Chanseok Oh Date: Thu, 21 Oct 2021 17:37:03 -0400 Subject: [PATCH 2/4] Fix bug and add tests --- ...ractTransportServiceStubClassComposer.java | 8 +- .../GrpcServiceStubClassComposerTest.java | 13 + .../grpc/goldens/GrpcLoggingStub.golden | 341 ++++++++++++++++++ 3 files changed, 358 insertions(+), 4 deletions(-) create mode 100644 src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/GrpcLoggingStub.golden diff --git a/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java index c188157b3d..1f18faac80 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java @@ -813,8 +813,9 @@ private Expr createCallableInitExpr( clientContextVarExpr); } + String methodName = JavaStyle.toUpperCamelCase(javaStyleMethodName); Optional callableCreatorMethodName = - getCallableCreatorMethodName(context, service, callableVarExpr.type(), javaStyleMethodName); + getCallableCreatorMethodName(context, service, callableVarExpr.type(), methodName); Expr initExpr; if (callableCreatorMethodName.isPresent()) { @@ -839,12 +840,11 @@ protected Optional getCallableCreatorMethodName( GapicContext context, Service service, TypeNode callableVarExprType, - String javaStyleServiceMethodName) { + String serviceMethodName) { GapicServiceConfig serviceConfig = context.serviceConfig(); if (serviceConfig != null && serviceConfig.hasBatchingSetting( - service.protoPakkage(), service.name(), javaStyleServiceMethodName)) { - if (true) throw new UnsupportedOperationException(); + service.protoPakkage(), service.name(), serviceMethodName)) { return Optional.of("createBatchingCallable"); } // Special handling for pagination methods. diff --git a/src/test/java/com/google/api/generator/gapic/composer/grpc/GrpcServiceStubClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/grpc/GrpcServiceStubClassComposerTest.java index 788d9b27c5..cf07432966 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/grpc/GrpcServiceStubClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/grpc/GrpcServiceStubClassComposerTest.java @@ -78,4 +78,17 @@ public void generateGrpcServiceStubClass_httpBindingsWithSubMessageFields() { Paths.get(Utils.getGoldenDir(this.getClass()), "GrpcPublisherStub.golden"); Assert.assertCodeEquals(goldenFilePath, visitor.write()); } + + @Test + public void generateGrpcServiceStubClass_createBatchingCallable() { + GapicContext context = GrpcTestProtoLoader.instance().parseLogging(); + Service service = context.services().get(0); + GapicClass clazz = GrpcServiceStubClassComposer.instance().generate(context, service); + + JavaWriterVisitor visitor = new JavaWriterVisitor(); + clazz.classDefinition().accept(visitor); + Utils.saveCodegenToFile(this.getClass(), "GrpcLoggingStub.golden", visitor.write()); + Path goldenFilePath = Paths.get(Utils.getGoldenDir(this.getClass()), "GrpcLoggingStub.golden"); + Assert.assertCodeEquals(goldenFilePath, visitor.write()); + } } diff --git a/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/GrpcLoggingStub.golden b/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/GrpcLoggingStub.golden new file mode 100644 index 0000000000..09386582c9 --- /dev/null +++ b/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/GrpcLoggingStub.golden @@ -0,0 +1,341 @@ +package com.google.logging.v2.stub; + +import static com.google.logging.v2.LoggingServiceV2Client.ListLogEntriesPagedResponse; +import static com.google.logging.v2.LoggingServiceV2Client.ListLogsPagedResponse; +import static com.google.logging.v2.LoggingServiceV2Client.ListMonitoredResourceDescriptorsPagedResponse; + +import com.google.api.gax.core.BackgroundResource; +import com.google.api.gax.core.BackgroundResourceAggregation; +import com.google.api.gax.grpc.GrpcCallSettings; +import com.google.api.gax.grpc.GrpcStubCallableFactory; +import com.google.api.gax.rpc.BidiStreamingCallable; +import com.google.api.gax.rpc.ClientContext; +import com.google.api.gax.rpc.UnaryCallable; +import com.google.common.collect.ImmutableMap; +import com.google.logging.v2.DeleteLogRequest; +import com.google.logging.v2.ListLogEntriesRequest; +import com.google.logging.v2.ListLogEntriesResponse; +import com.google.logging.v2.ListLogsRequest; +import com.google.logging.v2.ListLogsResponse; +import com.google.logging.v2.ListMonitoredResourceDescriptorsRequest; +import com.google.logging.v2.ListMonitoredResourceDescriptorsResponse; +import com.google.logging.v2.TailLogEntriesRequest; +import com.google.logging.v2.TailLogEntriesResponse; +import com.google.logging.v2.WriteLogEntriesRequest; +import com.google.logging.v2.WriteLogEntriesResponse; +import com.google.longrunning.stub.GrpcOperationsStub; +import com.google.protobuf.Empty; +import io.grpc.MethodDescriptor; +import io.grpc.protobuf.ProtoUtils; +import java.io.IOException; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import javax.annotation.Generated; + +// AUTO-GENERATED DOCUMENTATION AND CLASS. +/** + * gRPC stub implementation for the LoggingServiceV2 service API. + * + *

This class is for advanced usage and reflects the underlying API directly. + */ +@Generated("by gapic-generator-java") +public class GrpcLoggingServiceV2Stub extends LoggingServiceV2Stub { + private static final MethodDescriptor deleteLogMethodDescriptor = + MethodDescriptor.newBuilder() + .setType(MethodDescriptor.MethodType.UNARY) + .setFullMethodName("google.logging.v2.LoggingServiceV2/DeleteLog") + .setRequestMarshaller(ProtoUtils.marshaller(DeleteLogRequest.getDefaultInstance())) + .setResponseMarshaller(ProtoUtils.marshaller(Empty.getDefaultInstance())) + .build(); + + private static final MethodDescriptor + writeLogEntriesMethodDescriptor = + MethodDescriptor.newBuilder() + .setType(MethodDescriptor.MethodType.UNARY) + .setFullMethodName("google.logging.v2.LoggingServiceV2/WriteLogEntries") + .setRequestMarshaller( + ProtoUtils.marshaller(WriteLogEntriesRequest.getDefaultInstance())) + .setResponseMarshaller( + ProtoUtils.marshaller(WriteLogEntriesResponse.getDefaultInstance())) + .build(); + + private static final MethodDescriptor + listLogEntriesMethodDescriptor = + MethodDescriptor.newBuilder() + .setType(MethodDescriptor.MethodType.UNARY) + .setFullMethodName("google.logging.v2.LoggingServiceV2/ListLogEntries") + .setRequestMarshaller( + ProtoUtils.marshaller(ListLogEntriesRequest.getDefaultInstance())) + .setResponseMarshaller( + ProtoUtils.marshaller(ListLogEntriesResponse.getDefaultInstance())) + .build(); + + private static final MethodDescriptor< + ListMonitoredResourceDescriptorsRequest, ListMonitoredResourceDescriptorsResponse> + listMonitoredResourceDescriptorsMethodDescriptor = + MethodDescriptor + . + newBuilder() + .setType(MethodDescriptor.MethodType.UNARY) + .setFullMethodName( + "google.logging.v2.LoggingServiceV2/ListMonitoredResourceDescriptors") + .setRequestMarshaller( + ProtoUtils.marshaller( + ListMonitoredResourceDescriptorsRequest.getDefaultInstance())) + .setResponseMarshaller( + ProtoUtils.marshaller( + ListMonitoredResourceDescriptorsResponse.getDefaultInstance())) + .build(); + + private static final MethodDescriptor + listLogsMethodDescriptor = + MethodDescriptor.newBuilder() + .setType(MethodDescriptor.MethodType.UNARY) + .setFullMethodName("google.logging.v2.LoggingServiceV2/ListLogs") + .setRequestMarshaller(ProtoUtils.marshaller(ListLogsRequest.getDefaultInstance())) + .setResponseMarshaller(ProtoUtils.marshaller(ListLogsResponse.getDefaultInstance())) + .build(); + + private static final MethodDescriptor + tailLogEntriesMethodDescriptor = + MethodDescriptor.newBuilder() + .setType(MethodDescriptor.MethodType.BIDI_STREAMING) + .setFullMethodName("google.logging.v2.LoggingServiceV2/TailLogEntries") + .setRequestMarshaller( + ProtoUtils.marshaller(TailLogEntriesRequest.getDefaultInstance())) + .setResponseMarshaller( + ProtoUtils.marshaller(TailLogEntriesResponse.getDefaultInstance())) + .build(); + + private final UnaryCallable deleteLogCallable; + private final UnaryCallable + writeLogEntriesCallable; + private final UnaryCallable listLogEntriesCallable; + private final UnaryCallable + listLogEntriesPagedCallable; + private final UnaryCallable< + ListMonitoredResourceDescriptorsRequest, ListMonitoredResourceDescriptorsResponse> + listMonitoredResourceDescriptorsCallable; + private final UnaryCallable< + ListMonitoredResourceDescriptorsRequest, ListMonitoredResourceDescriptorsPagedResponse> + listMonitoredResourceDescriptorsPagedCallable; + private final UnaryCallable listLogsCallable; + private final UnaryCallable listLogsPagedCallable; + private final BidiStreamingCallable + tailLogEntriesCallable; + + private final BackgroundResource backgroundResources; + private final GrpcOperationsStub operationsStub; + private final GrpcStubCallableFactory callableFactory; + + public static final GrpcLoggingServiceV2Stub create(LoggingServiceV2StubSettings settings) + throws IOException { + return new GrpcLoggingServiceV2Stub(settings, ClientContext.create(settings)); + } + + public static final GrpcLoggingServiceV2Stub create(ClientContext clientContext) + throws IOException { + return new GrpcLoggingServiceV2Stub( + LoggingServiceV2StubSettings.newBuilder().build(), clientContext); + } + + public static final GrpcLoggingServiceV2Stub create( + ClientContext clientContext, GrpcStubCallableFactory callableFactory) throws IOException { + return new GrpcLoggingServiceV2Stub( + LoggingServiceV2StubSettings.newBuilder().build(), clientContext, callableFactory); + } + + /** + * Constructs an instance of GrpcLoggingServiceV2Stub, using the given settings. This is protected + * so that it is easy to make a subclass, but otherwise, the static factory methods should be + * preferred. + */ + protected GrpcLoggingServiceV2Stub( + LoggingServiceV2StubSettings settings, ClientContext clientContext) throws IOException { + this(settings, clientContext, new GrpcLoggingServiceV2CallableFactory()); + } + + /** + * Constructs an instance of GrpcLoggingServiceV2Stub, using the given settings. This is protected + * so that it is easy to make a subclass, but otherwise, the static factory methods should be + * preferred. + */ + protected GrpcLoggingServiceV2Stub( + LoggingServiceV2StubSettings settings, + ClientContext clientContext, + GrpcStubCallableFactory callableFactory) + throws IOException { + this.callableFactory = callableFactory; + this.operationsStub = GrpcOperationsStub.create(clientContext, callableFactory); + + GrpcCallSettings deleteLogTransportSettings = + GrpcCallSettings.newBuilder() + .setMethodDescriptor(deleteLogMethodDescriptor) + .setParamsExtractor( + request -> { + ImmutableMap.Builder params = ImmutableMap.builder(); + params.put("log_name", String.valueOf(request.getLogName())); + return params.build(); + }) + .build(); + GrpcCallSettings + writeLogEntriesTransportSettings = + GrpcCallSettings.newBuilder() + .setMethodDescriptor(writeLogEntriesMethodDescriptor) + .build(); + GrpcCallSettings + listLogEntriesTransportSettings = + GrpcCallSettings.newBuilder() + .setMethodDescriptor(listLogEntriesMethodDescriptor) + .build(); + GrpcCallSettings< + ListMonitoredResourceDescriptorsRequest, ListMonitoredResourceDescriptorsResponse> + listMonitoredResourceDescriptorsTransportSettings = + GrpcCallSettings + . + newBuilder() + .setMethodDescriptor(listMonitoredResourceDescriptorsMethodDescriptor) + .build(); + GrpcCallSettings listLogsTransportSettings = + GrpcCallSettings.newBuilder() + .setMethodDescriptor(listLogsMethodDescriptor) + .setParamsExtractor( + request -> { + ImmutableMap.Builder params = ImmutableMap.builder(); + params.put("parent", String.valueOf(request.getParent())); + return params.build(); + }) + .build(); + GrpcCallSettings + tailLogEntriesTransportSettings = + GrpcCallSettings.newBuilder() + .setMethodDescriptor(tailLogEntriesMethodDescriptor) + .build(); + + this.deleteLogCallable = + callableFactory.createUnaryCallable( + deleteLogTransportSettings, settings.deleteLogSettings(), clientContext); + this.writeLogEntriesCallable = + callableFactory.createBatchingCallable( + writeLogEntriesTransportSettings, settings.writeLogEntriesSettings(), clientContext); + this.listLogEntriesCallable = + callableFactory.createUnaryCallable( + listLogEntriesTransportSettings, settings.listLogEntriesSettings(), clientContext); + this.listLogEntriesPagedCallable = + callableFactory.createPagedCallable( + listLogEntriesTransportSettings, settings.listLogEntriesSettings(), clientContext); + this.listMonitoredResourceDescriptorsCallable = + callableFactory.createUnaryCallable( + listMonitoredResourceDescriptorsTransportSettings, + settings.listMonitoredResourceDescriptorsSettings(), + clientContext); + this.listMonitoredResourceDescriptorsPagedCallable = + callableFactory.createPagedCallable( + listMonitoredResourceDescriptorsTransportSettings, + settings.listMonitoredResourceDescriptorsSettings(), + clientContext); + this.listLogsCallable = + callableFactory.createUnaryCallable( + listLogsTransportSettings, settings.listLogsSettings(), clientContext); + this.listLogsPagedCallable = + callableFactory.createPagedCallable( + listLogsTransportSettings, settings.listLogsSettings(), clientContext); + this.tailLogEntriesCallable = + callableFactory.createBidiStreamingCallable( + tailLogEntriesTransportSettings, settings.tailLogEntriesSettings(), clientContext); + + this.backgroundResources = + new BackgroundResourceAggregation(clientContext.getBackgroundResources()); + } + + public GrpcOperationsStub getOperationsStub() { + return operationsStub; + } + + @Override + public UnaryCallable deleteLogCallable() { + return deleteLogCallable; + } + + @Override + public UnaryCallable writeLogEntriesCallable() { + return writeLogEntriesCallable; + } + + @Override + public UnaryCallable listLogEntriesCallable() { + return listLogEntriesCallable; + } + + @Override + public UnaryCallable + listLogEntriesPagedCallable() { + return listLogEntriesPagedCallable; + } + + @Override + public UnaryCallable< + ListMonitoredResourceDescriptorsRequest, ListMonitoredResourceDescriptorsResponse> + listMonitoredResourceDescriptorsCallable() { + return listMonitoredResourceDescriptorsCallable; + } + + @Override + public UnaryCallable< + ListMonitoredResourceDescriptorsRequest, ListMonitoredResourceDescriptorsPagedResponse> + listMonitoredResourceDescriptorsPagedCallable() { + return listMonitoredResourceDescriptorsPagedCallable; + } + + @Override + public UnaryCallable listLogsCallable() { + return listLogsCallable; + } + + @Override + public UnaryCallable listLogsPagedCallable() { + return listLogsPagedCallable; + } + + @Override + public BidiStreamingCallable + tailLogEntriesCallable() { + return tailLogEntriesCallable; + } + + @Override + public final void close() { + try { + backgroundResources.close(); + } catch (RuntimeException e) { + throw e; + } catch (Exception e) { + throw new IllegalStateException("Failed to close resource", e); + } + } + + @Override + public void shutdown() { + backgroundResources.shutdown(); + } + + @Override + public boolean isShutdown() { + return backgroundResources.isShutdown(); + } + + @Override + public boolean isTerminated() { + return backgroundResources.isTerminated(); + } + + @Override + public void shutdownNow() { + backgroundResources.shutdownNow(); + } + + @Override + public boolean awaitTermination(long duration, TimeUnit unit) throws InterruptedException { + return backgroundResources.awaitTermination(duration, unit); + } +} From cbe8ab5ea89a34938c1effb0a68f3bbafb8a5d0c Mon Sep 17 00:00:00 2001 From: Chanseok Oh Date: Sun, 24 Oct 2021 18:03:05 -0400 Subject: [PATCH 3/4] Update golden files to fix tests --- .../gapic/composer/grpc/goldens/GrpcPublisherStub.golden | 2 +- .../google/cloud/logging/v2/stub/GrpcLoggingServiceV2Stub.java | 2 +- .../com/google/cloud/pubsub/v1/stub/GrpcPublisherStub.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/GrpcPublisherStub.golden b/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/GrpcPublisherStub.golden index b0f6557279..1b61e70b05 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/GrpcPublisherStub.golden +++ b/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/GrpcPublisherStub.golden @@ -287,7 +287,7 @@ public class GrpcPublisherStub extends PublisherStub { callableFactory.createUnaryCallable( updateTopicTransportSettings, settings.updateTopicSettings(), clientContext); this.publishCallable = - callableFactory.createUnaryCallable( + callableFactory.createBatchingCallable( publishTransportSettings, settings.publishSettings(), clientContext); this.getTopicCallable = callableFactory.createUnaryCallable( diff --git a/test/integration/goldens/logging/com/google/cloud/logging/v2/stub/GrpcLoggingServiceV2Stub.java b/test/integration/goldens/logging/com/google/cloud/logging/v2/stub/GrpcLoggingServiceV2Stub.java index c7ce0b40f2..f92e4f6437 100644 --- a/test/integration/goldens/logging/com/google/cloud/logging/v2/stub/GrpcLoggingServiceV2Stub.java +++ b/test/integration/goldens/logging/com/google/cloud/logging/v2/stub/GrpcLoggingServiceV2Stub.java @@ -232,7 +232,7 @@ protected GrpcLoggingServiceV2Stub( callableFactory.createUnaryCallable( deleteLogTransportSettings, settings.deleteLogSettings(), clientContext); this.writeLogEntriesCallable = - callableFactory.createUnaryCallable( + callableFactory.createBatchingCallable( writeLogEntriesTransportSettings, settings.writeLogEntriesSettings(), clientContext); this.listLogEntriesCallable = callableFactory.createUnaryCallable( diff --git a/test/integration/goldens/pubsub/com/google/cloud/pubsub/v1/stub/GrpcPublisherStub.java b/test/integration/goldens/pubsub/com/google/cloud/pubsub/v1/stub/GrpcPublisherStub.java index 3b4330559f..e7f1114ed5 100644 --- a/test/integration/goldens/pubsub/com/google/cloud/pubsub/v1/stub/GrpcPublisherStub.java +++ b/test/integration/goldens/pubsub/com/google/cloud/pubsub/v1/stub/GrpcPublisherStub.java @@ -370,7 +370,7 @@ protected GrpcPublisherStub( callableFactory.createUnaryCallable( updateTopicTransportSettings, settings.updateTopicSettings(), clientContext); this.publishCallable = - callableFactory.createUnaryCallable( + callableFactory.createBatchingCallable( publishTransportSettings, settings.publishSettings(), clientContext); this.getTopicCallable = callableFactory.createUnaryCallable( From 77727a8073654ab554eeb70b3106cee7e6464546 Mon Sep 17 00:00:00 2001 From: Chanseok Oh Date: Mon, 25 Oct 2021 10:57:35 -0400 Subject: [PATCH 4/4] Revert some cleanups --- .../api/generator/gapic/composer/Composer.java | 6 ++++-- ...AbstractTransportServiceStubClassComposer.java | 15 +++++++++------ 2 files changed, 13 insertions(+), 8 deletions(-) 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 b291449b2c..63cf049dd0 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 @@ -153,8 +153,10 @@ public static List generateMockClasses(GapicContext context, List { if (context.transport() == Transport.REST) { // REST transport tests do not use mock services. - } else if (context.transport() == Transport.GRPC - || context.transport() == Transport.GRPC_REST) { + } else if (context.transport() == Transport.GRPC) { + clazzes.add(MockServiceClassComposer.instance().generate(context, s)); + clazzes.add(MockServiceImplClassComposer.instance().generate(context, s)); + } else if (context.transport() == Transport.GRPC_REST) { clazzes.add(MockServiceClassComposer.instance().generate(context, s)); clazzes.add(MockServiceImplClassComposer.instance().generate(context, s)); } diff --git a/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java index 1f18faac80..1b4827ef70 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java @@ -202,7 +202,8 @@ public GapicClass generate(GapicContext context, Service service) { .setAnnotations(createClassAnnotations(service)) .setScope(ScopeNode.PUBLIC) .setName(className) - .setExtendsType(typeStore.get(ClassNames.getServiceStubClassName(service))) + .setExtendsType( + typeStore.get(getTransportContext().classNames().getServiceStubClassName(service))) .setStatements(classStatements) .setMethods( createClassMethods( @@ -477,7 +478,8 @@ protected List createStaticCreatorMethods( argList -> NewObjectExpr.builder().setType(creatorMethodReturnType).setArguments(argList).build(); - TypeNode stubSettingsType = typeStore.get(ClassNames.getServiceStubSettingsClassName(service)); + TypeNode stubSettingsType = + typeStore.get(getTransportContext().classNames().getServiceStubSettingsClassName(service)); VariableExpr settingsVarExpr = VariableExpr.withVariable( Variable.builder().setName("settings").setType(stubSettingsType).build()); @@ -540,7 +542,8 @@ protected List createConstructorMethods( Map classMemberVarExprs, Map callableClassMemberVarExprs, Map protoMethodNameToDescriptorVarExprs) { - TypeNode stubSettingsType = typeStore.get(ClassNames.getServiceStubSettingsClassName(service)); + TypeNode stubSettingsType = + typeStore.get(getTransportContext().classNames().getServiceStubSettingsClassName(service)); VariableExpr settingsVarExpr = VariableExpr.withVariable( Variable.builder().setName("settings").setType(stubSettingsType).build()); @@ -1054,8 +1057,8 @@ private TypeStore createDynamicTypes(Service service, String stubPakkage) { stubPakkage, Arrays.asList( getTransportContext().classNames().getTransportServiceStubClassName(service), - ClassNames.getServiceStubSettingsClassName(service), - ClassNames.getServiceStubClassName(service), + getTransportContext().classNames().getServiceStubSettingsClassName(service), + getTransportContext().classNames().getServiceStubClassName(service), getTransportContext() .classNames() .getTransportServiceCallableFactoryClassName(service))); @@ -1067,7 +1070,7 @@ private TypeStore createDynamicTypes(Service service, String stubPakkage) { .map(m -> String.format(PAGED_RESPONSE_TYPE_NAME_PATTERN, m.name())) .collect(Collectors.toList()), true, - ClassNames.getServiceClientClassName(service)); + getTransportContext().classNames().getServiceClientClassName(service)); return typeStore; }