From 9c06bc95b9aac869bf21c343cbb4b857aa25b593 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Fri, 27 Jan 2023 10:24:22 -0500 Subject: [PATCH] feat: Do not generate Service REST code if there are no matching RPC in a Service (#1236) * feat: Add callable getter methods for REST * chore: Update showcase tests * chore: Update error message * feat: Move httpjson specific logic to sub composer * feat: Move method supported logic to Method * feat: Move method supported logic to Method * chore: Format the files * chore: Cleanup Abstract composer * chore: Move code to httpjson composer * chore: Resolve code smell * feat: Use generic error message * chore: Fix format issues * feat: Add tests for Method.isSupportedByTransport() * feat: Resolve PR comments * feat: Update back to private * feat: Update error message * feat: Update javadoc comment * feat: Do not generate Service REST code if there are no matching RPC in a Service * chore: Pull in latest part 1 changes * fix: Update Kind to NON_GENERATED * feat: Do not generate secondary Transport sample if no rest code is generated * feat: Do not generate httpjson tests if no matching RPCs * chore: Run mvn test -DupdateUnitGoldens * chore: Update formatting * chore: Add apigeeconnect to test REGAPIC * chore: Create directory for new modules * chore: Update googleapis commit to a later version for grpc+rest enabled APIs * chore Add in goldens for apigeeconnect * chore: Add comments for funcs * chore: Refactor ServiceClientClassComposer for GRPC_REST * chore: Remove unused import * chore: Remove unnecessary if/else check * chore: Fix transport sample name * chore: Update apigeeconnect IT goldens * chore: Update asset IT goldens * chore: Update asset goldens * chore: Update credentials IT goldens * chore: Update library IT goldens * chore: Update redis IT goldens * chore: Fix linting issues * chore: Add showcase extended proto framework * chore: Use seperate Bazel rules for showcase extended * chore: Seperate GRPC jar into separate jobs * chore: Update bazel build file * Apply suggestions from code review Co-authored-by: Burke Davison <40617934+burkedavison@users.noreply.github.com> * chore: Update showcase tests * chore: Resolve sonar comments * chore: Update unit tests for wicked proto * chore: Resolve format * chore: Update sonar comments * chore: Update PR comments * chore: Update golden test cases * chore: Revert back to original sample name * chore: Update showcase and goldens * chore: Leave framework but remove wicked proto from showcase extended * chore: Update showcase project with extended info * chore: Remove comment * chore: Use TransportContext instead of duplicate transportName() * chore: Fix formatting issues * chore: Remove the changed spacing in the file * chore: Use transportContext where possible * chore: Fix format issues * chore: Fix compile issue --------- Co-authored-by: Burke Davison <40617934+burkedavison@users.noreply.github.com> --- ...ctServiceCallableFactoryClassComposer.java | 5 + ...bstractServiceClientTestClassComposer.java | 11 +- .../AbstractServiceSettingsClassComposer.java | 15 +- ...tractServiceStubSettingsClassComposer.java | 56 ++- ...ractTransportServiceStubClassComposer.java | 25 +- ...ttpJsonServiceClientTestClassComposer.java | 8 - .../HttpJsonServiceStubClassComposer.java | 2 + .../grpcrest/ServiceClientClassComposer.java | 5 + .../ServiceSettingsClassComposer.java | 53 +- .../ServiceStubSettingsClassComposer.java | 68 +-- .../HttpJsonServiceStubClassComposer.java | 10 +- .../ServiceStubSettingsClassComposer.java | 20 +- .../api/generator/gapic/model/GapicClass.java | 24 +- .../api/generator/gapic/model/Service.java | 27 ++ .../api/generator/gapic/model/Transport.java | 8 +- .../generator/gapic/protowriter/Writer.java | 3 + .../grpcrest/GrpcRestTestProtoLoader.java | 32 ++ ...rviceCallableFactoryClassComposerTest.java | 15 + .../GrpcServiceStubClassComposerTest.java | 14 + ...rviceCallableFactoryClassComposerTest.java | 12 + ...sonServiceClientTestClassComposerTest.java | 10 + .../HttpJsonServiceStubClassComposerTest.java | 11 + .../ServiceClientClassComposerTest.java | 13 + .../ServiceClientTestClassComposerTest.java | 15 + .../ServiceSettingsClassComposerTest.java | 14 + .../ServiceStubSettingsClassComposerTest.java | 15 + .../grpcrest/goldens/EchoEmpty.golden | 13 - .../goldens/GrpcWickedCallableFactory.golden | 99 ++++ .../grpcrest/goldens/GrpcWickedStub.golden | 182 +++++++ .../grpcrest/goldens/WickedClient.golden | 278 +++++++++++ .../grpcrest/goldens/WickedClientTest.golden | 197 ++++++++ .../grpcrest/goldens/WickedSettings.golden | 191 ++++++++ .../goldens/WickedStubSettings.golden | 285 +++++++++++ .../generator/gapic/model/ServiceTest.java | 105 ++++ .../generator/gapic/model/TransportTest.java | 49 ++ .../src/test/proto/wicked.proto | 49 ++ scripts/update_golden.sh | 1 + showcase/BUILD.bazel | 27 +- .../gapic-showcase-extended/proto/BUILD.bazel | 34 ++ .../proto/wicked.proto | 49 ++ showcase/scripts/update.sh | 8 +- showcase/scripts/verify.sh | 8 +- test/integration/BUILD.bazel | 9 + .../SyncCreateSetCredentialsProvider.java | 45 ++ .../SyncCreateSetCredentialsProvider1.java | 41 ++ .../create/SyncCreateSetEndpoint.java | 42 ++ .../listconnections/AsyncListConnections.java | 54 +++ .../AsyncListConnectionsPaged.java | 62 +++ .../listconnections/SyncListConnections.java | 50 ++ .../SyncListConnectionsEndpointname.java | 44 ++ .../SyncListConnectionsString.java | 44 ++ .../listconnections/SyncListConnections.java | 49 ++ .../listconnections/SyncListConnections.java | 50 ++ .../tetherstubsettings/egress/SyncEgress.java | 48 ++ .../SyncCreateSetCredentialsProvider.java | 44 ++ .../tether/create/SyncCreateSetEndpoint.java | 40 ++ .../v1/tether/egress/AsyncEgress.java | 59 +++ .../v1/tethersettings/egress/SyncEgress.java | 48 ++ .../v1/ConnectionServiceClient.java | 452 ++++++++++++++++++ .../ConnectionServiceClientHttpJsonTest.java | 177 +++++++ .../v1/ConnectionServiceClientTest.java | 168 +++++++ .../v1/ConnectionServiceSettings.java | 213 +++++++++ .../cloud/apigeeconnect/v1/EndpointName.java | 192 ++++++++ .../v1/MockConnectionService.java | 59 +++ .../v1/MockConnectionServiceImpl.java | 81 ++++ .../cloud/apigeeconnect/v1/MockTether.java | 59 +++ .../apigeeconnect/v1/MockTetherImpl.java | 97 ++++ .../cloud/apigeeconnect/v1/TetherClient.java | 232 +++++++++ .../apigeeconnect/v1/TetherClientTest.java | 151 ++++++ .../apigeeconnect/v1/TetherSettings.java | 186 +++++++ .../apigeeconnect/v1/gapic_metadata.json | 33 ++ .../cloud/apigeeconnect/v1/package-info.java | 76 +++ .../v1/stub/ConnectionServiceStub.java | 47 ++ .../stub/ConnectionServiceStubSettings.java | 402 ++++++++++++++++ .../GrpcConnectionServiceCallableFactory.java | 113 +++++ .../v1/stub/GrpcConnectionServiceStub.java | 179 +++++++ .../v1/stub/GrpcTetherCallableFactory.java | 113 +++++ .../apigeeconnect/v1/stub/GrpcTetherStub.java | 148 ++++++ ...pJsonConnectionServiceCallableFactory.java | 105 ++++ .../stub/HttpJsonConnectionServiceStub.java | 209 ++++++++ .../apigeeconnect/v1/stub/TetherStub.java | 40 ++ .../v1/stub/TetherStubSettings.java | 262 ++++++++++ 82 files changed, 6445 insertions(+), 144 deletions(-) create mode 100644 gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/GrpcWickedCallableFactory.golden create mode 100644 gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/GrpcWickedStub.golden create mode 100644 gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/WickedClient.golden create mode 100644 gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/WickedClientTest.golden create mode 100644 gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/WickedSettings.golden create mode 100644 gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/WickedStubSettings.golden create mode 100644 gapic-generator-java/src/test/java/com/google/api/generator/gapic/model/TransportTest.java create mode 100644 gapic-generator-java/src/test/proto/wicked.proto create mode 100644 showcase/gapic-showcase-extended/proto/BUILD.bazel create mode 100644 showcase/gapic-showcase-extended/proto/wicked.proto create mode 100644 test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/create/SyncCreateSetCredentialsProvider.java create mode 100644 test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/create/SyncCreateSetCredentialsProvider1.java create mode 100644 test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/create/SyncCreateSetEndpoint.java create mode 100644 test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/listconnections/AsyncListConnections.java create mode 100644 test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/listconnections/AsyncListConnectionsPaged.java create mode 100644 test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/listconnections/SyncListConnections.java create mode 100644 test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/listconnections/SyncListConnectionsEndpointname.java create mode 100644 test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/listconnections/SyncListConnectionsString.java create mode 100644 test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservicesettings/listconnections/SyncListConnections.java create mode 100644 test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/stub/connectionservicestubsettings/listconnections/SyncListConnections.java create mode 100644 test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/stub/tetherstubsettings/egress/SyncEgress.java create mode 100644 test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/tether/create/SyncCreateSetCredentialsProvider.java create mode 100644 test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/tether/create/SyncCreateSetEndpoint.java create mode 100644 test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/tether/egress/AsyncEgress.java create mode 100644 test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/tethersettings/egress/SyncEgress.java create mode 100644 test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/ConnectionServiceClient.java create mode 100644 test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/ConnectionServiceClientHttpJsonTest.java create mode 100644 test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/ConnectionServiceClientTest.java create mode 100644 test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/ConnectionServiceSettings.java create mode 100644 test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/EndpointName.java create mode 100644 test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/MockConnectionService.java create mode 100644 test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/MockConnectionServiceImpl.java create mode 100644 test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/MockTether.java create mode 100644 test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/MockTetherImpl.java create mode 100644 test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/TetherClient.java create mode 100644 test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/TetherClientTest.java create mode 100644 test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/TetherSettings.java create mode 100644 test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/gapic_metadata.json create mode 100644 test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/package-info.java create mode 100644 test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/ConnectionServiceStub.java create mode 100644 test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/ConnectionServiceStubSettings.java create mode 100644 test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/GrpcConnectionServiceCallableFactory.java create mode 100644 test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/GrpcConnectionServiceStub.java create mode 100644 test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/GrpcTetherCallableFactory.java create mode 100644 test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/GrpcTetherStub.java create mode 100644 test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/HttpJsonConnectionServiceCallableFactory.java create mode 100644 test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/HttpJsonConnectionServiceStub.java create mode 100644 test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/TetherStub.java create mode 100644 test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/TetherStubSettings.java diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceCallableFactoryClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceCallableFactoryClassComposer.java index 9fcbaa0f9e..029cfba23d 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceCallableFactoryClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceCallableFactoryClassComposer.java @@ -62,6 +62,11 @@ protected TransportContext getTransportContext() { @Override public GapicClass generate(GapicContext context, Service service) { + // Do not generate the Callable Factory if there are no RPCs enabled for the Transport + if (!service.hasAnyEnabledMethodsForTransport(getTransportContext().transport())) { + return GapicClass.createNonGeneratedGapicClass(); + } + TypeStore typeStore = createTypes(service); String className = diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceClientTestClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceClientTestClassComposer.java index fd6686212f..a2db5ada32 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceClientTestClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceClientTestClassComposer.java @@ -109,6 +109,11 @@ public GapicClass generate(GapicContext context, Service service) { } protected GapicClass generate(String className, GapicContext context, Service service) { + // Do not generate Client Test code for Transport if there are no matching RPCs for a Transport + if (!service.hasAnyEnabledMethodsForTransport(getTransportContext().transport())) { + return GapicClass.createNonGeneratedGapicClass(); + } + Map resourceNames = context.helperResourceNames(); String pakkage = service.pakkage(); TypeStore typeStore = new TypeStore(); @@ -131,10 +136,6 @@ protected GapicClass generate(String className, GapicContext context, Service se return GapicClass.create(kind, classDef); } - protected boolean isSupportedMethod(Method method) { - return true; - } - private List createClassAnnotations() { return Arrays.asList( AnnotationNode.builder() @@ -230,7 +231,7 @@ private List createTestMethods( Map messageTypes = context.messages(); List javaMethods = new ArrayList<>(); for (Method method : service.methods()) { - if (!isSupportedMethod(method)) { + if (!method.isSupportedByTransport(getTransportContext().transport())) { javaMethods.add(createUnsupportedTestMethod(method)); continue; } diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceSettingsClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceSettingsClassComposer.java index fdfa33f471..a395aafd61 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceSettingsClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceSettingsClassComposer.java @@ -385,6 +385,14 @@ private List createDefaultGetterMethods(Service service, TypeS while (providerBuilderNamesIt.hasNext() && channelProviderClassesIt.hasNext() && transportNamesIt.hasNext()) { + String providerBuilderName = providerBuilderNamesIt.next(); + Class channelProviderClass = channelProviderClassesIt.next(); + String transportName = transportNamesIt.next(); + + if (!service.hasAnyEnabledMethodsForTransport(transportName)) { + continue; + } + List annotations = ImmutableList.of(); // For clients supporting multiple transports (mainly grpc+rest case) make secondary transport @@ -397,16 +405,13 @@ private List createDefaultGetterMethods(Service service, TypeS SettingsCommentComposer.DEFAULT_TRANSPORT_PROVIDER_BUILDER_METHOD_COMMENT; if (getTransportContext().transportNames().size() > 1) { commentStatement = - new SettingsCommentComposer(transportNamesIt.next()) - .getTransportProviderBuilderMethodComment(); + new SettingsCommentComposer(transportName).getTransportProviderBuilderMethodComment(); } javaMethods.add( methodMakerFn.apply( methodStarterFn - .apply( - providerBuilderNamesIt.next(), - typeMakerFn.apply(channelProviderClassesIt.next())) + .apply(providerBuilderName, typeMakerFn.apply(channelProviderClass)) .setAnnotations(annotations), commentStatement)); secondaryTransportProviderBuilder = true; diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceStubSettingsClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceStubSettingsClassComposer.java index fe66a11e77..50e9c12e71 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceStubSettingsClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceStubSettingsClassComposer.java @@ -243,7 +243,8 @@ protected MethodDefinition createDefaultCredentialsProviderBuilderMethod() { .build(); } - protected List createDefaultTransportTransportProviderBuilderMethods() { + protected List createDefaultTransportTransportProviderBuilderMethods( + Service service) { // Create the defaultGrpcTransportProviderBuilder method. Iterator> providerClassIt = getTransportContext().instantiatingChannelProviderClasses().iterator(); @@ -259,10 +260,19 @@ protected List createDefaultTransportTransportProviderBuilderM && providerBuilderClassIt.hasNext() && builderNamesIt.hasNext() && transportNamesIt.hasNext()) { + Class providerClass = providerClassIt.next(); + Class providerBuilderClass = providerBuilderClassIt.next(); + String builderName = builderNamesIt.next(); + String transportName = transportNamesIt.next(); + + if (!service.hasAnyEnabledMethodsForTransport(transportName)) { + continue; + } + TypeNode returnType = - TypeNode.withReference(ConcreteReference.withClazz(providerBuilderClassIt.next())); + TypeNode.withReference(ConcreteReference.withClazz(providerBuilderClass)); TypeNode channelProviderType = - TypeNode.withReference(ConcreteReference.withClazz(providerClassIt.next())); + TypeNode.withReference(ConcreteReference.withClazz(providerClass)); MethodInvocationExpr transportChannelProviderBuilderExpr = MethodInvocationExpr.builder() @@ -281,8 +291,7 @@ protected List createDefaultTransportTransportProviderBuilderM SettingsCommentComposer.DEFAULT_TRANSPORT_PROVIDER_BUILDER_METHOD_COMMENT; if (getTransportContext().transportNames().size() > 1) { commentStatement = - new SettingsCommentComposer(transportNamesIt.next()) - .getTransportProviderBuilderMethodComment(); + new SettingsCommentComposer(transportName).getTransportProviderBuilderMethodComment(); } MethodDefinition method = @@ -292,7 +301,7 @@ protected List createDefaultTransportTransportProviderBuilderM .setScope(ScopeNode.PUBLIC) .setIsStatic(true) .setReturnType(returnType) - .setName(builderNamesIt.next()) + .setName(builderName) .setReturnExpr(returnExpr) .build(); @@ -1047,17 +1056,23 @@ private MethodDefinition createCreateStubMethod(Service service, TypeStore typeS .setMethodName("getTransportName") .build(); + Iterator transportNamesIt = getTransportContext().transportNames().iterator(); Iterator channelTypesIt = getTransportContext().transportChannelTypes().iterator(); Iterator getterNameIt = getTransportContext().transportGetterNames().iterator(); Iterator serivceStubClassNameIt = getTransportContext().classNames().getTransportServiceStubClassNames(service).iterator(); while (channelTypesIt.hasNext() && getterNameIt.hasNext()) { + String transportName = transportNamesIt.next(); TypeNode channelType = channelTypesIt.next(); String getterName = getterNameIt.next(); String serivceStubClassName = serivceStubClassNameIt.next(); - Expr tRansportNameExpr = + if (!service.hasAnyEnabledMethodsForTransport(transportName)) { + continue; + } + + Expr transportNameExpr = MethodInvocationExpr.builder() .setStaticReferenceType(channelType) .setMethodName(getterName) @@ -1067,7 +1082,7 @@ private MethodDefinition createCreateStubMethod(Service service, TypeStore typeS MethodInvocationExpr.builder() .setExprReferenceExpr(getTransportNameExpr) .setMethodName("equals") - .setArguments(tRansportNameExpr) + .setArguments(transportNameExpr) .setReturnType(TypeNode.BOOLEAN) .build(); @@ -1191,7 +1206,7 @@ private List createDefaultHelperAndGetterMethods( .build()); javaMethods.add(createDefaultCredentialsProviderBuilderMethod()); - javaMethods.addAll(createDefaultTransportTransportProviderBuilderMethods()); + javaMethods.addAll(createDefaultTransportTransportProviderBuilderMethods(service)); javaMethods.add(createDefaultTransportChannelProviderMethod()); javaMethods.addAll(createApiClientHeaderProviderBuilderMethods(service, typeStore)); @@ -1424,7 +1439,7 @@ private List createNestedClassMethods( nestedClassMethods.addAll( createNestedClassConstructorMethods( service, serviceConfig, nestedMethodSettingsMemberVarExprs, typeStore)); - nestedClassMethods.addAll(createNestedClassCreateDefaultMethods(typeStore)); + nestedClassMethods.addAll(createNestedClassCreateDefaultMethods(service, typeStore)); nestedClassMethods.add(createNestedClassInitDefaultsMethod(service, serviceConfig, typeStore)); nestedClassMethods.add(createNestedClassApplyToAllUnaryMethodsMethod(superType, typeStore)); nestedClassMethods.add(createNestedClassUnaryMethodSettingsBuilderGetterMethod()); @@ -1762,14 +1777,19 @@ private static List createNestedClassConstructorMethods( return ctorMethods; } - protected List createNestedClassCreateDefaultMethods(TypeStore typeStore) { - return Collections.singletonList( - createNestedClassCreateDefaultMethod( - typeStore, - "createDefault", - "defaultTransportChannelProvider", - null, - "defaultApiClientHeaderProviderBuilder")); + protected List createNestedClassCreateDefaultMethods( + Service service, TypeStore typeStore) { + if (service.hasAnyEnabledMethodsForTransport(getTransportContext().transport())) { + return Arrays.asList( + createNestedClassCreateDefaultMethod( + typeStore, + "createDefault", + "defaultTransportChannelProvider", + null, + "defaultApiClientHeaderProviderBuilder")); + } else { + return Collections.emptyList(); + } } protected MethodDefinition createNestedClassCreateDefaultMethod( diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java index ebbaac698f..d217196a0a 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java @@ -59,7 +59,6 @@ import com.google.api.generator.gapic.model.Message; import com.google.api.generator.gapic.model.Method; import com.google.api.generator.gapic.model.Service; -import com.google.api.generator.gapic.model.Transport; import com.google.api.generator.gapic.utils.JavaStyle; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; @@ -94,7 +93,7 @@ public abstract class AbstractTransportServiceStubClassComposer implements Class private static final String OPERATION_CALLABLE_CLASS_MEMBER_PATTERN = "%sOperationCallable"; private static final String OPERATION_CALLABLE_NAME = "OperationCallable"; // private static final String OPERATIONS_STUB_MEMBER_NAME = "operationsStub"; - private static final String PAGED_CALLABLE_NAME = "PagedCallable"; + protected static final String PAGED_CALLABLE_NAME = "PagedCallable"; protected static final TypeStore FIXED_TYPESTORE = createStaticTypes(); @@ -134,6 +133,10 @@ private static TypeStore createStaticTypes() { @Override public GapicClass generate(GapicContext context, Service service) { + if (!service.hasAnyEnabledMethodsForTransport(getTransportContext().transport())) { + return GapicClass.createNonGeneratedGapicClass(); + } + String pakkage = service.pakkage() + ".stub"; TypeStore typeStore = createDynamicTypes(service, pakkage); String className = getTransportContext().classNames().getTransportServiceStubClassName(service); @@ -225,10 +228,6 @@ public GapicClass generate(GapicContext context, Service service) { return GapicClass.create(kind, classDef); } - protected Transport getTransport() { - return Transport.GRPC; - } - protected abstract Statement createMethodDescriptorVariableDecl( Service service, Method protoMethod, @@ -314,7 +313,7 @@ protected List createMethodDescriptorVariableDecls( Map messageTypes, boolean restNumericEnumsEnabled) { return service.methods().stream() - .filter(x -> x.isSupportedByTransport(getTransport())) + .filter(x -> x.isSupportedByTransport(getTransportContext().transport())) .map( m -> createMethodDescriptorVariableDecl( @@ -343,7 +342,7 @@ private static List createClassMemberFieldDeclarations( protected Map createProtoMethodNameToDescriptorClassMembers( Service service, Class descriptorClass) { return service.methods().stream() - .filter(x -> x.isSupportedByTransport(getTransport())) + .filter(x -> x.isSupportedByTransport(getTransportContext().transport())) .collect( Collectors.toMap( Method::name, @@ -375,7 +374,7 @@ private Map createCallableClassMembers( Map callableClassMembers = new LinkedHashMap<>(); // Using a for-loop because the output cardinality is not a 1:1 mapping to the input set. for (Method protoMethod : service.methods()) { - if (!protoMethod.isSupportedByTransport(getTransport())) { + if (!protoMethod.isSupportedByTransport(getTransportContext().transport())) { continue; } String javaStyleProtoMethodName = JavaStyle.toLowerCamelCase(protoMethod.name()); @@ -664,7 +663,7 @@ protected List createConstructorMethods( // Transport settings local variables. Map javaStyleMethodNameToTransportSettingsVarExprs = service.methods().stream() - .filter(x -> x.isSupportedByTransport(getTransport())) + .filter(x -> x.isSupportedByTransport(getTransportContext().transport())) .collect( Collectors.toMap( m -> JavaStyle.toLowerCamelCase(m.name()), @@ -688,7 +687,7 @@ protected List createConstructorMethods( secondCtorExprs.addAll( service.methods().stream() - .filter(x -> x.isSupportedByTransport(getTransport())) + .filter(x -> x.isSupportedByTransport(getTransportContext().transport())) .map( m -> createTransportSettingsInitExpr( @@ -1059,7 +1058,7 @@ private List createStubOverrideMethods( private boolean checkOperationPollingMethod(Service service) { return service.methods().stream() - .filter(x -> x.isSupportedByTransport(getTransport())) + .filter(x -> x.isSupportedByTransport(getTransportContext().transport())) .anyMatch(Method::isOperationPollingMethod); } @@ -1098,7 +1097,7 @@ private TypeStore createDynamicTypes(Service service, String stubPakkage) { typeStore.putAll( service.pakkage(), service.methods().stream() - .filter(x -> x.isSupportedByTransport(getTransport())) + .filter(x -> x.isSupportedByTransport(getTransportContext().transport())) .filter(Method::isPaged) .map(m -> String.format(PAGED_RESPONSE_TYPE_NAME_PATTERN, m.name())) .collect(Collectors.toList()), diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpcrest/HttpJsonServiceClientTestClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpcrest/HttpJsonServiceClientTestClassComposer.java index 00f76eb75e..9f9bbafc05 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpcrest/HttpJsonServiceClientTestClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpcrest/HttpJsonServiceClientTestClassComposer.java @@ -21,8 +21,6 @@ import com.google.api.generator.gapic.composer.store.TypeStore; import com.google.api.generator.gapic.model.GapicClass; import com.google.api.generator.gapic.model.GapicContext; -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 java.util.Map; @@ -46,12 +44,6 @@ protected GapicClass generate(String className, GapicContext context, Service se service); } - protected boolean isSupportedMethod(Method method) { - return method.httpBindings() != null - && method.stream() != Stream.BIDI - && method.stream() != Stream.CLIENT; - } - @Override protected MethodDefinition createStartStaticServerMethod( Service service, diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpcrest/HttpJsonServiceStubClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpcrest/HttpJsonServiceStubClassComposer.java index 7f99c81287..6d46c07792 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpcrest/HttpJsonServiceStubClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpcrest/HttpJsonServiceStubClassComposer.java @@ -35,6 +35,8 @@ public static HttpJsonServiceStubClassComposer instance() { @Override protected List createStaticCreatorMethods( Service service, TypeStore typeStore, String newBuilderMethod) { + // No need to check if REST Transport is enabled + // AbstractTransportServiceStubClassComposer won't generate a file if REST isn't enabled return super.createStaticCreatorMethods(service, typeStore, "newHttpJsonBuilder"); } } diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpcrest/ServiceClientClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpcrest/ServiceClientClassComposer.java index 8933b7b4ed..c101c96469 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpcrest/ServiceClientClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpcrest/ServiceClientClassComposer.java @@ -26,6 +26,7 @@ import com.google.api.generator.gapic.model.ResourceName; import com.google.api.generator.gapic.model.Sample; import com.google.api.generator.gapic.model.Service; +import com.google.api.generator.gapic.model.Transport; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -48,6 +49,10 @@ protected List createClassHeaderComments( Map resourceNames, Map messageTypes, List samples) { + if (!service.hasAnyEnabledMethodsForTransport(Transport.REST)) { + return super.createClassHeaderComments( + service, typeStore, resourceNames, messageTypes, samples); + } TypeNode clientType = typeStore.get(ClassNames.getServiceClientClassName(service)); TypeNode settingsType = typeStore.get(ClassNames.getServiceSettingsClassName(service)); Sample classMethodSampleCode = diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpcrest/ServiceSettingsClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpcrest/ServiceSettingsClassComposer.java index 3b48a45958..c597be4c8a 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpcrest/ServiceSettingsClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpcrest/ServiceSettingsClassComposer.java @@ -21,6 +21,7 @@ import com.google.api.generator.gapic.composer.common.AbstractServiceSettingsClassComposer; import com.google.api.generator.gapic.composer.store.TypeStore; import com.google.api.generator.gapic.model.Service; +import com.google.api.generator.gapic.model.Transport; import com.google.common.collect.ImmutableList; import java.util.ArrayList; import java.util.Iterator; @@ -44,24 +45,25 @@ protected List createNestedBuilderCreatorMethods( String newBuilderMethodName, String createDefaultMethodName, List annotations) { - List methods = new ArrayList<>(); AnnotationNode betaApiAnnotaiton = AnnotationNode.builder().setType(FIXED_TYPESTORE.get("BetaApi")).build(); + List methods = new ArrayList<>(); methods.addAll( super.createNestedBuilderCreatorMethods( service, typeStore, "newBuilder", "createDefault", annotations)); - methods.addAll( - super.createNestedBuilderCreatorMethods( - service, - typeStore, - "newHttpJsonBuilder", - "createHttpJsonDefault", - ImmutableList.builder() - .addAll(annotations) - .add(betaApiAnnotaiton) - .build())); - + if (service.hasAnyEnabledMethodsForTransport(Transport.REST)) { + methods.addAll( + super.createNestedBuilderCreatorMethods( + service, + typeStore, + "newHttpJsonBuilder", + "createHttpJsonDefault", + ImmutableList.builder() + .addAll(annotations) + .add(betaApiAnnotaiton) + .build())); + } return methods; } @@ -89,19 +91,20 @@ protected List createNewBuilderMethods( annotations, new SettingsCommentComposer(transportNames.next()) .getNewTransportBuilderMethodComment())); - methods.addAll( - super.createNewBuilderMethods( - service, - typeStore, - "newHttpJsonBuilder", - "createHttpJsonDefault", - ImmutableList.builder() - .addAll(annotations) - .add(betaApiAnnotaiton) - .build(), - new SettingsCommentComposer(transportNames.next()) - .getNewTransportBuilderMethodComment())); - + if (service.hasAnyEnabledMethodsForTransport(Transport.REST)) { + methods.addAll( + super.createNewBuilderMethods( + service, + typeStore, + "newHttpJsonBuilder", + "createHttpJsonDefault", + ImmutableList.builder() + .addAll(annotations) + .add(betaApiAnnotaiton) + .build(), + new SettingsCommentComposer(transportNames.next()) + .getNewTransportBuilderMethodComment())); + } return methods; } } diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpcrest/ServiceStubSettingsClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpcrest/ServiceStubSettingsClassComposer.java index 84adf3598a..b79c74ed99 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpcrest/ServiceStubSettingsClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpcrest/ServiceStubSettingsClassComposer.java @@ -34,7 +34,7 @@ import com.google.api.generator.gapic.composer.store.TypeStore; import com.google.api.generator.gapic.composer.utils.ClassNames; import com.google.api.generator.gapic.model.Service; -import com.google.common.collect.ImmutableList; +import com.google.api.generator.gapic.model.Transport; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -118,21 +118,26 @@ protected List createApiClientHeaderProviderBuilderMethods( TypeNode returnType = TypeNode.withReference(ConcreteReference.withClazz(ApiClientHeaderProvider.Builder.class)); - return ImmutableList.of( + List methodDefinitions = new ArrayList<>(); + methodDefinitions.add( createApiClientHeaderProviderBuilderMethod( service, typeStore, "defaultGrpcApiClientHeaderProviderBuilder", TypeNode.withReference(ConcreteReference.withClazz(GaxGrpcProperties.class)), "getGrpcTokenName", - "getGrpcVersion"), - createApiClientHeaderProviderBuilderMethod( - service, - typeStore, - "defaultHttpJsonApiClientHeaderProviderBuilder", - TypeNode.withReference(ConcreteReference.withClazz(GaxHttpJsonProperties.class)), - "getHttpJsonTokenName", - "getHttpJsonVersion"), + "getGrpcVersion")); + if (service.hasAnyEnabledMethodsForTransport(Transport.REST)) { + methodDefinitions.add( + createApiClientHeaderProviderBuilderMethod( + service, + typeStore, + "defaultHttpJsonApiClientHeaderProviderBuilder", + TypeNode.withReference(ConcreteReference.withClazz(GaxHttpJsonProperties.class)), + "getHttpJsonTokenName", + "getHttpJsonVersion")); + } + methodDefinitions.add( MethodDefinition.builder() .setScope(ScopeNode.PUBLIC) .setIsStatic(true) @@ -146,6 +151,7 @@ protected List createApiClientHeaderProviderBuilderMethods( .setReturnType(returnType) .build()) .build()); + return methodDefinitions; } @Override @@ -169,20 +175,26 @@ public MethodDefinition createDefaultTransportChannelProviderMethod() { } @Override - protected List createNestedClassCreateDefaultMethods(TypeStore typeStore) { - return ImmutableList.of( + protected List createNestedClassCreateDefaultMethods( + Service service, TypeStore typeStore) { + List methodDefinitions = new ArrayList<>(); + methodDefinitions.add( createNestedClassCreateDefaultMethod( typeStore, "createDefault", "defaultTransportChannelProvider", null, - "defaultApiClientHeaderProviderBuilder"), - createNestedClassCreateDefaultMethod( - typeStore, - "createHttpJsonDefault", - null, - "defaultHttpJsonTransportProviderBuilder", - "defaultHttpJsonApiClientHeaderProviderBuilder")); + "defaultApiClientHeaderProviderBuilder")); + if (service.hasAnyEnabledMethodsForTransport(Transport.REST)) { + methodDefinitions.add( + createNestedClassCreateDefaultMethod( + typeStore, + "createHttpJsonDefault", + null, + "defaultHttpJsonTransportProviderBuilder", + "defaultHttpJsonApiClientHeaderProviderBuilder")); + } + return methodDefinitions; } @Override @@ -202,14 +214,16 @@ protected List createNewBuilderMethods( "createDefault", new SettingsCommentComposer(transportNames.next()) .getNewTransportBuilderMethodComment())); - methods.addAll( - super.createNewBuilderMethods( - service, - typeStore, - "newHttpJsonBuilder", - "createHttpJsonDefault", - new SettingsCommentComposer(transportNames.next()) - .getNewTransportBuilderMethodComment())); + if (service.hasAnyEnabledMethodsForTransport(Transport.REST)) { + methods.addAll( + super.createNewBuilderMethods( + service, + typeStore, + "newHttpJsonBuilder", + "createHttpJsonDefault", + new SettingsCommentComposer(transportNames.next()) + .getNewTransportBuilderMethodComment())); + } return methods; } } diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java index 277a5f2c7e..2712dd4638 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java @@ -59,7 +59,6 @@ import com.google.api.generator.gapic.model.Method; import com.google.api.generator.gapic.model.OperationResponse; import com.google.api.generator.gapic.model.Service; -import com.google.api.generator.gapic.model.Transport; import com.google.api.generator.gapic.utils.JavaStyle; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.BiMap; @@ -117,11 +116,6 @@ private static TypeStore createStaticTypes() { TypeRegistry.class)); } - @Override - protected Transport getTransport() { - return Transport.REST; - } - @Override protected boolean generateOperationsStubLogic(Service service) { return service.hasLroMethods(); @@ -1276,7 +1270,7 @@ protected List createClassMethods( private List createInvalidClassMethods(Service service) { List methodDefinitions = new ArrayList<>(); for (Method protoMethod : service.methods()) { - if (protoMethod.isSupportedByTransport(getTransport())) { + if (protoMethod.isSupportedByTransport(getTransportContext().transport())) { continue; } String javaStyleProtoMethodName = JavaStyle.toLowerCamelCase(protoMethod.name()); @@ -1295,7 +1289,7 @@ private List createInvalidClassMethods(Service service) { .setMessageExpr( String.format( "Not implemented: %s(). %s transport is not implemented for this method yet.", - callableName, getTransport())) + callableName, getTransportContext().transport())) .build()))) .build()); } diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/ServiceStubSettingsClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/ServiceStubSettingsClassComposer.java index b12528ec3f..654337fb87 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/ServiceStubSettingsClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/ServiceStubSettingsClassComposer.java @@ -53,14 +53,18 @@ private static TypeStore createStaticTypes() { @Override protected List createApiClientHeaderProviderBuilderMethods( Service service, TypeStore typeStore) { - return Collections.singletonList( - createApiClientHeaderProviderBuilderMethod( - service, - typeStore, - "defaultApiClientHeaderProviderBuilder", - FIXED_REST_TYPESTORE.get(GaxHttpJsonProperties.class.getSimpleName()), - "getHttpJsonTokenName", - "getHttpJsonVersion")); + if (service.hasAnyEnabledMethodsForTransport(getTransportContext().transport())) { + return Collections.singletonList( + createApiClientHeaderProviderBuilderMethod( + service, + typeStore, + "defaultApiClientHeaderProviderBuilder", + FIXED_REST_TYPESTORE.get(GaxHttpJsonProperties.class.getSimpleName()), + "getHttpJsonTokenName", + "getHttpJsonVersion")); + } else { + return Collections.emptyList(); + } } @Override diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/GapicClass.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/GapicClass.java index f05e308290..11d6598e7e 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/GapicClass.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/GapicClass.java @@ -15,6 +15,7 @@ package com.google.api.generator.gapic.model; import com.google.api.generator.engine.ast.ClassDefinition; +import com.google.api.generator.engine.ast.ScopeNode; import com.google.auto.value.AutoValue; import java.util.Collections; import java.util.List; @@ -26,7 +27,10 @@ public enum Kind { MAIN, STUB, TEST, - PROTO + PROTO, + // Used to denote a Gapic Class that has no intention of being generated + // The Writer will skip generating code for this class + NON_GENERATED }; public abstract Kind kind(); @@ -41,6 +45,24 @@ public enum Kind { // Only used for generating the region tag for samples; therefore only used in select Composers. public abstract String apiVersion(); + /** + * Create a GapicClass with minimal information. This is intended to be used for GapicClasses that + * will not generate any Java files (Writer will skip) + * + * @return GapicClass denoted with NON_GENERATED Kind enum + */ + public static GapicClass createNonGeneratedGapicClass() { + return builder() + .setKind(Kind.NON_GENERATED) + .setClassDefinition( + ClassDefinition.builder() + .setPackageString("Empty Package") + .setName("Empty Name") + .setScope(ScopeNode.PUBLIC) + .build()) + .build(); + } + public static GapicClass create(Kind kind, ClassDefinition classDefinition) { return builder().setKind(kind).setClassDefinition(classDefinition).build(); } diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Service.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Service.java index 2e3a6be7df..ce581915c9 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Service.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Service.java @@ -113,6 +113,33 @@ public boolean hasStandardLroMethods() { return false; } + /** + * Wrapper for hasAnyEnabledMethodsForTransport(Transport). Some invocations are called with + * `gRPC` which can't match with the correct Transport (GRPC) + * + * @param transportName String transport value + * @return boolean if service contains any enabled methods for a transport + */ + public boolean hasAnyEnabledMethodsForTransport(String transportName) { + return hasAnyEnabledMethodsForTransport(Transport.parse(transportName)); + } + + /** + * Determines if a Service contains any methods that are both eligible and enabled for the + * Transport. GRPC+REST Transport is not supported as each transport's sub composers will invoke + * this method the specific transport (GRPC or REST) + * + * @param transport Expects either GRPC or REST Transport + * @return boolean if service contains any enabled methods for a transport + */ + public boolean hasAnyEnabledMethodsForTransport(Transport transport) { + if (transport == Transport.GRPC_REST) { + throw new IllegalArgumentException( + String.format("Invalid Transport: %s. Expecting GRPC or REST", transport.name())); + } + return methods().stream().anyMatch(x -> x.isSupportedByTransport(transport)); + } + public abstract Builder toBuilder(); public static Builder builder() { diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Transport.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Transport.java index ae7820c8ed..87d49820bf 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Transport.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Transport.java @@ -20,12 +20,12 @@ public enum Transport { GRPC_REST; /** - * Parse command line transport argument in the format `grpc+rest`. + * Parse the input and return the corresponding Transport enum * - * @param name name of the transport. Valid inputs are "grpc", "rest", "grpc+rest" - * @return the {@code Transport} enum matching the command line argument + * @param name Transport name + * @return the {@code Transport} enum matching the name parameter */ public static Transport parse(String name) { - return valueOf(name.replace('+', '_').toUpperCase()); + return valueOf(name.toLowerCase().replace('+', '_').toUpperCase()); } } diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/protowriter/Writer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/protowriter/Writer.java index 35f9f21fdb..d130b12feb 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/protowriter/Writer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/protowriter/Writer.java @@ -57,6 +57,9 @@ public static CodeGeneratorResponse write( } for (GapicClass gapicClazz : clazzes) { + if (gapicClazz.kind() == GapicClass.Kind.NON_GENERATED) { + continue; + } String classPath = writeClazz(gapicClazz, codeWriter, jos); writeSamples(gapicClazz, getSamplePackage(gapicClazz), classPath, jos); } diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/GrpcRestTestProtoLoader.java b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/GrpcRestTestProtoLoader.java index 05c0241327..1e3b057170 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/GrpcRestTestProtoLoader.java +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/GrpcRestTestProtoLoader.java @@ -31,6 +31,7 @@ import com.google.protobuf.Descriptors.ServiceDescriptor; import com.google.protobuf.StructProto; import com.google.showcase.grpcrest.v1beta1.EchoGrpcrest; +import com.google.showcase.v1beta1.WickedOuterClass; import java.nio.file.Path; import java.nio.file.Paths; import java.util.HashSet; @@ -82,4 +83,35 @@ public GapicContext parseShowcaseEcho() { .setTransport(getTransport()) .build(); } + + public GapicContext parseShowcaseWicked() { + FileDescriptor fileDescriptor = WickedOuterClass.getDescriptor(); + ServiceDescriptor messagingService = fileDescriptor.getServices().get(0); + assertEquals("Wicked", messagingService.getName()); + + Map messageTypes = Parser.parseMessages(fileDescriptor); + messageTypes.putAll(Parser.parseMessages(OperationsProto.getDescriptor())); + messageTypes.putAll(Parser.parseMessages(StructProto.getDescriptor())); + + Map resourceNames = Parser.parseResourceNames(fileDescriptor); + Set outputResourceNames = new HashSet<>(); + List services = + Parser.parseService( + fileDescriptor, messageTypes, resourceNames, Optional.empty(), outputResourceNames); + + String jsonFilename = "showcase_grpc_service_config.json"; + Path jsonPath = Paths.get(getTestFilesDirectory(), 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) + .setTransport(getTransport()) + .build(); + } } diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/GrpcServiceCallableFactoryClassComposerTest.java b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/GrpcServiceCallableFactoryClassComposerTest.java index dc6adc72fe..844eea2e6e 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/GrpcServiceCallableFactoryClassComposerTest.java +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/GrpcServiceCallableFactoryClassComposerTest.java @@ -40,4 +40,19 @@ public void generateServiceClasses() { Paths.get(Utils.getGoldenDir(this.getClass()), "GrpcEchoCallableFactory.golden"); Assert.assertCodeEquals(goldenFilePath, visitor.write()); } + + @Test + public void generateServiceClassesWicked() { + GapicContext context = GrpcRestTestProtoLoader.instance().parseShowcaseWicked(); + Service wickedProtoService = context.services().get(0); + GapicClass clazz = + GrpcServiceCallableFactoryClassComposer.instance().generate(context, wickedProtoService); + + JavaWriterVisitor visitor = new JavaWriterVisitor(); + clazz.classDefinition().accept(visitor); + Utils.saveCodegenToFile(this.getClass(), "GrpcWickedCallableFactory.golden", visitor.write()); + Path goldenFilePath = + Paths.get(Utils.getGoldenDir(this.getClass()), "GrpcWickedCallableFactory.golden"); + Assert.assertCodeEquals(goldenFilePath, visitor.write()); + } } diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/GrpcServiceStubClassComposerTest.java b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/GrpcServiceStubClassComposerTest.java index f9385b56b1..f96a5efc72 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/GrpcServiceStubClassComposerTest.java +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/GrpcServiceStubClassComposerTest.java @@ -38,4 +38,18 @@ public void generateServiceClasses() { Path goldenFilePath = Paths.get(Utils.getGoldenDir(this.getClass()), "GrpcEchoStub.golden"); Assert.assertCodeEquals(goldenFilePath, visitor.write()); } + + @Test + public void generateServiceClassesWicked() { + GapicContext context = GrpcRestTestProtoLoader.instance().parseShowcaseWicked(); + Service wickedProtoService = context.services().get(0); + GapicClass clazz = + GrpcServiceStubClassComposer.instance().generate(context, wickedProtoService); + + JavaWriterVisitor visitor = new JavaWriterVisitor(); + clazz.classDefinition().accept(visitor); + Utils.saveCodegenToFile(this.getClass(), "GrpcWickedStub.golden", visitor.write()); + Path goldenFilePath = Paths.get(Utils.getGoldenDir(this.getClass()), "GrpcWickedStub.golden"); + Assert.assertCodeEquals(goldenFilePath, visitor.write()); + } } diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/HttpJsonServiceCallableFactoryClassComposerTest.java b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/HttpJsonServiceCallableFactoryClassComposerTest.java index 249013974f..6c287236df 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/HttpJsonServiceCallableFactoryClassComposerTest.java +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/HttpJsonServiceCallableFactoryClassComposerTest.java @@ -14,6 +14,8 @@ package com.google.api.generator.gapic.composer.grpcrest; +import static com.google.common.truth.Truth.assertThat; + import com.google.api.generator.engine.writer.JavaWriterVisitor; import com.google.api.generator.gapic.composer.rest.HttpJsonServiceCallableFactoryClassComposer; import com.google.api.generator.gapic.model.GapicClass; @@ -40,4 +42,14 @@ public void generateServiceClasses() { Paths.get(Utils.getGoldenDir(this.getClass()), "HttpJsonEchoCallableFactory.golden"); Assert.assertCodeEquals(goldenFilePath, visitor.write()); } + + @Test + public void generateServiceClassesWicked() { + GapicContext context = GrpcRestTestProtoLoader.instance().parseShowcaseWicked(); + Service wickedProtoService = context.services().get(0); + GapicClass clazz = + HttpJsonServiceCallableFactoryClassComposer.instance() + .generate(context, wickedProtoService); + assertThat(clazz.kind()).isEqualTo(GapicClass.Kind.NON_GENERATED); + } } diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/HttpJsonServiceClientTestClassComposerTest.java b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/HttpJsonServiceClientTestClassComposerTest.java index 23d0a9adb3..82f4e44e0c 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/HttpJsonServiceClientTestClassComposerTest.java +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/HttpJsonServiceClientTestClassComposerTest.java @@ -15,6 +15,7 @@ package com.google.api.generator.gapic.composer.grpcrest; import static com.google.api.generator.test.framework.Assert.assertCodeEquals; +import static com.google.common.truth.Truth.assertThat; import com.google.api.generator.engine.writer.JavaWriterVisitor; import com.google.api.generator.gapic.model.GapicClass; @@ -40,4 +41,13 @@ public void generateServiceClasses() { Paths.get(Utils.getGoldenDir(this.getClass()), "EchoClientHttpJsonTest.golden"); assertCodeEquals(goldenFilePath, visitor.write()); } + + @Test + public void generateServiceClassesWicked() { + GapicContext context = GrpcRestTestProtoLoader.instance().parseShowcaseWicked(); + Service wickedProtoService = context.services().get(0); + GapicClass clazz = + HttpJsonServiceClientTestClassComposer.instance().generate(context, wickedProtoService); + assertThat(clazz.kind()).isEqualTo(GapicClass.Kind.NON_GENERATED); + } } diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/HttpJsonServiceStubClassComposerTest.java b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/HttpJsonServiceStubClassComposerTest.java index 87f21c8872..6bd960d91b 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/HttpJsonServiceStubClassComposerTest.java +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/HttpJsonServiceStubClassComposerTest.java @@ -14,6 +14,8 @@ package com.google.api.generator.gapic.composer.grpcrest; +import static com.google.common.truth.Truth.assertThat; + import com.google.api.generator.engine.writer.JavaWriterVisitor; import com.google.api.generator.gapic.model.GapicClass; import com.google.api.generator.gapic.model.GapicContext; @@ -38,4 +40,13 @@ public void generateServiceClasses() { Path goldenFilePath = Paths.get(Utils.getGoldenDir(this.getClass()), "HttpJsonEchoStub.golden"); Assert.assertCodeEquals(goldenFilePath, visitor.write()); } + + @Test + public void generateServiceClassesWicked() { + GapicContext context = GrpcRestTestProtoLoader.instance().parseShowcaseWicked(); + Service wickedProtoService = context.services().get(0); + GapicClass clazz = + HttpJsonServiceStubClassComposer.instance().generate(context, wickedProtoService); + assertThat(clazz.kind()).isEqualTo(GapicClass.Kind.NON_GENERATED); + } } diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/ServiceClientClassComposerTest.java b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/ServiceClientClassComposerTest.java index 0be072badd..ded1a19112 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/ServiceClientClassComposerTest.java +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/ServiceClientClassComposerTest.java @@ -50,4 +50,17 @@ public void generateServiceClassesEmpty() { Path goldenFilePath = Paths.get(Utils.getGoldenDir(this.getClass()), "EchoEmpty.golden"); Assert.assertCodeEquals(goldenFilePath, visitor.write()); } + + @Test + public void generateServiceClassesWicked() { + GapicContext context = GrpcRestTestProtoLoader.instance().parseShowcaseWicked(); + Service wickedProtoService = context.services().get(0); + GapicClass clazz = ServiceClientClassComposer.instance().generate(context, wickedProtoService); + + JavaWriterVisitor visitor = new JavaWriterVisitor(); + clazz.classDefinition().accept(visitor); + Utils.saveCodegenToFile(this.getClass(), "WickedClient.golden", visitor.write()); + Path goldenFilePath = Paths.get(Utils.getGoldenDir(this.getClass()), "WickedClient.golden"); + Assert.assertCodeEquals(goldenFilePath, visitor.write()); + } } diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/ServiceClientTestClassComposerTest.java b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/ServiceClientTestClassComposerTest.java index d7d4053f07..521c15bdbd 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/ServiceClientTestClassComposerTest.java +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/ServiceClientTestClassComposerTest.java @@ -21,6 +21,7 @@ import com.google.api.generator.gapic.model.GapicClass; import com.google.api.generator.gapic.model.GapicContext; import com.google.api.generator.gapic.model.Service; +import com.google.api.generator.test.framework.Assert; import com.google.api.generator.test.framework.Utils; import java.nio.file.Path; import java.nio.file.Paths; @@ -40,4 +41,18 @@ public void generateServiceClasses() { Path goldenFilePath = Paths.get(Utils.getGoldenDir(this.getClass()), "EchoClientTest.golden"); assertCodeEquals(goldenFilePath, visitor.write()); } + + @Test + public void generateServiceClassesWicked() { + GapicContext context = GrpcRestTestProtoLoader.instance().parseShowcaseWicked(); + Service wickedProtoService = context.services().get(0); + GapicClass clazz = + ServiceClientTestClassComposer.instance().generate(context, wickedProtoService); + + JavaWriterVisitor visitor = new JavaWriterVisitor(); + clazz.classDefinition().accept(visitor); + Utils.saveCodegenToFile(this.getClass(), "WickedClientTest.golden", visitor.write()); + Path goldenFilePath = Paths.get(Utils.getGoldenDir(this.getClass()), "WickedClientTest.golden"); + Assert.assertCodeEquals(goldenFilePath, visitor.write()); + } } diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/ServiceSettingsClassComposerTest.java b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/ServiceSettingsClassComposerTest.java index 8ccca9269b..4b5dc73f81 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/ServiceSettingsClassComposerTest.java +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/ServiceSettingsClassComposerTest.java @@ -37,4 +37,18 @@ public void generateServiceClasses() { Path goldenFilePath = Paths.get(Utils.getGoldenDir(this.getClass()), "EchoSettings.golden"); Assert.assertCodeEquals(goldenFilePath, visitor.write()); } + + @Test + public void generateServiceClassesWicked() { + GapicContext context = GrpcRestTestProtoLoader.instance().parseShowcaseWicked(); + Service wickedProtoService = context.services().get(0); + GapicClass clazz = + ServiceSettingsClassComposer.instance().generate(context, wickedProtoService); + + JavaWriterVisitor visitor = new JavaWriterVisitor(); + clazz.classDefinition().accept(visitor); + Utils.saveCodegenToFile(this.getClass(), "WickedSettings.golden", visitor.write()); + Path goldenFilePath = Paths.get(Utils.getGoldenDir(this.getClass()), "WickedSettings.golden"); + Assert.assertCodeEquals(goldenFilePath, visitor.write()); + } } diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/ServiceStubSettingsClassComposerTest.java b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/ServiceStubSettingsClassComposerTest.java index 812df41ff8..3348fd3d67 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/ServiceStubSettingsClassComposerTest.java +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/ServiceStubSettingsClassComposerTest.java @@ -38,4 +38,19 @@ public void generateServiceClasses() { Path goldenFilePath = Paths.get(Utils.getGoldenDir(this.getClass()), "EchoStubSettings.golden"); Assert.assertCodeEquals(goldenFilePath, visitor.write()); } + + @Test + public void generateServiceClassesWicked() { + GapicContext context = GrpcRestTestProtoLoader.instance().parseShowcaseWicked(); + Service wickedProtoService = context.services().get(0); + GapicClass clazz = + ServiceStubSettingsClassComposer.instance().generate(context, wickedProtoService); + + JavaWriterVisitor visitor = new JavaWriterVisitor(); + clazz.classDefinition().accept(visitor); + Utils.saveCodegenToFile(this.getClass(), "WickedStubSettings.golden", visitor.write()); + Path goldenFilePath = + Paths.get(Utils.getGoldenDir(this.getClass()), "WickedStubSettings.golden"); + Assert.assertCodeEquals(goldenFilePath, visitor.write()); + } } diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/EchoEmpty.golden b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/EchoEmpty.golden index d9708af4ae..ad2bd517d2 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/EchoEmpty.golden +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/EchoEmpty.golden @@ -76,19 +76,6 @@ import javax.annotation.Generated; * EchoEmpyClient echoEmpyClient = EchoEmpyClient.create(echoEmpySettings); * } * - *

To use REST (HTTP1.1/JSON) transport (instead of gRPC) for sending and receiving requests over - * the wire: - * - *

{@code
- * // This snippet has been automatically generated and should be regarded as a code template only.
- * // It will require modifications to work:
- * // - It may require correct/in-range values for request initialization.
- * // - It may require specifying regional endpoints when creating the service client as shown in
- * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
- * EchoEmpySettings echoEmpySettings = EchoEmpySettings.newHttpJsonBuilder().build();
- * EchoEmpyClient echoEmpyClient = EchoEmpyClient.create(echoEmpySettings);
- * }
- * *

Please refer to the GitHub repository's samples for more quickstart code snippets. */ @BetaApi diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/GrpcWickedCallableFactory.golden b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/GrpcWickedCallableFactory.golden new file mode 100644 index 0000000000..88f063999a --- /dev/null +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/GrpcWickedCallableFactory.golden @@ -0,0 +1,99 @@ +package com.google.showcase.v1beta1.stub; + +import com.google.api.core.BetaApi; +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.rpc.BatchingCallSettings; +import com.google.api.gax.rpc.BidiStreamingCallable; +import com.google.api.gax.rpc.ClientContext; +import com.google.api.gax.rpc.ClientStreamingCallable; +import com.google.api.gax.rpc.OperationCallSettings; +import com.google.api.gax.rpc.OperationCallable; +import com.google.api.gax.rpc.PagedCallSettings; +import com.google.api.gax.rpc.ServerStreamingCallSettings; +import com.google.api.gax.rpc.ServerStreamingCallable; +import com.google.api.gax.rpc.StreamingCallSettings; +import com.google.api.gax.rpc.UnaryCallSettings; +import com.google.api.gax.rpc.UnaryCallable; +import com.google.longrunning.Operation; +import com.google.longrunning.stub.OperationsStub; +import javax.annotation.Generated; + +// AUTO-GENERATED DOCUMENTATION AND CLASS. +/** + * gRPC callable factory implementation for the Wicked service API. + * + *

This class is for advanced usage. + */ +@BetaApi +@Generated("by gapic-generator-java") +public class GrpcWickedCallableFactory implements GrpcStubCallableFactory { + + @Override + public UnaryCallable createUnaryCallable( + GrpcCallSettings grpcCallSettings, + UnaryCallSettings callSettings, + ClientContext clientContext) { + return GrpcCallableFactory.createUnaryCallable(grpcCallSettings, callSettings, clientContext); + } + + @Override + public + UnaryCallable createPagedCallable( + GrpcCallSettings grpcCallSettings, + PagedCallSettings callSettings, + ClientContext clientContext) { + return GrpcCallableFactory.createPagedCallable(grpcCallSettings, callSettings, clientContext); + } + + @Override + public UnaryCallable createBatchingCallable( + GrpcCallSettings grpcCallSettings, + BatchingCallSettings callSettings, + ClientContext clientContext) { + return GrpcCallableFactory.createBatchingCallable( + grpcCallSettings, callSettings, clientContext); + } + + @Override + public + OperationCallable createOperationCallable( + GrpcCallSettings grpcCallSettings, + OperationCallSettings callSettings, + ClientContext clientContext, + OperationsStub operationsStub) { + return GrpcCallableFactory.createOperationCallable( + grpcCallSettings, callSettings, clientContext, operationsStub); + } + + @Override + public + BidiStreamingCallable createBidiStreamingCallable( + GrpcCallSettings grpcCallSettings, + StreamingCallSettings callSettings, + ClientContext clientContext) { + return GrpcCallableFactory.createBidiStreamingCallable( + grpcCallSettings, callSettings, clientContext); + } + + @Override + public + ServerStreamingCallable createServerStreamingCallable( + GrpcCallSettings grpcCallSettings, + ServerStreamingCallSettings callSettings, + ClientContext clientContext) { + return GrpcCallableFactory.createServerStreamingCallable( + grpcCallSettings, callSettings, clientContext); + } + + @Override + public + ClientStreamingCallable createClientStreamingCallable( + GrpcCallSettings grpcCallSettings, + StreamingCallSettings callSettings, + ClientContext clientContext) { + return GrpcCallableFactory.createClientStreamingCallable( + grpcCallSettings, callSettings, clientContext); + } +} diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/GrpcWickedStub.golden b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/GrpcWickedStub.golden new file mode 100644 index 0000000000..a4accaa5ae --- /dev/null +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/GrpcWickedStub.golden @@ -0,0 +1,182 @@ +package com.google.showcase.v1beta1.stub; + +import com.google.api.core.BetaApi; +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.ClientStreamingCallable; +import com.google.api.gax.rpc.UnaryCallable; +import com.google.longrunning.stub.GrpcOperationsStub; +import com.google.showcase.v1beta1.EvilRequest; +import com.google.showcase.v1beta1.EvilResponse; +import io.grpc.MethodDescriptor; +import io.grpc.protobuf.ProtoUtils; +import java.io.IOException; +import java.util.concurrent.TimeUnit; +import javax.annotation.Generated; + +// AUTO-GENERATED DOCUMENTATION AND CLASS. +/** + * gRPC stub implementation for the Wicked service API. + * + *

This class is for advanced usage and reflects the underlying API directly. + */ +@BetaApi +@Generated("by gapic-generator-java") +public class GrpcWickedStub extends WickedStub { + private static final MethodDescriptor craftEvilPlanMethodDescriptor = + MethodDescriptor.newBuilder() + .setType(MethodDescriptor.MethodType.UNARY) + .setFullMethodName("google.showcase.v1beta1.Wicked/CraftEvilPlan") + .setRequestMarshaller(ProtoUtils.marshaller(EvilRequest.getDefaultInstance())) + .setResponseMarshaller(ProtoUtils.marshaller(EvilResponse.getDefaultInstance())) + .build(); + + private static final MethodDescriptor + brainstormEvilPlansMethodDescriptor = + MethodDescriptor.newBuilder() + .setType(MethodDescriptor.MethodType.BIDI_STREAMING) + .setFullMethodName("google.showcase.v1beta1.Wicked/BrainstormEvilPlans") + .setRequestMarshaller(ProtoUtils.marshaller(EvilRequest.getDefaultInstance())) + .setResponseMarshaller(ProtoUtils.marshaller(EvilResponse.getDefaultInstance())) + .build(); + + private static final MethodDescriptor + persuadeEvilPlanMethodDescriptor = + MethodDescriptor.newBuilder() + .setType(MethodDescriptor.MethodType.CLIENT_STREAMING) + .setFullMethodName("google.showcase.v1beta1.Wicked/PersuadeEvilPlan") + .setRequestMarshaller(ProtoUtils.marshaller(EvilRequest.getDefaultInstance())) + .setResponseMarshaller(ProtoUtils.marshaller(EvilResponse.getDefaultInstance())) + .build(); + + private final UnaryCallable craftEvilPlanCallable; + private final BidiStreamingCallable brainstormEvilPlansCallable; + private final ClientStreamingCallable persuadeEvilPlanCallable; + + private final BackgroundResource backgroundResources; + private final GrpcOperationsStub operationsStub; + private final GrpcStubCallableFactory callableFactory; + + public static final GrpcWickedStub create(WickedStubSettings settings) throws IOException { + return new GrpcWickedStub(settings, ClientContext.create(settings)); + } + + public static final GrpcWickedStub create(ClientContext clientContext) throws IOException { + return new GrpcWickedStub(WickedStubSettings.newBuilder().build(), clientContext); + } + + public static final GrpcWickedStub create( + ClientContext clientContext, GrpcStubCallableFactory callableFactory) throws IOException { + return new GrpcWickedStub( + WickedStubSettings.newBuilder().build(), clientContext, callableFactory); + } + + /** + * Constructs an instance of GrpcWickedStub, 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 GrpcWickedStub(WickedStubSettings settings, ClientContext clientContext) + throws IOException { + this(settings, clientContext, new GrpcWickedCallableFactory()); + } + + /** + * Constructs an instance of GrpcWickedStub, 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 GrpcWickedStub( + WickedStubSettings settings, + ClientContext clientContext, + GrpcStubCallableFactory callableFactory) + throws IOException { + this.callableFactory = callableFactory; + this.operationsStub = GrpcOperationsStub.create(clientContext, callableFactory); + + GrpcCallSettings craftEvilPlanTransportSettings = + GrpcCallSettings.newBuilder() + .setMethodDescriptor(craftEvilPlanMethodDescriptor) + .build(); + GrpcCallSettings brainstormEvilPlansTransportSettings = + GrpcCallSettings.newBuilder() + .setMethodDescriptor(brainstormEvilPlansMethodDescriptor) + .build(); + GrpcCallSettings persuadeEvilPlanTransportSettings = + GrpcCallSettings.newBuilder() + .setMethodDescriptor(persuadeEvilPlanMethodDescriptor) + .build(); + + this.craftEvilPlanCallable = + callableFactory.createUnaryCallable( + craftEvilPlanTransportSettings, settings.craftEvilPlanSettings(), clientContext); + this.brainstormEvilPlansCallable = + callableFactory.createBidiStreamingCallable( + brainstormEvilPlansTransportSettings, + settings.brainstormEvilPlansSettings(), + clientContext); + this.persuadeEvilPlanCallable = + callableFactory.createClientStreamingCallable( + persuadeEvilPlanTransportSettings, settings.persuadeEvilPlanSettings(), clientContext); + + this.backgroundResources = + new BackgroundResourceAggregation(clientContext.getBackgroundResources()); + } + + public GrpcOperationsStub getOperationsStub() { + return operationsStub; + } + + @Override + public UnaryCallable craftEvilPlanCallable() { + return craftEvilPlanCallable; + } + + @Override + public BidiStreamingCallable brainstormEvilPlansCallable() { + return brainstormEvilPlansCallable; + } + + @Override + public ClientStreamingCallable persuadeEvilPlanCallable() { + return persuadeEvilPlanCallable; + } + + @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); + } +} diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/WickedClient.golden b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/WickedClient.golden new file mode 100644 index 0000000000..67f9212085 --- /dev/null +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/WickedClient.golden @@ -0,0 +1,278 @@ +package com.google.showcase.v1beta1; + +import com.google.api.core.BetaApi; +import com.google.api.gax.core.BackgroundResource; +import com.google.api.gax.rpc.BidiStreamingCallable; +import com.google.api.gax.rpc.ClientStreamingCallable; +import com.google.api.gax.rpc.UnaryCallable; +import com.google.showcase.v1beta1.stub.WickedStub; +import com.google.showcase.v1beta1.stub.WickedStubSettings; +import java.io.IOException; +import java.util.concurrent.TimeUnit; +import javax.annotation.Generated; + +// AUTO-GENERATED DOCUMENTATION AND CLASS. +/** + * This class provides the ability to make remote calls to the backing service through method calls + * that map to API methods. Sample code to get started: + * + *

{@code
+ * // This snippet has been automatically generated and should be regarded as a code template only.
+ * // It will require modifications to work:
+ * // - It may require correct/in-range values for request initialization.
+ * // - It may require specifying regional endpoints when creating the service client as shown in
+ * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+ * try (WickedClient wickedClient = WickedClient.create()) {
+ *   EvilRequest request =
+ *       EvilRequest.newBuilder().setMaliciousIdea("maliciousIdea712541645").build();
+ *   EvilResponse response = wickedClient.craftEvilPlan(request);
+ * }
+ * }
+ * + *

Note: close() needs to be called on the WickedClient object to clean up resources such as + * threads. In the example above, try-with-resources is used, which automatically calls close(). + * + *

The surface of this class includes several types of Java methods for each of the API's + * methods: + * + *

    + *
  1. A "flattened" method. With this type of method, the fields of the request type have been + * converted into function parameters. It may be the case that not all fields are available as + * parameters, and not every API method will have a flattened method entry point. + *
  2. A "request object" method. This type of method only takes one parameter, a request object, + * which must be constructed before the call. Not every API method will have a request object + * method. + *
  3. A "callable" method. This type of method takes no parameters and returns an immutable API + * callable object, which can be used to initiate calls to the service. + *
+ * + *

See the individual methods for example code. + * + *

Many parameters require resource names to be formatted in a particular way. To assist with + * these names, this class includes a format method for each type of name, and additionally a parse + * method to extract the individual identifiers contained within names that are returned. + * + *

This class can be customized by passing in a custom instance of WickedSettings to create(). + * For example: + * + *

To customize credentials: + * + *

{@code
+ * // This snippet has been automatically generated and should be regarded as a code template only.
+ * // It will require modifications to work:
+ * // - It may require correct/in-range values for request initialization.
+ * // - It may require specifying regional endpoints when creating the service client as shown in
+ * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+ * WickedSettings wickedSettings =
+ *     WickedSettings.newBuilder()
+ *         .setCredentialsProvider(FixedCredentialsProvider.create(myCredentials))
+ *         .build();
+ * WickedClient wickedClient = WickedClient.create(wickedSettings);
+ * }
+ * + *

To customize the endpoint: + * + *

{@code
+ * // This snippet has been automatically generated and should be regarded as a code template only.
+ * // It will require modifications to work:
+ * // - It may require correct/in-range values for request initialization.
+ * // - It may require specifying regional endpoints when creating the service client as shown in
+ * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+ * WickedSettings wickedSettings = WickedSettings.newBuilder().setEndpoint(myEndpoint).build();
+ * WickedClient wickedClient = WickedClient.create(wickedSettings);
+ * }
+ * + *

Please refer to the GitHub repository's samples for more quickstart code snippets. + */ +@BetaApi +@Generated("by gapic-generator-java") +public class WickedClient implements BackgroundResource { + private final WickedSettings settings; + private final WickedStub stub; + + /** Constructs an instance of WickedClient with default settings. */ + public static final WickedClient create() throws IOException { + return create(WickedSettings.newBuilder().build()); + } + + /** + * Constructs an instance of WickedClient, using the given settings. The channels are created + * based on the settings passed in, or defaults for any settings that are not set. + */ + public static final WickedClient create(WickedSettings settings) throws IOException { + return new WickedClient(settings); + } + + /** + * Constructs an instance of WickedClient, using the given stub for making calls. This is for + * advanced usage - prefer using create(WickedSettings). + */ + public static final WickedClient create(WickedStub stub) { + return new WickedClient(stub); + } + + /** + * Constructs an instance of WickedClient, 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 WickedClient(WickedSettings settings) throws IOException { + this.settings = settings; + this.stub = ((WickedStubSettings) settings.getStubSettings()).createStub(); + } + + protected WickedClient(WickedStub stub) { + this.settings = null; + this.stub = stub; + } + + public final WickedSettings getSettings() { + return settings; + } + + public WickedStub getStub() { + return stub; + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Sample code: + * + *

{@code
+   * // This snippet has been automatically generated and should be regarded as a code template only.
+   * // It will require modifications to work:
+   * // - It may require correct/in-range values for request initialization.
+   * // - It may require specifying regional endpoints when creating the service client as shown in
+   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+   * try (WickedClient wickedClient = WickedClient.create()) {
+   *   EvilRequest request =
+   *       EvilRequest.newBuilder().setMaliciousIdea("maliciousIdea712541645").build();
+   *   EvilResponse response = wickedClient.craftEvilPlan(request);
+   * }
+   * }
+ * + * @param request The request object containing all of the parameters for the API call. + * @throws com.google.api.gax.rpc.ApiException if the remote call fails + */ + public final EvilResponse craftEvilPlan(EvilRequest request) { + return craftEvilPlanCallable().call(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Sample code: + * + *
{@code
+   * // This snippet has been automatically generated and should be regarded as a code template only.
+   * // It will require modifications to work:
+   * // - It may require correct/in-range values for request initialization.
+   * // - It may require specifying regional endpoints when creating the service client as shown in
+   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+   * try (WickedClient wickedClient = WickedClient.create()) {
+   *   EvilRequest request =
+   *       EvilRequest.newBuilder().setMaliciousIdea("maliciousIdea712541645").build();
+   *   ApiFuture future = wickedClient.craftEvilPlanCallable().futureCall(request);
+   *   // Do something.
+   *   EvilResponse response = future.get();
+   * }
+   * }
+ */ + public final UnaryCallable craftEvilPlanCallable() { + return stub.craftEvilPlanCallable(); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Sample code: + * + *
{@code
+   * // This snippet has been automatically generated and should be regarded as a code template only.
+   * // It will require modifications to work:
+   * // - It may require correct/in-range values for request initialization.
+   * // - It may require specifying regional endpoints when creating the service client as shown in
+   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+   * try (WickedClient wickedClient = WickedClient.create()) {
+   *   BidiStream bidiStream =
+   *       wickedClient.brainstormEvilPlansCallable().call();
+   *   EvilRequest request =
+   *       EvilRequest.newBuilder().setMaliciousIdea("maliciousIdea712541645").build();
+   *   bidiStream.send(request);
+   *   for (EvilResponse response : bidiStream) {
+   *     // Do something when a response is received.
+   *   }
+   * }
+   * }
+ */ + public final BidiStreamingCallable brainstormEvilPlansCallable() { + return stub.brainstormEvilPlansCallable(); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Sample code: + * + *
{@code
+   * // This snippet has been automatically generated and should be regarded as a code template only.
+   * // It will require modifications to work:
+   * // - It may require correct/in-range values for request initialization.
+   * // - It may require specifying regional endpoints when creating the service client as shown in
+   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+   * try (WickedClient wickedClient = WickedClient.create()) {
+   *   ApiStreamObserver responseObserver =
+   *       new ApiStreamObserver() {
+   *         {@literal @}Override
+   *         public void onNext(EvilResponse response) {
+   *           // Do something when a response is received.
+   *         }
+   *
+   *         {@literal @}Override
+   *         public void onError(Throwable t) {
+   *           // Add error-handling
+   *         }
+   *
+   *         {@literal @}Override
+   *         public void onCompleted() {
+   *           // Do something when complete.
+   *         }
+   *       };
+   *   ApiStreamObserver requestObserver =
+   *       wickedClient.persuadeEvilPlan().clientStreamingCall(responseObserver);
+   *   EvilRequest request =
+   *       EvilRequest.newBuilder().setMaliciousIdea("maliciousIdea712541645").build();
+   *   requestObserver.onNext(request);
+   * }
+   * }
+ */ + public final ClientStreamingCallable persuadeEvilPlanCallable() { + return stub.persuadeEvilPlanCallable(); + } + + @Override + public final void close() { + stub.close(); + } + + @Override + public void shutdown() { + stub.shutdown(); + } + + @Override + public boolean isShutdown() { + return stub.isShutdown(); + } + + @Override + public boolean isTerminated() { + return stub.isTerminated(); + } + + @Override + public void shutdownNow() { + stub.shutdownNow(); + } + + @Override + public boolean awaitTermination(long duration, TimeUnit unit) throws InterruptedException { + return stub.awaitTermination(duration, unit); + } +} diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/WickedClientTest.golden b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/WickedClientTest.golden new file mode 100644 index 0000000000..69db1fda7a --- /dev/null +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/WickedClientTest.golden @@ -0,0 +1,197 @@ +package com.google.showcase.v1beta1; + +import com.google.api.gax.core.NoCredentialsProvider; +import com.google.api.gax.grpc.GaxGrpcProperties; +import com.google.api.gax.grpc.testing.LocalChannelProvider; +import com.google.api.gax.grpc.testing.MockGrpcService; +import com.google.api.gax.grpc.testing.MockServiceHelper; +import com.google.api.gax.grpc.testing.MockStreamObserver; +import com.google.api.gax.rpc.ApiClientHeaderProvider; +import com.google.api.gax.rpc.ApiStreamObserver; +import com.google.api.gax.rpc.BidiStreamingCallable; +import com.google.api.gax.rpc.ClientStreamingCallable; +import com.google.api.gax.rpc.InvalidArgumentException; +import com.google.api.gax.rpc.StatusCode; +import com.google.protobuf.AbstractMessage; +import io.grpc.StatusRuntimeException; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.ExecutionException; +import javax.annotation.Generated; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +@Generated("by gapic-generator-java") +public class WickedClientTest { + private static MockServiceHelper mockServiceHelper; + private static MockWicked mockWicked; + private LocalChannelProvider channelProvider; + private WickedClient client; + + @BeforeClass + public static void startStaticServer() { + mockWicked = new MockWicked(); + mockServiceHelper = + new MockServiceHelper( + UUID.randomUUID().toString(), Arrays.asList(mockWicked)); + mockServiceHelper.start(); + } + + @AfterClass + public static void stopServer() { + mockServiceHelper.stop(); + } + + @Before + public void setUp() throws IOException { + mockServiceHelper.reset(); + channelProvider = mockServiceHelper.createChannelProvider(); + WickedSettings settings = + WickedSettings.newBuilder() + .setTransportChannelProvider(channelProvider) + .setCredentialsProvider(NoCredentialsProvider.create()) + .build(); + client = WickedClient.create(settings); + } + + @After + public void tearDown() throws Exception { + client.close(); + } + + @Test + public void craftEvilPlanTest() throws Exception { + EvilResponse expectedResponse = + EvilResponse.newBuilder().setMaliciousPlan("maliciousPlan712757759").build(); + mockWicked.addResponse(expectedResponse); + + EvilRequest request = + EvilRequest.newBuilder().setMaliciousIdea("maliciousIdea712541645").build(); + + EvilResponse actualResponse = client.craftEvilPlan(request); + Assert.assertEquals(expectedResponse, actualResponse); + + List actualRequests = mockWicked.getRequests(); + Assert.assertEquals(1, actualRequests.size()); + EvilRequest actualRequest = ((EvilRequest) actualRequests.get(0)); + + Assert.assertEquals(request.getMaliciousIdea(), actualRequest.getMaliciousIdea()); + Assert.assertTrue( + channelProvider.isHeaderSent( + ApiClientHeaderProvider.getDefaultApiClientHeaderKey(), + GaxGrpcProperties.getDefaultApiClientHeaderPattern())); + } + + @Test + public void craftEvilPlanExceptionTest() throws Exception { + StatusRuntimeException exception = new StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT); + mockWicked.addException(exception); + + try { + EvilRequest request = + EvilRequest.newBuilder().setMaliciousIdea("maliciousIdea712541645").build(); + client.craftEvilPlan(request); + Assert.fail("No exception raised"); + } catch (InvalidArgumentException e) { + // Expected exception. + } + } + + @Test + public void brainstormEvilPlansTest() throws Exception { + EvilResponse expectedResponse = + EvilResponse.newBuilder().setMaliciousPlan("maliciousPlan712757759").build(); + mockWicked.addResponse(expectedResponse); + EvilRequest request = + EvilRequest.newBuilder().setMaliciousIdea("maliciousIdea712541645").build(); + + MockStreamObserver responseObserver = new MockStreamObserver<>(); + + BidiStreamingCallable callable = + client.brainstormEvilPlansCallable(); + ApiStreamObserver requestObserver = callable.bidiStreamingCall(responseObserver); + + requestObserver.onNext(request); + requestObserver.onCompleted(); + + List actualResponses = responseObserver.future().get(); + Assert.assertEquals(1, actualResponses.size()); + Assert.assertEquals(expectedResponse, actualResponses.get(0)); + } + + @Test + public void brainstormEvilPlansExceptionTest() throws Exception { + StatusRuntimeException exception = new StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT); + mockWicked.addException(exception); + EvilRequest request = + EvilRequest.newBuilder().setMaliciousIdea("maliciousIdea712541645").build(); + + MockStreamObserver responseObserver = new MockStreamObserver<>(); + + BidiStreamingCallable callable = + client.brainstormEvilPlansCallable(); + ApiStreamObserver requestObserver = callable.bidiStreamingCall(responseObserver); + + requestObserver.onNext(request); + + try { + List actualResponses = responseObserver.future().get(); + Assert.fail("No exception thrown"); + } catch (ExecutionException e) { + Assert.assertTrue(e.getCause() instanceof InvalidArgumentException); + InvalidArgumentException apiException = ((InvalidArgumentException) e.getCause()); + Assert.assertEquals(StatusCode.Code.INVALID_ARGUMENT, apiException.getStatusCode().getCode()); + } + } + + @Test + public void persuadeEvilPlanTest() throws Exception { + EvilResponse expectedResponse = + EvilResponse.newBuilder().setMaliciousPlan("maliciousPlan712757759").build(); + mockWicked.addResponse(expectedResponse); + EvilRequest request = + EvilRequest.newBuilder().setMaliciousIdea("maliciousIdea712541645").build(); + + MockStreamObserver responseObserver = new MockStreamObserver<>(); + + ClientStreamingCallable callable = client.persuadeEvilPlanCallable(); + ApiStreamObserver requestObserver = callable.clientStreamingCall(responseObserver); + + requestObserver.onNext(request); + requestObserver.onCompleted(); + + List actualResponses = responseObserver.future().get(); + Assert.assertEquals(1, actualResponses.size()); + Assert.assertEquals(expectedResponse, actualResponses.get(0)); + } + + @Test + public void persuadeEvilPlanExceptionTest() throws Exception { + StatusRuntimeException exception = new StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT); + mockWicked.addException(exception); + EvilRequest request = + EvilRequest.newBuilder().setMaliciousIdea("maliciousIdea712541645").build(); + + MockStreamObserver responseObserver = new MockStreamObserver<>(); + + ClientStreamingCallable callable = client.persuadeEvilPlanCallable(); + ApiStreamObserver requestObserver = callable.clientStreamingCall(responseObserver); + + requestObserver.onNext(request); + + try { + List actualResponses = responseObserver.future().get(); + Assert.fail("No exception thrown"); + } catch (ExecutionException e) { + Assert.assertTrue(e.getCause() instanceof InvalidArgumentException); + InvalidArgumentException apiException = ((InvalidArgumentException) e.getCause()); + Assert.assertEquals(StatusCode.Code.INVALID_ARGUMENT, apiException.getStatusCode().getCode()); + } + } +} diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/WickedSettings.golden b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/WickedSettings.golden new file mode 100644 index 0000000000..28b2e47cf9 --- /dev/null +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/WickedSettings.golden @@ -0,0 +1,191 @@ +package com.google.showcase.v1beta1; + +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.ClientContext; +import com.google.api.gax.rpc.ClientSettings; +import com.google.api.gax.rpc.StreamingCallSettings; +import com.google.api.gax.rpc.StubSettings; +import com.google.api.gax.rpc.TransportChannelProvider; +import com.google.api.gax.rpc.UnaryCallSettings; +import com.google.showcase.v1beta1.stub.WickedStubSettings; +import java.io.IOException; +import java.util.List; +import javax.annotation.Generated; + +// AUTO-GENERATED DOCUMENTATION AND CLASS. +/** + * Settings class to configure an instance of {@link WickedClient}. + * + *

The default instance has everything set to sensible defaults: + * + *

    + *
  • The default service address (localhost) and default port (7469) are used. + *
  • Credentials are acquired automatically through Application Default Credentials. + *
  • Retries are configured for idempotent methods but not for non-idempotent methods. + *
+ * + *

The builder of this class is recursive, so contained classes are themselves builders. When + * build() is called, the tree of builders is called to create the complete settings object. + * + *

For example, to set the total timeout of craftEvilPlan to 30 seconds: + * + *

{@code
+ * // This snippet has been automatically generated and should be regarded as a code template only.
+ * // It will require modifications to work:
+ * // - It may require correct/in-range values for request initialization.
+ * // - It may require specifying regional endpoints when creating the service client as shown in
+ * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+ * WickedSettings.Builder wickedSettingsBuilder = WickedSettings.newBuilder();
+ * wickedSettingsBuilder
+ *     .craftEvilPlanSettings()
+ *     .setRetrySettings(
+ *         wickedSettingsBuilder
+ *             .craftEvilPlanSettings()
+ *             .getRetrySettings()
+ *             .toBuilder()
+ *             .setTotalTimeout(Duration.ofSeconds(30))
+ *             .build());
+ * WickedSettings wickedSettings = wickedSettingsBuilder.build();
+ * }
+ */ +@BetaApi +@Generated("by gapic-generator-java") +public class WickedSettings extends ClientSettings { + + /** Returns the object with the settings used for calls to craftEvilPlan. */ + public UnaryCallSettings craftEvilPlanSettings() { + return ((WickedStubSettings) getStubSettings()).craftEvilPlanSettings(); + } + + /** Returns the object with the settings used for calls to brainstormEvilPlans. */ + public StreamingCallSettings brainstormEvilPlansSettings() { + return ((WickedStubSettings) getStubSettings()).brainstormEvilPlansSettings(); + } + + /** Returns the object with the settings used for calls to persuadeEvilPlan. */ + public StreamingCallSettings persuadeEvilPlanSettings() { + return ((WickedStubSettings) getStubSettings()).persuadeEvilPlanSettings(); + } + + public static final WickedSettings create(WickedStubSettings stub) throws IOException { + return new WickedSettings.Builder(stub.toBuilder()).build(); + } + + /** Returns a builder for the default ExecutorProvider for this service. */ + public static InstantiatingExecutorProvider.Builder defaultExecutorProviderBuilder() { + return WickedStubSettings.defaultExecutorProviderBuilder(); + } + + /** Returns the default service endpoint. */ + public static String getDefaultEndpoint() { + return WickedStubSettings.getDefaultEndpoint(); + } + + /** Returns the default service scopes. */ + public static List getDefaultServiceScopes() { + return WickedStubSettings.getDefaultServiceScopes(); + } + + /** Returns a builder for the default credentials for this service. */ + public static GoogleCredentialsProvider.Builder defaultCredentialsProviderBuilder() { + return WickedStubSettings.defaultCredentialsProviderBuilder(); + } + + /** Returns a builder for the default gRPC ChannelProvider for this service. */ + public static InstantiatingGrpcChannelProvider.Builder defaultGrpcTransportProviderBuilder() { + return WickedStubSettings.defaultGrpcTransportProviderBuilder(); + } + + public static TransportChannelProvider defaultTransportChannelProvider() { + return WickedStubSettings.defaultTransportChannelProvider(); + } + + @BetaApi("The surface for customizing headers is not stable yet and may change in the future.") + public static ApiClientHeaderProvider.Builder defaultApiClientHeaderProviderBuilder() { + return WickedStubSettings.defaultApiClientHeaderProviderBuilder(); + } + + /** Returns a new gRPC builder for this class. */ + public static Builder newBuilder() { + return Builder.createDefault(); + } + + /** Returns a new builder for this class. */ + public static Builder newBuilder(ClientContext clientContext) { + return new Builder(clientContext); + } + + /** Returns a builder containing all the values of this settings class. */ + public Builder toBuilder() { + return new Builder(this); + } + + protected WickedSettings(Builder settingsBuilder) throws IOException { + super(settingsBuilder); + } + + /** Builder for WickedSettings. */ + public static class Builder extends ClientSettings.Builder { + + protected Builder() throws IOException { + this(((ClientContext) null)); + } + + protected Builder(ClientContext clientContext) { + super(WickedStubSettings.newBuilder(clientContext)); + } + + protected Builder(WickedSettings settings) { + super(settings.getStubSettings().toBuilder()); + } + + protected Builder(WickedStubSettings.Builder stubSettings) { + super(stubSettings); + } + + private static Builder createDefault() { + return new Builder(WickedStubSettings.newBuilder()); + } + + public WickedStubSettings.Builder getStubSettingsBuilder() { + return ((WickedStubSettings.Builder) getStubSettings()); + } + + /** + * Applies the given settings updater function to all of the unary API methods in this service. + * + *

Note: This method does not support applying settings to streaming methods. + */ + public Builder applyToAllUnaryMethods( + ApiFunction, Void> settingsUpdater) { + super.applyToAllUnaryMethods( + getStubSettingsBuilder().unaryMethodSettingsBuilders(), settingsUpdater); + return this; + } + + /** Returns the builder for the settings used for calls to craftEvilPlan. */ + public UnaryCallSettings.Builder craftEvilPlanSettings() { + return getStubSettingsBuilder().craftEvilPlanSettings(); + } + + /** Returns the builder for the settings used for calls to brainstormEvilPlans. */ + public StreamingCallSettings.Builder brainstormEvilPlansSettings() { + return getStubSettingsBuilder().brainstormEvilPlansSettings(); + } + + /** Returns the builder for the settings used for calls to persuadeEvilPlan. */ + public StreamingCallSettings.Builder persuadeEvilPlanSettings() { + return getStubSettingsBuilder().persuadeEvilPlanSettings(); + } + + @Override + public WickedSettings build() throws IOException { + return new WickedSettings(this); + } + } +} diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/WickedStubSettings.golden b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/WickedStubSettings.golden new file mode 100644 index 0000000000..702d9a6dcd --- /dev/null +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/WickedStubSettings.golden @@ -0,0 +1,285 @@ +package com.google.showcase.v1beta1.stub; + +import com.google.api.core.ApiFunction; +import com.google.api.core.BetaApi; +import com.google.api.gax.core.GaxProperties; +import com.google.api.gax.core.GoogleCredentialsProvider; +import com.google.api.gax.core.InstantiatingExecutorProvider; +import com.google.api.gax.grpc.GaxGrpcProperties; +import com.google.api.gax.grpc.GrpcTransportChannel; +import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider; +import com.google.api.gax.retrying.RetrySettings; +import com.google.api.gax.rpc.ApiClientHeaderProvider; +import com.google.api.gax.rpc.ClientContext; +import com.google.api.gax.rpc.StatusCode; +import com.google.api.gax.rpc.StreamingCallSettings; +import com.google.api.gax.rpc.StubSettings; +import com.google.api.gax.rpc.TransportChannelProvider; +import com.google.api.gax.rpc.UnaryCallSettings; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Lists; +import com.google.showcase.v1beta1.EvilRequest; +import com.google.showcase.v1beta1.EvilResponse; +import java.io.IOException; +import java.util.List; +import javax.annotation.Generated; + +// AUTO-GENERATED DOCUMENTATION AND CLASS. +/** + * Settings class to configure an instance of {@link WickedStub}. + * + *

The default instance has everything set to sensible defaults: + * + *

    + *
  • The default service address (localhost) and default port (7469) are used. + *
  • Credentials are acquired automatically through Application Default Credentials. + *
  • Retries are configured for idempotent methods but not for non-idempotent methods. + *
+ * + *

The builder of this class is recursive, so contained classes are themselves builders. When + * build() is called, the tree of builders is called to create the complete settings object. + * + *

For example, to set the total timeout of craftEvilPlan to 30 seconds: + * + *

{@code
+ * // This snippet has been automatically generated and should be regarded as a code template only.
+ * // It will require modifications to work:
+ * // - It may require correct/in-range values for request initialization.
+ * // - It may require specifying regional endpoints when creating the service client as shown in
+ * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+ * WickedStubSettings.Builder wickedSettingsBuilder = WickedStubSettings.newBuilder();
+ * wickedSettingsBuilder
+ *     .craftEvilPlanSettings()
+ *     .setRetrySettings(
+ *         wickedSettingsBuilder
+ *             .craftEvilPlanSettings()
+ *             .getRetrySettings()
+ *             .toBuilder()
+ *             .setTotalTimeout(Duration.ofSeconds(30))
+ *             .build());
+ * WickedStubSettings wickedSettings = wickedSettingsBuilder.build();
+ * }
+ */ +@BetaApi +@Generated("by gapic-generator-java") +public class WickedStubSettings extends StubSettings { + /** The default scopes of the service. */ + private static final ImmutableList DEFAULT_SERVICE_SCOPES = + ImmutableList.builder().build(); + + private final UnaryCallSettings craftEvilPlanSettings; + private final StreamingCallSettings brainstormEvilPlansSettings; + private final StreamingCallSettings persuadeEvilPlanSettings; + + /** Returns the object with the settings used for calls to craftEvilPlan. */ + public UnaryCallSettings craftEvilPlanSettings() { + return craftEvilPlanSettings; + } + + /** Returns the object with the settings used for calls to brainstormEvilPlans. */ + public StreamingCallSettings brainstormEvilPlansSettings() { + return brainstormEvilPlansSettings; + } + + /** Returns the object with the settings used for calls to persuadeEvilPlan. */ + public StreamingCallSettings persuadeEvilPlanSettings() { + return persuadeEvilPlanSettings; + } + + public WickedStub createStub() throws IOException { + if (getTransportChannelProvider() + .getTransportName() + .equals(GrpcTransportChannel.getGrpcTransportName())) { + return GrpcWickedStub.create(this); + } + throw new UnsupportedOperationException( + String.format( + "Transport not supported: %s", getTransportChannelProvider().getTransportName())); + } + + /** Returns a builder for the default ExecutorProvider for this service. */ + public static InstantiatingExecutorProvider.Builder defaultExecutorProviderBuilder() { + return InstantiatingExecutorProvider.newBuilder(); + } + + /** Returns the default service endpoint. */ + public static String getDefaultEndpoint() { + return "localhost:7469"; + } + + /** Returns the default mTLS service endpoint. */ + public static String getDefaultMtlsEndpoint() { + return "localhost:7469"; + } + + /** Returns the default service scopes. */ + public static List getDefaultServiceScopes() { + return DEFAULT_SERVICE_SCOPES; + } + + /** Returns a builder for the default credentials for this service. */ + public static GoogleCredentialsProvider.Builder defaultCredentialsProviderBuilder() { + return GoogleCredentialsProvider.newBuilder() + .setScopesToApply(DEFAULT_SERVICE_SCOPES) + .setUseJwtAccessWithScope(true); + } + + /** Returns a builder for the default gRPC ChannelProvider for this service. */ + public static InstantiatingGrpcChannelProvider.Builder defaultGrpcTransportProviderBuilder() { + return InstantiatingGrpcChannelProvider.newBuilder() + .setMaxInboundMessageSize(Integer.MAX_VALUE); + } + + public static TransportChannelProvider defaultTransportChannelProvider() { + return defaultGrpcTransportProviderBuilder().build(); + } + + @BetaApi("The surface for customizing headers is not stable yet and may change in the future.") + public static ApiClientHeaderProvider.Builder defaultGrpcApiClientHeaderProviderBuilder() { + return ApiClientHeaderProvider.newBuilder() + .setGeneratedLibToken("gapic", GaxProperties.getLibraryVersion(WickedStubSettings.class)) + .setTransportToken( + GaxGrpcProperties.getGrpcTokenName(), GaxGrpcProperties.getGrpcVersion()); + } + + public static ApiClientHeaderProvider.Builder defaultApiClientHeaderProviderBuilder() { + return WickedStubSettings.defaultGrpcApiClientHeaderProviderBuilder(); + } + + /** Returns a new gRPC builder for this class. */ + public static Builder newBuilder() { + return Builder.createDefault(); + } + + /** Returns a new builder for this class. */ + public static Builder newBuilder(ClientContext clientContext) { + return new Builder(clientContext); + } + + /** Returns a builder containing all the values of this settings class. */ + public Builder toBuilder() { + return new Builder(this); + } + + protected WickedStubSettings(Builder settingsBuilder) throws IOException { + super(settingsBuilder); + + craftEvilPlanSettings = settingsBuilder.craftEvilPlanSettings().build(); + brainstormEvilPlansSettings = settingsBuilder.brainstormEvilPlansSettings().build(); + persuadeEvilPlanSettings = settingsBuilder.persuadeEvilPlanSettings().build(); + } + + /** Builder for WickedStubSettings. */ + public static class Builder extends StubSettings.Builder { + private final ImmutableList> unaryMethodSettingsBuilders; + private final UnaryCallSettings.Builder craftEvilPlanSettings; + private final StreamingCallSettings.Builder + brainstormEvilPlansSettings; + private final StreamingCallSettings.Builder persuadeEvilPlanSettings; + private static final ImmutableMap> + RETRYABLE_CODE_DEFINITIONS; + + static { + ImmutableMap.Builder> definitions = + ImmutableMap.builder(); + definitions.put("no_retry_codes", ImmutableSet.copyOf(Lists.newArrayList())); + RETRYABLE_CODE_DEFINITIONS = definitions.build(); + } + + private static final ImmutableMap RETRY_PARAM_DEFINITIONS; + + static { + ImmutableMap.Builder definitions = ImmutableMap.builder(); + RetrySettings settings = null; + settings = RetrySettings.newBuilder().setRpcTimeoutMultiplier(1.0).build(); + definitions.put("no_retry_params", settings); + RETRY_PARAM_DEFINITIONS = definitions.build(); + } + + protected Builder() { + this(((ClientContext) null)); + } + + protected Builder(ClientContext clientContext) { + super(clientContext); + + craftEvilPlanSettings = UnaryCallSettings.newUnaryCallSettingsBuilder(); + brainstormEvilPlansSettings = StreamingCallSettings.newBuilder(); + persuadeEvilPlanSettings = StreamingCallSettings.newBuilder(); + + unaryMethodSettingsBuilders = + ImmutableList.>of(craftEvilPlanSettings); + initDefaults(this); + } + + protected Builder(WickedStubSettings settings) { + super(settings); + + craftEvilPlanSettings = settings.craftEvilPlanSettings.toBuilder(); + brainstormEvilPlansSettings = settings.brainstormEvilPlansSettings.toBuilder(); + persuadeEvilPlanSettings = settings.persuadeEvilPlanSettings.toBuilder(); + + unaryMethodSettingsBuilders = + ImmutableList.>of(craftEvilPlanSettings); + } + + private static Builder createDefault() { + Builder builder = new Builder(((ClientContext) null)); + + builder.setTransportChannelProvider(defaultTransportChannelProvider()); + builder.setCredentialsProvider(defaultCredentialsProviderBuilder().build()); + builder.setInternalHeaderProvider(defaultApiClientHeaderProviderBuilder().build()); + builder.setEndpoint(getDefaultEndpoint()); + builder.setMtlsEndpoint(getDefaultMtlsEndpoint()); + builder.setSwitchToMtlsEndpointAllowed(true); + + return initDefaults(builder); + } + + private static Builder initDefaults(Builder builder) { + builder + .craftEvilPlanSettings() + .setRetryableCodes(RETRYABLE_CODE_DEFINITIONS.get("no_retry_codes")) + .setRetrySettings(RETRY_PARAM_DEFINITIONS.get("no_retry_params")); + + return builder; + } + + /** + * Applies the given settings updater function to all of the unary API methods in this service. + * + *

Note: This method does not support applying settings to streaming methods. + */ + public Builder applyToAllUnaryMethods( + ApiFunction, Void> settingsUpdater) { + super.applyToAllUnaryMethods(unaryMethodSettingsBuilders, settingsUpdater); + return this; + } + + public ImmutableList> unaryMethodSettingsBuilders() { + return unaryMethodSettingsBuilders; + } + + /** Returns the builder for the settings used for calls to craftEvilPlan. */ + public UnaryCallSettings.Builder craftEvilPlanSettings() { + return craftEvilPlanSettings; + } + + /** Returns the builder for the settings used for calls to brainstormEvilPlans. */ + public StreamingCallSettings.Builder brainstormEvilPlansSettings() { + return brainstormEvilPlansSettings; + } + + /** Returns the builder for the settings used for calls to persuadeEvilPlan. */ + public StreamingCallSettings.Builder persuadeEvilPlanSettings() { + return persuadeEvilPlanSettings; + } + + @Override + public WickedStubSettings build() throws IOException { + return new WickedStubSettings(this); + } + } +} diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/model/ServiceTest.java b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/model/ServiceTest.java index c6f60b831f..888a4eb6ce 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/model/ServiceTest.java +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/model/ServiceTest.java @@ -14,8 +14,12 @@ package com.google.api.generator.gapic.model; +import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; +import com.google.api.generator.engine.ast.TypeNode; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import java.util.Arrays; import org.junit.Test; @@ -31,6 +35,21 @@ public class ServiceTest { .setOriginalJavaPackage(SHOWCASE_PACKAGE_NAME) .setOverriddenName("Echo"); + private static final Method.Builder testMethodBuilder = + Method.builder() + .setName("My method") + .setInputType(TypeNode.STRING) + .setOutputType(TypeNode.STRING); + + private static final HttpBindings.Builder testHttpBindingsBuilder = + HttpBindings.builder() + .setPathParameters( + ImmutableSet.of(HttpBindings.HttpBinding.builder().setName("table").build())) + .setPattern("/pattern/test") + .setAdditionalPatterns(Arrays.asList("/extra_pattern/test", "/extra_pattern/hey")) + .setIsAsteriskBody(false) + .setHttpVerb(HttpBindings.HttpVerb.GET); + @Test public void apiShortName_shouldReturnApiShortNameIfHostContainsRegionalEndpoint() { String defaultHost = "us-east1-pubsub.googleapis.com"; @@ -72,4 +91,90 @@ public void apiVersion_shouldReturnEmptyIfNoMatch() { Service testService = testServiceBuilder.setProtoPakkage(protoPackage).build(); assertEquals("", testService.apiVersion()); } + + @Test + public void + hasAnyEnabledMethodsForTransport_shouldReturnFalseForEmptyMethodListForBothTransports() { + Service testService = testServiceBuilder.setMethods(ImmutableList.of()).build(); + assertThat(testService.hasAnyEnabledMethodsForTransport(Transport.GRPC)).isFalse(); + assertThat(testService.hasAnyEnabledMethodsForTransport(Transport.REST)).isFalse(); + } + + @Test + public void + hasAnyEnabledMethodsForTransport_shouldReturnTrueForAnyNonEmptyMethodListGRPCTransport() { + Method testMethod1 = + testMethodBuilder + .setStream(Method.Stream.NONE) + .setHttpBindings(testHttpBindingsBuilder.build()) + .build(); + Service testService1 = testServiceBuilder.setMethods(ImmutableList.of(testMethod1)).build(); + assertThat(testService1.hasAnyEnabledMethodsForTransport(Transport.GRPC)).isTrue(); + + Method testMethod2 = + testMethodBuilder + .setStream(Method.Stream.BIDI) + .setHttpBindings(testHttpBindingsBuilder.build()) + .build(); + Service testService2 = testServiceBuilder.setMethods(ImmutableList.of(testMethod2)).build(); + assertThat(testService2.hasAnyEnabledMethodsForTransport(Transport.GRPC)).isTrue(); + + Service testService3 = + testServiceBuilder.setMethods(ImmutableList.of(testMethod1, testMethod2)).build(); + assertThat(testService3.hasAnyEnabledMethodsForTransport(Transport.GRPC)).isTrue(); + } + + @Test + public void + hasAnyEnabledMethodsForTransport_shouldReturnTrueForAnyNonEmptyAndValidMethodListRESTTransport() { + Method testMethod1 = + testMethodBuilder + .setStream(Method.Stream.NONE) + .setHttpBindings(testHttpBindingsBuilder.build()) + .build(); + Service testService1 = testServiceBuilder.setMethods(ImmutableList.of(testMethod1)).build(); + assertThat(testService1.hasAnyEnabledMethodsForTransport(Transport.REST)).isTrue(); + + Method testMethod2 = + testMethodBuilder + .setStream(Method.Stream.SERVER) + .setHttpBindings(testHttpBindingsBuilder.build()) + .build(); + Service testService2 = testServiceBuilder.setMethods(ImmutableList.of(testMethod2)).build(); + assertThat(testService2.hasAnyEnabledMethodsForTransport(Transport.REST)).isTrue(); + + Service testService3 = + testServiceBuilder.setMethods(ImmutableList.of(testMethod1, testMethod2)).build(); + assertThat(testService3.hasAnyEnabledMethodsForTransport(Transport.REST)).isTrue(); + } + + @Test + public void + hasAnyEnabledMethodsForTransport_shouldReturnFalseForAnyNonEmptyButInvalidMethodListRESTTransport() { + Method testMethod1 = + testMethodBuilder + .setStream(Method.Stream.BIDI) + .setHttpBindings(testHttpBindingsBuilder.build()) + .build(); + Service testService1 = testServiceBuilder.setMethods(ImmutableList.of(testMethod1)).build(); + assertThat(testService1.hasAnyEnabledMethodsForTransport(Transport.REST)).isFalse(); + + Method testMethod2 = + testMethodBuilder + .setStream(Method.Stream.CLIENT) + .setHttpBindings(testHttpBindingsBuilder.build()) + .build(); + Service testService2 = testServiceBuilder.setMethods(ImmutableList.of(testMethod2)).build(); + assertThat(testService2.hasAnyEnabledMethodsForTransport(Transport.REST)).isFalse(); + + Service testService3 = + testServiceBuilder.setMethods(ImmutableList.of(testMethod1, testMethod2)).build(); + assertThat(testService3.hasAnyEnabledMethodsForTransport(Transport.REST)).isFalse(); + } + + @Test(expected = IllegalArgumentException.class) + public void hasAnyEnabledMethodsForTransport_shouldThrowExceptionForGRPCRESTTransport() { + Service testService = testServiceBuilder.build(); + testService.hasAnyEnabledMethodsForTransport(Transport.GRPC_REST); + } } diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/model/TransportTest.java b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/model/TransportTest.java new file mode 100644 index 0000000000..f83c2e16a8 --- /dev/null +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/model/TransportTest.java @@ -0,0 +1,49 @@ +package com.google.api.generator.gapic.model; + +import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertThrows; + +import java.util.Arrays; +import java.util.Collection; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +@RunWith(Parameterized.class) +public class TransportTest { + + private final String input; + private final Transport expected; + + @Parameterized.Parameters + public static Collection primeNumbers() { + return Arrays.asList( + new Object[][] { + {"grpc", Transport.GRPC}, + {"Grpc", Transport.GRPC}, + {"gRPC", Transport.GRPC}, + {"rest", Transport.REST}, + {"REST", Transport.REST}, + {"rESt", Transport.REST}, + {"grpc+rest", Transport.GRPC_REST}, + {"gRPC+REST", Transport.GRPC_REST}, + {"grPc+rEst", Transport.GRPC_REST} + }); + } + + public TransportTest(String input, Transport expected) { + this.input = input; + this.expected = expected; + } + + @Test + public void testParse_returnsValidTransport() { + assertThat(expected).isEqualTo(Transport.parse(input)); + } + + @Test + public void testParse_throwsException() { + assertThrows(IllegalArgumentException.class, () -> Transport.parse("invalid transport")); + assertThrows(IllegalArgumentException.class, () -> Transport.parse("grHttpc")); + } +} diff --git a/gapic-generator-java/src/test/proto/wicked.proto b/gapic-generator-java/src/test/proto/wicked.proto new file mode 100644 index 0000000000..ea45fee918 --- /dev/null +++ b/gapic-generator-java/src/test/proto/wicked.proto @@ -0,0 +1,49 @@ +// Copyright 2023 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 +// +// https://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. + +syntax = "proto3"; + +import "google/api/client.proto"; + +package google.showcase.v1beta1; + +option go_package = "github.com/googleapis/gapic-showcase/server/genproto"; +option java_package = "com.google.showcase.v1beta1"; +option java_multiple_files = true; +option ruby_package = "Google::Showcase::V1beta1"; + +// This service is used to show a Service with either non-enabled or non-eligible +// RPCs for HttpJson (Http 1.1). +// Non-Enabled: Missing the (google.api.http) annotation to enabled it +// Non-Eligible: BIDI and Client side streaming are not supported with Http 1.1 +// Service name is reference to `No REST for the Wicked` +service Wicked { + // This service is meant to only run locally on the port 7469 (keypad digits + // for "show"). + option (google.api.default_host) = "localhost:7469"; + + rpc CraftEvilPlan(EvilRequest) returns (EvilResponse); + + rpc BrainstormEvilPlans(stream EvilRequest) returns (stream EvilResponse); + + rpc PersuadeEvilPlan(stream EvilRequest) returns (EvilResponse); +} + +message EvilRequest { + string malicious_idea = 1; +} + +message EvilResponse { + string malicious_plan = 1; +} \ No newline at end of file diff --git a/scripts/update_golden.sh b/scripts/update_golden.sh index 98203b15f2..825ca36dd9 100755 --- a/scripts/update_golden.sh +++ b/scripts/update_golden.sh @@ -11,6 +11,7 @@ cd srcjar_unpacked UNPACK_DIR=$PWD unzip -q -c "../${RAW_SRCJAR}" temp-codegen.srcjar | jar x +mkdir -p ${BUILD_WORKSPACE_DIRECTORY}/test/integration/goldens/${API_NAME} cd ${BUILD_WORKSPACE_DIRECTORY}/test/integration/goldens/${API_NAME} # clear out existing Java and JSON files. diff --git a/showcase/BUILD.bazel b/showcase/BUILD.bazel index 919547453c..1653df2bff 100644 --- a/showcase/BUILD.bazel +++ b/showcase/BUILD.bazel @@ -1,3 +1,6 @@ +# Note: The commented section is the framework for gapic-showcase-extended +# See gapic-showcase-extended folder for more info + load( "//rules_java_gapic:java_gapic.bzl", "java_gapic_library", @@ -14,13 +17,17 @@ proto_library_with_info( name = "showcase_proto_with_info", deps = [ "@com_google_gapic_showcase//schema/google/showcase/v1beta1:showcase_proto", +# "//showcase/gapic-showcase-extended/proto:showcase_proto_extended", "@com_google_googleapis//google/cloud:common_resources_proto", ], ) java_proto_library( name = "showcase_java_proto", - deps = ["@com_google_gapic_showcase//schema/google/showcase/v1beta1:showcase_proto"], + deps = [ + "@com_google_gapic_showcase//schema/google/showcase/v1beta1:showcase_proto", +# "//showcase/gapic-showcase-extended/proto:showcase_proto_extended", + ], ) java_grpc_library( @@ -29,6 +36,14 @@ java_grpc_library( deps = [":showcase_java_proto"], ) +#java_grpc_library( +# name = "showcase_java_grpc_extended", +# srcs = [ +# "//showcase/gapic-showcase-extended/proto:showcase_proto_extended", +# ], +# deps = [":showcase_java_proto"], +#) + java_gapic_library( name = "showcase_java_gapic", srcs = [":showcase_proto_with_info"], @@ -38,6 +53,7 @@ java_gapic_library( service_yaml = "@com_google_gapic_showcase//schema/google/showcase/v1beta1:showcase_v1beta1.yaml", test_deps = [ ":showcase_java_grpc", +# ":showcase_java_grpc_extended", ], transport = "grpc+rest", deps = [ @@ -52,6 +68,8 @@ java_gapic_assembly_gradle_pkg( transport = "grpc+rest", deps = [ ":showcase_java_gapic", + # TODO(lawrenceqiu): Not adding :showcase_java_grpc_extended dep as that includes WickedGrpc.java + # Need to figure out why it's being included ":showcase_java_grpc", ":showcase_java_proto", "@com_google_gapic_showcase//schema/google/showcase/v1beta1:showcase_proto", @@ -98,8 +116,10 @@ sh_binary( # GRPC Showcase : Update and Verify GRPC_DATA = [ "libshowcase_java_grpc-src.jar", +# "libshowcase_java_grpc_extended-src.jar", ":grpc_gapic_showcase_files", - "//showcase:showcase_java_grpc", + ":showcase_java_grpc", +# ":showcase_java_grpc_extended" ] sh_binary( @@ -120,7 +140,8 @@ sh_binary( PROTO_DATA = [ "proto-google-cloud-showcase-v1beta1-java.tar.gz", ":proto_gapic_showcase_files", - "//showcase:showcase_java_proto", + ":showcase_java_proto", +# ":showcase_java_proto_extended", ] sh_binary( diff --git a/showcase/gapic-showcase-extended/proto/BUILD.bazel b/showcase/gapic-showcase-extended/proto/BUILD.bazel new file mode 100644 index 0000000000..bc57596d1b --- /dev/null +++ b/showcase/gapic-showcase-extended/proto/BUILD.bazel @@ -0,0 +1,34 @@ +# Copyright 2023 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 +# +# https://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. + +""" +Provides proto_library target +Exports grpc service config +""" +load ("@rules_proto//proto:defs.bzl", "proto_library") + +# This is an API workspace, having public visibility by default makes perfect sense. +package(default_visibility = ["//visibility:public"]) + +# This BUILD file is the framework for gapic-showcase-extended (an extension to the existing gapic-showcase) +# It serves to augment the existing showcase project with generic protos not *yet* suited to the upstream project +# +# gapic-showcase project is used to test the generated client behavior with a showcase server +# gapic-showcase-extension project is used to test the generator's behavior + +#proto_library( +# name = "showcase_proto_extended", +# srcs = [], +# deps = [] +#) \ No newline at end of file diff --git a/showcase/gapic-showcase-extended/proto/wicked.proto b/showcase/gapic-showcase-extended/proto/wicked.proto new file mode 100644 index 0000000000..ea45fee918 --- /dev/null +++ b/showcase/gapic-showcase-extended/proto/wicked.proto @@ -0,0 +1,49 @@ +// Copyright 2023 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 +// +// https://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. + +syntax = "proto3"; + +import "google/api/client.proto"; + +package google.showcase.v1beta1; + +option go_package = "github.com/googleapis/gapic-showcase/server/genproto"; +option java_package = "com.google.showcase.v1beta1"; +option java_multiple_files = true; +option ruby_package = "Google::Showcase::V1beta1"; + +// This service is used to show a Service with either non-enabled or non-eligible +// RPCs for HttpJson (Http 1.1). +// Non-Enabled: Missing the (google.api.http) annotation to enabled it +// Non-Eligible: BIDI and Client side streaming are not supported with Http 1.1 +// Service name is reference to `No REST for the Wicked` +service Wicked { + // This service is meant to only run locally on the port 7469 (keypad digits + // for "show"). + option (google.api.default_host) = "localhost:7469"; + + rpc CraftEvilPlan(EvilRequest) returns (EvilResponse); + + rpc BrainstormEvilPlans(stream EvilRequest) returns (stream EvilResponse); + + rpc PersuadeEvilPlan(stream EvilRequest) returns (EvilResponse); +} + +message EvilRequest { + string malicious_idea = 1; +} + +message EvilResponse { + string malicious_plan = 1; +} \ No newline at end of file diff --git a/showcase/scripts/update.sh b/showcase/scripts/update.sh index b5da568f65..f7b7e4ee7a 100755 --- a/showcase/scripts/update.sh +++ b/showcase/scripts/update.sh @@ -30,7 +30,7 @@ case $1 in create_unpack_dir proto_unpacked PROTO_UNPACK_DIR=$PWD - tar -xzf "../$PROTO_ARCHIVE" + tar -xzf "$BAZEL_ROOT/$PROTO_ARCHIVE" delete_unneeded cd "$BUILD_WORKSPACE_DIRECTORY/showcase/$PROTO_PROJECT_DIR" mkdir -p ./src @@ -40,11 +40,13 @@ case $1 in grpc) GRPC_PROJECT_DIR=grpc-gapic-showcase-v1beta1 GRPC_JAR=$(find . -name 'libshowcase_java_grpc-src.jar') +# GRPC_JAR_EXTENDED=$(find . -name 'libshowcase_java_grpc_extended-src.jar') clear_existing $GRPC_PROJECT_DIR create_unpack_dir grpc_unpacked GRPC_UNPACK_DIR=$PWD - jar xf "../$GRPC_JAR" + jar xf "$BAZEL_ROOT/$GRPC_JAR" +# jar xf "$BAZEL_ROOT/$GRPC_JAR_EXTENDED" cd "$BUILD_WORKSPACE_DIRECTORY/showcase/$GRPC_PROJECT_DIR" mkdir -p ./src/main/java/com cp -r "$GRPC_UNPACK_DIR"/com/* ./src/main/java/com @@ -57,7 +59,7 @@ case $1 in create_unpack_dir gapic_unpacked GAPIC_UNPACK_DIR=$PWD - unzip -q -c "../$GAPIC_JAR" temp-codegen.srcjar | jar x + unzip -q -c "$BAZEL_ROOT/$GAPIC_JAR" temp-codegen.srcjar | jar x cd "$BUILD_WORKSPACE_DIRECTORY/showcase/$GAPIC_PROJECT_DIR" cp -r "$GAPIC_UNPACK_DIR"/* ./ ;; diff --git a/showcase/scripts/verify.sh b/showcase/scripts/verify.sh index ae6ffb4d35..41b72565c7 100755 --- a/showcase/scripts/verify.sh +++ b/showcase/scripts/verify.sh @@ -31,7 +31,7 @@ case $1 in create_unpack_dir proto_unpacked PROTO_UNPACK_DIR=$PWD - tar -xzf "../$PROTO_ARCHIVE" + tar -xzf "$BAZEL_ROOT/$PROTO_ARCHIVE" delete_unneeded diff -ru "$SHOWCASE_DIR/$PROTO_PROJECT_DIR"/src/main/java "$PROTO_UNPACK_DIR/$PROTO_ARCHIVE_NAME"/src/main/java ;; @@ -39,10 +39,12 @@ case $1 in grpc) GRPC_PROJECT_DIR=grpc-gapic-showcase-v1beta1 GRPC_JAR=$(find . -name 'libshowcase_java_grpc-src.jar') +# GRPC_JAR_EXTENDED=$(find . -name 'libshowcase_java_grpc_extended-src.jar') create_unpack_dir grpc_unpacked GRPC_UNPACK_DIR=$PWD - jar xf "../$GRPC_JAR" + jar xf "$BAZEL_ROOT/$GRPC_JAR" +# jar xf "$BAZEL_ROOT/$GRPC_JAR_EXTENDED" delete_unneeded diff -ru "$SHOWCASE_DIR/$GRPC_PROJECT_DIR"/src/main/java/com "$GRPC_UNPACK_DIR"/com ;; @@ -53,7 +55,7 @@ case $1 in create_unpack_dir gapic_unpacked GAPIC_UNPACK_DIR=$PWD - unzip -q -c "../$GAPIC_JAR" temp-codegen.srcjar | jar x + unzip -q -c "$BAZEL_ROOT/$GAPIC_JAR" temp-codegen.srcjar | jar x delete_unneeded diff -ru "$SHOWCASE_DIR/$GAPIC_PROJECT_DIR"/src "$GAPIC_UNPACK_DIR"/src --exclude=it ;; diff --git a/test/integration/BUILD.bazel b/test/integration/BUILD.bazel index 57cd8b2210..4a3409aa0e 100644 --- a/test/integration/BUILD.bazel +++ b/test/integration/BUILD.bazel @@ -34,6 +34,8 @@ API_GAPIC_TARGETS = { "compute": "@com_google_googleapis//google/cloud/compute/v1small:compute_small_java_gapic", # Routing headers. "bigtable": "@com_google_googleapis//google/bigtable/v2:bigtable_java_gapic", + # REGAPIC REST Client Generation + "apigeeconnect": "@com_google_googleapis//google/cloud/apigeeconnect/v1:apigeeconnect_java_gapic", } [filegroup( @@ -135,6 +137,13 @@ java_gapic_test( runtime_deps = ["@com_google_googleapis//google/bigtable/v2:bigtable_java_gapic_test"], ) +# Apigee Connect V1 API +java_gapic_test( + name = "apigeeconnect_java_gapic_test_suite", + test_classes = [], + runtime_deps = ["@com_google_googleapis//google/cloud/apigeeconnect/v1:apigeeconnect_java_gapic_test"], +) + # IAM (for a standalone mixed-in API). java_gapic_library( name = "iam_java_gapic", diff --git a/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/create/SyncCreateSetCredentialsProvider.java b/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/create/SyncCreateSetCredentialsProvider.java new file mode 100644 index 0000000000..ef37e87690 --- /dev/null +++ b/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/create/SyncCreateSetCredentialsProvider.java @@ -0,0 +1,45 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1.samples; + +// [START apigeeconnect_v1_generated_ConnectionService_Create_SetCredentialsProvider_sync] +import com.google.api.gax.core.FixedCredentialsProvider; +import com.google.cloud.apigeeconnect.v1.ConnectionServiceClient; +import com.google.cloud.apigeeconnect.v1.ConnectionServiceSettings; +import com.google.cloud.apigeeconnect.v1.myCredentials; + +public class SyncCreateSetCredentialsProvider { + + public static void main(String[] args) throws Exception { + syncCreateSetCredentialsProvider(); + } + + public static void syncCreateSetCredentialsProvider() throws Exception { + // This snippet has been automatically generated and should be regarded as a code template only. + // It will require modifications to work: + // - It may require correct/in-range values for request initialization. + // - It may require specifying regional endpoints when creating the service client as shown in + // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library + ConnectionServiceSettings connectionServiceSettings = + ConnectionServiceSettings.newBuilder() + .setCredentialsProvider(FixedCredentialsProvider.create(myCredentials)) + .build(); + ConnectionServiceClient connectionServiceClient = + ConnectionServiceClient.create(connectionServiceSettings); + } +} +// [END apigeeconnect_v1_generated_ConnectionService_Create_SetCredentialsProvider_sync] diff --git a/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/create/SyncCreateSetCredentialsProvider1.java b/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/create/SyncCreateSetCredentialsProvider1.java new file mode 100644 index 0000000000..b2a5bd5657 --- /dev/null +++ b/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/create/SyncCreateSetCredentialsProvider1.java @@ -0,0 +1,41 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1.samples; + +// [START apigeeconnect_v1_generated_ConnectionService_Create_SetCredentialsProvider1_sync] +import com.google.cloud.apigeeconnect.v1.ConnectionServiceClient; +import com.google.cloud.apigeeconnect.v1.ConnectionServiceSettings; + +public class SyncCreateSetCredentialsProvider1 { + + public static void main(String[] args) throws Exception { + syncCreateSetCredentialsProvider1(); + } + + public static void syncCreateSetCredentialsProvider1() throws Exception { + // This snippet has been automatically generated and should be regarded as a code template only. + // It will require modifications to work: + // - It may require correct/in-range values for request initialization. + // - It may require specifying regional endpoints when creating the service client as shown in + // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library + ConnectionServiceSettings connectionServiceSettings = + ConnectionServiceSettings.newHttpJsonBuilder().build(); + ConnectionServiceClient connectionServiceClient = + ConnectionServiceClient.create(connectionServiceSettings); + } +} +// [END apigeeconnect_v1_generated_ConnectionService_Create_SetCredentialsProvider1_sync] diff --git a/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/create/SyncCreateSetEndpoint.java b/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/create/SyncCreateSetEndpoint.java new file mode 100644 index 0000000000..3d5446239c --- /dev/null +++ b/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/create/SyncCreateSetEndpoint.java @@ -0,0 +1,42 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1.samples; + +// [START apigeeconnect_v1_generated_ConnectionService_Create_SetEndpoint_sync] +import com.google.cloud.apigeeconnect.v1.ConnectionServiceClient; +import com.google.cloud.apigeeconnect.v1.ConnectionServiceSettings; +import com.google.cloud.apigeeconnect.v1.myEndpoint; + +public class SyncCreateSetEndpoint { + + public static void main(String[] args) throws Exception { + syncCreateSetEndpoint(); + } + + public static void syncCreateSetEndpoint() throws Exception { + // This snippet has been automatically generated and should be regarded as a code template only. + // It will require modifications to work: + // - It may require correct/in-range values for request initialization. + // - It may require specifying regional endpoints when creating the service client as shown in + // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library + ConnectionServiceSettings connectionServiceSettings = + ConnectionServiceSettings.newBuilder().setEndpoint(myEndpoint).build(); + ConnectionServiceClient connectionServiceClient = + ConnectionServiceClient.create(connectionServiceSettings); + } +} +// [END apigeeconnect_v1_generated_ConnectionService_Create_SetEndpoint_sync] diff --git a/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/listconnections/AsyncListConnections.java b/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/listconnections/AsyncListConnections.java new file mode 100644 index 0000000000..e58d765ec9 --- /dev/null +++ b/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/listconnections/AsyncListConnections.java @@ -0,0 +1,54 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1.samples; + +// [START apigeeconnect_v1_generated_ConnectionService_ListConnections_async] +import com.google.api.core.ApiFuture; +import com.google.cloud.apigeeconnect.v1.Connection; +import com.google.cloud.apigeeconnect.v1.ConnectionServiceClient; +import com.google.cloud.apigeeconnect.v1.EndpointName; +import com.google.cloud.apigeeconnect.v1.ListConnectionsRequest; + +public class AsyncListConnections { + + public static void main(String[] args) throws Exception { + asyncListConnections(); + } + + public static void asyncListConnections() throws Exception { + // This snippet has been automatically generated and should be regarded as a code template only. + // It will require modifications to work: + // - It may require correct/in-range values for request initialization. + // - It may require specifying regional endpoints when creating the service client as shown in + // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library + try (ConnectionServiceClient connectionServiceClient = ConnectionServiceClient.create()) { + ListConnectionsRequest request = + ListConnectionsRequest.newBuilder() + .setParent(EndpointName.of("[PROJECT]", "[ENDPOINT]").toString()) + .setPageSize(883849137) + .setPageToken("pageToken873572522") + .build(); + ApiFuture future = + connectionServiceClient.listConnectionsPagedCallable().futureCall(request); + // Do something. + for (Connection element : future.get().iterateAll()) { + // doThingsWith(element); + } + } + } +} +// [END apigeeconnect_v1_generated_ConnectionService_ListConnections_async] diff --git a/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/listconnections/AsyncListConnectionsPaged.java b/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/listconnections/AsyncListConnectionsPaged.java new file mode 100644 index 0000000000..b2254cf236 --- /dev/null +++ b/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/listconnections/AsyncListConnectionsPaged.java @@ -0,0 +1,62 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1.samples; + +// [START apigeeconnect_v1_generated_ConnectionService_ListConnections_Paged_async] +import com.google.cloud.apigeeconnect.v1.Connection; +import com.google.cloud.apigeeconnect.v1.ConnectionServiceClient; +import com.google.cloud.apigeeconnect.v1.EndpointName; +import com.google.cloud.apigeeconnect.v1.ListConnectionsRequest; +import com.google.cloud.apigeeconnect.v1.ListConnectionsResponse; +import com.google.common.base.Strings; + +public class AsyncListConnectionsPaged { + + public static void main(String[] args) throws Exception { + asyncListConnectionsPaged(); + } + + public static void asyncListConnectionsPaged() throws Exception { + // This snippet has been automatically generated and should be regarded as a code template only. + // It will require modifications to work: + // - It may require correct/in-range values for request initialization. + // - It may require specifying regional endpoints when creating the service client as shown in + // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library + try (ConnectionServiceClient connectionServiceClient = ConnectionServiceClient.create()) { + ListConnectionsRequest request = + ListConnectionsRequest.newBuilder() + .setParent(EndpointName.of("[PROJECT]", "[ENDPOINT]").toString()) + .setPageSize(883849137) + .setPageToken("pageToken873572522") + .build(); + while (true) { + ListConnectionsResponse response = + connectionServiceClient.listConnectionsCallable().call(request); + for (Connection element : response.getConnectionsList()) { + // doThingsWith(element); + } + String nextPageToken = response.getNextPageToken(); + if (!Strings.isNullOrEmpty(nextPageToken)) { + request = request.toBuilder().setPageToken(nextPageToken).build(); + } else { + break; + } + } + } + } +} +// [END apigeeconnect_v1_generated_ConnectionService_ListConnections_Paged_async] diff --git a/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/listconnections/SyncListConnections.java b/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/listconnections/SyncListConnections.java new file mode 100644 index 0000000000..22d8721a3d --- /dev/null +++ b/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/listconnections/SyncListConnections.java @@ -0,0 +1,50 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1.samples; + +// [START apigeeconnect_v1_generated_ConnectionService_ListConnections_sync] +import com.google.cloud.apigeeconnect.v1.Connection; +import com.google.cloud.apigeeconnect.v1.ConnectionServiceClient; +import com.google.cloud.apigeeconnect.v1.EndpointName; +import com.google.cloud.apigeeconnect.v1.ListConnectionsRequest; + +public class SyncListConnections { + + public static void main(String[] args) throws Exception { + syncListConnections(); + } + + public static void syncListConnections() throws Exception { + // This snippet has been automatically generated and should be regarded as a code template only. + // It will require modifications to work: + // - It may require correct/in-range values for request initialization. + // - It may require specifying regional endpoints when creating the service client as shown in + // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library + try (ConnectionServiceClient connectionServiceClient = ConnectionServiceClient.create()) { + ListConnectionsRequest request = + ListConnectionsRequest.newBuilder() + .setParent(EndpointName.of("[PROJECT]", "[ENDPOINT]").toString()) + .setPageSize(883849137) + .setPageToken("pageToken873572522") + .build(); + for (Connection element : connectionServiceClient.listConnections(request).iterateAll()) { + // doThingsWith(element); + } + } + } +} +// [END apigeeconnect_v1_generated_ConnectionService_ListConnections_sync] diff --git a/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/listconnections/SyncListConnectionsEndpointname.java b/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/listconnections/SyncListConnectionsEndpointname.java new file mode 100644 index 0000000000..3c375d2ab4 --- /dev/null +++ b/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/listconnections/SyncListConnectionsEndpointname.java @@ -0,0 +1,44 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1.samples; + +// [START apigeeconnect_v1_generated_ConnectionService_ListConnections_Endpointname_sync] +import com.google.cloud.apigeeconnect.v1.Connection; +import com.google.cloud.apigeeconnect.v1.ConnectionServiceClient; +import com.google.cloud.apigeeconnect.v1.EndpointName; + +public class SyncListConnectionsEndpointname { + + public static void main(String[] args) throws Exception { + syncListConnectionsEndpointname(); + } + + public static void syncListConnectionsEndpointname() throws Exception { + // This snippet has been automatically generated and should be regarded as a code template only. + // It will require modifications to work: + // - It may require correct/in-range values for request initialization. + // - It may require specifying regional endpoints when creating the service client as shown in + // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library + try (ConnectionServiceClient connectionServiceClient = ConnectionServiceClient.create()) { + EndpointName parent = EndpointName.of("[PROJECT]", "[ENDPOINT]"); + for (Connection element : connectionServiceClient.listConnections(parent).iterateAll()) { + // doThingsWith(element); + } + } + } +} +// [END apigeeconnect_v1_generated_ConnectionService_ListConnections_Endpointname_sync] diff --git a/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/listconnections/SyncListConnectionsString.java b/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/listconnections/SyncListConnectionsString.java new file mode 100644 index 0000000000..5ba3d9f0d5 --- /dev/null +++ b/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservice/listconnections/SyncListConnectionsString.java @@ -0,0 +1,44 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1.samples; + +// [START apigeeconnect_v1_generated_ConnectionService_ListConnections_String_sync] +import com.google.cloud.apigeeconnect.v1.Connection; +import com.google.cloud.apigeeconnect.v1.ConnectionServiceClient; +import com.google.cloud.apigeeconnect.v1.EndpointName; + +public class SyncListConnectionsString { + + public static void main(String[] args) throws Exception { + syncListConnectionsString(); + } + + public static void syncListConnectionsString() throws Exception { + // This snippet has been automatically generated and should be regarded as a code template only. + // It will require modifications to work: + // - It may require correct/in-range values for request initialization. + // - It may require specifying regional endpoints when creating the service client as shown in + // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library + try (ConnectionServiceClient connectionServiceClient = ConnectionServiceClient.create()) { + String parent = EndpointName.of("[PROJECT]", "[ENDPOINT]").toString(); + for (Connection element : connectionServiceClient.listConnections(parent).iterateAll()) { + // doThingsWith(element); + } + } + } +} +// [END apigeeconnect_v1_generated_ConnectionService_ListConnections_String_sync] diff --git a/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservicesettings/listconnections/SyncListConnections.java b/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservicesettings/listconnections/SyncListConnections.java new file mode 100644 index 0000000000..b52fb067ef --- /dev/null +++ b/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/connectionservicesettings/listconnections/SyncListConnections.java @@ -0,0 +1,49 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1.samples; + +// [START apigeeconnect_v1_generated_ConnectionServiceSettings_ListConnections_sync] +import com.google.cloud.apigeeconnect.v1.ConnectionServiceSettings; +import java.time.Duration; + +public class SyncListConnections { + + public static void main(String[] args) throws Exception { + syncListConnections(); + } + + public static void syncListConnections() throws Exception { + // This snippet has been automatically generated and should be regarded as a code template only. + // It will require modifications to work: + // - It may require correct/in-range values for request initialization. + // - It may require specifying regional endpoints when creating the service client as shown in + // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library + ConnectionServiceSettings.Builder connectionServiceSettingsBuilder = + ConnectionServiceSettings.newBuilder(); + connectionServiceSettingsBuilder + .listConnectionsSettings() + .setRetrySettings( + connectionServiceSettingsBuilder + .listConnectionsSettings() + .getRetrySettings() + .toBuilder() + .setTotalTimeout(Duration.ofSeconds(30)) + .build()); + ConnectionServiceSettings connectionServiceSettings = connectionServiceSettingsBuilder.build(); + } +} +// [END apigeeconnect_v1_generated_ConnectionServiceSettings_ListConnections_sync] diff --git a/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/stub/connectionservicestubsettings/listconnections/SyncListConnections.java b/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/stub/connectionservicestubsettings/listconnections/SyncListConnections.java new file mode 100644 index 0000000000..cfd7db3cb8 --- /dev/null +++ b/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/stub/connectionservicestubsettings/listconnections/SyncListConnections.java @@ -0,0 +1,50 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1.stub.samples; + +// [START apigeeconnect_v1_generated_ConnectionServiceStubSettings_ListConnections_sync] +import com.google.cloud.apigeeconnect.v1.stub.ConnectionServiceStubSettings; +import java.time.Duration; + +public class SyncListConnections { + + public static void main(String[] args) throws Exception { + syncListConnections(); + } + + public static void syncListConnections() throws Exception { + // This snippet has been automatically generated and should be regarded as a code template only. + // It will require modifications to work: + // - It may require correct/in-range values for request initialization. + // - It may require specifying regional endpoints when creating the service client as shown in + // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library + ConnectionServiceStubSettings.Builder connectionServiceSettingsBuilder = + ConnectionServiceStubSettings.newBuilder(); + connectionServiceSettingsBuilder + .listConnectionsSettings() + .setRetrySettings( + connectionServiceSettingsBuilder + .listConnectionsSettings() + .getRetrySettings() + .toBuilder() + .setTotalTimeout(Duration.ofSeconds(30)) + .build()); + ConnectionServiceStubSettings connectionServiceSettings = + connectionServiceSettingsBuilder.build(); + } +} +// [END apigeeconnect_v1_generated_ConnectionServiceStubSettings_ListConnections_sync] diff --git a/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/stub/tetherstubsettings/egress/SyncEgress.java b/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/stub/tetherstubsettings/egress/SyncEgress.java new file mode 100644 index 0000000000..ac44c199a1 --- /dev/null +++ b/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/stub/tetherstubsettings/egress/SyncEgress.java @@ -0,0 +1,48 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1.stub.samples; + +// [START apigeeconnect_v1_generated_TetherStubSettings_Egress_sync] +import com.google.cloud.apigeeconnect.v1.stub.TetherStubSettings; +import java.time.Duration; + +public class SyncEgress { + + public static void main(String[] args) throws Exception { + syncEgress(); + } + + public static void syncEgress() throws Exception { + // This snippet has been automatically generated and should be regarded as a code template only. + // It will require modifications to work: + // - It may require correct/in-range values for request initialization. + // - It may require specifying regional endpoints when creating the service client as shown in + // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library + TetherStubSettings.Builder tetherSettingsBuilder = TetherStubSettings.newBuilder(); + tetherSettingsBuilder + .egressSettings() + .setRetrySettings( + tetherSettingsBuilder + .egressSettings() + .getRetrySettings() + .toBuilder() + .setTotalTimeout(Duration.ofSeconds(30)) + .build()); + TetherStubSettings tetherSettings = tetherSettingsBuilder.build(); + } +} +// [END apigeeconnect_v1_generated_TetherStubSettings_Egress_sync] diff --git a/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/tether/create/SyncCreateSetCredentialsProvider.java b/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/tether/create/SyncCreateSetCredentialsProvider.java new file mode 100644 index 0000000000..1a44df0098 --- /dev/null +++ b/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/tether/create/SyncCreateSetCredentialsProvider.java @@ -0,0 +1,44 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1.samples; + +// [START apigeeconnect_v1_generated_Tether_Create_SetCredentialsProvider_sync] +import com.google.api.gax.core.FixedCredentialsProvider; +import com.google.cloud.apigeeconnect.v1.TetherClient; +import com.google.cloud.apigeeconnect.v1.TetherSettings; +import com.google.cloud.apigeeconnect.v1.myCredentials; + +public class SyncCreateSetCredentialsProvider { + + public static void main(String[] args) throws Exception { + syncCreateSetCredentialsProvider(); + } + + public static void syncCreateSetCredentialsProvider() throws Exception { + // This snippet has been automatically generated and should be regarded as a code template only. + // It will require modifications to work: + // - It may require correct/in-range values for request initialization. + // - It may require specifying regional endpoints when creating the service client as shown in + // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library + TetherSettings tetherSettings = + TetherSettings.newBuilder() + .setCredentialsProvider(FixedCredentialsProvider.create(myCredentials)) + .build(); + TetherClient tetherClient = TetherClient.create(tetherSettings); + } +} +// [END apigeeconnect_v1_generated_Tether_Create_SetCredentialsProvider_sync] diff --git a/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/tether/create/SyncCreateSetEndpoint.java b/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/tether/create/SyncCreateSetEndpoint.java new file mode 100644 index 0000000000..d8b615f9fe --- /dev/null +++ b/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/tether/create/SyncCreateSetEndpoint.java @@ -0,0 +1,40 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1.samples; + +// [START apigeeconnect_v1_generated_Tether_Create_SetEndpoint_sync] +import com.google.cloud.apigeeconnect.v1.TetherClient; +import com.google.cloud.apigeeconnect.v1.TetherSettings; +import com.google.cloud.apigeeconnect.v1.myEndpoint; + +public class SyncCreateSetEndpoint { + + public static void main(String[] args) throws Exception { + syncCreateSetEndpoint(); + } + + public static void syncCreateSetEndpoint() throws Exception { + // This snippet has been automatically generated and should be regarded as a code template only. + // It will require modifications to work: + // - It may require correct/in-range values for request initialization. + // - It may require specifying regional endpoints when creating the service client as shown in + // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library + TetherSettings tetherSettings = TetherSettings.newBuilder().setEndpoint(myEndpoint).build(); + TetherClient tetherClient = TetherClient.create(tetherSettings); + } +} +// [END apigeeconnect_v1_generated_Tether_Create_SetEndpoint_sync] diff --git a/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/tether/egress/AsyncEgress.java b/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/tether/egress/AsyncEgress.java new file mode 100644 index 0000000000..1d32c19c1d --- /dev/null +++ b/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/tether/egress/AsyncEgress.java @@ -0,0 +1,59 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1.samples; + +// [START apigeeconnect_v1_generated_Tether_Egress_async] +import com.google.api.gax.rpc.BidiStream; +import com.google.cloud.apigeeconnect.v1.EgressRequest; +import com.google.cloud.apigeeconnect.v1.EgressResponse; +import com.google.cloud.apigeeconnect.v1.HttpResponse; +import com.google.cloud.apigeeconnect.v1.TetherClient; +import com.google.cloud.apigeeconnect.v1.TetherEndpoint; +import com.google.rpc.Status; + +public class AsyncEgress { + + public static void main(String[] args) throws Exception { + asyncEgress(); + } + + public static void asyncEgress() throws Exception { + // This snippet has been automatically generated and should be regarded as a code template only. + // It will require modifications to work: + // - It may require correct/in-range values for request initialization. + // - It may require specifying regional endpoints when creating the service client as shown in + // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library + try (TetherClient tetherClient = TetherClient.create()) { + BidiStream bidiStream = tetherClient.egressCallable().call(); + EgressResponse request = + EgressResponse.newBuilder() + .setId("id3355") + .setHttpResponse(HttpResponse.newBuilder().build()) + .setStatus(Status.newBuilder().build()) + .setProject("project-309310695") + .setTraceId("traceId-1067401920") + .setEndpoint(TetherEndpoint.forNumber(0)) + .setName("name3373707") + .build(); + bidiStream.send(request); + for (EgressRequest response : bidiStream) { + // Do something when a response is received. + } + } + } +} +// [END apigeeconnect_v1_generated_Tether_Egress_async] diff --git a/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/tethersettings/egress/SyncEgress.java b/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/tethersettings/egress/SyncEgress.java new file mode 100644 index 0000000000..f1efa82994 --- /dev/null +++ b/test/integration/goldens/apigeeconnect/samples/snippets/generated/main/java/com/google/cloud/apigeeconnect/v1/tethersettings/egress/SyncEgress.java @@ -0,0 +1,48 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1.samples; + +// [START apigeeconnect_v1_generated_TetherSettings_Egress_sync] +import com.google.cloud.apigeeconnect.v1.TetherSettings; +import java.time.Duration; + +public class SyncEgress { + + public static void main(String[] args) throws Exception { + syncEgress(); + } + + public static void syncEgress() throws Exception { + // This snippet has been automatically generated and should be regarded as a code template only. + // It will require modifications to work: + // - It may require correct/in-range values for request initialization. + // - It may require specifying regional endpoints when creating the service client as shown in + // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library + TetherSettings.Builder tetherSettingsBuilder = TetherSettings.newBuilder(); + tetherSettingsBuilder + .egressSettings() + .setRetrySettings( + tetherSettingsBuilder + .egressSettings() + .getRetrySettings() + .toBuilder() + .setTotalTimeout(Duration.ofSeconds(30)) + .build()); + TetherSettings tetherSettings = tetherSettingsBuilder.build(); + } +} +// [END apigeeconnect_v1_generated_TetherSettings_Egress_sync] diff --git a/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/ConnectionServiceClient.java b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/ConnectionServiceClient.java new file mode 100644 index 0000000000..661c504449 --- /dev/null +++ b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/ConnectionServiceClient.java @@ -0,0 +1,452 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1; + +import com.google.api.core.ApiFuture; +import com.google.api.core.ApiFutures; +import com.google.api.gax.core.BackgroundResource; +import com.google.api.gax.paging.AbstractFixedSizeCollection; +import com.google.api.gax.paging.AbstractPage; +import com.google.api.gax.paging.AbstractPagedListResponse; +import com.google.api.gax.rpc.PageContext; +import com.google.api.gax.rpc.UnaryCallable; +import com.google.cloud.apigeeconnect.v1.stub.ConnectionServiceStub; +import com.google.cloud.apigeeconnect.v1.stub.ConnectionServiceStubSettings; +import com.google.common.util.concurrent.MoreExecutors; +import java.io.IOException; +import java.util.List; +import java.util.concurrent.TimeUnit; +import javax.annotation.Generated; + +// AUTO-GENERATED DOCUMENTATION AND CLASS. +/** + * Service Description: Service Interface for the Apigee Connect connection management APIs. + * + *

This class provides the ability to make remote calls to the backing service through method + * calls that map to API methods. Sample code to get started: + * + *

{@code
+ * // This snippet has been automatically generated and should be regarded as a code template only.
+ * // It will require modifications to work:
+ * // - It may require correct/in-range values for request initialization.
+ * // - It may require specifying regional endpoints when creating the service client as shown in
+ * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+ * try (ConnectionServiceClient connectionServiceClient = ConnectionServiceClient.create()) {
+ *   EndpointName parent = EndpointName.of("[PROJECT]", "[ENDPOINT]");
+ *   for (Connection element : connectionServiceClient.listConnections(parent).iterateAll()) {
+ *     // doThingsWith(element);
+ *   }
+ * }
+ * }
+ * + *

Note: close() needs to be called on the ConnectionServiceClient object to clean up resources + * such as threads. In the example above, try-with-resources is used, which automatically calls + * close(). + * + *

The surface of this class includes several types of Java methods for each of the API's + * methods: + * + *

    + *
  1. A "flattened" method. With this type of method, the fields of the request type have been + * converted into function parameters. It may be the case that not all fields are available as + * parameters, and not every API method will have a flattened method entry point. + *
  2. A "request object" method. This type of method only takes one parameter, a request object, + * which must be constructed before the call. Not every API method will have a request object + * method. + *
  3. A "callable" method. This type of method takes no parameters and returns an immutable API + * callable object, which can be used to initiate calls to the service. + *
+ * + *

See the individual methods for example code. + * + *

Many parameters require resource names to be formatted in a particular way. To assist with + * these names, this class includes a format method for each type of name, and additionally a parse + * method to extract the individual identifiers contained within names that are returned. + * + *

This class can be customized by passing in a custom instance of ConnectionServiceSettings to + * create(). For example: + * + *

To customize credentials: + * + *

{@code
+ * // This snippet has been automatically generated and should be regarded as a code template only.
+ * // It will require modifications to work:
+ * // - It may require correct/in-range values for request initialization.
+ * // - It may require specifying regional endpoints when creating the service client as shown in
+ * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+ * ConnectionServiceSettings connectionServiceSettings =
+ *     ConnectionServiceSettings.newBuilder()
+ *         .setCredentialsProvider(FixedCredentialsProvider.create(myCredentials))
+ *         .build();
+ * ConnectionServiceClient connectionServiceClient =
+ *     ConnectionServiceClient.create(connectionServiceSettings);
+ * }
+ * + *

To customize the endpoint: + * + *

{@code
+ * // This snippet has been automatically generated and should be regarded as a code template only.
+ * // It will require modifications to work:
+ * // - It may require correct/in-range values for request initialization.
+ * // - It may require specifying regional endpoints when creating the service client as shown in
+ * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+ * ConnectionServiceSettings connectionServiceSettings =
+ *     ConnectionServiceSettings.newBuilder().setEndpoint(myEndpoint).build();
+ * ConnectionServiceClient connectionServiceClient =
+ *     ConnectionServiceClient.create(connectionServiceSettings);
+ * }
+ * + *

To use REST (HTTP1.1/JSON) transport (instead of gRPC) for sending and receiving requests over + * the wire: + * + *

{@code
+ * // This snippet has been automatically generated and should be regarded as a code template only.
+ * // It will require modifications to work:
+ * // - It may require correct/in-range values for request initialization.
+ * // - It may require specifying regional endpoints when creating the service client as shown in
+ * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+ * ConnectionServiceSettings connectionServiceSettings =
+ *     ConnectionServiceSettings.newHttpJsonBuilder().build();
+ * ConnectionServiceClient connectionServiceClient =
+ *     ConnectionServiceClient.create(connectionServiceSettings);
+ * }
+ * + *

Please refer to the GitHub repository's samples for more quickstart code snippets. + */ +@Generated("by gapic-generator-java") +public class ConnectionServiceClient implements BackgroundResource { + private final ConnectionServiceSettings settings; + private final ConnectionServiceStub stub; + + /** Constructs an instance of ConnectionServiceClient with default settings. */ + public static final ConnectionServiceClient create() throws IOException { + return create(ConnectionServiceSettings.newBuilder().build()); + } + + /** + * Constructs an instance of ConnectionServiceClient, using the given settings. The channels are + * created based on the settings passed in, or defaults for any settings that are not set. + */ + public static final ConnectionServiceClient create(ConnectionServiceSettings settings) + throws IOException { + return new ConnectionServiceClient(settings); + } + + /** + * Constructs an instance of ConnectionServiceClient, using the given stub for making calls. This + * is for advanced usage - prefer using create(ConnectionServiceSettings). + */ + public static final ConnectionServiceClient create(ConnectionServiceStub stub) { + return new ConnectionServiceClient(stub); + } + + /** + * Constructs an instance of ConnectionServiceClient, 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 ConnectionServiceClient(ConnectionServiceSettings settings) throws IOException { + this.settings = settings; + this.stub = ((ConnectionServiceStubSettings) settings.getStubSettings()).createStub(); + } + + protected ConnectionServiceClient(ConnectionServiceStub stub) { + this.settings = null; + this.stub = stub; + } + + public final ConnectionServiceSettings getSettings() { + return settings; + } + + public ConnectionServiceStub getStub() { + return stub; + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Lists connections that are currently active for the given Apigee Connect endpoint. + * + *

Sample code: + * + *

{@code
+   * // This snippet has been automatically generated and should be regarded as a code template only.
+   * // It will require modifications to work:
+   * // - It may require correct/in-range values for request initialization.
+   * // - It may require specifying regional endpoints when creating the service client as shown in
+   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+   * try (ConnectionServiceClient connectionServiceClient = ConnectionServiceClient.create()) {
+   *   EndpointName parent = EndpointName.of("[PROJECT]", "[ENDPOINT]");
+   *   for (Connection element : connectionServiceClient.listConnections(parent).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * + * @param parent Required. Parent name of the form: `projects/{project_number or + * project_id}/endpoints/{endpoint}`. + * @throws com.google.api.gax.rpc.ApiException if the remote call fails + */ + public final ListConnectionsPagedResponse listConnections(EndpointName parent) { + ListConnectionsRequest request = + ListConnectionsRequest.newBuilder() + .setParent(parent == null ? null : parent.toString()) + .build(); + return listConnections(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Lists connections that are currently active for the given Apigee Connect endpoint. + * + *

Sample code: + * + *

{@code
+   * // This snippet has been automatically generated and should be regarded as a code template only.
+   * // It will require modifications to work:
+   * // - It may require correct/in-range values for request initialization.
+   * // - It may require specifying regional endpoints when creating the service client as shown in
+   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+   * try (ConnectionServiceClient connectionServiceClient = ConnectionServiceClient.create()) {
+   *   String parent = EndpointName.of("[PROJECT]", "[ENDPOINT]").toString();
+   *   for (Connection element : connectionServiceClient.listConnections(parent).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * + * @param parent Required. Parent name of the form: `projects/{project_number or + * project_id}/endpoints/{endpoint}`. + * @throws com.google.api.gax.rpc.ApiException if the remote call fails + */ + public final ListConnectionsPagedResponse listConnections(String parent) { + ListConnectionsRequest request = ListConnectionsRequest.newBuilder().setParent(parent).build(); + return listConnections(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Lists connections that are currently active for the given Apigee Connect endpoint. + * + *

Sample code: + * + *

{@code
+   * // This snippet has been automatically generated and should be regarded as a code template only.
+   * // It will require modifications to work:
+   * // - It may require correct/in-range values for request initialization.
+   * // - It may require specifying regional endpoints when creating the service client as shown in
+   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+   * try (ConnectionServiceClient connectionServiceClient = ConnectionServiceClient.create()) {
+   *   ListConnectionsRequest request =
+   *       ListConnectionsRequest.newBuilder()
+   *           .setParent(EndpointName.of("[PROJECT]", "[ENDPOINT]").toString())
+   *           .setPageSize(883849137)
+   *           .setPageToken("pageToken873572522")
+   *           .build();
+   *   for (Connection element : connectionServiceClient.listConnections(request).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * + * @param request The request object containing all of the parameters for the API call. + * @throws com.google.api.gax.rpc.ApiException if the remote call fails + */ + public final ListConnectionsPagedResponse listConnections(ListConnectionsRequest request) { + return listConnectionsPagedCallable().call(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Lists connections that are currently active for the given Apigee Connect endpoint. + * + *

Sample code: + * + *

{@code
+   * // This snippet has been automatically generated and should be regarded as a code template only.
+   * // It will require modifications to work:
+   * // - It may require correct/in-range values for request initialization.
+   * // - It may require specifying regional endpoints when creating the service client as shown in
+   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+   * try (ConnectionServiceClient connectionServiceClient = ConnectionServiceClient.create()) {
+   *   ListConnectionsRequest request =
+   *       ListConnectionsRequest.newBuilder()
+   *           .setParent(EndpointName.of("[PROJECT]", "[ENDPOINT]").toString())
+   *           .setPageSize(883849137)
+   *           .setPageToken("pageToken873572522")
+   *           .build();
+   *   ApiFuture future =
+   *       connectionServiceClient.listConnectionsPagedCallable().futureCall(request);
+   *   // Do something.
+   *   for (Connection element : future.get().iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ */ + public final UnaryCallable + listConnectionsPagedCallable() { + return stub.listConnectionsPagedCallable(); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Lists connections that are currently active for the given Apigee Connect endpoint. + * + *

Sample code: + * + *

{@code
+   * // This snippet has been automatically generated and should be regarded as a code template only.
+   * // It will require modifications to work:
+   * // - It may require correct/in-range values for request initialization.
+   * // - It may require specifying regional endpoints when creating the service client as shown in
+   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+   * try (ConnectionServiceClient connectionServiceClient = ConnectionServiceClient.create()) {
+   *   ListConnectionsRequest request =
+   *       ListConnectionsRequest.newBuilder()
+   *           .setParent(EndpointName.of("[PROJECT]", "[ENDPOINT]").toString())
+   *           .setPageSize(883849137)
+   *           .setPageToken("pageToken873572522")
+   *           .build();
+   *   while (true) {
+   *     ListConnectionsResponse response =
+   *         connectionServiceClient.listConnectionsCallable().call(request);
+   *     for (Connection element : response.getConnectionsList()) {
+   *       // doThingsWith(element);
+   *     }
+   *     String nextPageToken = response.getNextPageToken();
+   *     if (!Strings.isNullOrEmpty(nextPageToken)) {
+   *       request = request.toBuilder().setPageToken(nextPageToken).build();
+   *     } else {
+   *       break;
+   *     }
+   *   }
+   * }
+   * }
+ */ + public final UnaryCallable + listConnectionsCallable() { + return stub.listConnectionsCallable(); + } + + @Override + public final void close() { + stub.close(); + } + + @Override + public void shutdown() { + stub.shutdown(); + } + + @Override + public boolean isShutdown() { + return stub.isShutdown(); + } + + @Override + public boolean isTerminated() { + return stub.isTerminated(); + } + + @Override + public void shutdownNow() { + stub.shutdownNow(); + } + + @Override + public boolean awaitTermination(long duration, TimeUnit unit) throws InterruptedException { + return stub.awaitTermination(duration, unit); + } + + public static class ListConnectionsPagedResponse + extends AbstractPagedListResponse< + ListConnectionsRequest, + ListConnectionsResponse, + Connection, + ListConnectionsPage, + ListConnectionsFixedSizeCollection> { + + public static ApiFuture createAsync( + PageContext context, + ApiFuture futureResponse) { + ApiFuture futurePage = + ListConnectionsPage.createEmptyPage().createPageAsync(context, futureResponse); + return ApiFutures.transform( + futurePage, + input -> new ListConnectionsPagedResponse(input), + MoreExecutors.directExecutor()); + } + + private ListConnectionsPagedResponse(ListConnectionsPage page) { + super(page, ListConnectionsFixedSizeCollection.createEmptyCollection()); + } + } + + public static class ListConnectionsPage + extends AbstractPage< + ListConnectionsRequest, ListConnectionsResponse, Connection, ListConnectionsPage> { + + private ListConnectionsPage( + PageContext context, + ListConnectionsResponse response) { + super(context, response); + } + + private static ListConnectionsPage createEmptyPage() { + return new ListConnectionsPage(null, null); + } + + @Override + protected ListConnectionsPage createPage( + PageContext context, + ListConnectionsResponse response) { + return new ListConnectionsPage(context, response); + } + + @Override + public ApiFuture createPageAsync( + PageContext context, + ApiFuture futureResponse) { + return super.createPageAsync(context, futureResponse); + } + } + + public static class ListConnectionsFixedSizeCollection + extends AbstractFixedSizeCollection< + ListConnectionsRequest, + ListConnectionsResponse, + Connection, + ListConnectionsPage, + ListConnectionsFixedSizeCollection> { + + private ListConnectionsFixedSizeCollection( + List pages, int collectionSize) { + super(pages, collectionSize); + } + + private static ListConnectionsFixedSizeCollection createEmptyCollection() { + return new ListConnectionsFixedSizeCollection(null, 0); + } + + @Override + protected ListConnectionsFixedSizeCollection createCollection( + List pages, int collectionSize) { + return new ListConnectionsFixedSizeCollection(pages, collectionSize); + } + } +} diff --git a/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/ConnectionServiceClientHttpJsonTest.java b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/ConnectionServiceClientHttpJsonTest.java new file mode 100644 index 0000000000..3f8d216e7b --- /dev/null +++ b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/ConnectionServiceClientHttpJsonTest.java @@ -0,0 +1,177 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1; + +import static com.google.cloud.apigeeconnect.v1.ConnectionServiceClient.ListConnectionsPagedResponse; + +import com.google.api.gax.core.NoCredentialsProvider; +import com.google.api.gax.httpjson.GaxHttpJsonProperties; +import com.google.api.gax.httpjson.testing.MockHttpService; +import com.google.api.gax.rpc.ApiClientHeaderProvider; +import com.google.api.gax.rpc.ApiException; +import com.google.api.gax.rpc.ApiExceptionFactory; +import com.google.api.gax.rpc.InvalidArgumentException; +import com.google.api.gax.rpc.StatusCode; +import com.google.api.gax.rpc.testing.FakeStatusCode; +import com.google.cloud.apigeeconnect.v1.stub.HttpJsonConnectionServiceStub; +import com.google.common.collect.Lists; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import javax.annotation.Generated; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +@Generated("by gapic-generator-java") +public class ConnectionServiceClientHttpJsonTest { + private static MockHttpService mockService; + private static ConnectionServiceClient client; + + @BeforeClass + public static void startStaticServer() throws IOException { + mockService = + new MockHttpService( + HttpJsonConnectionServiceStub.getMethodDescriptors(), + ConnectionServiceSettings.getDefaultEndpoint()); + ConnectionServiceSettings settings = + ConnectionServiceSettings.newHttpJsonBuilder() + .setTransportChannelProvider( + ConnectionServiceSettings.defaultHttpJsonTransportProviderBuilder() + .setHttpTransport(mockService) + .build()) + .setCredentialsProvider(NoCredentialsProvider.create()) + .build(); + client = ConnectionServiceClient.create(settings); + } + + @AfterClass + public static void stopServer() { + client.close(); + } + + @Before + public void setUp() {} + + @After + public void tearDown() throws Exception { + mockService.reset(); + } + + @Test + public void listConnectionsTest() throws Exception { + Connection responsesElement = Connection.newBuilder().build(); + ListConnectionsResponse expectedResponse = + ListConnectionsResponse.newBuilder() + .setNextPageToken("") + .addAllConnections(Arrays.asList(responsesElement)) + .build(); + mockService.addResponse(expectedResponse); + + EndpointName parent = EndpointName.of("[PROJECT]", "[ENDPOINT]"); + + ListConnectionsPagedResponse pagedListResponse = client.listConnections(parent); + + List resources = Lists.newArrayList(pagedListResponse.iterateAll()); + + Assert.assertEquals(1, resources.size()); + Assert.assertEquals(expectedResponse.getConnectionsList().get(0), resources.get(0)); + + List actualRequests = mockService.getRequestPaths(); + Assert.assertEquals(1, actualRequests.size()); + + String apiClientHeaderKey = + mockService + .getRequestHeaders() + .get(ApiClientHeaderProvider.getDefaultApiClientHeaderKey()) + .iterator() + .next(); + Assert.assertTrue( + GaxHttpJsonProperties.getDefaultApiClientHeaderPattern() + .matcher(apiClientHeaderKey) + .matches()); + } + + @Test + public void listConnectionsExceptionTest() throws Exception { + ApiException exception = + ApiExceptionFactory.createException( + new Exception(), FakeStatusCode.of(StatusCode.Code.INVALID_ARGUMENT), false); + mockService.addException(exception); + + try { + EndpointName parent = EndpointName.of("[PROJECT]", "[ENDPOINT]"); + client.listConnections(parent); + Assert.fail("No exception raised"); + } catch (InvalidArgumentException e) { + // Expected exception. + } + } + + @Test + public void listConnectionsTest2() throws Exception { + Connection responsesElement = Connection.newBuilder().build(); + ListConnectionsResponse expectedResponse = + ListConnectionsResponse.newBuilder() + .setNextPageToken("") + .addAllConnections(Arrays.asList(responsesElement)) + .build(); + mockService.addResponse(expectedResponse); + + String parent = "projects/project-7865/endpoints/endpoint-7865"; + + ListConnectionsPagedResponse pagedListResponse = client.listConnections(parent); + + List resources = Lists.newArrayList(pagedListResponse.iterateAll()); + + Assert.assertEquals(1, resources.size()); + Assert.assertEquals(expectedResponse.getConnectionsList().get(0), resources.get(0)); + + List actualRequests = mockService.getRequestPaths(); + Assert.assertEquals(1, actualRequests.size()); + + String apiClientHeaderKey = + mockService + .getRequestHeaders() + .get(ApiClientHeaderProvider.getDefaultApiClientHeaderKey()) + .iterator() + .next(); + Assert.assertTrue( + GaxHttpJsonProperties.getDefaultApiClientHeaderPattern() + .matcher(apiClientHeaderKey) + .matches()); + } + + @Test + public void listConnectionsExceptionTest2() throws Exception { + ApiException exception = + ApiExceptionFactory.createException( + new Exception(), FakeStatusCode.of(StatusCode.Code.INVALID_ARGUMENT), false); + mockService.addException(exception); + + try { + String parent = "projects/project-7865/endpoints/endpoint-7865"; + client.listConnections(parent); + Assert.fail("No exception raised"); + } catch (InvalidArgumentException e) { + // Expected exception. + } + } +} diff --git a/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/ConnectionServiceClientTest.java b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/ConnectionServiceClientTest.java new file mode 100644 index 0000000000..c3c3b68a0d --- /dev/null +++ b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/ConnectionServiceClientTest.java @@ -0,0 +1,168 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1; + +import static com.google.cloud.apigeeconnect.v1.ConnectionServiceClient.ListConnectionsPagedResponse; + +import com.google.api.gax.core.NoCredentialsProvider; +import com.google.api.gax.grpc.GaxGrpcProperties; +import com.google.api.gax.grpc.testing.LocalChannelProvider; +import com.google.api.gax.grpc.testing.MockGrpcService; +import com.google.api.gax.grpc.testing.MockServiceHelper; +import com.google.api.gax.rpc.ApiClientHeaderProvider; +import com.google.api.gax.rpc.InvalidArgumentException; +import com.google.common.collect.Lists; +import com.google.protobuf.AbstractMessage; +import io.grpc.StatusRuntimeException; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.UUID; +import javax.annotation.Generated; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +@Generated("by gapic-generator-java") +public class ConnectionServiceClientTest { + private static MockConnectionService mockConnectionService; + private static MockServiceHelper mockServiceHelper; + private LocalChannelProvider channelProvider; + private ConnectionServiceClient client; + + @BeforeClass + public static void startStaticServer() { + mockConnectionService = new MockConnectionService(); + mockServiceHelper = + new MockServiceHelper( + UUID.randomUUID().toString(), Arrays.asList(mockConnectionService)); + mockServiceHelper.start(); + } + + @AfterClass + public static void stopServer() { + mockServiceHelper.stop(); + } + + @Before + public void setUp() throws IOException { + mockServiceHelper.reset(); + channelProvider = mockServiceHelper.createChannelProvider(); + ConnectionServiceSettings settings = + ConnectionServiceSettings.newBuilder() + .setTransportChannelProvider(channelProvider) + .setCredentialsProvider(NoCredentialsProvider.create()) + .build(); + client = ConnectionServiceClient.create(settings); + } + + @After + public void tearDown() throws Exception { + client.close(); + } + + @Test + public void listConnectionsTest() throws Exception { + Connection responsesElement = Connection.newBuilder().build(); + ListConnectionsResponse expectedResponse = + ListConnectionsResponse.newBuilder() + .setNextPageToken("") + .addAllConnections(Arrays.asList(responsesElement)) + .build(); + mockConnectionService.addResponse(expectedResponse); + + EndpointName parent = EndpointName.of("[PROJECT]", "[ENDPOINT]"); + + ListConnectionsPagedResponse pagedListResponse = client.listConnections(parent); + + List resources = Lists.newArrayList(pagedListResponse.iterateAll()); + + Assert.assertEquals(1, resources.size()); + Assert.assertEquals(expectedResponse.getConnectionsList().get(0), resources.get(0)); + + List actualRequests = mockConnectionService.getRequests(); + Assert.assertEquals(1, actualRequests.size()); + ListConnectionsRequest actualRequest = ((ListConnectionsRequest) actualRequests.get(0)); + + Assert.assertEquals(parent.toString(), actualRequest.getParent()); + Assert.assertTrue( + channelProvider.isHeaderSent( + ApiClientHeaderProvider.getDefaultApiClientHeaderKey(), + GaxGrpcProperties.getDefaultApiClientHeaderPattern())); + } + + @Test + public void listConnectionsExceptionTest() throws Exception { + StatusRuntimeException exception = new StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT); + mockConnectionService.addException(exception); + + try { + EndpointName parent = EndpointName.of("[PROJECT]", "[ENDPOINT]"); + client.listConnections(parent); + Assert.fail("No exception raised"); + } catch (InvalidArgumentException e) { + // Expected exception. + } + } + + @Test + public void listConnectionsTest2() throws Exception { + Connection responsesElement = Connection.newBuilder().build(); + ListConnectionsResponse expectedResponse = + ListConnectionsResponse.newBuilder() + .setNextPageToken("") + .addAllConnections(Arrays.asList(responsesElement)) + .build(); + mockConnectionService.addResponse(expectedResponse); + + String parent = "parent-995424086"; + + ListConnectionsPagedResponse pagedListResponse = client.listConnections(parent); + + List resources = Lists.newArrayList(pagedListResponse.iterateAll()); + + Assert.assertEquals(1, resources.size()); + Assert.assertEquals(expectedResponse.getConnectionsList().get(0), resources.get(0)); + + List actualRequests = mockConnectionService.getRequests(); + Assert.assertEquals(1, actualRequests.size()); + ListConnectionsRequest actualRequest = ((ListConnectionsRequest) actualRequests.get(0)); + + Assert.assertEquals(parent, actualRequest.getParent()); + Assert.assertTrue( + channelProvider.isHeaderSent( + ApiClientHeaderProvider.getDefaultApiClientHeaderKey(), + GaxGrpcProperties.getDefaultApiClientHeaderPattern())); + } + + @Test + public void listConnectionsExceptionTest2() throws Exception { + StatusRuntimeException exception = new StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT); + mockConnectionService.addException(exception); + + try { + String parent = "parent-995424086"; + client.listConnections(parent); + Assert.fail("No exception raised"); + } catch (InvalidArgumentException e) { + // Expected exception. + } + } +} diff --git a/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/ConnectionServiceSettings.java b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/ConnectionServiceSettings.java new file mode 100644 index 0000000000..00472714eb --- /dev/null +++ b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/ConnectionServiceSettings.java @@ -0,0 +1,213 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1; + +import static com.google.cloud.apigeeconnect.v1.ConnectionServiceClient.ListConnectionsPagedResponse; + +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.httpjson.InstantiatingHttpJsonChannelProvider; +import com.google.api.gax.rpc.ApiClientHeaderProvider; +import com.google.api.gax.rpc.ClientContext; +import com.google.api.gax.rpc.ClientSettings; +import com.google.api.gax.rpc.PagedCallSettings; +import com.google.api.gax.rpc.StubSettings; +import com.google.api.gax.rpc.TransportChannelProvider; +import com.google.api.gax.rpc.UnaryCallSettings; +import com.google.cloud.apigeeconnect.v1.stub.ConnectionServiceStubSettings; +import java.io.IOException; +import java.util.List; +import javax.annotation.Generated; + +// AUTO-GENERATED DOCUMENTATION AND CLASS. +/** + * Settings class to configure an instance of {@link ConnectionServiceClient}. + * + *

The default instance has everything set to sensible defaults: + * + *

    + *
  • The default service address (apigeeconnect.googleapis.com) and default port (443) are used. + *
  • Credentials are acquired automatically through Application Default Credentials. + *
  • Retries are configured for idempotent methods but not for non-idempotent methods. + *
+ * + *

The builder of this class is recursive, so contained classes are themselves builders. When + * build() is called, the tree of builders is called to create the complete settings object. + * + *

For example, to set the total timeout of listConnections to 30 seconds: + * + *

{@code
+ * // This snippet has been automatically generated and should be regarded as a code template only.
+ * // It will require modifications to work:
+ * // - It may require correct/in-range values for request initialization.
+ * // - It may require specifying regional endpoints when creating the service client as shown in
+ * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+ * ConnectionServiceSettings.Builder connectionServiceSettingsBuilder =
+ *     ConnectionServiceSettings.newBuilder();
+ * connectionServiceSettingsBuilder
+ *     .listConnectionsSettings()
+ *     .setRetrySettings(
+ *         connectionServiceSettingsBuilder
+ *             .listConnectionsSettings()
+ *             .getRetrySettings()
+ *             .toBuilder()
+ *             .setTotalTimeout(Duration.ofSeconds(30))
+ *             .build());
+ * ConnectionServiceSettings connectionServiceSettings = connectionServiceSettingsBuilder.build();
+ * }
+ */ +@Generated("by gapic-generator-java") +public class ConnectionServiceSettings extends ClientSettings { + + /** Returns the object with the settings used for calls to listConnections. */ + public PagedCallSettings< + ListConnectionsRequest, ListConnectionsResponse, ListConnectionsPagedResponse> + listConnectionsSettings() { + return ((ConnectionServiceStubSettings) getStubSettings()).listConnectionsSettings(); + } + + public static final ConnectionServiceSettings create(ConnectionServiceStubSettings stub) + throws IOException { + return new ConnectionServiceSettings.Builder(stub.toBuilder()).build(); + } + + /** Returns a builder for the default ExecutorProvider for this service. */ + public static InstantiatingExecutorProvider.Builder defaultExecutorProviderBuilder() { + return ConnectionServiceStubSettings.defaultExecutorProviderBuilder(); + } + + /** Returns the default service endpoint. */ + public static String getDefaultEndpoint() { + return ConnectionServiceStubSettings.getDefaultEndpoint(); + } + + /** Returns the default service scopes. */ + public static List getDefaultServiceScopes() { + return ConnectionServiceStubSettings.getDefaultServiceScopes(); + } + + /** Returns a builder for the default credentials for this service. */ + public static GoogleCredentialsProvider.Builder defaultCredentialsProviderBuilder() { + return ConnectionServiceStubSettings.defaultCredentialsProviderBuilder(); + } + + /** Returns a builder for the default gRPC ChannelProvider for this service. */ + public static InstantiatingGrpcChannelProvider.Builder defaultGrpcTransportProviderBuilder() { + return ConnectionServiceStubSettings.defaultGrpcTransportProviderBuilder(); + } + + /** Returns a builder for the default REST ChannelProvider for this service. */ + @BetaApi + public static InstantiatingHttpJsonChannelProvider.Builder + defaultHttpJsonTransportProviderBuilder() { + return ConnectionServiceStubSettings.defaultHttpJsonTransportProviderBuilder(); + } + + public static TransportChannelProvider defaultTransportChannelProvider() { + return ConnectionServiceStubSettings.defaultTransportChannelProvider(); + } + + @BetaApi("The surface for customizing headers is not stable yet and may change in the future.") + public static ApiClientHeaderProvider.Builder defaultApiClientHeaderProviderBuilder() { + return ConnectionServiceStubSettings.defaultApiClientHeaderProviderBuilder(); + } + + /** Returns a new gRPC builder for this class. */ + public static Builder newBuilder() { + return Builder.createDefault(); + } + + /** Returns a new REST builder for this class. */ + @BetaApi + public static Builder newHttpJsonBuilder() { + return Builder.createHttpJsonDefault(); + } + + /** Returns a new builder for this class. */ + public static Builder newBuilder(ClientContext clientContext) { + return new Builder(clientContext); + } + + /** Returns a builder containing all the values of this settings class. */ + public Builder toBuilder() { + return new Builder(this); + } + + protected ConnectionServiceSettings(Builder settingsBuilder) throws IOException { + super(settingsBuilder); + } + + /** Builder for ConnectionServiceSettings. */ + public static class Builder extends ClientSettings.Builder { + + protected Builder() throws IOException { + this(((ClientContext) null)); + } + + protected Builder(ClientContext clientContext) { + super(ConnectionServiceStubSettings.newBuilder(clientContext)); + } + + protected Builder(ConnectionServiceSettings settings) { + super(settings.getStubSettings().toBuilder()); + } + + protected Builder(ConnectionServiceStubSettings.Builder stubSettings) { + super(stubSettings); + } + + private static Builder createDefault() { + return new Builder(ConnectionServiceStubSettings.newBuilder()); + } + + @BetaApi + private static Builder createHttpJsonDefault() { + return new Builder(ConnectionServiceStubSettings.newHttpJsonBuilder()); + } + + public ConnectionServiceStubSettings.Builder getStubSettingsBuilder() { + return ((ConnectionServiceStubSettings.Builder) getStubSettings()); + } + + /** + * Applies the given settings updater function to all of the unary API methods in this service. + * + *

Note: This method does not support applying settings to streaming methods. + */ + public Builder applyToAllUnaryMethods( + ApiFunction, Void> settingsUpdater) { + super.applyToAllUnaryMethods( + getStubSettingsBuilder().unaryMethodSettingsBuilders(), settingsUpdater); + return this; + } + + /** Returns the builder for the settings used for calls to listConnections. */ + public PagedCallSettings.Builder< + ListConnectionsRequest, ListConnectionsResponse, ListConnectionsPagedResponse> + listConnectionsSettings() { + return getStubSettingsBuilder().listConnectionsSettings(); + } + + @Override + public ConnectionServiceSettings build() throws IOException { + return new ConnectionServiceSettings(this); + } + } +} diff --git a/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/EndpointName.java b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/EndpointName.java new file mode 100644 index 0000000000..2c7edfea89 --- /dev/null +++ b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/EndpointName.java @@ -0,0 +1,192 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1; + +import com.google.api.pathtemplate.PathTemplate; +import com.google.api.resourcenames.ResourceName; +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableMap; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import javax.annotation.Generated; + +// AUTO-GENERATED DOCUMENTATION AND CLASS. +@Generated("by gapic-generator-java") +public class EndpointName implements ResourceName { + private static final PathTemplate PROJECT_ENDPOINT = + PathTemplate.createWithoutUrlEncoding("projects/{project}/endpoints/{endpoint}"); + private volatile Map fieldValuesMap; + private final String project; + private final String endpoint; + + @Deprecated + protected EndpointName() { + project = null; + endpoint = null; + } + + private EndpointName(Builder builder) { + project = Preconditions.checkNotNull(builder.getProject()); + endpoint = Preconditions.checkNotNull(builder.getEndpoint()); + } + + public String getProject() { + return project; + } + + public String getEndpoint() { + return endpoint; + } + + public static Builder newBuilder() { + return new Builder(); + } + + public Builder toBuilder() { + return new Builder(this); + } + + public static EndpointName of(String project, String endpoint) { + return newBuilder().setProject(project).setEndpoint(endpoint).build(); + } + + public static String format(String project, String endpoint) { + return newBuilder().setProject(project).setEndpoint(endpoint).build().toString(); + } + + public static EndpointName parse(String formattedString) { + if (formattedString.isEmpty()) { + return null; + } + Map matchMap = + PROJECT_ENDPOINT.validatedMatch( + formattedString, "EndpointName.parse: formattedString not in valid format"); + return of(matchMap.get("project"), matchMap.get("endpoint")); + } + + public static List parseList(List formattedStrings) { + List list = new ArrayList<>(formattedStrings.size()); + for (String formattedString : formattedStrings) { + list.add(parse(formattedString)); + } + return list; + } + + public static List toStringList(List values) { + List list = new ArrayList<>(values.size()); + for (EndpointName value : values) { + if (value == null) { + list.add(""); + } else { + list.add(value.toString()); + } + } + return list; + } + + public static boolean isParsableFrom(String formattedString) { + return PROJECT_ENDPOINT.matches(formattedString); + } + + @Override + public Map getFieldValuesMap() { + if (fieldValuesMap == null) { + synchronized (this) { + if (fieldValuesMap == null) { + ImmutableMap.Builder fieldMapBuilder = ImmutableMap.builder(); + if (project != null) { + fieldMapBuilder.put("project", project); + } + if (endpoint != null) { + fieldMapBuilder.put("endpoint", endpoint); + } + fieldValuesMap = fieldMapBuilder.build(); + } + } + } + return fieldValuesMap; + } + + public String getFieldValue(String fieldName) { + return getFieldValuesMap().get(fieldName); + } + + @Override + public String toString() { + return PROJECT_ENDPOINT.instantiate("project", project, "endpoint", endpoint); + } + + @Override + public boolean equals(Object o) { + if (o == this) { + return true; + } + if (o != null || getClass() == o.getClass()) { + EndpointName that = ((EndpointName) o); + return Objects.equals(this.project, that.project) + && Objects.equals(this.endpoint, that.endpoint); + } + return false; + } + + @Override + public int hashCode() { + int h = 1; + h *= 1000003; + h ^= Objects.hashCode(project); + h *= 1000003; + h ^= Objects.hashCode(endpoint); + return h; + } + + /** Builder for projects/{project}/endpoints/{endpoint}. */ + public static class Builder { + private String project; + private String endpoint; + + protected Builder() {} + + public String getProject() { + return project; + } + + public String getEndpoint() { + return endpoint; + } + + public Builder setProject(String project) { + this.project = project; + return this; + } + + public Builder setEndpoint(String endpoint) { + this.endpoint = endpoint; + return this; + } + + private Builder(EndpointName endpointName) { + this.project = endpointName.project; + this.endpoint = endpointName.endpoint; + } + + public EndpointName build() { + return new EndpointName(this); + } + } +} diff --git a/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/MockConnectionService.java b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/MockConnectionService.java new file mode 100644 index 0000000000..689619cd60 --- /dev/null +++ b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/MockConnectionService.java @@ -0,0 +1,59 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1; + +import com.google.api.core.BetaApi; +import com.google.api.gax.grpc.testing.MockGrpcService; +import com.google.protobuf.AbstractMessage; +import io.grpc.ServerServiceDefinition; +import java.util.List; +import javax.annotation.Generated; + +@BetaApi +@Generated("by gapic-generator-java") +public class MockConnectionService implements MockGrpcService { + private final MockConnectionServiceImpl serviceImpl; + + public MockConnectionService() { + serviceImpl = new MockConnectionServiceImpl(); + } + + @Override + public List getRequests() { + return serviceImpl.getRequests(); + } + + @Override + public void addResponse(AbstractMessage response) { + serviceImpl.addResponse(response); + } + + @Override + public void addException(Exception exception) { + serviceImpl.addException(exception); + } + + @Override + public ServerServiceDefinition getServiceDefinition() { + return serviceImpl.bindService(); + } + + @Override + public void reset() { + serviceImpl.reset(); + } +} diff --git a/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/MockConnectionServiceImpl.java b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/MockConnectionServiceImpl.java new file mode 100644 index 0000000000..b56c59b7bd --- /dev/null +++ b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/MockConnectionServiceImpl.java @@ -0,0 +1,81 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1; + +import com.google.api.core.BetaApi; +import com.google.cloud.apigeeconnect.v1.ConnectionServiceGrpc.ConnectionServiceImplBase; +import com.google.protobuf.AbstractMessage; +import io.grpc.stub.StreamObserver; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; +import javax.annotation.Generated; + +@BetaApi +@Generated("by gapic-generator-java") +public class MockConnectionServiceImpl extends ConnectionServiceImplBase { + private List requests; + private Queue responses; + + public MockConnectionServiceImpl() { + requests = new ArrayList<>(); + responses = new LinkedList<>(); + } + + public List getRequests() { + return requests; + } + + public void addResponse(AbstractMessage response) { + responses.add(response); + } + + public void setResponses(List responses) { + this.responses = new LinkedList(responses); + } + + public void addException(Exception exception) { + responses.add(exception); + } + + public void reset() { + requests = new ArrayList<>(); + responses = new LinkedList<>(); + } + + @Override + public void listConnections( + ListConnectionsRequest request, StreamObserver responseObserver) { + Object response = responses.poll(); + if (response instanceof ListConnectionsResponse) { + requests.add(request); + responseObserver.onNext(((ListConnectionsResponse) response)); + responseObserver.onCompleted(); + } else if (response instanceof Exception) { + responseObserver.onError(((Exception) response)); + } else { + responseObserver.onError( + new IllegalArgumentException( + String.format( + "Unrecognized response type %s for method ListConnections, expected %s or %s", + response == null ? "null" : response.getClass().getName(), + ListConnectionsResponse.class.getName(), + Exception.class.getName()))); + } + } +} diff --git a/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/MockTether.java b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/MockTether.java new file mode 100644 index 0000000000..dcb2167abc --- /dev/null +++ b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/MockTether.java @@ -0,0 +1,59 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1; + +import com.google.api.core.BetaApi; +import com.google.api.gax.grpc.testing.MockGrpcService; +import com.google.protobuf.AbstractMessage; +import io.grpc.ServerServiceDefinition; +import java.util.List; +import javax.annotation.Generated; + +@BetaApi +@Generated("by gapic-generator-java") +public class MockTether implements MockGrpcService { + private final MockTetherImpl serviceImpl; + + public MockTether() { + serviceImpl = new MockTetherImpl(); + } + + @Override + public List getRequests() { + return serviceImpl.getRequests(); + } + + @Override + public void addResponse(AbstractMessage response) { + serviceImpl.addResponse(response); + } + + @Override + public void addException(Exception exception) { + serviceImpl.addException(exception); + } + + @Override + public ServerServiceDefinition getServiceDefinition() { + return serviceImpl.bindService(); + } + + @Override + public void reset() { + serviceImpl.reset(); + } +} diff --git a/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/MockTetherImpl.java b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/MockTetherImpl.java new file mode 100644 index 0000000000..178bbe5ada --- /dev/null +++ b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/MockTetherImpl.java @@ -0,0 +1,97 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1; + +import com.google.api.core.BetaApi; +import com.google.cloud.apigeeconnect.v1.TetherGrpc.TetherImplBase; +import com.google.protobuf.AbstractMessage; +import io.grpc.stub.StreamObserver; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; +import javax.annotation.Generated; + +@BetaApi +@Generated("by gapic-generator-java") +public class MockTetherImpl extends TetherImplBase { + private List requests; + private Queue responses; + + public MockTetherImpl() { + requests = new ArrayList<>(); + responses = new LinkedList<>(); + } + + public List getRequests() { + return requests; + } + + public void addResponse(AbstractMessage response) { + responses.add(response); + } + + public void setResponses(List responses) { + this.responses = new LinkedList(responses); + } + + public void addException(Exception exception) { + responses.add(exception); + } + + public void reset() { + requests = new ArrayList<>(); + responses = new LinkedList<>(); + } + + @Override + public StreamObserver egress( + final StreamObserver responseObserver) { + StreamObserver requestObserver = + new StreamObserver() { + @Override + public void onNext(EgressResponse value) { + requests.add(value); + final Object response = responses.remove(); + if (response instanceof EgressRequest) { + responseObserver.onNext(((EgressRequest) response)); + } else if (response instanceof Exception) { + responseObserver.onError(((Exception) response)); + } else { + responseObserver.onError( + new IllegalArgumentException( + String.format( + "Unrecognized response type %s for method Egress, expected %s or %s", + response == null ? "null" : response.getClass().getName(), + EgressRequest.class.getName(), + Exception.class.getName()))); + } + } + + @Override + public void onError(Throwable t) { + responseObserver.onError(t); + } + + @Override + public void onCompleted() { + responseObserver.onCompleted(); + } + }; + return requestObserver; + } +} diff --git a/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/TetherClient.java b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/TetherClient.java new file mode 100644 index 0000000000..e376843051 --- /dev/null +++ b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/TetherClient.java @@ -0,0 +1,232 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1; + +import com.google.api.gax.core.BackgroundResource; +import com.google.api.gax.rpc.BidiStreamingCallable; +import com.google.cloud.apigeeconnect.v1.stub.TetherStub; +import com.google.cloud.apigeeconnect.v1.stub.TetherStubSettings; +import java.io.IOException; +import java.util.concurrent.TimeUnit; +import javax.annotation.Generated; + +// AUTO-GENERATED DOCUMENTATION AND CLASS. +/** + * Service Description: Tether provides a way for the control plane to send HTTP API requests to + * services in data planes that runs in a remote datacenter without requiring customers to open + * firewalls on their runtime plane. + * + *

This class provides the ability to make remote calls to the backing service through method + * calls that map to API methods. Sample code to get started: + * + *

{@code
+ * // This snippet has been automatically generated and should be regarded as a code template only.
+ * // It will require modifications to work:
+ * // - It may require correct/in-range values for request initialization.
+ * // - It may require specifying regional endpoints when creating the service client as shown in
+ * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+ * try (TetherClient tetherClient = TetherClient.create()) {
+ *   BidiStream bidiStream = tetherClient.egressCallable().call();
+ *   EgressResponse request =
+ *       EgressResponse.newBuilder()
+ *           .setId("id3355")
+ *           .setHttpResponse(HttpResponse.newBuilder().build())
+ *           .setStatus(Status.newBuilder().build())
+ *           .setProject("project-309310695")
+ *           .setTraceId("traceId-1067401920")
+ *           .setEndpoint(TetherEndpoint.forNumber(0))
+ *           .setName("name3373707")
+ *           .build();
+ *   bidiStream.send(request);
+ *   for (EgressRequest response : bidiStream) {
+ *     // Do something when a response is received.
+ *   }
+ * }
+ * }
+ * + *

Note: close() needs to be called on the TetherClient object to clean up resources such as + * threads. In the example above, try-with-resources is used, which automatically calls close(). + * + *

The surface of this class includes several types of Java methods for each of the API's + * methods: + * + *

    + *
  1. A "flattened" method. With this type of method, the fields of the request type have been + * converted into function parameters. It may be the case that not all fields are available as + * parameters, and not every API method will have a flattened method entry point. + *
  2. A "request object" method. This type of method only takes one parameter, a request object, + * which must be constructed before the call. Not every API method will have a request object + * method. + *
  3. A "callable" method. This type of method takes no parameters and returns an immutable API + * callable object, which can be used to initiate calls to the service. + *
+ * + *

See the individual methods for example code. + * + *

Many parameters require resource names to be formatted in a particular way. To assist with + * these names, this class includes a format method for each type of name, and additionally a parse + * method to extract the individual identifiers contained within names that are returned. + * + *

This class can be customized by passing in a custom instance of TetherSettings to create(). + * For example: + * + *

To customize credentials: + * + *

{@code
+ * // This snippet has been automatically generated and should be regarded as a code template only.
+ * // It will require modifications to work:
+ * // - It may require correct/in-range values for request initialization.
+ * // - It may require specifying regional endpoints when creating the service client as shown in
+ * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+ * TetherSettings tetherSettings =
+ *     TetherSettings.newBuilder()
+ *         .setCredentialsProvider(FixedCredentialsProvider.create(myCredentials))
+ *         .build();
+ * TetherClient tetherClient = TetherClient.create(tetherSettings);
+ * }
+ * + *

To customize the endpoint: + * + *

{@code
+ * // This snippet has been automatically generated and should be regarded as a code template only.
+ * // It will require modifications to work:
+ * // - It may require correct/in-range values for request initialization.
+ * // - It may require specifying regional endpoints when creating the service client as shown in
+ * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+ * TetherSettings tetherSettings = TetherSettings.newBuilder().setEndpoint(myEndpoint).build();
+ * TetherClient tetherClient = TetherClient.create(tetherSettings);
+ * }
+ * + *

Please refer to the GitHub repository's samples for more quickstart code snippets. + */ +@Generated("by gapic-generator-java") +public class TetherClient implements BackgroundResource { + private final TetherSettings settings; + private final TetherStub stub; + + /** Constructs an instance of TetherClient with default settings. */ + public static final TetherClient create() throws IOException { + return create(TetherSettings.newBuilder().build()); + } + + /** + * Constructs an instance of TetherClient, using the given settings. The channels are created + * based on the settings passed in, or defaults for any settings that are not set. + */ + public static final TetherClient create(TetherSettings settings) throws IOException { + return new TetherClient(settings); + } + + /** + * Constructs an instance of TetherClient, using the given stub for making calls. This is for + * advanced usage - prefer using create(TetherSettings). + */ + public static final TetherClient create(TetherStub stub) { + return new TetherClient(stub); + } + + /** + * Constructs an instance of TetherClient, 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 TetherClient(TetherSettings settings) throws IOException { + this.settings = settings; + this.stub = ((TetherStubSettings) settings.getStubSettings()).createStub(); + } + + protected TetherClient(TetherStub stub) { + this.settings = null; + this.stub = stub; + } + + public final TetherSettings getSettings() { + return settings; + } + + public TetherStub getStub() { + return stub; + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Egress streams egress requests and responses. Logically, this is not actually a streaming + * request, but uses streaming as a mechanism to flip the client-server relationship of gRPC so + * that the server can act as a client. The listener, the RPC server, accepts connections from the + * dialer, the RPC client. The listener streams http requests and the dialer streams http + * responses. + * + *

Sample code: + * + *

{@code
+   * // This snippet has been automatically generated and should be regarded as a code template only.
+   * // It will require modifications to work:
+   * // - It may require correct/in-range values for request initialization.
+   * // - It may require specifying regional endpoints when creating the service client as shown in
+   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+   * try (TetherClient tetherClient = TetherClient.create()) {
+   *   BidiStream bidiStream = tetherClient.egressCallable().call();
+   *   EgressResponse request =
+   *       EgressResponse.newBuilder()
+   *           .setId("id3355")
+   *           .setHttpResponse(HttpResponse.newBuilder().build())
+   *           .setStatus(Status.newBuilder().build())
+   *           .setProject("project-309310695")
+   *           .setTraceId("traceId-1067401920")
+   *           .setEndpoint(TetherEndpoint.forNumber(0))
+   *           .setName("name3373707")
+   *           .build();
+   *   bidiStream.send(request);
+   *   for (EgressRequest response : bidiStream) {
+   *     // Do something when a response is received.
+   *   }
+   * }
+   * }
+ */ + public final BidiStreamingCallable egressCallable() { + return stub.egressCallable(); + } + + @Override + public final void close() { + stub.close(); + } + + @Override + public void shutdown() { + stub.shutdown(); + } + + @Override + public boolean isShutdown() { + return stub.isShutdown(); + } + + @Override + public boolean isTerminated() { + return stub.isTerminated(); + } + + @Override + public void shutdownNow() { + stub.shutdownNow(); + } + + @Override + public boolean awaitTermination(long duration, TimeUnit unit) throws InterruptedException { + return stub.awaitTermination(duration, unit); + } +} diff --git a/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/TetherClientTest.java b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/TetherClientTest.java new file mode 100644 index 0000000000..50f8fe5aab --- /dev/null +++ b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/TetherClientTest.java @@ -0,0 +1,151 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1; + +import com.google.api.gax.core.NoCredentialsProvider; +import com.google.api.gax.grpc.testing.LocalChannelProvider; +import com.google.api.gax.grpc.testing.MockGrpcService; +import com.google.api.gax.grpc.testing.MockServiceHelper; +import com.google.api.gax.grpc.testing.MockStreamObserver; +import com.google.api.gax.rpc.ApiStreamObserver; +import com.google.api.gax.rpc.BidiStreamingCallable; +import com.google.api.gax.rpc.InvalidArgumentException; +import com.google.api.gax.rpc.StatusCode; +import com.google.protobuf.Duration; +import com.google.rpc.Status; +import io.grpc.StatusRuntimeException; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.ExecutionException; +import javax.annotation.Generated; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +@Generated("by gapic-generator-java") +public class TetherClientTest { + private static MockServiceHelper mockServiceHelper; + private static MockTether mockTether; + private LocalChannelProvider channelProvider; + private TetherClient client; + + @BeforeClass + public static void startStaticServer() { + mockTether = new MockTether(); + mockServiceHelper = + new MockServiceHelper( + UUID.randomUUID().toString(), Arrays.asList(mockTether)); + mockServiceHelper.start(); + } + + @AfterClass + public static void stopServer() { + mockServiceHelper.stop(); + } + + @Before + public void setUp() throws IOException { + mockServiceHelper.reset(); + channelProvider = mockServiceHelper.createChannelProvider(); + TetherSettings settings = + TetherSettings.newBuilder() + .setTransportChannelProvider(channelProvider) + .setCredentialsProvider(NoCredentialsProvider.create()) + .build(); + client = TetherClient.create(settings); + } + + @After + public void tearDown() throws Exception { + client.close(); + } + + @Test + public void egressTest() throws Exception { + EgressRequest expectedResponse = + EgressRequest.newBuilder() + .setId("id3355") + .setPayload(Payload.newBuilder().build()) + .setEndpoint(TetherEndpoint.forNumber(0)) + .setProject("project-309310695") + .setTraceId("traceId-1067401920") + .setTimeout(Duration.newBuilder().build()) + .build(); + mockTether.addResponse(expectedResponse); + EgressResponse request = + EgressResponse.newBuilder() + .setId("id3355") + .setHttpResponse(HttpResponse.newBuilder().build()) + .setStatus(Status.newBuilder().build()) + .setProject("project-309310695") + .setTraceId("traceId-1067401920") + .setEndpoint(TetherEndpoint.forNumber(0)) + .setName("name3373707") + .build(); + + MockStreamObserver responseObserver = new MockStreamObserver<>(); + + BidiStreamingCallable callable = client.egressCallable(); + ApiStreamObserver requestObserver = + callable.bidiStreamingCall(responseObserver); + + requestObserver.onNext(request); + requestObserver.onCompleted(); + + List actualResponses = responseObserver.future().get(); + Assert.assertEquals(1, actualResponses.size()); + Assert.assertEquals(expectedResponse, actualResponses.get(0)); + } + + @Test + public void egressExceptionTest() throws Exception { + StatusRuntimeException exception = new StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT); + mockTether.addException(exception); + EgressResponse request = + EgressResponse.newBuilder() + .setId("id3355") + .setHttpResponse(HttpResponse.newBuilder().build()) + .setStatus(Status.newBuilder().build()) + .setProject("project-309310695") + .setTraceId("traceId-1067401920") + .setEndpoint(TetherEndpoint.forNumber(0)) + .setName("name3373707") + .build(); + + MockStreamObserver responseObserver = new MockStreamObserver<>(); + + BidiStreamingCallable callable = client.egressCallable(); + ApiStreamObserver requestObserver = + callable.bidiStreamingCall(responseObserver); + + requestObserver.onNext(request); + + try { + List actualResponses = responseObserver.future().get(); + Assert.fail("No exception thrown"); + } catch (ExecutionException e) { + Assert.assertTrue(e.getCause() instanceof InvalidArgumentException); + InvalidArgumentException apiException = ((InvalidArgumentException) e.getCause()); + Assert.assertEquals(StatusCode.Code.INVALID_ARGUMENT, apiException.getStatusCode().getCode()); + } + } +} diff --git a/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/TetherSettings.java b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/TetherSettings.java new file mode 100644 index 0000000000..9c6b02565d --- /dev/null +++ b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/TetherSettings.java @@ -0,0 +1,186 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1; + +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.ClientContext; +import com.google.api.gax.rpc.ClientSettings; +import com.google.api.gax.rpc.StreamingCallSettings; +import com.google.api.gax.rpc.StubSettings; +import com.google.api.gax.rpc.TransportChannelProvider; +import com.google.api.gax.rpc.UnaryCallSettings; +import com.google.cloud.apigeeconnect.v1.stub.TetherStubSettings; +import java.io.IOException; +import java.util.List; +import javax.annotation.Generated; + +// AUTO-GENERATED DOCUMENTATION AND CLASS. +/** + * Settings class to configure an instance of {@link TetherClient}. + * + *

The default instance has everything set to sensible defaults: + * + *

    + *
  • The default service address (apigeeconnect.googleapis.com) and default port (443) are used. + *
  • Credentials are acquired automatically through Application Default Credentials. + *
  • Retries are configured for idempotent methods but not for non-idempotent methods. + *
+ * + *

The builder of this class is recursive, so contained classes are themselves builders. When + * build() is called, the tree of builders is called to create the complete settings object. + * + *

For example, to set the total timeout of egress to 30 seconds: + * + *

{@code
+ * // This snippet has been automatically generated and should be regarded as a code template only.
+ * // It will require modifications to work:
+ * // - It may require correct/in-range values for request initialization.
+ * // - It may require specifying regional endpoints when creating the service client as shown in
+ * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+ * TetherSettings.Builder tetherSettingsBuilder = TetherSettings.newBuilder();
+ * tetherSettingsBuilder
+ *     .egressSettings()
+ *     .setRetrySettings(
+ *         tetherSettingsBuilder
+ *             .egressSettings()
+ *             .getRetrySettings()
+ *             .toBuilder()
+ *             .setTotalTimeout(Duration.ofSeconds(30))
+ *             .build());
+ * TetherSettings tetherSettings = tetherSettingsBuilder.build();
+ * }
+ */ +@Generated("by gapic-generator-java") +public class TetherSettings extends ClientSettings { + + /** Returns the object with the settings used for calls to egress. */ + public StreamingCallSettings egressSettings() { + return ((TetherStubSettings) getStubSettings()).egressSettings(); + } + + public static final TetherSettings create(TetherStubSettings stub) throws IOException { + return new TetherSettings.Builder(stub.toBuilder()).build(); + } + + /** Returns a builder for the default ExecutorProvider for this service. */ + public static InstantiatingExecutorProvider.Builder defaultExecutorProviderBuilder() { + return TetherStubSettings.defaultExecutorProviderBuilder(); + } + + /** Returns the default service endpoint. */ + public static String getDefaultEndpoint() { + return TetherStubSettings.getDefaultEndpoint(); + } + + /** Returns the default service scopes. */ + public static List getDefaultServiceScopes() { + return TetherStubSettings.getDefaultServiceScopes(); + } + + /** Returns a builder for the default credentials for this service. */ + public static GoogleCredentialsProvider.Builder defaultCredentialsProviderBuilder() { + return TetherStubSettings.defaultCredentialsProviderBuilder(); + } + + /** Returns a builder for the default gRPC ChannelProvider for this service. */ + public static InstantiatingGrpcChannelProvider.Builder defaultGrpcTransportProviderBuilder() { + return TetherStubSettings.defaultGrpcTransportProviderBuilder(); + } + + public static TransportChannelProvider defaultTransportChannelProvider() { + return TetherStubSettings.defaultTransportChannelProvider(); + } + + @BetaApi("The surface for customizing headers is not stable yet and may change in the future.") + public static ApiClientHeaderProvider.Builder defaultApiClientHeaderProviderBuilder() { + return TetherStubSettings.defaultApiClientHeaderProviderBuilder(); + } + + /** Returns a new gRPC builder for this class. */ + public static Builder newBuilder() { + return Builder.createDefault(); + } + + /** Returns a new builder for this class. */ + public static Builder newBuilder(ClientContext clientContext) { + return new Builder(clientContext); + } + + /** Returns a builder containing all the values of this settings class. */ + public Builder toBuilder() { + return new Builder(this); + } + + protected TetherSettings(Builder settingsBuilder) throws IOException { + super(settingsBuilder); + } + + /** Builder for TetherSettings. */ + public static class Builder extends ClientSettings.Builder { + + protected Builder() throws IOException { + this(((ClientContext) null)); + } + + protected Builder(ClientContext clientContext) { + super(TetherStubSettings.newBuilder(clientContext)); + } + + protected Builder(TetherSettings settings) { + super(settings.getStubSettings().toBuilder()); + } + + protected Builder(TetherStubSettings.Builder stubSettings) { + super(stubSettings); + } + + private static Builder createDefault() { + return new Builder(TetherStubSettings.newBuilder()); + } + + public TetherStubSettings.Builder getStubSettingsBuilder() { + return ((TetherStubSettings.Builder) getStubSettings()); + } + + /** + * Applies the given settings updater function to all of the unary API methods in this service. + * + *

Note: This method does not support applying settings to streaming methods. + */ + public Builder applyToAllUnaryMethods( + ApiFunction, Void> settingsUpdater) { + super.applyToAllUnaryMethods( + getStubSettingsBuilder().unaryMethodSettingsBuilders(), settingsUpdater); + return this; + } + + /** Returns the builder for the settings used for calls to egress. */ + public StreamingCallSettings.Builder egressSettings() { + return getStubSettingsBuilder().egressSettings(); + } + + @Override + public TetherSettings build() throws IOException { + return new TetherSettings(this); + } + } +} diff --git a/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/gapic_metadata.json b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/gapic_metadata.json new file mode 100644 index 0000000000..3a2757f4ca --- /dev/null +++ b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/gapic_metadata.json @@ -0,0 +1,33 @@ +{ + "schema": "1.0", + "comment": "This file maps proto services/RPCs to the corresponding library clients/methods", + "language": "java", + "protoPackage": "google.cloud.apigeeconnect.v1", + "libraryPackage": "com.google.cloud.apigeeconnect.v1", + "services": { + "ConnectionService": { + "clients": { + "grpc": { + "libraryClient": "ConnectionServiceClient", + "rpcs": { + "ListConnections": { + "methods": ["listConnections", "listConnections", "listConnections", "listConnectionsPagedCallable", "listConnectionsCallable"] + } + } + } + } + }, + "Tether": { + "clients": { + "grpc": { + "libraryClient": "TetherClient", + "rpcs": { + "Egress": { + "methods": ["egressCallable"] + } + } + } + } + } + } +} \ No newline at end of file diff --git a/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/package-info.java b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/package-info.java new file mode 100644 index 0000000000..085161a7eb --- /dev/null +++ b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/package-info.java @@ -0,0 +1,76 @@ +/* + * Copyright 2022 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 + * + * https://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. + */ + +/** + * The interfaces provided are listed below, along with usage samples. + * + *

======================= ConnectionServiceClient ======================= + * + *

Service Description: Service Interface for the Apigee Connect connection management APIs. + * + *

Sample for ConnectionServiceClient: + * + *

{@code
+ * // This snippet has been automatically generated and should be regarded as a code template only.
+ * // It will require modifications to work:
+ * // - It may require correct/in-range values for request initialization.
+ * // - It may require specifying regional endpoints when creating the service client as shown in
+ * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+ * try (ConnectionServiceClient connectionServiceClient = ConnectionServiceClient.create()) {
+ *   EndpointName parent = EndpointName.of("[PROJECT]", "[ENDPOINT]");
+ *   for (Connection element : connectionServiceClient.listConnections(parent).iterateAll()) {
+ *     // doThingsWith(element);
+ *   }
+ * }
+ * }
+ * + *

======================= TetherClient ======================= + * + *

Service Description: Tether provides a way for the control plane to send HTTP API requests to + * services in data planes that runs in a remote datacenter without requiring customers to open + * firewalls on their runtime plane. + * + *

Sample for TetherClient: + * + *

{@code
+ * // This snippet has been automatically generated and should be regarded as a code template only.
+ * // It will require modifications to work:
+ * // - It may require correct/in-range values for request initialization.
+ * // - It may require specifying regional endpoints when creating the service client as shown in
+ * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+ * try (TetherClient tetherClient = TetherClient.create()) {
+ *   BidiStream bidiStream = tetherClient.egressCallable().call();
+ *   EgressResponse request =
+ *       EgressResponse.newBuilder()
+ *           .setId("id3355")
+ *           .setHttpResponse(HttpResponse.newBuilder().build())
+ *           .setStatus(Status.newBuilder().build())
+ *           .setProject("project-309310695")
+ *           .setTraceId("traceId-1067401920")
+ *           .setEndpoint(TetherEndpoint.forNumber(0))
+ *           .setName("name3373707")
+ *           .build();
+ *   bidiStream.send(request);
+ *   for (EgressRequest response : bidiStream) {
+ *     // Do something when a response is received.
+ *   }
+ * }
+ * }
+ */ +@Generated("by gapic-generator-java") +package com.google.cloud.apigeeconnect.v1; + +import javax.annotation.Generated; diff --git a/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/ConnectionServiceStub.java b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/ConnectionServiceStub.java new file mode 100644 index 0000000000..77156a6000 --- /dev/null +++ b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/ConnectionServiceStub.java @@ -0,0 +1,47 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1.stub; + +import static com.google.cloud.apigeeconnect.v1.ConnectionServiceClient.ListConnectionsPagedResponse; + +import com.google.api.gax.core.BackgroundResource; +import com.google.api.gax.rpc.UnaryCallable; +import com.google.cloud.apigeeconnect.v1.ListConnectionsRequest; +import com.google.cloud.apigeeconnect.v1.ListConnectionsResponse; +import javax.annotation.Generated; + +// AUTO-GENERATED DOCUMENTATION AND CLASS. +/** + * Base stub class for the ConnectionService service API. + * + *

This class is for advanced usage and reflects the underlying API directly. + */ +@Generated("by gapic-generator-java") +public abstract class ConnectionServiceStub implements BackgroundResource { + + public UnaryCallable + listConnectionsPagedCallable() { + throw new UnsupportedOperationException("Not implemented: listConnectionsPagedCallable()"); + } + + public UnaryCallable listConnectionsCallable() { + throw new UnsupportedOperationException("Not implemented: listConnectionsCallable()"); + } + + @Override + public abstract void close(); +} diff --git a/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/ConnectionServiceStubSettings.java b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/ConnectionServiceStubSettings.java new file mode 100644 index 0000000000..19103472ab --- /dev/null +++ b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/ConnectionServiceStubSettings.java @@ -0,0 +1,402 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1.stub; + +import static com.google.cloud.apigeeconnect.v1.ConnectionServiceClient.ListConnectionsPagedResponse; + +import com.google.api.core.ApiFunction; +import com.google.api.core.ApiFuture; +import com.google.api.core.BetaApi; +import com.google.api.gax.core.GaxProperties; +import com.google.api.gax.core.GoogleCredentialsProvider; +import com.google.api.gax.core.InstantiatingExecutorProvider; +import com.google.api.gax.grpc.GaxGrpcProperties; +import com.google.api.gax.grpc.GrpcTransportChannel; +import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider; +import com.google.api.gax.httpjson.GaxHttpJsonProperties; +import com.google.api.gax.httpjson.HttpJsonTransportChannel; +import com.google.api.gax.httpjson.InstantiatingHttpJsonChannelProvider; +import com.google.api.gax.retrying.RetrySettings; +import com.google.api.gax.rpc.ApiCallContext; +import com.google.api.gax.rpc.ApiClientHeaderProvider; +import com.google.api.gax.rpc.ClientContext; +import com.google.api.gax.rpc.PageContext; +import com.google.api.gax.rpc.PagedCallSettings; +import com.google.api.gax.rpc.PagedListDescriptor; +import com.google.api.gax.rpc.PagedListResponseFactory; +import com.google.api.gax.rpc.StatusCode; +import com.google.api.gax.rpc.StubSettings; +import com.google.api.gax.rpc.TransportChannelProvider; +import com.google.api.gax.rpc.UnaryCallSettings; +import com.google.api.gax.rpc.UnaryCallable; +import com.google.cloud.apigeeconnect.v1.Connection; +import com.google.cloud.apigeeconnect.v1.ListConnectionsRequest; +import com.google.cloud.apigeeconnect.v1.ListConnectionsResponse; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Lists; +import java.io.IOException; +import java.util.List; +import javax.annotation.Generated; +import org.threeten.bp.Duration; + +// AUTO-GENERATED DOCUMENTATION AND CLASS. +/** + * Settings class to configure an instance of {@link ConnectionServiceStub}. + * + *

The default instance has everything set to sensible defaults: + * + *

    + *
  • The default service address (apigeeconnect.googleapis.com) and default port (443) are used. + *
  • Credentials are acquired automatically through Application Default Credentials. + *
  • Retries are configured for idempotent methods but not for non-idempotent methods. + *
+ * + *

The builder of this class is recursive, so contained classes are themselves builders. When + * build() is called, the tree of builders is called to create the complete settings object. + * + *

For example, to set the total timeout of listConnections to 30 seconds: + * + *

{@code
+ * // This snippet has been automatically generated and should be regarded as a code template only.
+ * // It will require modifications to work:
+ * // - It may require correct/in-range values for request initialization.
+ * // - It may require specifying regional endpoints when creating the service client as shown in
+ * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+ * ConnectionServiceStubSettings.Builder connectionServiceSettingsBuilder =
+ *     ConnectionServiceStubSettings.newBuilder();
+ * connectionServiceSettingsBuilder
+ *     .listConnectionsSettings()
+ *     .setRetrySettings(
+ *         connectionServiceSettingsBuilder
+ *             .listConnectionsSettings()
+ *             .getRetrySettings()
+ *             .toBuilder()
+ *             .setTotalTimeout(Duration.ofSeconds(30))
+ *             .build());
+ * ConnectionServiceStubSettings connectionServiceSettings =
+ *     connectionServiceSettingsBuilder.build();
+ * }
+ */ +@Generated("by gapic-generator-java") +public class ConnectionServiceStubSettings extends StubSettings { + /** The default scopes of the service. */ + private static final ImmutableList DEFAULT_SERVICE_SCOPES = + ImmutableList.builder().add("https://www.googleapis.com/auth/cloud-platform").build(); + + private final PagedCallSettings< + ListConnectionsRequest, ListConnectionsResponse, ListConnectionsPagedResponse> + listConnectionsSettings; + + private static final PagedListDescriptor< + ListConnectionsRequest, ListConnectionsResponse, Connection> + LIST_CONNECTIONS_PAGE_STR_DESC = + new PagedListDescriptor() { + @Override + public String emptyToken() { + return ""; + } + + @Override + public ListConnectionsRequest injectToken( + ListConnectionsRequest payload, String token) { + return ListConnectionsRequest.newBuilder(payload).setPageToken(token).build(); + } + + @Override + public ListConnectionsRequest injectPageSize( + ListConnectionsRequest payload, int pageSize) { + return ListConnectionsRequest.newBuilder(payload).setPageSize(pageSize).build(); + } + + @Override + public Integer extractPageSize(ListConnectionsRequest payload) { + return payload.getPageSize(); + } + + @Override + public String extractNextToken(ListConnectionsResponse payload) { + return payload.getNextPageToken(); + } + + @Override + public Iterable extractResources(ListConnectionsResponse payload) { + return payload.getConnectionsList() == null + ? ImmutableList.of() + : payload.getConnectionsList(); + } + }; + + private static final PagedListResponseFactory< + ListConnectionsRequest, ListConnectionsResponse, ListConnectionsPagedResponse> + LIST_CONNECTIONS_PAGE_STR_FACT = + new PagedListResponseFactory< + ListConnectionsRequest, ListConnectionsResponse, ListConnectionsPagedResponse>() { + @Override + public ApiFuture getFuturePagedResponse( + UnaryCallable callable, + ListConnectionsRequest request, + ApiCallContext context, + ApiFuture futureResponse) { + PageContext pageContext = + PageContext.create(callable, LIST_CONNECTIONS_PAGE_STR_DESC, request, context); + return ListConnectionsPagedResponse.createAsync(pageContext, futureResponse); + } + }; + + /** Returns the object with the settings used for calls to listConnections. */ + public PagedCallSettings< + ListConnectionsRequest, ListConnectionsResponse, ListConnectionsPagedResponse> + listConnectionsSettings() { + return listConnectionsSettings; + } + + public ConnectionServiceStub createStub() throws IOException { + if (getTransportChannelProvider() + .getTransportName() + .equals(GrpcTransportChannel.getGrpcTransportName())) { + return GrpcConnectionServiceStub.create(this); + } + if (getTransportChannelProvider() + .getTransportName() + .equals(HttpJsonTransportChannel.getHttpJsonTransportName())) { + return HttpJsonConnectionServiceStub.create(this); + } + throw new UnsupportedOperationException( + String.format( + "Transport not supported: %s", getTransportChannelProvider().getTransportName())); + } + + /** Returns a builder for the default ExecutorProvider for this service. */ + public static InstantiatingExecutorProvider.Builder defaultExecutorProviderBuilder() { + return InstantiatingExecutorProvider.newBuilder(); + } + + /** Returns the default service endpoint. */ + public static String getDefaultEndpoint() { + return "apigeeconnect.googleapis.com:443"; + } + + /** Returns the default mTLS service endpoint. */ + public static String getDefaultMtlsEndpoint() { + return "apigeeconnect.mtls.googleapis.com:443"; + } + + /** Returns the default service scopes. */ + public static List getDefaultServiceScopes() { + return DEFAULT_SERVICE_SCOPES; + } + + /** Returns a builder for the default credentials for this service. */ + public static GoogleCredentialsProvider.Builder defaultCredentialsProviderBuilder() { + return GoogleCredentialsProvider.newBuilder() + .setScopesToApply(DEFAULT_SERVICE_SCOPES) + .setUseJwtAccessWithScope(true); + } + + /** Returns a builder for the default gRPC ChannelProvider for this service. */ + public static InstantiatingGrpcChannelProvider.Builder defaultGrpcTransportProviderBuilder() { + return InstantiatingGrpcChannelProvider.newBuilder() + .setMaxInboundMessageSize(Integer.MAX_VALUE); + } + + /** Returns a builder for the default REST ChannelProvider for this service. */ + @BetaApi + public static InstantiatingHttpJsonChannelProvider.Builder + defaultHttpJsonTransportProviderBuilder() { + return InstantiatingHttpJsonChannelProvider.newBuilder(); + } + + public static TransportChannelProvider defaultTransportChannelProvider() { + return defaultGrpcTransportProviderBuilder().build(); + } + + @BetaApi("The surface for customizing headers is not stable yet and may change in the future.") + public static ApiClientHeaderProvider.Builder defaultGrpcApiClientHeaderProviderBuilder() { + return ApiClientHeaderProvider.newBuilder() + .setGeneratedLibToken( + "gapic", GaxProperties.getLibraryVersion(ConnectionServiceStubSettings.class)) + .setTransportToken( + GaxGrpcProperties.getGrpcTokenName(), GaxGrpcProperties.getGrpcVersion()); + } + + @BetaApi("The surface for customizing headers is not stable yet and may change in the future.") + public static ApiClientHeaderProvider.Builder defaultHttpJsonApiClientHeaderProviderBuilder() { + return ApiClientHeaderProvider.newBuilder() + .setGeneratedLibToken( + "gapic", GaxProperties.getLibraryVersion(ConnectionServiceStubSettings.class)) + .setTransportToken( + GaxHttpJsonProperties.getHttpJsonTokenName(), + GaxHttpJsonProperties.getHttpJsonVersion()); + } + + public static ApiClientHeaderProvider.Builder defaultApiClientHeaderProviderBuilder() { + return ConnectionServiceStubSettings.defaultGrpcApiClientHeaderProviderBuilder(); + } + + /** Returns a new gRPC builder for this class. */ + public static Builder newBuilder() { + return Builder.createDefault(); + } + + /** Returns a new REST builder for this class. */ + public static Builder newHttpJsonBuilder() { + return Builder.createHttpJsonDefault(); + } + + /** Returns a new builder for this class. */ + public static Builder newBuilder(ClientContext clientContext) { + return new Builder(clientContext); + } + + /** Returns a builder containing all the values of this settings class. */ + public Builder toBuilder() { + return new Builder(this); + } + + protected ConnectionServiceStubSettings(Builder settingsBuilder) throws IOException { + super(settingsBuilder); + + listConnectionsSettings = settingsBuilder.listConnectionsSettings().build(); + } + + /** Builder for ConnectionServiceStubSettings. */ + public static class Builder extends StubSettings.Builder { + private final ImmutableList> unaryMethodSettingsBuilders; + private final PagedCallSettings.Builder< + ListConnectionsRequest, ListConnectionsResponse, ListConnectionsPagedResponse> + listConnectionsSettings; + private static final ImmutableMap> + RETRYABLE_CODE_DEFINITIONS; + + static { + ImmutableMap.Builder> definitions = + ImmutableMap.builder(); + definitions.put( + "retry_policy_0_codes", + ImmutableSet.copyOf( + Lists.newArrayList( + StatusCode.Code.UNAVAILABLE, StatusCode.Code.UNKNOWN))); + RETRYABLE_CODE_DEFINITIONS = definitions.build(); + } + + private static final ImmutableMap RETRY_PARAM_DEFINITIONS; + + static { + ImmutableMap.Builder definitions = ImmutableMap.builder(); + RetrySettings settings = null; + settings = + RetrySettings.newBuilder() + .setInitialRetryDelay(Duration.ofMillis(1000L)) + .setRetryDelayMultiplier(1.3) + .setMaxRetryDelay(Duration.ofMillis(60000L)) + .setInitialRpcTimeout(Duration.ofMillis(60000L)) + .setRpcTimeoutMultiplier(1.0) + .setMaxRpcTimeout(Duration.ofMillis(60000L)) + .setTotalTimeout(Duration.ofMillis(60000L)) + .build(); + definitions.put("retry_policy_0_params", settings); + RETRY_PARAM_DEFINITIONS = definitions.build(); + } + + protected Builder() { + this(((ClientContext) null)); + } + + protected Builder(ClientContext clientContext) { + super(clientContext); + + listConnectionsSettings = PagedCallSettings.newBuilder(LIST_CONNECTIONS_PAGE_STR_FACT); + + unaryMethodSettingsBuilders = + ImmutableList.>of(listConnectionsSettings); + initDefaults(this); + } + + protected Builder(ConnectionServiceStubSettings settings) { + super(settings); + + listConnectionsSettings = settings.listConnectionsSettings.toBuilder(); + + unaryMethodSettingsBuilders = + ImmutableList.>of(listConnectionsSettings); + } + + private static Builder createDefault() { + Builder builder = new Builder(((ClientContext) null)); + + builder.setTransportChannelProvider(defaultTransportChannelProvider()); + builder.setCredentialsProvider(defaultCredentialsProviderBuilder().build()); + builder.setInternalHeaderProvider(defaultApiClientHeaderProviderBuilder().build()); + builder.setEndpoint(getDefaultEndpoint()); + builder.setMtlsEndpoint(getDefaultMtlsEndpoint()); + builder.setSwitchToMtlsEndpointAllowed(true); + + return initDefaults(builder); + } + + private static Builder createHttpJsonDefault() { + Builder builder = new Builder(((ClientContext) null)); + + builder.setTransportChannelProvider(defaultHttpJsonTransportProviderBuilder().build()); + builder.setCredentialsProvider(defaultCredentialsProviderBuilder().build()); + builder.setInternalHeaderProvider(defaultHttpJsonApiClientHeaderProviderBuilder().build()); + builder.setEndpoint(getDefaultEndpoint()); + builder.setMtlsEndpoint(getDefaultMtlsEndpoint()); + builder.setSwitchToMtlsEndpointAllowed(true); + + return initDefaults(builder); + } + + private static Builder initDefaults(Builder builder) { + builder + .listConnectionsSettings() + .setRetryableCodes(RETRYABLE_CODE_DEFINITIONS.get("retry_policy_0_codes")) + .setRetrySettings(RETRY_PARAM_DEFINITIONS.get("retry_policy_0_params")); + + return builder; + } + + /** + * Applies the given settings updater function to all of the unary API methods in this service. + * + *

Note: This method does not support applying settings to streaming methods. + */ + public Builder applyToAllUnaryMethods( + ApiFunction, Void> settingsUpdater) { + super.applyToAllUnaryMethods(unaryMethodSettingsBuilders, settingsUpdater); + return this; + } + + public ImmutableList> unaryMethodSettingsBuilders() { + return unaryMethodSettingsBuilders; + } + + /** Returns the builder for the settings used for calls to listConnections. */ + public PagedCallSettings.Builder< + ListConnectionsRequest, ListConnectionsResponse, ListConnectionsPagedResponse> + listConnectionsSettings() { + return listConnectionsSettings; + } + + @Override + public ConnectionServiceStubSettings build() throws IOException { + return new ConnectionServiceStubSettings(this); + } + } +} diff --git a/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/GrpcConnectionServiceCallableFactory.java b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/GrpcConnectionServiceCallableFactory.java new file mode 100644 index 0000000000..a4b43d630d --- /dev/null +++ b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/GrpcConnectionServiceCallableFactory.java @@ -0,0 +1,113 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1.stub; + +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.rpc.BatchingCallSettings; +import com.google.api.gax.rpc.BidiStreamingCallable; +import com.google.api.gax.rpc.ClientContext; +import com.google.api.gax.rpc.ClientStreamingCallable; +import com.google.api.gax.rpc.OperationCallSettings; +import com.google.api.gax.rpc.OperationCallable; +import com.google.api.gax.rpc.PagedCallSettings; +import com.google.api.gax.rpc.ServerStreamingCallSettings; +import com.google.api.gax.rpc.ServerStreamingCallable; +import com.google.api.gax.rpc.StreamingCallSettings; +import com.google.api.gax.rpc.UnaryCallSettings; +import com.google.api.gax.rpc.UnaryCallable; +import com.google.longrunning.Operation; +import com.google.longrunning.stub.OperationsStub; +import javax.annotation.Generated; + +// AUTO-GENERATED DOCUMENTATION AND CLASS. +/** + * gRPC callable factory implementation for the ConnectionService service API. + * + *

This class is for advanced usage. + */ +@Generated("by gapic-generator-java") +public class GrpcConnectionServiceCallableFactory implements GrpcStubCallableFactory { + + @Override + public UnaryCallable createUnaryCallable( + GrpcCallSettings grpcCallSettings, + UnaryCallSettings callSettings, + ClientContext clientContext) { + return GrpcCallableFactory.createUnaryCallable(grpcCallSettings, callSettings, clientContext); + } + + @Override + public + UnaryCallable createPagedCallable( + GrpcCallSettings grpcCallSettings, + PagedCallSettings callSettings, + ClientContext clientContext) { + return GrpcCallableFactory.createPagedCallable(grpcCallSettings, callSettings, clientContext); + } + + @Override + public UnaryCallable createBatchingCallable( + GrpcCallSettings grpcCallSettings, + BatchingCallSettings callSettings, + ClientContext clientContext) { + return GrpcCallableFactory.createBatchingCallable( + grpcCallSettings, callSettings, clientContext); + } + + @Override + public + OperationCallable createOperationCallable( + GrpcCallSettings grpcCallSettings, + OperationCallSettings callSettings, + ClientContext clientContext, + OperationsStub operationsStub) { + return GrpcCallableFactory.createOperationCallable( + grpcCallSettings, callSettings, clientContext, operationsStub); + } + + @Override + public + BidiStreamingCallable createBidiStreamingCallable( + GrpcCallSettings grpcCallSettings, + StreamingCallSettings callSettings, + ClientContext clientContext) { + return GrpcCallableFactory.createBidiStreamingCallable( + grpcCallSettings, callSettings, clientContext); + } + + @Override + public + ServerStreamingCallable createServerStreamingCallable( + GrpcCallSettings grpcCallSettings, + ServerStreamingCallSettings callSettings, + ClientContext clientContext) { + return GrpcCallableFactory.createServerStreamingCallable( + grpcCallSettings, callSettings, clientContext); + } + + @Override + public + ClientStreamingCallable createClientStreamingCallable( + GrpcCallSettings grpcCallSettings, + StreamingCallSettings callSettings, + ClientContext clientContext) { + return GrpcCallableFactory.createClientStreamingCallable( + grpcCallSettings, callSettings, clientContext); + } +} diff --git a/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/GrpcConnectionServiceStub.java b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/GrpcConnectionServiceStub.java new file mode 100644 index 0000000000..f3ab3ba895 --- /dev/null +++ b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/GrpcConnectionServiceStub.java @@ -0,0 +1,179 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1.stub; + +import static com.google.cloud.apigeeconnect.v1.ConnectionServiceClient.ListConnectionsPagedResponse; + +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.ClientContext; +import com.google.api.gax.rpc.UnaryCallable; +import com.google.cloud.apigeeconnect.v1.ListConnectionsRequest; +import com.google.cloud.apigeeconnect.v1.ListConnectionsResponse; +import com.google.common.collect.ImmutableMap; +import com.google.longrunning.stub.GrpcOperationsStub; +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 ConnectionService service API. + * + *

This class is for advanced usage and reflects the underlying API directly. + */ +@Generated("by gapic-generator-java") +public class GrpcConnectionServiceStub extends ConnectionServiceStub { + private static final MethodDescriptor + listConnectionsMethodDescriptor = + MethodDescriptor.newBuilder() + .setType(MethodDescriptor.MethodType.UNARY) + .setFullMethodName("google.cloud.apigeeconnect.v1.ConnectionService/ListConnections") + .setRequestMarshaller( + ProtoUtils.marshaller(ListConnectionsRequest.getDefaultInstance())) + .setResponseMarshaller( + ProtoUtils.marshaller(ListConnectionsResponse.getDefaultInstance())) + .build(); + + private final UnaryCallable + listConnectionsCallable; + private final UnaryCallable + listConnectionsPagedCallable; + + private final BackgroundResource backgroundResources; + private final GrpcOperationsStub operationsStub; + private final GrpcStubCallableFactory callableFactory; + + public static final GrpcConnectionServiceStub create(ConnectionServiceStubSettings settings) + throws IOException { + return new GrpcConnectionServiceStub(settings, ClientContext.create(settings)); + } + + public static final GrpcConnectionServiceStub create(ClientContext clientContext) + throws IOException { + return new GrpcConnectionServiceStub( + ConnectionServiceStubSettings.newBuilder().build(), clientContext); + } + + public static final GrpcConnectionServiceStub create( + ClientContext clientContext, GrpcStubCallableFactory callableFactory) throws IOException { + return new GrpcConnectionServiceStub( + ConnectionServiceStubSettings.newBuilder().build(), clientContext, callableFactory); + } + + /** + * Constructs an instance of GrpcConnectionServiceStub, 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 GrpcConnectionServiceStub( + ConnectionServiceStubSettings settings, ClientContext clientContext) throws IOException { + this(settings, clientContext, new GrpcConnectionServiceCallableFactory()); + } + + /** + * Constructs an instance of GrpcConnectionServiceStub, 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 GrpcConnectionServiceStub( + ConnectionServiceStubSettings settings, + ClientContext clientContext, + GrpcStubCallableFactory callableFactory) + throws IOException { + this.callableFactory = callableFactory; + this.operationsStub = GrpcOperationsStub.create(clientContext, callableFactory); + + GrpcCallSettings + listConnectionsTransportSettings = + GrpcCallSettings.newBuilder() + .setMethodDescriptor(listConnectionsMethodDescriptor) + .setParamsExtractor( + request -> { + ImmutableMap.Builder params = ImmutableMap.builder(); + params.put("parent", String.valueOf(request.getParent())); + return params.build(); + }) + .build(); + + this.listConnectionsCallable = + callableFactory.createUnaryCallable( + listConnectionsTransportSettings, settings.listConnectionsSettings(), clientContext); + this.listConnectionsPagedCallable = + callableFactory.createPagedCallable( + listConnectionsTransportSettings, settings.listConnectionsSettings(), clientContext); + + this.backgroundResources = + new BackgroundResourceAggregation(clientContext.getBackgroundResources()); + } + + public GrpcOperationsStub getOperationsStub() { + return operationsStub; + } + + @Override + public UnaryCallable listConnectionsCallable() { + return listConnectionsCallable; + } + + @Override + public UnaryCallable + listConnectionsPagedCallable() { + return listConnectionsPagedCallable; + } + + @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); + } +} diff --git a/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/GrpcTetherCallableFactory.java b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/GrpcTetherCallableFactory.java new file mode 100644 index 0000000000..9539d5b225 --- /dev/null +++ b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/GrpcTetherCallableFactory.java @@ -0,0 +1,113 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1.stub; + +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.rpc.BatchingCallSettings; +import com.google.api.gax.rpc.BidiStreamingCallable; +import com.google.api.gax.rpc.ClientContext; +import com.google.api.gax.rpc.ClientStreamingCallable; +import com.google.api.gax.rpc.OperationCallSettings; +import com.google.api.gax.rpc.OperationCallable; +import com.google.api.gax.rpc.PagedCallSettings; +import com.google.api.gax.rpc.ServerStreamingCallSettings; +import com.google.api.gax.rpc.ServerStreamingCallable; +import com.google.api.gax.rpc.StreamingCallSettings; +import com.google.api.gax.rpc.UnaryCallSettings; +import com.google.api.gax.rpc.UnaryCallable; +import com.google.longrunning.Operation; +import com.google.longrunning.stub.OperationsStub; +import javax.annotation.Generated; + +// AUTO-GENERATED DOCUMENTATION AND CLASS. +/** + * gRPC callable factory implementation for the Tether service API. + * + *

This class is for advanced usage. + */ +@Generated("by gapic-generator-java") +public class GrpcTetherCallableFactory implements GrpcStubCallableFactory { + + @Override + public UnaryCallable createUnaryCallable( + GrpcCallSettings grpcCallSettings, + UnaryCallSettings callSettings, + ClientContext clientContext) { + return GrpcCallableFactory.createUnaryCallable(grpcCallSettings, callSettings, clientContext); + } + + @Override + public + UnaryCallable createPagedCallable( + GrpcCallSettings grpcCallSettings, + PagedCallSettings callSettings, + ClientContext clientContext) { + return GrpcCallableFactory.createPagedCallable(grpcCallSettings, callSettings, clientContext); + } + + @Override + public UnaryCallable createBatchingCallable( + GrpcCallSettings grpcCallSettings, + BatchingCallSettings callSettings, + ClientContext clientContext) { + return GrpcCallableFactory.createBatchingCallable( + grpcCallSettings, callSettings, clientContext); + } + + @Override + public + OperationCallable createOperationCallable( + GrpcCallSettings grpcCallSettings, + OperationCallSettings callSettings, + ClientContext clientContext, + OperationsStub operationsStub) { + return GrpcCallableFactory.createOperationCallable( + grpcCallSettings, callSettings, clientContext, operationsStub); + } + + @Override + public + BidiStreamingCallable createBidiStreamingCallable( + GrpcCallSettings grpcCallSettings, + StreamingCallSettings callSettings, + ClientContext clientContext) { + return GrpcCallableFactory.createBidiStreamingCallable( + grpcCallSettings, callSettings, clientContext); + } + + @Override + public + ServerStreamingCallable createServerStreamingCallable( + GrpcCallSettings grpcCallSettings, + ServerStreamingCallSettings callSettings, + ClientContext clientContext) { + return GrpcCallableFactory.createServerStreamingCallable( + grpcCallSettings, callSettings, clientContext); + } + + @Override + public + ClientStreamingCallable createClientStreamingCallable( + GrpcCallSettings grpcCallSettings, + StreamingCallSettings callSettings, + ClientContext clientContext) { + return GrpcCallableFactory.createClientStreamingCallable( + grpcCallSettings, callSettings, clientContext); + } +} diff --git a/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/GrpcTetherStub.java b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/GrpcTetherStub.java new file mode 100644 index 0000000000..5e26b215cf --- /dev/null +++ b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/GrpcTetherStub.java @@ -0,0 +1,148 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1.stub; + +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.cloud.apigeeconnect.v1.EgressRequest; +import com.google.cloud.apigeeconnect.v1.EgressResponse; +import com.google.longrunning.stub.GrpcOperationsStub; +import io.grpc.MethodDescriptor; +import io.grpc.protobuf.ProtoUtils; +import java.io.IOException; +import java.util.concurrent.TimeUnit; +import javax.annotation.Generated; + +// AUTO-GENERATED DOCUMENTATION AND CLASS. +/** + * gRPC stub implementation for the Tether service API. + * + *

This class is for advanced usage and reflects the underlying API directly. + */ +@Generated("by gapic-generator-java") +public class GrpcTetherStub extends TetherStub { + private static final MethodDescriptor egressMethodDescriptor = + MethodDescriptor.newBuilder() + .setType(MethodDescriptor.MethodType.BIDI_STREAMING) + .setFullMethodName("google.cloud.apigeeconnect.v1.Tether/Egress") + .setRequestMarshaller(ProtoUtils.marshaller(EgressResponse.getDefaultInstance())) + .setResponseMarshaller(ProtoUtils.marshaller(EgressRequest.getDefaultInstance())) + .build(); + + private final BidiStreamingCallable egressCallable; + + private final BackgroundResource backgroundResources; + private final GrpcOperationsStub operationsStub; + private final GrpcStubCallableFactory callableFactory; + + public static final GrpcTetherStub create(TetherStubSettings settings) throws IOException { + return new GrpcTetherStub(settings, ClientContext.create(settings)); + } + + public static final GrpcTetherStub create(ClientContext clientContext) throws IOException { + return new GrpcTetherStub(TetherStubSettings.newBuilder().build(), clientContext); + } + + public static final GrpcTetherStub create( + ClientContext clientContext, GrpcStubCallableFactory callableFactory) throws IOException { + return new GrpcTetherStub( + TetherStubSettings.newBuilder().build(), clientContext, callableFactory); + } + + /** + * Constructs an instance of GrpcTetherStub, 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 GrpcTetherStub(TetherStubSettings settings, ClientContext clientContext) + throws IOException { + this(settings, clientContext, new GrpcTetherCallableFactory()); + } + + /** + * Constructs an instance of GrpcTetherStub, 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 GrpcTetherStub( + TetherStubSettings settings, + ClientContext clientContext, + GrpcStubCallableFactory callableFactory) + throws IOException { + this.callableFactory = callableFactory; + this.operationsStub = GrpcOperationsStub.create(clientContext, callableFactory); + + GrpcCallSettings egressTransportSettings = + GrpcCallSettings.newBuilder() + .setMethodDescriptor(egressMethodDescriptor) + .build(); + + this.egressCallable = + callableFactory.createBidiStreamingCallable( + egressTransportSettings, settings.egressSettings(), clientContext); + + this.backgroundResources = + new BackgroundResourceAggregation(clientContext.getBackgroundResources()); + } + + public GrpcOperationsStub getOperationsStub() { + return operationsStub; + } + + @Override + public BidiStreamingCallable egressCallable() { + return egressCallable; + } + + @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); + } +} diff --git a/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/HttpJsonConnectionServiceCallableFactory.java b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/HttpJsonConnectionServiceCallableFactory.java new file mode 100644 index 0000000000..6aa75e6206 --- /dev/null +++ b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/HttpJsonConnectionServiceCallableFactory.java @@ -0,0 +1,105 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1.stub; + +import com.google.api.core.BetaApi; +import com.google.api.gax.httpjson.HttpJsonCallSettings; +import com.google.api.gax.httpjson.HttpJsonCallableFactory; +import com.google.api.gax.httpjson.HttpJsonOperationSnapshotCallable; +import com.google.api.gax.httpjson.HttpJsonStubCallableFactory; +import com.google.api.gax.httpjson.longrunning.stub.OperationsStub; +import com.google.api.gax.rpc.BatchingCallSettings; +import com.google.api.gax.rpc.ClientContext; +import com.google.api.gax.rpc.OperationCallSettings; +import com.google.api.gax.rpc.OperationCallable; +import com.google.api.gax.rpc.PagedCallSettings; +import com.google.api.gax.rpc.ServerStreamingCallSettings; +import com.google.api.gax.rpc.ServerStreamingCallable; +import com.google.api.gax.rpc.UnaryCallSettings; +import com.google.api.gax.rpc.UnaryCallable; +import com.google.longrunning.Operation; +import javax.annotation.Generated; + +// AUTO-GENERATED DOCUMENTATION AND CLASS. +/** + * REST callable factory implementation for the ConnectionService service API. + * + *

This class is for advanced usage. + */ +@Generated("by gapic-generator-java") +@BetaApi +public class HttpJsonConnectionServiceCallableFactory + implements HttpJsonStubCallableFactory { + + @Override + public UnaryCallable createUnaryCallable( + HttpJsonCallSettings httpJsonCallSettings, + UnaryCallSettings callSettings, + ClientContext clientContext) { + return HttpJsonCallableFactory.createUnaryCallable( + httpJsonCallSettings, callSettings, clientContext); + } + + @Override + public + UnaryCallable createPagedCallable( + HttpJsonCallSettings httpJsonCallSettings, + PagedCallSettings callSettings, + ClientContext clientContext) { + return HttpJsonCallableFactory.createPagedCallable( + httpJsonCallSettings, callSettings, clientContext); + } + + @Override + public UnaryCallable createBatchingCallable( + HttpJsonCallSettings httpJsonCallSettings, + BatchingCallSettings callSettings, + ClientContext clientContext) { + return HttpJsonCallableFactory.createBatchingCallable( + httpJsonCallSettings, callSettings, clientContext); + } + + @BetaApi( + "The surface for long-running operations is not stable yet and may change in the future.") + @Override + public + OperationCallable createOperationCallable( + HttpJsonCallSettings httpJsonCallSettings, + OperationCallSettings callSettings, + ClientContext clientContext, + OperationsStub operationsStub) { + UnaryCallable innerCallable = + HttpJsonCallableFactory.createBaseUnaryCallable( + httpJsonCallSettings, callSettings.getInitialCallSettings(), clientContext); + HttpJsonOperationSnapshotCallable initialCallable = + new HttpJsonOperationSnapshotCallable( + innerCallable, + httpJsonCallSettings.getMethodDescriptor().getOperationSnapshotFactory()); + return HttpJsonCallableFactory.createOperationCallable( + callSettings, clientContext, operationsStub.longRunningClient(), initialCallable); + } + + @Override + public + ServerStreamingCallable createServerStreamingCallable( + HttpJsonCallSettings httpJsonCallSettings, + ServerStreamingCallSettings callSettings, + ClientContext clientContext) { + return HttpJsonCallableFactory.createServerStreamingCallable( + httpJsonCallSettings, callSettings, clientContext); + } +} diff --git a/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/HttpJsonConnectionServiceStub.java b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/HttpJsonConnectionServiceStub.java new file mode 100644 index 0000000000..1c5701c575 --- /dev/null +++ b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/HttpJsonConnectionServiceStub.java @@ -0,0 +1,209 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1.stub; + +import static com.google.cloud.apigeeconnect.v1.ConnectionServiceClient.ListConnectionsPagedResponse; + +import com.google.api.core.BetaApi; +import com.google.api.core.InternalApi; +import com.google.api.gax.core.BackgroundResource; +import com.google.api.gax.core.BackgroundResourceAggregation; +import com.google.api.gax.httpjson.ApiMethodDescriptor; +import com.google.api.gax.httpjson.HttpJsonCallSettings; +import com.google.api.gax.httpjson.HttpJsonStubCallableFactory; +import com.google.api.gax.httpjson.ProtoMessageRequestFormatter; +import com.google.api.gax.httpjson.ProtoMessageResponseParser; +import com.google.api.gax.httpjson.ProtoRestSerializer; +import com.google.api.gax.rpc.ClientContext; +import com.google.api.gax.rpc.UnaryCallable; +import com.google.cloud.apigeeconnect.v1.ListConnectionsRequest; +import com.google.cloud.apigeeconnect.v1.ListConnectionsResponse; +import com.google.protobuf.TypeRegistry; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import javax.annotation.Generated; + +// AUTO-GENERATED DOCUMENTATION AND CLASS. +/** + * REST stub implementation for the ConnectionService service API. + * + *

This class is for advanced usage and reflects the underlying API directly. + */ +@Generated("by gapic-generator-java") +@BetaApi +public class HttpJsonConnectionServiceStub extends ConnectionServiceStub { + private static final TypeRegistry typeRegistry = TypeRegistry.newBuilder().build(); + + private static final ApiMethodDescriptor + listConnectionsMethodDescriptor = + ApiMethodDescriptor.newBuilder() + .setFullMethodName("google.cloud.apigeeconnect.v1.ConnectionService/ListConnections") + .setHttpMethod("GET") + .setType(ApiMethodDescriptor.MethodType.UNARY) + .setRequestFormatter( + ProtoMessageRequestFormatter.newBuilder() + .setPath( + "/v1/{parent=projects/*/endpoints/*}/connections", + request -> { + Map fields = new HashMap<>(); + ProtoRestSerializer serializer = + ProtoRestSerializer.create(); + serializer.putPathParam(fields, "parent", request.getParent()); + return fields; + }) + .setQueryParamsExtractor( + request -> { + Map> fields = new HashMap<>(); + ProtoRestSerializer serializer = + ProtoRestSerializer.create(); + serializer.putQueryParam(fields, "pageSize", request.getPageSize()); + serializer.putQueryParam(fields, "pageToken", request.getPageToken()); + serializer.putQueryParam(fields, "$alt", "json;enum-encoding=int"); + return fields; + }) + .setRequestBodyExtractor(request -> null) + .build()) + .setResponseParser( + ProtoMessageResponseParser.newBuilder() + .setDefaultInstance(ListConnectionsResponse.getDefaultInstance()) + .setDefaultTypeRegistry(typeRegistry) + .build()) + .build(); + + private final UnaryCallable + listConnectionsCallable; + private final UnaryCallable + listConnectionsPagedCallable; + + private final BackgroundResource backgroundResources; + private final HttpJsonStubCallableFactory callableFactory; + + public static final HttpJsonConnectionServiceStub create(ConnectionServiceStubSettings settings) + throws IOException { + return new HttpJsonConnectionServiceStub(settings, ClientContext.create(settings)); + } + + public static final HttpJsonConnectionServiceStub create(ClientContext clientContext) + throws IOException { + return new HttpJsonConnectionServiceStub( + ConnectionServiceStubSettings.newHttpJsonBuilder().build(), clientContext); + } + + public static final HttpJsonConnectionServiceStub create( + ClientContext clientContext, HttpJsonStubCallableFactory callableFactory) throws IOException { + return new HttpJsonConnectionServiceStub( + ConnectionServiceStubSettings.newHttpJsonBuilder().build(), clientContext, callableFactory); + } + + /** + * Constructs an instance of HttpJsonConnectionServiceStub, 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 HttpJsonConnectionServiceStub( + ConnectionServiceStubSettings settings, ClientContext clientContext) throws IOException { + this(settings, clientContext, new HttpJsonConnectionServiceCallableFactory()); + } + + /** + * Constructs an instance of HttpJsonConnectionServiceStub, 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 HttpJsonConnectionServiceStub( + ConnectionServiceStubSettings settings, + ClientContext clientContext, + HttpJsonStubCallableFactory callableFactory) + throws IOException { + this.callableFactory = callableFactory; + + HttpJsonCallSettings + listConnectionsTransportSettings = + HttpJsonCallSettings.newBuilder() + .setMethodDescriptor(listConnectionsMethodDescriptor) + .setTypeRegistry(typeRegistry) + .build(); + + this.listConnectionsCallable = + callableFactory.createUnaryCallable( + listConnectionsTransportSettings, settings.listConnectionsSettings(), clientContext); + this.listConnectionsPagedCallable = + callableFactory.createPagedCallable( + listConnectionsTransportSettings, settings.listConnectionsSettings(), clientContext); + + this.backgroundResources = + new BackgroundResourceAggregation(clientContext.getBackgroundResources()); + } + + @InternalApi + public static List getMethodDescriptors() { + List methodDescriptors = new ArrayList<>(); + methodDescriptors.add(listConnectionsMethodDescriptor); + return methodDescriptors; + } + + @Override + public UnaryCallable listConnectionsCallable() { + return listConnectionsCallable; + } + + @Override + public UnaryCallable + listConnectionsPagedCallable() { + return listConnectionsPagedCallable; + } + + @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); + } +} diff --git a/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/TetherStub.java b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/TetherStub.java new file mode 100644 index 0000000000..e53dbb6fb5 --- /dev/null +++ b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/TetherStub.java @@ -0,0 +1,40 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1.stub; + +import com.google.api.gax.core.BackgroundResource; +import com.google.api.gax.rpc.BidiStreamingCallable; +import com.google.cloud.apigeeconnect.v1.EgressRequest; +import com.google.cloud.apigeeconnect.v1.EgressResponse; +import javax.annotation.Generated; + +// AUTO-GENERATED DOCUMENTATION AND CLASS. +/** + * Base stub class for the Tether service API. + * + *

This class is for advanced usage and reflects the underlying API directly. + */ +@Generated("by gapic-generator-java") +public abstract class TetherStub implements BackgroundResource { + + public BidiStreamingCallable egressCallable() { + throw new UnsupportedOperationException("Not implemented: egressCallable()"); + } + + @Override + public abstract void close(); +} diff --git a/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/TetherStubSettings.java b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/TetherStubSettings.java new file mode 100644 index 0000000000..3a926ba150 --- /dev/null +++ b/test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/TetherStubSettings.java @@ -0,0 +1,262 @@ +/* + * Copyright 2022 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 + * + * https://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.cloud.apigeeconnect.v1.stub; + +import com.google.api.core.ApiFunction; +import com.google.api.core.BetaApi; +import com.google.api.gax.core.GaxProperties; +import com.google.api.gax.core.GoogleCredentialsProvider; +import com.google.api.gax.core.InstantiatingExecutorProvider; +import com.google.api.gax.grpc.GaxGrpcProperties; +import com.google.api.gax.grpc.GrpcTransportChannel; +import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider; +import com.google.api.gax.retrying.RetrySettings; +import com.google.api.gax.rpc.ApiClientHeaderProvider; +import com.google.api.gax.rpc.ClientContext; +import com.google.api.gax.rpc.StatusCode; +import com.google.api.gax.rpc.StreamingCallSettings; +import com.google.api.gax.rpc.StubSettings; +import com.google.api.gax.rpc.TransportChannelProvider; +import com.google.api.gax.rpc.UnaryCallSettings; +import com.google.cloud.apigeeconnect.v1.EgressRequest; +import com.google.cloud.apigeeconnect.v1.EgressResponse; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Lists; +import java.io.IOException; +import java.util.List; +import javax.annotation.Generated; + +// AUTO-GENERATED DOCUMENTATION AND CLASS. +/** + * Settings class to configure an instance of {@link TetherStub}. + * + *

The default instance has everything set to sensible defaults: + * + *

    + *
  • The default service address (apigeeconnect.googleapis.com) and default port (443) are used. + *
  • Credentials are acquired automatically through Application Default Credentials. + *
  • Retries are configured for idempotent methods but not for non-idempotent methods. + *
+ * + *

The builder of this class is recursive, so contained classes are themselves builders. When + * build() is called, the tree of builders is called to create the complete settings object. + * + *

For example, to set the total timeout of egress to 30 seconds: + * + *

{@code
+ * // This snippet has been automatically generated and should be regarded as a code template only.
+ * // It will require modifications to work:
+ * // - It may require correct/in-range values for request initialization.
+ * // - It may require specifying regional endpoints when creating the service client as shown in
+ * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+ * TetherStubSettings.Builder tetherSettingsBuilder = TetherStubSettings.newBuilder();
+ * tetherSettingsBuilder
+ *     .egressSettings()
+ *     .setRetrySettings(
+ *         tetherSettingsBuilder
+ *             .egressSettings()
+ *             .getRetrySettings()
+ *             .toBuilder()
+ *             .setTotalTimeout(Duration.ofSeconds(30))
+ *             .build());
+ * TetherStubSettings tetherSettings = tetherSettingsBuilder.build();
+ * }
+ */ +@Generated("by gapic-generator-java") +public class TetherStubSettings extends StubSettings { + /** The default scopes of the service. */ + private static final ImmutableList DEFAULT_SERVICE_SCOPES = + ImmutableList.builder().add("https://www.googleapis.com/auth/cloud-platform").build(); + + private final StreamingCallSettings egressSettings; + + /** Returns the object with the settings used for calls to egress. */ + public StreamingCallSettings egressSettings() { + return egressSettings; + } + + public TetherStub createStub() throws IOException { + if (getTransportChannelProvider() + .getTransportName() + .equals(GrpcTransportChannel.getGrpcTransportName())) { + return GrpcTetherStub.create(this); + } + throw new UnsupportedOperationException( + String.format( + "Transport not supported: %s", getTransportChannelProvider().getTransportName())); + } + + /** Returns a builder for the default ExecutorProvider for this service. */ + public static InstantiatingExecutorProvider.Builder defaultExecutorProviderBuilder() { + return InstantiatingExecutorProvider.newBuilder(); + } + + /** Returns the default service endpoint. */ + public static String getDefaultEndpoint() { + return "apigeeconnect.googleapis.com:443"; + } + + /** Returns the default mTLS service endpoint. */ + public static String getDefaultMtlsEndpoint() { + return "apigeeconnect.mtls.googleapis.com:443"; + } + + /** Returns the default service scopes. */ + public static List getDefaultServiceScopes() { + return DEFAULT_SERVICE_SCOPES; + } + + /** Returns a builder for the default credentials for this service. */ + public static GoogleCredentialsProvider.Builder defaultCredentialsProviderBuilder() { + return GoogleCredentialsProvider.newBuilder() + .setScopesToApply(DEFAULT_SERVICE_SCOPES) + .setUseJwtAccessWithScope(true); + } + + /** Returns a builder for the default gRPC ChannelProvider for this service. */ + public static InstantiatingGrpcChannelProvider.Builder defaultGrpcTransportProviderBuilder() { + return InstantiatingGrpcChannelProvider.newBuilder() + .setMaxInboundMessageSize(Integer.MAX_VALUE); + } + + public static TransportChannelProvider defaultTransportChannelProvider() { + return defaultGrpcTransportProviderBuilder().build(); + } + + @BetaApi("The surface for customizing headers is not stable yet and may change in the future.") + public static ApiClientHeaderProvider.Builder defaultGrpcApiClientHeaderProviderBuilder() { + return ApiClientHeaderProvider.newBuilder() + .setGeneratedLibToken("gapic", GaxProperties.getLibraryVersion(TetherStubSettings.class)) + .setTransportToken( + GaxGrpcProperties.getGrpcTokenName(), GaxGrpcProperties.getGrpcVersion()); + } + + public static ApiClientHeaderProvider.Builder defaultApiClientHeaderProviderBuilder() { + return TetherStubSettings.defaultGrpcApiClientHeaderProviderBuilder(); + } + + /** Returns a new gRPC builder for this class. */ + public static Builder newBuilder() { + return Builder.createDefault(); + } + + /** Returns a new builder for this class. */ + public static Builder newBuilder(ClientContext clientContext) { + return new Builder(clientContext); + } + + /** Returns a builder containing all the values of this settings class. */ + public Builder toBuilder() { + return new Builder(this); + } + + protected TetherStubSettings(Builder settingsBuilder) throws IOException { + super(settingsBuilder); + + egressSettings = settingsBuilder.egressSettings().build(); + } + + /** Builder for TetherStubSettings. */ + public static class Builder extends StubSettings.Builder { + private final ImmutableList> unaryMethodSettingsBuilders; + private final StreamingCallSettings.Builder egressSettings; + private static final ImmutableMap> + RETRYABLE_CODE_DEFINITIONS; + + static { + ImmutableMap.Builder> definitions = + ImmutableMap.builder(); + definitions.put("no_retry_codes", ImmutableSet.copyOf(Lists.newArrayList())); + RETRYABLE_CODE_DEFINITIONS = definitions.build(); + } + + private static final ImmutableMap RETRY_PARAM_DEFINITIONS; + + static { + ImmutableMap.Builder definitions = ImmutableMap.builder(); + RetrySettings settings = null; + settings = RetrySettings.newBuilder().setRpcTimeoutMultiplier(1.0).build(); + definitions.put("no_retry_params", settings); + RETRY_PARAM_DEFINITIONS = definitions.build(); + } + + protected Builder() { + this(((ClientContext) null)); + } + + protected Builder(ClientContext clientContext) { + super(clientContext); + + egressSettings = StreamingCallSettings.newBuilder(); + + unaryMethodSettingsBuilders = ImmutableList.>of(); + initDefaults(this); + } + + protected Builder(TetherStubSettings settings) { + super(settings); + + egressSettings = settings.egressSettings.toBuilder(); + + unaryMethodSettingsBuilders = ImmutableList.>of(); + } + + private static Builder createDefault() { + Builder builder = new Builder(((ClientContext) null)); + + builder.setTransportChannelProvider(defaultTransportChannelProvider()); + builder.setCredentialsProvider(defaultCredentialsProviderBuilder().build()); + builder.setInternalHeaderProvider(defaultApiClientHeaderProviderBuilder().build()); + builder.setEndpoint(getDefaultEndpoint()); + builder.setMtlsEndpoint(getDefaultMtlsEndpoint()); + builder.setSwitchToMtlsEndpointAllowed(true); + + return initDefaults(builder); + } + + private static Builder initDefaults(Builder builder) { + return builder; + } + + /** + * Applies the given settings updater function to all of the unary API methods in this service. + * + *

Note: This method does not support applying settings to streaming methods. + */ + public Builder applyToAllUnaryMethods( + ApiFunction, Void> settingsUpdater) { + super.applyToAllUnaryMethods(unaryMethodSettingsBuilders, settingsUpdater); + return this; + } + + public ImmutableList> unaryMethodSettingsBuilders() { + return unaryMethodSettingsBuilders; + } + + /** Returns the builder for the settings used for calls to egress. */ + public StreamingCallSettings.Builder egressSettings() { + return egressSettings; + } + + @Override + public TetherStubSettings build() throws IOException { + return new TetherStubSettings(this); + } + } +}