Skip to content

Commit bfb35cd

Browse files
authored
feat: make generated test values comply with url path template (#903)
This includes nested messages creation when there are url paths with subfields mentioned (like `/v1/{field.name=projects/*/databases/*/collectionGroups/*/fields/*}`) This is needed for rest transports tests because, unlike grpc, request fields must match path templates for rest logic pass the tests. Main changes are in `DefaultValueComposer` and `HttpRuleParser` classes. The generated pattern-matching samples are in the following format: given the pattern pattern: `/v1/{field.name=projects/*/databases/*/collectionGroups/*/fields/*}` the value will be: `field.name=projects/project-1234/databases/database-1234/collectionGroups/collectionGroup-1234/fields/field-1234`
1 parent 90df081 commit bfb35cd

17 files changed

+403
-153
lines changed

src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceClientTestClassComposer.java

+32-14
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,7 @@ private MethodDefinition createRpcTestMethod(
354354
AssignmentExpr.builder()
355355
.setVariableExpr(responsesElementVarExpr.toBuilder().setIsDecl(true).build())
356356
.setValueExpr(
357-
DefaultValueComposer.createDefaultValue(
357+
DefaultValueComposer.createValue(
358358
Field.builder()
359359
.setType(repeatedResponseType)
360360
.setName("responsesElement")
@@ -377,23 +377,23 @@ private MethodDefinition createRpcTestMethod(
377377
method.name(), methodOutputMessage.name()));
378378

379379
expectedResponseValExpr =
380-
DefaultValueComposer.createSimplePagedResponse(
380+
DefaultValueComposer.createSimplePagedResponseValue(
381381
method.outputType(),
382382
firstRepeatedField.name(),
383383
responsesElementVarExpr,
384384
firstRepeatedField.isMap());
385385
} else {
386386
if (messageTypes.containsKey(methodOutputType.reference().fullName())) {
387387
expectedResponseValExpr =
388-
DefaultValueComposer.createSimpleMessageBuilderExpr(
388+
DefaultValueComposer.createSimpleMessageBuilderValue(
389389
messageTypes.get(methodOutputType.reference().fullName()),
390390
resourceNames,
391391
messageTypes);
392392
} else {
393393
// Wrap this in a field so we don't have to split the helper into lots of different methods,
394394
// or duplicate it for VariableExpr.
395395
expectedResponseValExpr =
396-
DefaultValueComposer.createDefaultValue(
396+
DefaultValueComposer.createValue(
397397
Field.builder()
398398
.setType(methodOutputType)
399399
.setIsMessage(true)
@@ -422,7 +422,7 @@ private MethodDefinition createRpcTestMethod(
422422
AssignmentExpr.builder()
423423
.setVariableExpr(resultOperationVarExpr.toBuilder().setIsDecl(true).build())
424424
.setValueExpr(
425-
DefaultValueComposer.createSimpleOperationBuilderExpr(
425+
DefaultValueComposer.createSimpleOperationBuilderValue(
426426
String.format("%sTest", JavaStyle.toLowerCamelCase(method.name())),
427427
expectedResponseVarExpr))
428428
.build());
@@ -457,22 +457,32 @@ private MethodDefinition createRpcTestMethod(
457457
argExprs.add(requestVarExpr);
458458
requestMessage = messageTypes.get(method.inputType().reference().fullName());
459459
Preconditions.checkNotNull(requestMessage);
460+
Map<String, String> pathParamValuePatterns = Collections.emptyMap();
461+
if (getTransportContext().useValuePatterns() && method.hasHttpBindings()) {
462+
pathParamValuePatterns = method.httpBindings().getPathParametersValuePatterns();
463+
}
460464
Expr valExpr =
461-
DefaultValueComposer.createSimpleMessageBuilderExpr(
462-
requestMessage, resourceNames, messageTypes);
465+
DefaultValueComposer.createSimpleMessageBuilderValue(
466+
requestMessage, resourceNames, messageTypes, pathParamValuePatterns);
463467
methodExprs.add(
464468
AssignmentExpr.builder()
465469
.setVariableExpr(requestVarExpr.toBuilder().setIsDecl(true).build())
466470
.setValueExpr(valExpr)
467471
.build());
468472
} else {
473+
Map<String, String> valuePatterns = Collections.emptyMap();
474+
if (getTransportContext().useValuePatterns() && method.hasHttpBindings()) {
475+
valuePatterns = method.httpBindings().getPathParametersValuePatterns();
476+
}
469477
for (MethodArgument methodArg : methodSignature) {
470478
String methodArgName = JavaStyle.toLowerCamelCase(methodArg.name());
471479
VariableExpr varExpr =
472480
VariableExpr.withVariable(
473481
Variable.builder().setType(methodArg.type()).setName(methodArgName).build());
474482
argExprs.add(varExpr);
475-
Expr valExpr = createDefaultValue(methodArg, resourceNames);
483+
Expr valExpr =
484+
DefaultValueComposer.createMethodArgValue(
485+
methodArg, resourceNames, messageTypes, valuePatterns);
476486
methodExprs.add(
477487
AssignmentExpr.builder()
478488
.setVariableExpr(varExpr.toBuilder().setIsDecl(true).build())
@@ -737,9 +747,6 @@ protected abstract List<Statement> createStreamingRpcExceptionTestStatements(
737747
Map<String, ResourceName> resourceNames,
738748
Map<String, Message> messageTypes);
739749

740-
protected abstract Expr createDefaultValue(
741-
MethodArgument methodArg, Map<String, ResourceName> resourceNames);
742-
743750
protected List<Statement> createRpcExceptionTestStatements(
744751
Method method,
745752
List<MethodArgument> methodSignature,
@@ -748,6 +755,7 @@ protected List<Statement> createRpcExceptionTestStatements(
748755
Map<String, Message> messageTypes) {
749756
List<VariableExpr> argVarExprs = new ArrayList<>();
750757
List<Expr> tryBodyExprs = new ArrayList<>();
758+
751759
if (methodSignature.isEmpty()) {
752760
// Construct the actual request.
753761
VariableExpr varExpr =
@@ -756,22 +764,32 @@ protected List<Statement> createRpcExceptionTestStatements(
756764
argVarExprs.add(varExpr);
757765
Message requestMessage = messageTypes.get(method.inputType().reference().fullName());
758766
Preconditions.checkNotNull(requestMessage);
767+
Map<String, String> valuePatterns = Collections.emptyMap();
768+
if (getTransportContext().useValuePatterns() && method.hasHttpBindings()) {
769+
valuePatterns = method.httpBindings().getPathParametersValuePatterns();
770+
}
759771
Expr valExpr =
760-
DefaultValueComposer.createSimpleMessageBuilderExpr(
761-
requestMessage, resourceNames, messageTypes);
772+
DefaultValueComposer.createSimpleMessageBuilderValue(
773+
requestMessage, resourceNames, messageTypes, valuePatterns);
762774
tryBodyExprs.add(
763775
AssignmentExpr.builder()
764776
.setVariableExpr(varExpr.toBuilder().setIsDecl(true).build())
765777
.setValueExpr(valExpr)
766778
.build());
767779
} else {
780+
Map<String, String> valuePatterns = Collections.emptyMap();
781+
if (getTransportContext().useValuePatterns() && method.hasHttpBindings()) {
782+
valuePatterns = method.httpBindings().getPathParametersValuePatterns();
783+
}
768784
for (MethodArgument methodArg : methodSignature) {
769785
String methodArgName = JavaStyle.toLowerCamelCase(methodArg.name());
770786
VariableExpr varExpr =
771787
VariableExpr.withVariable(
772788
Variable.builder().setType(methodArg.type()).setName(methodArgName).build());
773789
argVarExprs.add(varExpr);
774-
Expr valExpr = createDefaultValue(methodArg, resourceNames);
790+
Expr valExpr =
791+
DefaultValueComposer.createMethodArgValue(
792+
methodArg, resourceNames, messageTypes, valuePatterns);
775793
tryBodyExprs.add(
776794
AssignmentExpr.builder()
777795
.setVariableExpr(varExpr.toBuilder().setIsDecl(true).build())

src/main/java/com/google/api/generator/gapic/composer/common/TransportContext.java

+4
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ public abstract class TransportContext {
8181

8282
public abstract List<String> operationsClientNames();
8383

84+
public abstract boolean useValuePatterns();
85+
8486
protected static TypeNode classToType(Class<?> clazz) {
8587
return TypeNode.withReference(ConcreteReference.withClazz(clazz));
8688
}
@@ -140,6 +142,8 @@ public abstract Builder setTransportApiClientHeaderProviderBuilderNames(
140142

141143
public abstract Builder setOperationsClientNames(List<String> operationsClientNames);
142144

145+
public abstract Builder setUseValuePatterns(boolean useValuePatterns);
146+
143147
public abstract TransportContext build();
144148
}
145149
}

0 commit comments

Comments
 (0)