From 7c6239fbdda571f5056752005612ccdd7bcd2c8e Mon Sep 17 00:00:00 2001 From: Min Zhu Date: Tue, 16 Jul 2024 13:28:31 -0400 Subject: [PATCH 1/8] fix: filter on methods not empty when parsing services. --- .../generator/gapic/protoparser/Parser.java | 42 ++++-- .../gapic/protoparser/ParserTest.java | 29 ++++ .../test/proto/service_with_no_methods.proto | 131 ++++++++++++++++++ 3 files changed, 193 insertions(+), 9 deletions(-) create mode 100644 gapic-generator-java/src/test/proto/service_with_no_methods.proto diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/protoparser/Parser.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/protoparser/Parser.java index e7c6bd8967..d0e046f718 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/protoparser/Parser.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/protoparser/Parser.java @@ -435,6 +435,25 @@ public static List parseService( Transport transport) { return fileDescriptor.getServices().stream() + .filter( + s -> { + String pakkage = TypeParser.getPackage(fileDescriptor); + List methods = parseMethods( + s, + pakkage, + messageTypes, + resourceNames, + serviceConfigOpt, + serviceYamlProtoOpt, + outputArgResourceNames, + transport); + if (methods.isEmpty()) { + LOGGER.warning(String.format("No rpc methods specified in %s, generation will be skipped.", s.getName())); + // Service.builder() + } + return !methods.isEmpty(); + } + ) .map( s -> { // Workaround for a missing default_host and oauth_scopes annotation from a service @@ -495,6 +514,19 @@ public static List parseService( overriddenServiceName = languageSettings.getJavaServiceName(fileDescriptor.getPackage(), s.getName()); } + List methods = parseMethods( + s, + pakkage, + messageTypes, + resourceNames, + serviceConfigOpt, + serviceYamlProtoOpt, + outputArgResourceNames, + transport); + if (methods.isEmpty()) { + LOGGER.warning("No methods in this service."); + // Service.builder() + } return serviceBuilder .setName(serviceName) .setOverriddenName(overriddenServiceName) @@ -505,15 +537,7 @@ public static List parseService( .setProtoPakkage(fileDescriptor.getPackage()) .setIsDeprecated(isDeprecated) .setMethods( - parseMethods( - s, - pakkage, - messageTypes, - resourceNames, - serviceConfigOpt, - serviceYamlProtoOpt, - outputArgResourceNames, - transport)) + methods) .build(); }) .collect(Collectors.toList()); diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/protoparser/ParserTest.java b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/protoparser/ParserTest.java index 93c4eb3599..32007e823f 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/protoparser/ParserTest.java +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/protoparser/ParserTest.java @@ -58,6 +58,7 @@ import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.stream.Collectors; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -117,6 +118,17 @@ void parseMessages_basic() { echoResponseMessage, messageTypes.get("com.google.showcase.v1beta1." + echoResponseName)); } + // @Test + // void test() { + // FileDescriptor bookshopFileDescriptor = BookshopProto.getDescriptor(); + // Map messageTypes = Parser.parseMessages(bookshopFileDescriptor); + // messageTypes.keySet().stream() + // .map( + // x -> { + // System.out.println("keys: " + x); + // }) + // .collect(Collectors.toList()); + // } @Test void parseMessages_fieldNameConflicts() { FileDescriptor bookshopFileDescriptor = BookshopProto.getDescriptor(); @@ -692,6 +704,23 @@ void testServiceWithoutApiVersionParsed() { assertNull(parsedBookshopService.apiVersion()); } + + @Test + void parseServiceWithNoMethodsTest() { + FileDescriptor fileDescriptor = com.google.api.service.without.methods.test.ServiceWithNoMethodsOuterClass.getDescriptor(); + Map messageTypes = Parser.parseMessages(fileDescriptor); + Map resourceNames = Parser.parseResourceNames(fileDescriptor); + List services = + Parser.parseService( + fileDescriptor, + messageTypes, + resourceNames, + Optional.empty(), + new HashSet<>()); + assertEquals(1, services.size()); + assertEquals("EchoWithMethods", services.get(0).overriddenName()); + } + private void assertMethodArgumentEquals( String name, TypeNode type, List nestedFields, MethodArgument argument) { assertEquals(name, argument.name()); diff --git a/gapic-generator-java/src/test/proto/service_with_no_methods.proto b/gapic-generator-java/src/test/proto/service_with_no_methods.proto new file mode 100644 index 0000000000..3d1012ff72 --- /dev/null +++ b/gapic-generator-java/src/test/proto/service_with_no_methods.proto @@ -0,0 +1,131 @@ +// Copyright 2018 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/annotations.proto"; +import "google/api/client.proto"; +import "google/api/field_behavior.proto"; +import "google/api/field_info.proto"; +import "google/api/resource.proto"; +import "google/longrunning/operations.proto"; +import "google/protobuf/duration.proto"; +import "google/protobuf/timestamp.proto"; +import "google/rpc/status.proto"; + +package google.api.service.without.methods.test.v1; + +option java_package = "com.google.api.service.without.methods.test"; +option java_multiple_files = true; +option java_outer_classname = "ServiceWithNoMethodsOuterClass"; + +option (google.api.resource_definition) = { + type: "showcase.googleapis.com/AnythingGoes" + pattern: "*" +}; +// This proto is used to test scenarios where a service does not have any rpc methods + +// This service is used to test when roc methods are specified. +service EchoWithMethods { + // This service is meant to only run locally on the port 7469 (keypad digits + // for "show"). + option (google.api.default_host) = "localhost:7469"; + option (google.api.oauth_scopes) = + "https://www.googleapis.com/auth/cloud-platform"; + + // This method simply echos the request. This method is showcases unary rpcs. + rpc EchoWithMethod(EchoRequest) returns (EchoResponse) { + option (google.api.http) = { + post: "/v1beta1/echo:echo" + body: "*" + }; + option (google.api.method_signature) = "content"; + option (google.api.method_signature) = "error"; + option (google.api.method_signature) = "content,severity"; + option (google.api.method_signature) = "name"; + option (google.api.method_signature) = "parent"; + option (google.api.method_signature) = ""; + } +} + +// This service is to test when no method specified. +service EchoWithoutMethods { + // This service is meant to only run locally on the port 7469 (keypad digits + // for "show"). + option (google.api.default_host) = "localhost:7469"; + option (google.api.oauth_scopes) = + "https://www.googleapis.com/auth/cloud-platform"; +} + +// A severity enum used to test enum capabilities in GAPIC surfaces +enum Severity { + UNNECESSARY = 0; + NECESSARY = 1; + URGENT = 2; + CRITICAL = 3; +} + +message Foobar { + option (google.api.resource) = { + type: "showcase.googleapis.com/Foobar" + pattern: "projects/{project}/foobars/{foobar}" + pattern: "projects/{project}/chocolate/variants/{variant}/foobars/{foobar}" + pattern: "foobars/{foobar}" + pattern: "bar_foos/{bar_foo}/foobars/{foobar}" + pattern: "*" + }; + + string name = 1; + string info = 2; +} + +// The request message used for the Echo, Collect and Chat methods. +// If content or opt are set in this message then the request will succeed. +// If status is set in this message +// then the status will be returned as an error. +message EchoRequest { + string name = 5 [ + (google.api.resource_reference).type = "showcase.googleapis.com/Foobar", + (google.api.field_behavior) = REQUIRED + ]; + + string parent = 6 [ + (google.api.resource_reference).child_type = + "showcase.googleapis.com/AnythingGoes", + (google.api.field_behavior) = REQUIRED + ]; + + oneof response { + // The content to be echoed by the server. + string content = 1; + + // The error to be thrown by the server. + google.rpc.Status error = 2; + } + + // The severity to be echoed by the server. + Severity severity = 3; + + Foobar foobar = 4; +} + +// The response message for the Echo methods. +message EchoResponse { + // The content specified in the request. + string content = 1; + + // The severity specified in the request. + Severity severity = 2; +} + From c1b2aab09353349b88bfbff39da4ad7fd341edc8 Mon Sep 17 00:00:00 2001 From: Min Zhu Date: Tue, 16 Jul 2024 14:17:24 -0400 Subject: [PATCH 2/8] fix: cleanup and simplify. --- .../generator/gapic/protoparser/Parser.java | 49 +++++++------------ .../gapic/protoparser/ParserTest.java | 11 ++--- 2 files changed, 21 insertions(+), 39 deletions(-) diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/protoparser/Parser.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/protoparser/Parser.java index d0e046f718..ff89a87555 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/protoparser/Parser.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/protoparser/Parser.java @@ -436,24 +436,16 @@ public static List parseService( return fileDescriptor.getServices().stream() .filter( - s -> { - String pakkage = TypeParser.getPackage(fileDescriptor); - List methods = parseMethods( - s, - pakkage, - messageTypes, - resourceNames, - serviceConfigOpt, - serviceYamlProtoOpt, - outputArgResourceNames, - transport); - if (methods.isEmpty()) { - LOGGER.warning(String.format("No rpc methods specified in %s, generation will be skipped.", s.getName())); - // Service.builder() + serviceDescriptor -> { + List methodsList = serviceDescriptor.getMethods(); + if (methodsList.isEmpty()) { + LOGGER.warning( + String.format( + "No rpc methods specified in %s, generation will be skipped.", + serviceDescriptor.getName())); } - return !methods.isEmpty(); - } - ) + return !methodsList.isEmpty(); + }) .map( s -> { // Workaround for a missing default_host and oauth_scopes annotation from a service @@ -514,19 +506,6 @@ public static List parseService( overriddenServiceName = languageSettings.getJavaServiceName(fileDescriptor.getPackage(), s.getName()); } - List methods = parseMethods( - s, - pakkage, - messageTypes, - resourceNames, - serviceConfigOpt, - serviceYamlProtoOpt, - outputArgResourceNames, - transport); - if (methods.isEmpty()) { - LOGGER.warning("No methods in this service."); - // Service.builder() - } return serviceBuilder .setName(serviceName) .setOverriddenName(overriddenServiceName) @@ -537,7 +516,15 @@ public static List parseService( .setProtoPakkage(fileDescriptor.getPackage()) .setIsDeprecated(isDeprecated) .setMethods( - methods) + parseMethods( + s, + pakkage, + messageTypes, + resourceNames, + serviceConfigOpt, + serviceYamlProtoOpt, + outputArgResourceNames, + transport)) .build(); }) .collect(Collectors.toList()); diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/protoparser/ParserTest.java b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/protoparser/ParserTest.java index 32007e823f..c1cb182fad 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/protoparser/ParserTest.java +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/protoparser/ParserTest.java @@ -58,7 +58,6 @@ import java.util.Map; import java.util.Optional; import java.util.Set; -import java.util.stream.Collectors; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -704,19 +703,15 @@ void testServiceWithoutApiVersionParsed() { assertNull(parsedBookshopService.apiVersion()); } - @Test void parseServiceWithNoMethodsTest() { - FileDescriptor fileDescriptor = com.google.api.service.without.methods.test.ServiceWithNoMethodsOuterClass.getDescriptor(); + FileDescriptor fileDescriptor = + com.google.api.service.without.methods.test.ServiceWithNoMethodsOuterClass.getDescriptor(); Map messageTypes = Parser.parseMessages(fileDescriptor); Map resourceNames = Parser.parseResourceNames(fileDescriptor); List services = Parser.parseService( - fileDescriptor, - messageTypes, - resourceNames, - Optional.empty(), - new HashSet<>()); + fileDescriptor, messageTypes, resourceNames, Optional.empty(), new HashSet<>()); assertEquals(1, services.size()); assertEquals("EchoWithMethods", services.get(0).overriddenName()); } From e6aa0abf1873777a37a15b2142b28bd1a0f6d549 Mon Sep 17 00:00:00 2001 From: Min Zhu Date: Tue, 16 Jul 2024 14:23:54 -0400 Subject: [PATCH 3/8] fix: cleanup code. --- .../api/generator/gapic/protoparser/ParserTest.java | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/protoparser/ParserTest.java b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/protoparser/ParserTest.java index c1cb182fad..2776fec687 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/protoparser/ParserTest.java +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/protoparser/ParserTest.java @@ -117,17 +117,6 @@ void parseMessages_basic() { echoResponseMessage, messageTypes.get("com.google.showcase.v1beta1." + echoResponseName)); } - // @Test - // void test() { - // FileDescriptor bookshopFileDescriptor = BookshopProto.getDescriptor(); - // Map messageTypes = Parser.parseMessages(bookshopFileDescriptor); - // messageTypes.keySet().stream() - // .map( - // x -> { - // System.out.println("keys: " + x); - // }) - // .collect(Collectors.toList()); - // } @Test void parseMessages_fieldNameConflicts() { FileDescriptor bookshopFileDescriptor = BookshopProto.getDescriptor(); From 001f5e4d23462b6728b0c5e98f11cecc2f71a091 Mon Sep 17 00:00:00 2001 From: Min Zhu Date: Fri, 19 Jul 2024 15:52:44 -0400 Subject: [PATCH 4/8] fix: reverts related changes in #985 that partially allows empty services be generated for sample. --- .../ServiceClientHeaderSampleComposer.java | 4 - .../ServiceClientClassComposerTest.java | 14 -- .../grpcrest/goldens/EchoEmpty.golden | 154 ------------------ 3 files changed, 172 deletions(-) delete mode 100644 gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/EchoEmpty.golden diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientHeaderSampleComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientHeaderSampleComposer.java index b979f87744..6403890b99 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientHeaderSampleComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientHeaderSampleComposer.java @@ -52,10 +52,6 @@ public static Sample composeClassHeaderSample( TypeNode clientType, Map resourceNames, Map messageTypes) { - if (service.methods().isEmpty()) { - return ServiceClientMethodSampleComposer.composeEmptyServiceSample(clientType, service); - } - // Use the first pure unary RPC method's sample code as showcase, if no such method exists, use // the first method in the service's methods list. Method method = 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 8efc43118c..a6d057fe8d 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 @@ -40,20 +40,6 @@ void generateServiceClasses() { Assert.assertCodeEquals(goldenFilePath, visitor.write()); } - @Test - void generateServiceClassesEmpty() { - GapicContext context = GrpcRestTestProtoLoader.instance().parseShowcaseEcho(); - Service echoProtoService = context.services().get(1); - GapicClass clazz = ServiceClientClassComposer.instance().generate(context, echoProtoService); - - JavaWriterVisitor visitor = new JavaWriterVisitor(); - clazz.classDefinition().accept(visitor); - GoldenFileWriter.saveCodegenToFile(this.getClass(), "EchoEmpty.golden", visitor.write()); - Path goldenFilePath = - Paths.get(GoldenFileWriter.getGoldenDir(this.getClass()), "EchoEmpty.golden"); - Assert.assertCodeEquals(goldenFilePath, visitor.write()); - } - @Test void generateServiceClassesWicked() { GapicContext context = GrpcRestTestProtoLoader.instance().parseShowcaseWicked(); 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 deleted file mode 100644 index b423bbbb94..0000000000 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/EchoEmpty.golden +++ /dev/null @@ -1,154 +0,0 @@ -package com.google.showcase.grpcrest.v1beta1; - -import com.google.api.core.BetaApi; -import com.google.api.gax.core.BackgroundResource; -import com.google.showcase.grpcrest.v1beta1.stub.EchoEmpyStub; -import com.google.showcase.grpcrest.v1beta1.stub.EchoEmpyStubSettings; -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 (EchoEmpyClient echoEmpyClient = EchoEmpyClient.create()) {}
- * }
- * - *

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

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 EchoEmpySettings 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
- * EchoEmpySettings echoEmpySettings =
- *     EchoEmpySettings.newBuilder()
- *         .setCredentialsProvider(FixedCredentialsProvider.create(myCredentials))
- *         .build();
- * EchoEmpyClient echoEmpyClient = EchoEmpyClient.create(echoEmpySettings);
- * }
- * - *

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
- * EchoEmpySettings echoEmpySettings =
- *     EchoEmpySettings.newBuilder().setEndpoint(myEndpoint).build();
- * EchoEmpyClient echoEmpyClient = EchoEmpyClient.create(echoEmpySettings);
- * }
- * - *

Please refer to the GitHub repository's samples for more quickstart code snippets. - */ -@BetaApi -@Generated("by gapic-generator-java") -public class EchoEmpyClient implements BackgroundResource { - private final EchoEmpySettings settings; - private final EchoEmpyStub stub; - - /** Constructs an instance of EchoEmpyClient with default settings. */ - public static final EchoEmpyClient create() throws IOException { - return create(EchoEmpySettings.newBuilder().build()); - } - - /** - * Constructs an instance of EchoEmpyClient, 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 EchoEmpyClient create(EchoEmpySettings settings) throws IOException { - return new EchoEmpyClient(settings); - } - - /** - * Constructs an instance of EchoEmpyClient, using the given stub for making calls. This is for - * advanced usage - prefer using create(EchoEmpySettings). - */ - public static final EchoEmpyClient create(EchoEmpyStub stub) { - return new EchoEmpyClient(stub); - } - - /** - * Constructs an instance of EchoEmpyClient, 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 EchoEmpyClient(EchoEmpySettings settings) throws IOException { - this.settings = settings; - this.stub = ((EchoEmpyStubSettings) settings.getStubSettings()).createStub(); - } - - protected EchoEmpyClient(EchoEmpyStub stub) { - this.settings = null; - this.stub = stub; - } - - public final EchoEmpySettings getSettings() { - return settings; - } - - public EchoEmpyStub getStub() { - return stub; - } - - @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); - } -} From dde16590263afe4bbe0e8923e98ec2e3a5e822ad Mon Sep 17 00:00:00 2001 From: Min Zhu Date: Fri, 19 Jul 2024 16:42:04 -0400 Subject: [PATCH 5/8] fix: update test proto comment. --- .../src/test/proto/service_with_no_methods.proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gapic-generator-java/src/test/proto/service_with_no_methods.proto b/gapic-generator-java/src/test/proto/service_with_no_methods.proto index 3d1012ff72..906ade5dcb 100644 --- a/gapic-generator-java/src/test/proto/service_with_no_methods.proto +++ b/gapic-generator-java/src/test/proto/service_with_no_methods.proto @@ -36,7 +36,7 @@ option (google.api.resource_definition) = { }; // This proto is used to test scenarios where a service does not have any rpc methods -// This service is used to test when roc methods are specified. +// This service is used as control group when it is not empty. service EchoWithMethods { // This service is meant to only run locally on the port 7469 (keypad digits // for "show"). From a1898a9a3b614ff8eeed24d157ba26f89c9d2c04 Mon Sep 17 00:00:00 2001 From: Min Zhu Date: Mon, 22 Jul 2024 17:18:06 -0400 Subject: [PATCH 6/8] update log wording. Co-authored-by: Lawrence Qiu --- .../java/com/google/api/generator/gapic/protoparser/Parser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/protoparser/Parser.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/protoparser/Parser.java index ff89a87555..9a2da74747 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/protoparser/Parser.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/protoparser/Parser.java @@ -441,7 +441,7 @@ public static List parseService( if (methodsList.isEmpty()) { LOGGER.warning( String.format( - "No rpc methods specified in %s, generation will be skipped.", + "Service %s has no RPC methods and will not be generated", serviceDescriptor.getName())); } return !methodsList.isEmpty(); From c851d49923f5db5ac20c9d562a79e1e4215f3a66 Mon Sep 17 00:00:00 2001 From: Min Zhu Date: Tue, 23 Jul 2024 13:18:54 -0400 Subject: [PATCH 7/8] review comment: rm unused service from proto for test. --- gapic-generator-java/src/test/proto/echo_grpcrest.proto | 5 ----- 1 file changed, 5 deletions(-) diff --git a/gapic-generator-java/src/test/proto/echo_grpcrest.proto b/gapic-generator-java/src/test/proto/echo_grpcrest.proto index ea4a9392f3..e02b4e35db 100644 --- a/gapic-generator-java/src/test/proto/echo_grpcrest.proto +++ b/gapic-generator-java/src/test/proto/echo_grpcrest.proto @@ -163,11 +163,6 @@ service Echo { } } -// Generator should not fail when encounter a service without methods -service EchoEmpy { - option (google.api.default_host) = "localhost:7469"; -} - // A severity enum used to test enum capabilities in GAPIC surfaces enum Severity { UNNECESSARY = 0; From ac26d787316e3db392fe6886726e91d6a3534d5a Mon Sep 17 00:00:00 2001 From: Min Zhu Date: Tue, 23 Jul 2024 15:54:19 -0400 Subject: [PATCH 8/8] update golden showcase files to fix native test failure. --- .../reflect-config.json | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/showcase/gapic-showcase/src/main/resources/META-INF/native-image/com.google.showcase.v1beta1/reflect-config.json b/showcase/gapic-showcase/src/main/resources/META-INF/native-image/com.google.showcase.v1beta1/reflect-config.json index 27722fa934..3d3a14c9ba 100644 --- a/showcase/gapic-showcase/src/main/resources/META-INF/native-image/com.google.showcase.v1beta1/reflect-config.json +++ b/showcase/gapic-showcase/src/main/resources/META-INF/native-image/com.google.showcase.v1beta1/reflect-config.json @@ -440,6 +440,24 @@ "allDeclaredClasses": true, "allPublicClasses": true }, + { + "name": "com.google.api.TypeReference", + "queryAllDeclaredConstructors": true, + "queryAllPublicConstructors": true, + "queryAllDeclaredMethods": true, + "allPublicMethods": true, + "allDeclaredClasses": true, + "allPublicClasses": true + }, + { + "name": "com.google.api.TypeReference$Builder", + "queryAllDeclaredConstructors": true, + "queryAllPublicConstructors": true, + "queryAllDeclaredMethods": true, + "allPublicMethods": true, + "allDeclaredClasses": true, + "allPublicClasses": true + }, { "name": "com.google.cloud.location.GetLocationRequest", "queryAllDeclaredConstructors": true,