From 685ccfdd03c4213247b417729f406e0093999362 Mon Sep 17 00:00:00 2001 From: Noah Dietz Date: Thu, 6 Nov 2025 19:37:01 +0000 Subject: [PATCH 1/7] fix: add per-service api_version to gapic_metadata --- gapic-generator-java/pom.xml | 2 +- .../common/AbstractServiceClientClassComposer.java | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/gapic-generator-java/pom.xml b/gapic-generator-java/pom.xml index 43422afe3e..0764fc8cea 100644 --- a/gapic-generator-java/pom.xml +++ b/gapic-generator-java/pom.xml @@ -14,7 +14,7 @@ true UTF-8 - 44d6bef0ca6db8bba3fb324c8186e694bcc4829c + 9fcfbea0aa5b50fa22e190faceb073d74504172b 1.8 1.8 diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceClientClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceClientClassComposer.java index 0bd67e1663..2ae0667401 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceClientClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceClientClassComposer.java @@ -1898,12 +1898,17 @@ private static void updateGapicMetadata( serviceClientProtoBuilder.putRpcs(rpcName, methodList); } + GapicMetadata.ServiceForTransport.Builder grpcServiceClient = + GapicMetadata.ServiceForTransport.newBuilder() + .putClients("grpc", serviceClientProtoBuilder.build()); + + if (service.hasApiVersion()) { + grpcServiceClient.setApiVersion(service.apiVersion()); + } + metadataBuilder = metadataBuilder.putServices( - service.name(), - GapicMetadata.ServiceForTransport.newBuilder() - .putClients("grpc", serviceClientProtoBuilder.build()) - .build()); + service.name(),grpcServiceClient.build()); context.updateGapicMetadata(metadataBuilder.build()); } } From 472ab57e4fd0cb226f9d2a5f7f4d9f7dd2221069 Mon Sep 17 00:00:00 2001 From: Noah Dietz Date: Thu, 6 Nov 2025 19:56:04 +0000 Subject: [PATCH 2/7] chore: update java-showcase gapic_metadata.json --- .../main/java/com/google/showcase/v1beta1/gapic_metadata.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/java-showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/gapic_metadata.json b/java-showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/gapic_metadata.json index 1ab92719fe..4d11ed39b9 100644 --- a/java-showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/gapic_metadata.json +++ b/java-showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/gapic_metadata.json @@ -114,7 +114,8 @@ } } } - } + }, + "apiVersion": "v1_20240408" }, "Identity": { "clients": { From 40fe026edf4c6fcd41b177bde3e178f1b8de9c1c Mon Sep 17 00:00:00 2001 From: Noah Dietz Date: Thu, 6 Nov 2025 20:03:46 +0000 Subject: [PATCH 3/7] fix formatting --- .../common/AbstractServiceClientClassComposer.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceClientClassComposer.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceClientClassComposer.java index 2ae0667401..913ffd0f5c 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceClientClassComposer.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceClientClassComposer.java @@ -1898,17 +1898,15 @@ private static void updateGapicMetadata( serviceClientProtoBuilder.putRpcs(rpcName, methodList); } - GapicMetadata.ServiceForTransport.Builder grpcServiceClient = + GapicMetadata.ServiceForTransport.Builder grpcServiceClient = GapicMetadata.ServiceForTransport.newBuilder() .putClients("grpc", serviceClientProtoBuilder.build()); if (service.hasApiVersion()) { - grpcServiceClient.setApiVersion(service.apiVersion()); + grpcServiceClient.setApiVersion(service.apiVersion()); } - metadataBuilder = - metadataBuilder.putServices( - service.name(),grpcServiceClient.build()); + metadataBuilder = metadataBuilder.putServices(service.name(), grpcServiceClient.build()); context.updateGapicMetadata(metadataBuilder.build()); } } From c5f8d8d4140caa65b86ec209325ae93945c9209d Mon Sep 17 00:00:00 2001 From: Noah Dietz Date: Thu, 6 Nov 2025 20:10:30 +0000 Subject: [PATCH 4/7] update a unit test golden --- .../grpc/goldens/SubscriberClientTest.golden | 83 ++++++++++++++----- 1 file changed, 62 insertions(+), 21 deletions(-) diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/SubscriberClientTest.golden b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/SubscriberClientTest.golden index d9a1215708..b0ffbf3c02 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/SubscriberClientTest.golden +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/SubscriberClientTest.golden @@ -17,6 +17,7 @@ import com.google.api.gax.rpc.StatusCode; import com.google.common.collect.Lists; import com.google.protobuf.AbstractMessage; import com.google.protobuf.Empty; +import com.google.protobuf.FieldMask; import google.cloud.ProjectName; import io.grpc.StatusRuntimeException; import java.io.IOException; @@ -79,6 +80,8 @@ public class SubscriberClientTest { .setName(SubscriptionName.of("[PROJECT]", "[SUBSCRIPTION]").toString()) .setTopic(TopicName.ofProjectTopicName("[PROJECT]", "[TOPIC]").toString()) .setPushConfig(PushConfig.newBuilder().build()) + .setBigqueryConfig(BigQueryConfig.newBuilder().build()) + .setCloudStorageConfig(CloudStorageConfig.newBuilder().build()) .setAckDeadlineSeconds(2135351438) .setRetainAckedMessages(true) .putAllLabels(new HashMap()) @@ -89,6 +92,10 @@ public class SubscriberClientTest { .setRetryPolicy(RetryPolicy.newBuilder().build()) .setDetached(true) .setEnableExactlyOnceDelivery(true) + .setAnalyticsHubSubscriptionInfo( + Subscription.AnalyticsHubSubscriptionInfo.newBuilder().build()) + .addAllMessageTransforms(new ArrayList()) + .putAllTags(new HashMap()) .build(); mockSubscriber.addResponse(expectedResponse); @@ -139,6 +146,8 @@ public class SubscriberClientTest { .setName(SubscriptionName.of("[PROJECT]", "[SUBSCRIPTION]").toString()) .setTopic(TopicName.ofProjectTopicName("[PROJECT]", "[TOPIC]").toString()) .setPushConfig(PushConfig.newBuilder().build()) + .setBigqueryConfig(BigQueryConfig.newBuilder().build()) + .setCloudStorageConfig(CloudStorageConfig.newBuilder().build()) .setAckDeadlineSeconds(2135351438) .setRetainAckedMessages(true) .putAllLabels(new HashMap()) @@ -149,6 +158,10 @@ public class SubscriberClientTest { .setRetryPolicy(RetryPolicy.newBuilder().build()) .setDetached(true) .setEnableExactlyOnceDelivery(true) + .setAnalyticsHubSubscriptionInfo( + Subscription.AnalyticsHubSubscriptionInfo.newBuilder().build()) + .addAllMessageTransforms(new ArrayList()) + .putAllTags(new HashMap()) .build(); mockSubscriber.addResponse(expectedResponse); @@ -199,6 +212,8 @@ public class SubscriberClientTest { .setName(SubscriptionName.of("[PROJECT]", "[SUBSCRIPTION]").toString()) .setTopic(TopicName.ofProjectTopicName("[PROJECT]", "[TOPIC]").toString()) .setPushConfig(PushConfig.newBuilder().build()) + .setBigqueryConfig(BigQueryConfig.newBuilder().build()) + .setCloudStorageConfig(CloudStorageConfig.newBuilder().build()) .setAckDeadlineSeconds(2135351438) .setRetainAckedMessages(true) .putAllLabels(new HashMap()) @@ -209,6 +224,10 @@ public class SubscriberClientTest { .setRetryPolicy(RetryPolicy.newBuilder().build()) .setDetached(true) .setEnableExactlyOnceDelivery(true) + .setAnalyticsHubSubscriptionInfo( + Subscription.AnalyticsHubSubscriptionInfo.newBuilder().build()) + .addAllMessageTransforms(new ArrayList()) + .putAllTags(new HashMap()) .build(); mockSubscriber.addResponse(expectedResponse); @@ -259,6 +278,8 @@ public class SubscriberClientTest { .setName(SubscriptionName.of("[PROJECT]", "[SUBSCRIPTION]").toString()) .setTopic(TopicName.ofProjectTopicName("[PROJECT]", "[TOPIC]").toString()) .setPushConfig(PushConfig.newBuilder().build()) + .setBigqueryConfig(BigQueryConfig.newBuilder().build()) + .setCloudStorageConfig(CloudStorageConfig.newBuilder().build()) .setAckDeadlineSeconds(2135351438) .setRetainAckedMessages(true) .putAllLabels(new HashMap()) @@ -269,6 +290,10 @@ public class SubscriberClientTest { .setRetryPolicy(RetryPolicy.newBuilder().build()) .setDetached(true) .setEnableExactlyOnceDelivery(true) + .setAnalyticsHubSubscriptionInfo( + Subscription.AnalyticsHubSubscriptionInfo.newBuilder().build()) + .addAllMessageTransforms(new ArrayList()) + .putAllTags(new HashMap()) .build(); mockSubscriber.addResponse(expectedResponse); @@ -319,6 +344,8 @@ public class SubscriberClientTest { .setName(SubscriptionName.of("[PROJECT]", "[SUBSCRIPTION]").toString()) .setTopic(TopicName.ofProjectTopicName("[PROJECT]", "[TOPIC]").toString()) .setPushConfig(PushConfig.newBuilder().build()) + .setBigqueryConfig(BigQueryConfig.newBuilder().build()) + .setCloudStorageConfig(CloudStorageConfig.newBuilder().build()) .setAckDeadlineSeconds(2135351438) .setRetainAckedMessages(true) .putAllLabels(new HashMap()) @@ -329,6 +356,10 @@ public class SubscriberClientTest { .setRetryPolicy(RetryPolicy.newBuilder().build()) .setDetached(true) .setEnableExactlyOnceDelivery(true) + .setAnalyticsHubSubscriptionInfo( + Subscription.AnalyticsHubSubscriptionInfo.newBuilder().build()) + .addAllMessageTransforms(new ArrayList()) + .putAllTags(new HashMap()) .build(); mockSubscriber.addResponse(expectedResponse); @@ -369,6 +400,8 @@ public class SubscriberClientTest { .setName(SubscriptionName.of("[PROJECT]", "[SUBSCRIPTION]").toString()) .setTopic(TopicName.ofProjectTopicName("[PROJECT]", "[TOPIC]").toString()) .setPushConfig(PushConfig.newBuilder().build()) + .setBigqueryConfig(BigQueryConfig.newBuilder().build()) + .setCloudStorageConfig(CloudStorageConfig.newBuilder().build()) .setAckDeadlineSeconds(2135351438) .setRetainAckedMessages(true) .putAllLabels(new HashMap()) @@ -379,6 +412,10 @@ public class SubscriberClientTest { .setRetryPolicy(RetryPolicy.newBuilder().build()) .setDetached(true) .setEnableExactlyOnceDelivery(true) + .setAnalyticsHubSubscriptionInfo( + Subscription.AnalyticsHubSubscriptionInfo.newBuilder().build()) + .addAllMessageTransforms(new ArrayList()) + .putAllTags(new HashMap()) .build(); mockSubscriber.addResponse(expectedResponse); @@ -419,6 +456,8 @@ public class SubscriberClientTest { .setName(SubscriptionName.of("[PROJECT]", "[SUBSCRIPTION]").toString()) .setTopic(TopicName.ofProjectTopicName("[PROJECT]", "[TOPIC]").toString()) .setPushConfig(PushConfig.newBuilder().build()) + .setBigqueryConfig(BigQueryConfig.newBuilder().build()) + .setCloudStorageConfig(CloudStorageConfig.newBuilder().build()) .setAckDeadlineSeconds(2135351438) .setRetainAckedMessages(true) .putAllLabels(new HashMap()) @@ -429,23 +468,25 @@ public class SubscriberClientTest { .setRetryPolicy(RetryPolicy.newBuilder().build()) .setDetached(true) .setEnableExactlyOnceDelivery(true) + .setAnalyticsHubSubscriptionInfo( + Subscription.AnalyticsHubSubscriptionInfo.newBuilder().build()) + .addAllMessageTransforms(new ArrayList()) + .putAllTags(new HashMap()) .build(); mockSubscriber.addResponse(expectedResponse); - UpdateSubscriptionRequest request = - UpdateSubscriptionRequest.newBuilder() - .setSubscription(Subscription.newBuilder().build()) - .build(); + Subscription subscription = Subscription.newBuilder().build(); + FieldMask updateMask = FieldMask.newBuilder().build(); - Subscription actualResponse = client.updateSubscription(request); + Subscription actualResponse = client.updateSubscription(subscription, updateMask); Assert.assertEquals(expectedResponse, actualResponse); List actualRequests = mockSubscriber.getRequests(); Assert.assertEquals(1, actualRequests.size()); UpdateSubscriptionRequest actualRequest = ((UpdateSubscriptionRequest) actualRequests.get(0)); - Assert.assertEquals(request.getSubscription(), actualRequest.getSubscription()); - Assert.assertEquals(request.getUpdateMask(), actualRequest.getUpdateMask()); + Assert.assertEquals(subscription, actualRequest.getSubscription()); + Assert.assertEquals(updateMask, actualRequest.getUpdateMask()); Assert.assertTrue( channelProvider.isHeaderSent( ApiClientHeaderProvider.getDefaultApiClientHeaderKey(), @@ -458,11 +499,9 @@ public class SubscriberClientTest { mockSubscriber.addException(exception); try { - UpdateSubscriptionRequest request = - UpdateSubscriptionRequest.newBuilder() - .setSubscription(Subscription.newBuilder().build()) - .build(); - client.updateSubscription(request); + Subscription subscription = Subscription.newBuilder().build(); + FieldMask updateMask = FieldMask.newBuilder().build(); + client.updateSubscription(subscription, updateMask); Assert.fail("No exception raised"); } catch (InvalidArgumentException e) { // Expected exception. @@ -946,7 +985,7 @@ public class SubscriberClientTest { StreamingPullResponse expectedResponse = StreamingPullResponse.newBuilder() .addAllReceivedMessages(new ArrayList()) - .setAcknowlegeConfirmation( + .setAcknowledgeConfirmation( StreamingPullResponse.AcknowledgeConfirmation.newBuilder().build()) .setModifyAckDeadlineConfirmation( StreamingPullResponse.ModifyAckDeadlineConfirmation.newBuilder().build()) @@ -964,6 +1003,7 @@ public class SubscriberClientTest { .setClientId("clientId908408390") .setMaxOutstandingMessages(-1315266996) .setMaxOutstandingBytes(-2103098517) + .setProtocolVersion(-1161610703) .build(); MockStreamObserver responseObserver = new MockStreamObserver<>(); @@ -995,6 +1035,7 @@ public class SubscriberClientTest { .setClientId("clientId908408390") .setMaxOutstandingMessages(-1315266996) .setMaxOutstandingBytes(-2103098517) + .setProtocolVersion(-1161610703) .build(); MockStreamObserver responseObserver = new MockStreamObserver<>(); @@ -1440,18 +1481,18 @@ public class SubscriberClientTest { .build(); mockSubscriber.addResponse(expectedResponse); - UpdateSnapshotRequest request = - UpdateSnapshotRequest.newBuilder().setSnapshot(Snapshot.newBuilder().build()).build(); + Snapshot snapshot = Snapshot.newBuilder().build(); + FieldMask updateMask = FieldMask.newBuilder().build(); - Snapshot actualResponse = client.updateSnapshot(request); + Snapshot actualResponse = client.updateSnapshot(snapshot, updateMask); Assert.assertEquals(expectedResponse, actualResponse); List actualRequests = mockSubscriber.getRequests(); Assert.assertEquals(1, actualRequests.size()); UpdateSnapshotRequest actualRequest = ((UpdateSnapshotRequest) actualRequests.get(0)); - Assert.assertEquals(request.getSnapshot(), actualRequest.getSnapshot()); - Assert.assertEquals(request.getUpdateMask(), actualRequest.getUpdateMask()); + Assert.assertEquals(snapshot, actualRequest.getSnapshot()); + Assert.assertEquals(updateMask, actualRequest.getUpdateMask()); Assert.assertTrue( channelProvider.isHeaderSent( ApiClientHeaderProvider.getDefaultApiClientHeaderKey(), @@ -1464,9 +1505,9 @@ public class SubscriberClientTest { mockSubscriber.addException(exception); try { - UpdateSnapshotRequest request = - UpdateSnapshotRequest.newBuilder().setSnapshot(Snapshot.newBuilder().build()).build(); - client.updateSnapshot(request); + Snapshot snapshot = Snapshot.newBuilder().build(); + FieldMask updateMask = FieldMask.newBuilder().build(); + client.updateSnapshot(snapshot, updateMask); Assert.fail("No exception raised"); } catch (InvalidArgumentException e) { // Expected exception. From 2c4de611cda9e59216ac4373ff4f39954f80f0b7 Mon Sep 17 00:00:00 2001 From: Noah Dietz Date: Thu, 6 Nov 2025 20:25:34 +0000 Subject: [PATCH 5/7] fix missing test dep --- .../resourcename/ResourceNameHelperClassComposerTest.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/resourcename/ResourceNameHelperClassComposerTest.java b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/resourcename/ResourceNameHelperClassComposerTest.java index 7438d53b01..b5b8cc3f8e 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/resourcename/ResourceNameHelperClassComposerTest.java +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/resourcename/ResourceNameHelperClassComposerTest.java @@ -31,6 +31,8 @@ import com.google.logging.v2.LoggingConfigProto; import com.google.logging.v2.LoggingMetricsProto; import com.google.logging.v2.LoggingProto; +import com.google.protobuf.Empty; +import com.google.protobuf.EmptyProto; import com.google.protobuf.Descriptors.FileDescriptor; import com.google.protobuf.Descriptors.ServiceDescriptor; import com.google.showcase.v1beta1.EchoOuterClass; @@ -143,6 +145,12 @@ void generateResourceNameClass_loggingOnePatternMultipleVariables() { FileDescriptor commonResourcesFileDescriptor = CommonResources.getDescriptor(); resourceNames.putAll(Parser.parseResourceNames(commonResourcesFileDescriptor)); + // Additional dependency found in LoggingService.DeleteLink LRO + // (google.longrunning.operation_info).response_type. Necessary for + // complete parsing of the descriptors. + FileDescriptor emptyFileDescriptor = EmptyProto.getDescriptor(); + messageTypes.putAll(Parser.parseMessages(emptyFileDescriptor)); + Set outputResourceNames = new HashSet<>(); Parser.parseService( serviceFileDescriptor, messageTypes, resourceNames, Optional.empty(), outputResourceNames); From db2674fc6ddfc23e10f564948bd6769759876a0a Mon Sep 17 00:00:00 2001 From: Noah Dietz Date: Thu, 6 Nov 2025 20:26:43 +0000 Subject: [PATCH 6/7] remove unused import --- .../resourcename/ResourceNameHelperClassComposerTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/resourcename/ResourceNameHelperClassComposerTest.java b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/resourcename/ResourceNameHelperClassComposerTest.java index b5b8cc3f8e..5a3eb4df08 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/resourcename/ResourceNameHelperClassComposerTest.java +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/resourcename/ResourceNameHelperClassComposerTest.java @@ -31,7 +31,6 @@ import com.google.logging.v2.LoggingConfigProto; import com.google.logging.v2.LoggingMetricsProto; import com.google.logging.v2.LoggingProto; -import com.google.protobuf.Empty; import com.google.protobuf.EmptyProto; import com.google.protobuf.Descriptors.FileDescriptor; import com.google.protobuf.Descriptors.ServiceDescriptor; From 78c824107fbff7038e0fc31d105f63a9a95af0ea Mon Sep 17 00:00:00 2001 From: Noah Dietz Date: Thu, 6 Nov 2025 20:34:09 +0000 Subject: [PATCH 7/7] fix formatting in test --- .../resourcename/ResourceNameHelperClassComposerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/resourcename/ResourceNameHelperClassComposerTest.java b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/resourcename/ResourceNameHelperClassComposerTest.java index 5a3eb4df08..ecc3e682ae 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/resourcename/ResourceNameHelperClassComposerTest.java +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/resourcename/ResourceNameHelperClassComposerTest.java @@ -31,9 +31,9 @@ import com.google.logging.v2.LoggingConfigProto; import com.google.logging.v2.LoggingMetricsProto; import com.google.logging.v2.LoggingProto; -import com.google.protobuf.EmptyProto; import com.google.protobuf.Descriptors.FileDescriptor; import com.google.protobuf.Descriptors.ServiceDescriptor; +import com.google.protobuf.EmptyProto; import com.google.showcase.v1beta1.EchoOuterClass; import com.google.showcase.v1beta1.TestingOuterClass; import com.google.test.collisions.CollisionsOuterClass;