diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Field.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Field.java index a5ec9caacb..997ea54e5a 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Field.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Field.java @@ -14,6 +14,7 @@ package com.google.api.generator.gapic.model; +import com.google.api.FieldInfo.Format; import com.google.api.generator.engine.ast.TypeNode; import com.google.auto.value.AutoValue; import java.util.Objects; @@ -32,6 +33,15 @@ public abstract class Field { public abstract TypeNode type(); + // If the field is annotated with google.api.field_behavior = REQUIRED, then this is true. This is + // currently only used to check if a field should be auto-populated. If it is true, then the field + // should + // *not* be autopopulated. + public abstract boolean isRequired(); + + @Nullable + public abstract Format fieldInfoFormat(); + public abstract boolean isMessage(); public abstract boolean isEnum(); @@ -72,6 +82,8 @@ public boolean equals(Object o) { return name().equals(other.name()) && originalName().equals(other.originalName()) && type().equals(other.type()) + && isRequired() == other.isRequired() + && fieldInfoFormat() == other.fieldInfoFormat() && isMessage() == other.isMessage() && isEnum() == other.isEnum() && isRepeated() == other.isRepeated() @@ -89,6 +101,8 @@ public int hashCode() { + 19 * type().hashCode() + (isMessage() ? 1 : 0) * 23 + (isEnum() ? 1 : 0) * 29 + + (isRequired() ? 1 : 0) * 31 + + (fieldInfoFormat() == null ? 0 : fieldInfoFormat().hashCode()) + (isRepeated() ? 1 : 0) * 31 + (isMap() ? 1 : 0) * 37 + (isContainedInOneof() ? 1 : 0) * 41 @@ -101,6 +115,7 @@ public int hashCode() { public static Builder builder() { return new AutoValue_Field.Builder() + .setIsRequired(false) .setIsMessage(false) .setIsEnum(false) .setIsRepeated(false) @@ -117,6 +132,10 @@ public abstract static class Builder { public abstract Builder setType(TypeNode type); + public abstract Builder setIsRequired(boolean isRequired); + + public abstract Builder setFieldInfoFormat(Format fieldInfoFormat); + public abstract Builder setIsMessage(boolean isMessage); public abstract Builder setIsEnum(boolean isEnum); diff --git a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Method.java b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Method.java index 4fd5c4f384..f8f815cc08 100644 --- a/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Method.java +++ b/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Method.java @@ -17,6 +17,7 @@ import com.google.api.generator.engine.ast.TypeNode; import com.google.auto.value.AutoValue; import com.google.common.collect.ImmutableList; +import java.util.ArrayList; import java.util.List; import javax.annotation.Nullable; @@ -69,6 +70,16 @@ public boolean isPaged() { // [["content", "error"], ["content", "error", "info"]]. public abstract ImmutableList> methodSignatures(); + public abstract List autoPopulatedFields(); + + /** + * If a service's service_config.yaml file contains method_settings.auto_populated_fields for this + * method, and the method is a Unary-type, then this is true + */ + public boolean hasAutoPopulatedFields() { + return !autoPopulatedFields().isEmpty() && stream() == Stream.NONE; + } + public abstract boolean operationPollingMethod(); public boolean hasLro() { @@ -123,6 +134,7 @@ public boolean isSupportedByTransport(Transport transport) { public static Builder builder() { return new AutoValue_Method.Builder() .setStream(Stream.NONE) + .setAutoPopulatedFields(new ArrayList<>()) .setMethodSignatures(ImmutableList.of()) .setIsBatching(false) .setIsDeprecated(false) @@ -170,6 +182,8 @@ public abstract static class Builder { public abstract Builder setOperationPollingMethod(boolean operationPollingMethod); + public abstract Builder setAutoPopulatedFields(List autoPopulatedFields); + public abstract Builder setRoutingHeaderRule(RoutingHeaderRule routingHeaderRule); public abstract Method build(); 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 c13eda3718..9f1b395940 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 @@ -16,7 +16,12 @@ import com.google.api.ClientProto; import com.google.api.DocumentationRule; +import com.google.api.FieldBehavior; +import com.google.api.FieldBehaviorProto; +import com.google.api.FieldInfo.Format; +import com.google.api.FieldInfoProto; import com.google.api.HttpRule; +import com.google.api.MethodSettings; import com.google.api.ResourceDescriptor; import com.google.api.ResourceProto; import com.google.api.generator.engine.ast.TypeNode; @@ -47,6 +52,7 @@ import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Maps; import com.google.longrunning.OperationInfo; @@ -493,6 +499,7 @@ public static List parseService( messageTypes, resourceNames, serviceConfigOpt, + serviceYamlProtoOpt, outputArgResourceNames, transport)) .build(); @@ -683,9 +690,15 @@ static List parseMethods( Map messageTypes, Map resourceNames, Optional serviceConfigOpt, + Optional serviceYamlProtoOpt, Set outputArgResourceNames, Transport transport) { List methods = new ArrayList<>(); + + // Parse the serviceYaml for autopopulated methods and fields once and put into a map + Map> autoPopulatedMethodsWithFields = + parseAutoPopulatedMethodsAndFields(serviceYamlProtoOpt); + for (MethodDescriptor protoMethod : serviceDescriptor.getMethods()) { // Parse the method. TypeNode inputType = TypeParser.parseType(protoMethod.getInputType()); @@ -699,6 +712,12 @@ static List parseMethods( } } + // Associate the autopopulated fields with the correct method + List autoPopulatedFields = new ArrayList<>(); + if (autoPopulatedMethodsWithFields.containsKey(protoMethod.getFullName())) { + autoPopulatedFields = autoPopulatedMethodsWithFields.get(protoMethod.getFullName()); + } + boolean isDeprecated = false; if (protoMethod.getOptions().hasDeprecated()) { isDeprecated = protoMethod.getOptions().getDeprecated(); @@ -743,6 +762,7 @@ static List parseMethods( resourceNames, outputArgResourceNames)) .setHttpBindings(httpBindings) + .setAutoPopulatedFields(autoPopulatedFields) .setRoutingHeaderRule(routingHeaderRule) .setIsBatching(isBatching) .setPageSizeFieldName(parsePageSizeFieldName(protoMethod, messageTypes, transport)) @@ -970,6 +990,8 @@ private static Field parseField( FieldOptions fieldOptions = fieldDescriptor.getOptions(); MessageOptions messageOptions = messageDescriptor.getOptions(); ResourceReference resourceReference = null; + boolean isRequired = false; + Format fieldInfoFormat = null; if (fieldOptions.hasExtension(ResourceProto.resourceReference)) { com.google.api.ResourceReference protoResourceReference = fieldOptions.getExtension(ResourceProto.resourceReference); @@ -1000,6 +1022,16 @@ private static Field parseField( } } + if (fieldOptions.hasExtension(FieldInfoProto.fieldInfo)) { + fieldInfoFormat = fieldOptions.getExtension(FieldInfoProto.fieldInfo).getFormat(); + } + if (fieldOptions.getExtensionCount(FieldBehaviorProto.fieldBehavior) > 0) { + if (fieldOptions + .getExtension(FieldBehaviorProto.fieldBehavior) + .contains(FieldBehavior.REQUIRED)) ; + isRequired = true; + } + Field.Builder fieldBuilder = Field.builder(); if (fieldDescriptor.getFile().toProto().hasSourceCodeInfo()) { SourceCodeInfoLocation protoFieldLocation = @@ -1030,6 +1062,8 @@ private static Field parseField( fieldDescriptor.getContainingOneof() != null && fieldDescriptor.getContainingOneof().isSynthetic()) .setIsRepeated(fieldDescriptor.isRepeated()) + .setIsRequired(isRequired) + .setFieldInfoFormat(fieldInfoFormat) .setIsMap(fieldDescriptor.isMapField()) .setResourceReference(resourceReference) .build(); @@ -1124,4 +1158,25 @@ static String parseNestedProtoTypeName(String fullyQualifiedName) { .collect(Collectors.toList()); return String.join(".", nestedTypeComponents); } + + /** + * Converts a serviceYaml file to a map of methods and autopopulated fields. Note: this does NOT + * currently support wildcards in MethodSettings.selectors. + */ + @VisibleForTesting + static Map> parseAutoPopulatedMethodsAndFields( + Optional serviceYamlProtoOpt) { + if (!hasMethodSettings(serviceYamlProtoOpt)) { + return ImmutableMap.>builder().build(); + } + return serviceYamlProtoOpt.get().getPublishing().getMethodSettingsList().stream() + .collect( + Collectors.toMap( + MethodSettings::getSelector, MethodSettings::getAutoPopulatedFieldsList)); + } + + @VisibleForTesting + static boolean hasMethodSettings(Optional serviceYamlProtoOpt) { + return serviceYamlProtoOpt.isPresent() && serviceYamlProtoOpt.get().hasPublishing(); + } } diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/defaultvalue/DefaultValueComposerTest.java b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/defaultvalue/DefaultValueComposerTest.java index 264060f474..43e5411b30 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/defaultvalue/DefaultValueComposerTest.java +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/defaultvalue/DefaultValueComposerTest.java @@ -568,6 +568,7 @@ public void createSimpleMessage_containsMessagesEnumsAndResourceName() { "EchoRequest.newBuilder().setName(" + "FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\").toString())" + ".setParent(FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\").toString())" + + ".setRequestId(\"requestId693933066\")" + ".setSeverity(Severity.forNumber(0))" + ".setFoobar(Foobar.newBuilder().build()).build()", writerVisitor.write()); diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/EchoClient.golden b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/EchoClient.golden index 0abcdca6bb..8e92d7365d 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/EchoClient.golden +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/EchoClient.golden @@ -516,6 +516,7 @@ public class EchoClient implements BackgroundResource { * EchoRequest.newBuilder() * .setName(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) * .setParent(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) + * .setRequestId("requestId693933066") * .setSeverity(Severity.forNumber(0)) * .setFoobar(Foobar.newBuilder().build()) * .build(); @@ -545,6 +546,7 @@ public class EchoClient implements BackgroundResource { * EchoRequest.newBuilder() * .setName(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) * .setParent(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) + * .setRequestId("requestId693933066") * .setSeverity(Severity.forNumber(0)) * .setFoobar(Foobar.newBuilder().build()) * .build(); @@ -570,7 +572,11 @@ public class EchoClient implements BackgroundResource { * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library * try (EchoClient echoClient = EchoClient.create()) { * ExpandRequest request = - * ExpandRequest.newBuilder().setContent("content951530617").setInfo("info3237038").build(); + * ExpandRequest.newBuilder() + * .setContent("content951530617") + * .setInfo("info3237038") + * .setRequestId("requestId693933066") + * .build(); * ServerStream stream = echoClient.expandCallable().call(request); * for (EchoResponse response : stream) { * // Do something when a response is received. @@ -616,6 +622,7 @@ public class EchoClient implements BackgroundResource { * EchoRequest.newBuilder() * .setName(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) * .setParent(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) + * .setRequestId("requestId693933066") * .setSeverity(Severity.forNumber(0)) * .setFoobar(Foobar.newBuilder().build()) * .build(); @@ -643,6 +650,7 @@ public class EchoClient implements BackgroundResource { * EchoRequest.newBuilder() * .setName(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) * .setParent(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) + * .setRequestId("requestId693933066") * .setSeverity(Severity.forNumber(0)) * .setFoobar(Foobar.newBuilder().build()) * .build(); @@ -673,6 +681,7 @@ public class EchoClient implements BackgroundResource { * EchoRequest.newBuilder() * .setName(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) * .setParent(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) + * .setRequestId("requestId693933066") * .setSeverity(Severity.forNumber(0)) * .setFoobar(Foobar.newBuilder().build()) * .build(); @@ -1081,6 +1090,7 @@ public class EchoClient implements BackgroundResource { * EchoRequest.newBuilder() * .setName(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) * .setParent(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) + * .setRequestId("requestId693933066") * .setSeverity(Severity.forNumber(0)) * .setFoobar(Foobar.newBuilder().build()) * .build(); @@ -1110,6 +1120,7 @@ public class EchoClient implements BackgroundResource { * EchoRequest.newBuilder() * .setName(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) * .setParent(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) + * .setRequestId("requestId693933066") * .setSeverity(Severity.forNumber(0)) * .setFoobar(Foobar.newBuilder().build()) * .build(); diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/EchoClientTest.golden b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/EchoClientTest.golden index 1372cdd94e..009d8688df 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/EchoClientTest.golden +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/EchoClientTest.golden @@ -108,6 +108,7 @@ public class EchoClientTest { EchoRequest.newBuilder() .setName(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) .setParent(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) + .setRequestId("requestId693933066") .setSeverity(Severity.forNumber(0)) .setFoobar(Foobar.newBuilder().build()) .build(); @@ -403,7 +404,11 @@ public class EchoClientTest { .build(); mockEcho.addResponse(expectedResponse); ExpandRequest request = - ExpandRequest.newBuilder().setContent("content951530617").setInfo("info3237038").build(); + ExpandRequest.newBuilder() + .setContent("content951530617") + .setInfo("info3237038") + .setRequestId("requestId693933066") + .build(); MockStreamObserver responseObserver = new MockStreamObserver<>(); @@ -420,7 +425,11 @@ public class EchoClientTest { StatusRuntimeException exception = new StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT); mockEcho.addException(exception); ExpandRequest request = - ExpandRequest.newBuilder().setContent("content951530617").setInfo("info3237038").build(); + ExpandRequest.newBuilder() + .setContent("content951530617") + .setInfo("info3237038") + .setRequestId("requestId693933066") + .build(); MockStreamObserver responseObserver = new MockStreamObserver<>(); @@ -449,6 +458,7 @@ public class EchoClientTest { EchoRequest.newBuilder() .setName(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) .setParent(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) + .setRequestId("requestId693933066") .setSeverity(Severity.forNumber(0)) .setFoobar(Foobar.newBuilder().build()) .build(); @@ -474,6 +484,7 @@ public class EchoClientTest { EchoRequest.newBuilder() .setName(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) .setParent(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) + .setRequestId("requestId693933066") .setSeverity(Severity.forNumber(0)) .setFoobar(Foobar.newBuilder().build()) .build(); @@ -507,6 +518,7 @@ public class EchoClientTest { EchoRequest.newBuilder() .setName(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) .setParent(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) + .setRequestId("requestId693933066") .setSeverity(Severity.forNumber(0)) .setFoobar(Foobar.newBuilder().build()) .build(); @@ -532,6 +544,7 @@ public class EchoClientTest { EchoRequest.newBuilder() .setName(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) .setParent(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) + .setRequestId("requestId693933066") .setSeverity(Severity.forNumber(0)) .setFoobar(Foobar.newBuilder().build()) .build(); @@ -565,6 +578,7 @@ public class EchoClientTest { EchoRequest.newBuilder() .setName(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) .setParent(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) + .setRequestId("requestId693933066") .setSeverity(Severity.forNumber(0)) .setFoobar(Foobar.newBuilder().build()) .build(); @@ -590,6 +604,7 @@ public class EchoClientTest { EchoRequest.newBuilder() .setName(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) .setParent(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) + .setRequestId("requestId693933066") .setSeverity(Severity.forNumber(0)) .setFoobar(Foobar.newBuilder().build()) .build(); @@ -848,6 +863,7 @@ public class EchoClientTest { EchoRequest.newBuilder() .setName(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) .setParent(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) + .setRequestId("requestId693933066") .setSeverity(Severity.forNumber(0)) .setFoobar(Foobar.newBuilder().build()) .build(); @@ -861,6 +877,7 @@ public class EchoClientTest { Assert.assertEquals(request.getName(), actualRequest.getName()); Assert.assertEquals(request.getParent(), actualRequest.getParent()); + Assert.assertEquals(request.getRequestId(), actualRequest.getRequestId()); Assert.assertEquals(request.getContent(), actualRequest.getContent()); Assert.assertEquals(request.getError(), actualRequest.getError()); Assert.assertEquals(request.getSeverity(), actualRequest.getSeverity()); @@ -881,6 +898,7 @@ public class EchoClientTest { EchoRequest.newBuilder() .setName(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) .setParent(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) + .setRequestId("requestId693933066") .setSeverity(Severity.forNumber(0)) .setFoobar(Foobar.newBuilder().build()) .build(); diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/AsyncChat.golden b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/AsyncChat.golden index 13867b1bb8..e17e9367c8 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/AsyncChat.golden +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/AsyncChat.golden @@ -43,6 +43,7 @@ public class AsyncChat { EchoRequest.newBuilder() .setName(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) .setParent(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) + .setRequestId("requestId693933066") .setSeverity(Severity.forNumber(0)) .setFoobar(Foobar.newBuilder().build()) .build(); diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/AsyncChatAgain.golden b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/AsyncChatAgain.golden index aba2c145d9..02e38bd9db 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/AsyncChatAgain.golden +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/AsyncChatAgain.golden @@ -43,6 +43,7 @@ public class AsyncChatAgain { EchoRequest.newBuilder() .setName(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) .setParent(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) + .setRequestId("requestId693933066") .setSeverity(Severity.forNumber(0)) .setFoobar(Foobar.newBuilder().build()) .build(); diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/AsyncCollect.golden b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/AsyncCollect.golden index 0103bdc4a5..cd8c21c72d 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/AsyncCollect.golden +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/AsyncCollect.golden @@ -61,6 +61,7 @@ public class AsyncCollect { EchoRequest.newBuilder() .setName(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) .setParent(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) + .setRequestId("requestId693933066") .setSeverity(Severity.forNumber(0)) .setFoobar(Foobar.newBuilder().build()) .build(); diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/AsyncCollideName.golden b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/AsyncCollideName.golden index f606fdf6ed..5ca5cd0bcc 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/AsyncCollideName.golden +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/AsyncCollideName.golden @@ -42,6 +42,7 @@ public class AsyncCollideName { EchoRequest.newBuilder() .setName(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) .setParent(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) + .setRequestId("requestId693933066") .setSeverity(Severity.forNumber(0)) .setFoobar(Foobar.newBuilder().build()) .build(); diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/AsyncEcho.golden b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/AsyncEcho.golden index 2c9d336813..087faaebf5 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/AsyncEcho.golden +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/AsyncEcho.golden @@ -42,6 +42,7 @@ public class AsyncEcho { EchoRequest.newBuilder() .setName(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) .setParent(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) + .setRequestId("requestId693933066") .setSeverity(Severity.forNumber(0)) .setFoobar(Foobar.newBuilder().build()) .build(); diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/AsyncExpand.golden b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/AsyncExpand.golden index bd0dbd67c3..aff30c88fc 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/AsyncExpand.golden +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/AsyncExpand.golden @@ -36,7 +36,11 @@ public class AsyncExpand { // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library try (EchoClient echoClient = EchoClient.create()) { ExpandRequest request = - ExpandRequest.newBuilder().setContent("content951530617").setInfo("info3237038").build(); + ExpandRequest.newBuilder() + .setContent("content951530617") + .setInfo("info3237038") + .setRequestId("requestId693933066") + .build(); ServerStream stream = echoClient.expandCallable().call(request); for (EchoResponse response : stream) { // Do something when a response is received. diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/SyncCollideName.golden b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/SyncCollideName.golden index 57a842f907..f299524598 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/SyncCollideName.golden +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/SyncCollideName.golden @@ -41,6 +41,7 @@ public class SyncCollideName { EchoRequest.newBuilder() .setName(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) .setParent(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) + .setRequestId("requestId693933066") .setSeverity(Severity.forNumber(0)) .setFoobar(Foobar.newBuilder().build()) .build(); diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/SyncEcho.golden b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/SyncEcho.golden index f9fbef3fff..a0918f576d 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/SyncEcho.golden +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/samples/echoclient/SyncEcho.golden @@ -41,6 +41,7 @@ public class SyncEcho { EchoRequest.newBuilder() .setName(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) .setParent(FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString()) + .setRequestId("requestId693933066") .setSeverity(Severity.forNumber(0)) .setFoobar(Foobar.newBuilder().build()) .build(); diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientCallableMethodSampleComposerTest.java b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientCallableMethodSampleComposerTest.java index f063c50903..44a921f3b0 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientCallableMethodSampleComposerTest.java +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientCallableMethodSampleComposerTest.java @@ -462,7 +462,11 @@ public void valid_composeStreamCallableMethod_serverStream() { LineFormatter.lines( "try (EchoClient echoClient = EchoClient.create()) {\n", " ExpandRequest request =\n", - " ExpandRequest.newBuilder().setContent(\"content951530617\").setInfo(\"info3237038\").build();\n", + " ExpandRequest.newBuilder()\n", + " .setContent(\"content951530617\")\n", + " .setInfo(\"info3237038\")\n", + " .setRequestId(\"requestId693933066\")\n", + " .build();\n", " ServerStream stream = echoClient.expandCallable().call(request);\n", " for (EchoResponse response : stream) {\n", " // Do something when a response is received.\n", @@ -575,6 +579,7 @@ public void valid_composeStreamCallableMethod_bidiStream() { + " \"[FOOBAR]\").toString())\n", " .setParent(FoobarName.ofProjectFoobarName(\"[PROJECT]\"," + " \"[FOOBAR]\").toString())\n", + " .setRequestId(\"requestId693933066\")\n", " .setSeverity(Severity.forNumber(0))\n", " .setFoobar(Foobar.newBuilder().build())\n", " .build();\n", @@ -707,6 +712,7 @@ public void valid_composeStreamCallableMethod_clientStream() { + " \"[FOOBAR]\").toString())\n", " .setParent(FoobarName.ofProjectFoobarName(\"[PROJECT]\"," + " \"[FOOBAR]\").toString())\n", + " .setRequestId(\"requestId693933066\")\n", " .setSeverity(Severity.forNumber(0))\n", " .setFoobar(Foobar.newBuilder().build())\n", " .build();\n", @@ -813,6 +819,7 @@ public void valid_composeRegularCallableMethod_unaryRpc() { + " \"[FOOBAR]\").toString())\n", " .setParent(FoobarName.ofProjectFoobarName(\"[PROJECT]\"," + " \"[FOOBAR]\").toString())\n", + " .setRequestId(\"requestId693933066\")\n", " .setSeverity(Severity.forNumber(0))\n", " .setFoobar(Foobar.newBuilder().build())\n", " .build();\n", diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientHeaderSampleComposerTest.java b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientHeaderSampleComposerTest.java index bf33f30e26..265882ac3f 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientHeaderSampleComposerTest.java +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientHeaderSampleComposerTest.java @@ -223,6 +223,7 @@ public void composeClassHeaderSample_firstMethodHasNoSignatures() { + " \"[FOOBAR]\").toString())\n", " .setParent(FoobarName.ofProjectFoobarName(\"[PROJECT]\"," + " \"[FOOBAR]\").toString())\n", + " .setRequestId(\"requestId693933066\")\n", " .setSeverity(Severity.forNumber(0))\n", " .setFoobar(Foobar.newBuilder().build())\n", " .build();\n", @@ -280,7 +281,11 @@ public void composeClassHeaderSample_firstMethodIsStream() { LineFormatter.lines( "try (EchoClient echoClient = EchoClient.create()) {\n", " ExpandRequest request =\n", - " ExpandRequest.newBuilder().setContent(\"content951530617\").setInfo(\"info3237038\").build();\n", + " ExpandRequest.newBuilder()\n", + " .setContent(\"content951530617\")\n", + " .setInfo(\"info3237038\")\n", + " .setRequestId(\"requestId693933066\")\n", + " .build();\n", " ServerStream stream = echoClient.expandCallable().call(request);\n", " for (EchoResponse response : stream) {\n", " // Do something when a response is received.\n", diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientMethodSampleComposerTest.java b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientMethodSampleComposerTest.java index 6ba7985b5d..9839af8f31 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientMethodSampleComposerTest.java +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientMethodSampleComposerTest.java @@ -335,6 +335,7 @@ public void valid_composeDefaultSample_pureUnaryReturnVoid() { + " \"[FOOBAR]\").toString())\n", " .setParent(FoobarName.ofProjectFoobarName(\"[PROJECT]\"," + " \"[FOOBAR]\").toString())\n", + " .setRequestId(\"requestId693933066\")\n", " .setSeverity(Severity.forNumber(0))\n", " .setFoobar(Foobar.newBuilder().build())\n", " .build();\n", @@ -397,6 +398,7 @@ public void valid_composeDefaultSample_pureUnaryReturnResponse() { + " \"[FOOBAR]\").toString())\n", " .setParent(FoobarName.ofProjectFoobarName(\"[PROJECT]\"," + " \"[FOOBAR]\").toString())\n", + " .setRequestId(\"requestId693933066\")\n", " .setSeverity(Severity.forNumber(0))\n", " .setFoobar(Foobar.newBuilder().build())\n", " .build();\n", diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/model/MethodTest.java b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/model/MethodTest.java index 00754113ae..65c4f6039d 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/model/MethodTest.java +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/model/MethodTest.java @@ -15,14 +15,18 @@ package com.google.api.generator.gapic.model; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThrows; import com.google.api.generator.engine.ast.TypeNode; import com.google.api.generator.gapic.model.HttpBindings.HttpBinding; import com.google.api.generator.gapic.model.HttpBindings.HttpVerb; +import com.google.api.generator.gapic.model.Method.Stream; import com.google.api.generator.gapic.model.RoutingHeaderRule.RoutingHeaderParam; import com.google.common.collect.ImmutableSet; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import org.junit.Test; public class MethodTest { @@ -114,6 +118,55 @@ public void shouldSetParamsExtractor_shouldReturnFalseIfHasNoHttpBindingsAndNoRo assertThat(method.shouldSetParamsExtractor()).isFalse(); } + @Test + public void hasAutoPopulatedFields_shouldReturnTrueIfMethodIsUnary() { + List autoPopulatedFields = Arrays.asList("field1", "field2"); + Method method = METHOD.toBuilder().setAutoPopulatedFields(autoPopulatedFields).build(); + method.toStream(false, false); + assertEquals(true, method.hasAutoPopulatedFields()); + } + + @Test + public void hasAutoPopulatedFields_shouldReturnFalseIfMethodIsStreaming() { + List autoPopulatedFields = Arrays.asList("field1", "field2"); + Method method = + METHOD + .toBuilder() + .setAutoPopulatedFields(autoPopulatedFields) + .setStream(Stream.SERVER) + .build(); + assertEquals(false, method.hasAutoPopulatedFields()); + + method = + METHOD + .toBuilder() + .setAutoPopulatedFields(autoPopulatedFields) + .setStream(Stream.BIDI) + .build(); + assertEquals(false, method.hasAutoPopulatedFields()); + + method = + METHOD + .toBuilder() + .setAutoPopulatedFields(autoPopulatedFields) + .setStream(Stream.CLIENT) + .build(); + assertEquals(false, method.hasAutoPopulatedFields()); + } + + @Test + public void hasAutoPopulatedFields_shouldReturnFalseIfAutoPopulatedFieldsIsEmpty() { + List autoPopulatedFields = new ArrayList<>(); + Method method = + METHOD + .toBuilder() + .setAutoPopulatedFields(autoPopulatedFields) + .setStream(Stream.NONE) + .build(); + method.toStream(false, false); + assertEquals(false, method.hasAutoPopulatedFields()); + } + @Test public void isSupportedByTransport_shouldReturnTrueIfHasHttpBindingsAndIsRESTEligibleForRESTTransport() { 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 428b5156d9..16340e0a6b 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 @@ -20,6 +20,10 @@ import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; +import com.google.api.FieldInfo.Format; +import com.google.api.MethodSettings; +import com.google.api.Publishing; +import com.google.api.Service; import com.google.api.generator.engine.ast.ConcreteReference; import com.google.api.generator.engine.ast.Reference; import com.google.api.generator.engine.ast.TypeNode; @@ -39,6 +43,8 @@ import com.google.showcase.v1beta1.EchoOuterClass; import com.google.showcase.v1beta1.TestingOuterClass; import com.google.testgapic.v1beta1.LockerProto; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; @@ -55,10 +61,17 @@ public class ParserTest { private ServiceDescriptor echoService; private FileDescriptor echoFileDescriptor; + private static final String YAML_DIRECTORY = "src/test/resources/"; + + private Optional serviceYamlProtoOpt; + @Before public void setUp() { echoFileDescriptor = EchoOuterClass.getDescriptor(); echoService = echoFileDescriptor.getServices().get(0); + String yamlFilename = "echo_v1beta1.yaml"; + Path yamlPath = Paths.get(YAML_DIRECTORY, yamlFilename); + serviceYamlProtoOpt = ServiceYamlParser.parse(yamlPath.toString()); assertEquals("Echo", echoService.getName()); } @@ -121,6 +134,7 @@ public void parseMethods_basic() { messageTypes, resourceNames, Optional.empty(), + serviceYamlProtoOpt, outputResourceNames, Transport.GRPC); @@ -130,6 +144,8 @@ public void parseMethods_basic() { Method echoMethod = methods.get(0); assertEquals(echoMethod.name(), "Echo"); assertEquals(echoMethod.stream(), Method.Stream.NONE); + assertEquals(true, echoMethod.hasAutoPopulatedFields()); + assertEquals(Arrays.asList("request_id"), echoMethod.autoPopulatedFields()); // Detailed method signature parsing tests are in a separate unit test. List> methodSignatures = echoMethod.methodSignatures(); @@ -157,14 +173,17 @@ public void parseMethods_basic() { TypeNode.withReference(createStatusReference()), ImmutableList.of(), expandMethod.methodSignatures().get(0).get(1)); + assertEquals(false, expandMethod.hasAutoPopulatedFields()); Method collectMethod = methods.get(2); assertEquals("Collect", collectMethod.name()); assertEquals(Method.Stream.CLIENT, collectMethod.stream()); + assertEquals(false, collectMethod.hasAutoPopulatedFields()); Method chatMethod = methods.get(3); assertEquals("Chat", chatMethod.name()); assertEquals(Method.Stream.BIDI, chatMethod.stream()); + assertEquals(false, chatMethod.hasAutoPopulatedFields()); } @Test @@ -179,6 +198,7 @@ public void parseMethods_basicLro() { messageTypes, resourceNames, Optional.empty(), + Optional.empty(), outputResourceNames, Transport.GRPC); @@ -418,6 +438,111 @@ public void parseFields_mapType() { field.type()); } + @Test + public void parseFields_autoPopulated() { + Map messageTypes = Parser.parseMessages(echoFileDescriptor); + Message message = messageTypes.get("com.google.showcase.v1beta1.EchoRequest"); + Field field = message.fieldMap().get("request_id"); + assertEquals(false, field.isRequired()); + assertEquals(Format.UUID4, field.fieldInfoFormat()); + field = message.fieldMap().get("name"); + assertEquals(true, field.isRequired()); + assertEquals(null, field.fieldInfoFormat()); + field = message.fieldMap().get("severity"); + assertEquals(false, field.isRequired()); + assertEquals(null, field.fieldInfoFormat()); + + message = messageTypes.get("com.google.showcase.v1beta1.ExpandRequest"); + field = message.fieldMap().get("request_id"); + assertEquals(false, field.isRequired()); + assertEquals(Format.IPV6, field.fieldInfoFormat()); + } + + @Test + public void parseAutoPopulatedMethodsAndFields_exists() { + Map> autoPopulatedMethodsWithFields = + Parser.parseAutoPopulatedMethodsAndFields(serviceYamlProtoOpt); + assertEquals( + true, autoPopulatedMethodsWithFields.containsKey("google.showcase.v1beta1.Echo.Echo")); + assertEquals( + Arrays.asList("request_id"), + autoPopulatedMethodsWithFields.get("google.showcase.v1beta1.Echo.Echo")); + } + + @Test + public void parseAutoPopulatedMethodsAndFields_doesNotExist() { + String yamlFilename = "logging.yaml"; + Path yamlPath = Paths.get(YAML_DIRECTORY, yamlFilename); + Optional serviceYamlProtoOpt_Null = ServiceYamlParser.parse(yamlPath.toString()); + + Map> autoPopulatedMethodsWithFields = + Parser.parseAutoPopulatedMethodsAndFields(serviceYamlProtoOpt_Null); + assertEquals(true, autoPopulatedMethodsWithFields.isEmpty()); + } + + @Test + public void parseAutoPopulatedMethodsAndFields_returnsEmptyMapIfServiceYamlIsNull() { + assertEquals(true, Parser.parseAutoPopulatedMethodsAndFields(Optional.empty()).isEmpty()); + } + + @Test + public void parseAutoPopulatedMethodsAndFields_returnsMapOfMethodsAndAutoPopulatedFields() { + MethodSettings testMethodSettings = + MethodSettings.newBuilder() + .setSelector("test_method") + .addAutoPopulatedFields("test_field") + .addAutoPopulatedFields("test_field_2") + .build(); + MethodSettings testMethodSettings2 = + MethodSettings.newBuilder() + .setSelector("test_method_2") + .addAutoPopulatedFields("test_field_3") + .build(); + MethodSettings testMethodSettings3 = + MethodSettings.newBuilder().setSelector("test_method_3").build(); + Publishing testPublishing = + Publishing.newBuilder() + .addMethodSettings(testMethodSettings) + .addMethodSettings(testMethodSettings2) + .addMethodSettings(testMethodSettings3) + .build(); + Optional testService = + Optional.of(Service.newBuilder().setPublishing(testPublishing).build()); + assertEquals( + Arrays.asList("test_field", "test_field_2"), + Parser.parseAutoPopulatedMethodsAndFields(testService).get("test_method")); + assertEquals( + Arrays.asList("test_field_3"), + Parser.parseAutoPopulatedMethodsAndFields(testService).get("test_method_2")); + assertEquals( + Arrays.asList(), + Parser.parseAutoPopulatedMethodsAndFields(testService).get("test_method_3")); + assertEquals( + false, Parser.parseAutoPopulatedMethodsAndFields(testService).containsKey("test_method_4")); + } + + @Test + public void hasMethodSettings_shouldReturnFalseIfServiceYamlDoesNotExist() { + assertEquals(false, Parser.hasMethodSettings(Optional.empty())); + } + + @Test + public void hasMethodSettings_shouldReturnFalseIfServiceYamlDoesNotHavePublishing() { + assertEquals(false, Parser.hasMethodSettings(Optional.of(Service.newBuilder().build()))); + } + + @Test + public void hasMethodSettings_shouldReturnTrueIfServiceYamlHasNonEmptyMethodSettings() { + MethodSettings testMethodSettings = + MethodSettings.newBuilder().setSelector("test_method").build(); + Publishing testPublishing = + Publishing.newBuilder().addMethodSettings(testMethodSettings).build(); + assertEquals( + true, + Parser.hasMethodSettings( + Optional.of(Service.newBuilder().setPublishing(testPublishing).build()))); + } + @Test public void parseResourceNames_inputTypeHasReferenceNotInMethodSignature() { FileDescriptor testingFileDescriptor = TestingOuterClass.getDescriptor(); diff --git a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/protoparser/ServiceYamlParserTest.java b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/protoparser/ServiceYamlParserTest.java index 8df9ddcf84..f50fc572ff 100644 --- a/gapic-generator-java/src/test/java/com/google/api/generator/gapic/protoparser/ServiceYamlParserTest.java +++ b/gapic-generator-java/src/test/java/com/google/api/generator/gapic/protoparser/ServiceYamlParserTest.java @@ -17,8 +17,11 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import com.google.api.MethodSettings; +import com.google.api.Publishing; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.List; import java.util.Optional; import org.junit.Test; @@ -37,4 +40,24 @@ public void parseServiceYaml_basic() { com.google.api.Service serviceYamlProto = serviceYamlProtoOpt.get(); assertEquals("logging.googleapis.com", serviceYamlProto.getName()); } + + // TODO: Add more scenarios (e.g. null MethodSettings, null PublishingSettings, incorrect + // FieldNames, etc.) + @Test + public void parseServiceYaml_autoPopulatedFields() { + String yamlFilename = "echo_v1beta1.yaml"; + Path yamlPath = Paths.get(YAML_DIRECTORY, yamlFilename); + Optional serviceYamlProtoOpt = + ServiceYamlParser.parse(yamlPath.toString()); + assertTrue(serviceYamlProtoOpt.isPresent()); + + com.google.api.Service serviceYamlProto = serviceYamlProtoOpt.get(); + assertEquals("showcase.googleapis.com", serviceYamlProto.getName()); + + Publishing publishingSettings = serviceYamlProto.getPublishing(); + List methodSettings = publishingSettings.getMethodSettingsList(); + MethodSettings methodSetting = methodSettings.get(0); + assertEquals("google.showcase.v1beta1.Echo.Echo", methodSetting.getSelector()); + assertEquals("request_id", methodSetting.getAutoPopulatedFieldsList().get(0)); + } } diff --git a/gapic-generator-java/src/test/proto/echo.proto b/gapic-generator-java/src/test/proto/echo.proto index ea262faf32..d963447340 100644 --- a/gapic-generator-java/src/test/proto/echo.proto +++ b/gapic-generator-java/src/test/proto/echo.proto @@ -17,6 +17,7 @@ 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"; @@ -179,6 +180,11 @@ message EchoRequest { (google.api.field_behavior) = REQUIRED ]; + // This field is added based on go/client-populate-request-id-design; subject to change + string request_id = 7 [ + (google.api.field_info).format = UUID4 + ]; + oneof response { // The content to be echoed by the server. string content = 1; @@ -217,6 +223,11 @@ message ExpandRequest { google.rpc.Status error = 2; string info = 3; + + // This field is added based on go/client-populate-request-id-design; subject to change + string request_id = 4 [ + (google.api.field_info).format = IPV6 + ]; } // The request for the PagedExpand method. diff --git a/gapic-generator-java/src/test/resources/echo_v1beta1.yaml b/gapic-generator-java/src/test/resources/echo_v1beta1.yaml index 321758a4ea..57d9f90115 100644 --- a/gapic-generator-java/src/test/resources/echo_v1beta1.yaml +++ b/gapic-generator-java/src/test/resources/echo_v1beta1.yaml @@ -94,4 +94,10 @@ http: post: '/v1beta1/{name=operations/**}:cancel' additional_bindings: - post: '/v1beta2/{name=operations/**}:cancel' - - post: '/v1beta3/{name=operations/**}:cancel' \ No newline at end of file + - post: '/v1beta3/{name=operations/**}:cancel' +publishing: + method_settings: + # TODO: Add more test cases for scenarios where the field does not exist, the field is not a String, etc. Eventually the API Linter should handle some of those cases. + - selector: google.showcase.v1beta1.Echo.Echo + auto_populated_fields: + - request_id \ No newline at end of file