Skip to content

Commit 3cf3ba3

Browse files
authored
[ggj][codegen][test] fix: Use repeated field name for paged RPC unit tests (#405)
* fix: refactor requestBuilder into separate method in ServiceClientClassComposer * feat: add varargs to AnonClass and ref setter methods * feat: add HTTP annotation parsing/validation * feat: Generate RequestParamsExtractor in GrpcServiceStub * feat: add GrpcPublisherStub test to exercise HTTP subfields * fix: add ByteString to DefaultValueComposer * fix: Use repeated field name for paged RPC unit tests * fix: change getter too
1 parent 5b9c53f commit 3cf3ba3

4 files changed

Lines changed: 65 additions & 27 deletions

File tree

src/main/java/com/google/api/generator/gapic/composer/DefaultValueComposer.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,8 @@ static Expr createSimpleOperationBuilderExpr(String name, VariableExpr responseE
294294
.build();
295295
}
296296

297-
static Expr createSimplePagedResponse(TypeNode responseType, Expr responseElementVarExpr) {
297+
static Expr createSimplePagedResponse(
298+
TypeNode responseType, String repeatedFieldName, Expr responseElementVarExpr) {
298299
Expr pagedResponseExpr =
299300
MethodInvocationExpr.builder()
300301
.setStaticReferenceType(responseType)
@@ -309,7 +310,7 @@ static Expr createSimplePagedResponse(TypeNode responseType, Expr responseElemen
309310
pagedResponseExpr =
310311
MethodInvocationExpr.builder()
311312
.setExprReferenceExpr(pagedResponseExpr)
312-
.setMethodName("addAllResponses")
313+
.setMethodName(String.format("addAll%s", JavaStyle.toUpperCamelCase(repeatedFieldName)))
313314
.setArguments(
314315
MethodInvocationExpr.builder()
315316
.setStaticReferenceType(

src/main/java/com/google/api/generator/gapic/composer/ServiceClientTestClassComposer.java

Lines changed: 42 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -103,11 +103,11 @@ public class ServiceClientTestClassComposer {
103103
private static final String GRPC_TESTING_PACKAGE = "com.google.api.gax.grpc.testing";
104104
private static final String MOCK_SERVICE_CLASS_NAME_PATTERN = "Mock%s";
105105
private static final String MOCK_SERVICE_VAR_NAME_PATTERN = "mock%s";
106+
private static final String PAGED_RESPONSE_TYPE_NAME_PATTERN = "%sPagedResponse";
106107
private static final String SERVICE_CLIENT_CLASS_NAME_PATTERN = "%sClient";
107108
private static final String SERVICE_HELPER_VAR_NAME = "mockServiceHelper";
108109
private static final String SERVICE_SETTINGS_CLASS_NAME_PATTERN = "%sSettings";
109110
private static final String STUB_SETTINGS_PATTERN = "%sSettings";
110-
private static final String PAGED_RESPONSE_TYPE_NAME_PATTERN = "%sPagedResponse";
111111

112112
private static final ServiceClientTestClassComposer INSTANCE =
113113
new ServiceClientTestClassComposer();
@@ -424,18 +424,18 @@ private static List<MethodDefinition> createTestMethods(
424424
javaMethods.add(
425425
createRpcTestMethod(
426426
method,
427+
service,
427428
Collections.emptyList(),
428429
0,
429-
service.name(),
430430
classMemberVarExprs,
431431
resourceNames,
432432
messageTypes));
433433
javaMethods.add(
434434
createRpcExceptionTestMethod(
435435
method,
436+
service,
436437
Collections.emptyList(),
437438
0,
438-
service.name(),
439439
classMemberVarExprs,
440440
resourceNames,
441441
messageTypes));
@@ -444,18 +444,18 @@ private static List<MethodDefinition> createTestMethods(
444444
javaMethods.add(
445445
createRpcTestMethod(
446446
method,
447+
service,
447448
method.methodSignatures().get(i),
448449
i,
449-
service.name(),
450450
classMemberVarExprs,
451451
resourceNames,
452452
messageTypes));
453453
javaMethods.add(
454454
createRpcExceptionTestMethod(
455455
method,
456+
service,
456457
method.methodSignatures().get(i),
457458
i,
458-
service.name(),
459459
classMemberVarExprs,
460460
resourceNames,
461461
messageTypes));
@@ -467,12 +467,14 @@ private static List<MethodDefinition> createTestMethods(
467467

468468
private static MethodDefinition createRpcTestMethod(
469469
Method method,
470+
Service service,
470471
List<MethodArgument> methodSignature,
471472
int variantIndex,
472-
String serviceName,
473473
Map<String, VariableExpr> classMemberVarExprs,
474474
Map<String, ResourceName> resourceNames,
475475
Map<String, Message> messageTypes) {
476+
String serviceName = service.name();
477+
476478
if (!method.stream().equals(Method.Stream.NONE)) {
477479
return createStreamingRpcTestMethod(
478480
method, serviceName, classMemberVarExprs, resourceNames, messageTypes);
@@ -514,9 +516,17 @@ private static MethodDefinition createRpcTestMethod(
514516
Variable.builder().setType(methodOutputType).setName("expectedResponse").build());
515517
Expr expectedResponseValExpr = null;
516518
if (method.isPaged()) {
519+
Message methodOutputMessage = messageTypes.get(method.outputType().reference().name());
520+
Field firstRepeatedField = methodOutputMessage.findAndUnwrapFirstRepeatedField();
521+
Preconditions.checkNotNull(
522+
firstRepeatedField,
523+
String.format(
524+
"Expected paged RPC %s to have a repeated field in the response %s but found none",
525+
method.name(), methodOutputMessage.name()));
526+
517527
expectedResponseValExpr =
518528
DefaultValueComposer.createSimplePagedResponse(
519-
method.outputType(), responsesElementVarExpr);
529+
method.outputType(), firstRepeatedField.name(), responsesElementVarExpr);
520530
} else {
521531
if (messageTypes.containsKey(methodOutputType.reference().name())) {
522532
expectedResponseValExpr =
@@ -619,7 +629,8 @@ private static MethodDefinition createRpcTestMethod(
619629
VariableExpr actualResponseVarExpr =
620630
VariableExpr.withVariable(
621631
Variable.builder()
622-
.setType(methodOutputType)
632+
.setType(
633+
method.isPaged() ? getPagedResponseType(service, method) : methodOutputType)
623634
.setName(method.isPaged() ? "pagedListResponse" : "actualResponse")
624635
.build());
625636
Expr rpcJavaMethodInvocationExpr =
@@ -699,12 +710,21 @@ private static MethodDefinition createRpcTestMethod(
699710
.build());
700711

701712
// Assert the responses are equivalent.
713+
Message methodOutputMessage = messageTypes.get(method.outputType().reference().name());
714+
Field firstRepeatedField = methodOutputMessage.findAndUnwrapFirstRepeatedField();
715+
Preconditions.checkNotNull(
716+
firstRepeatedField,
717+
String.format(
718+
"Expected paged RPC %s to have a repeated field in the response %s but found none",
719+
method.name(), methodOutputMessage.name()));
720+
702721
Expr zeroExpr =
703722
ValueExpr.withValue(PrimitiveValue.builder().setType(TypeNode.INT).setValue("0").build());
704723
Expr expectedPagedResponseExpr =
705724
MethodInvocationExpr.builder()
706725
.setExprReferenceExpr(expectedResponseVarExpr)
707-
.setMethodName("getResponsesList")
726+
.setMethodName(
727+
String.format("get%sList", JavaStyle.toUpperCamelCase(firstRepeatedField.name())))
708728
.build();
709729
expectedPagedResponseExpr =
710730
MethodInvocationExpr.builder()
@@ -1160,12 +1180,14 @@ private static MethodDefinition createStreamingRpcTestMethod(
11601180

11611181
private static MethodDefinition createRpcExceptionTestMethod(
11621182
Method method,
1183+
Service service,
11631184
List<MethodArgument> methodSignature,
11641185
int variantIndex,
1165-
String serviceName,
11661186
Map<String, VariableExpr> classMemberVarExprs,
11671187
Map<String, ResourceName> resourceNames,
11681188
Map<String, Message> messageTypes) {
1189+
String serviceName = service.name();
1190+
11691191
VariableExpr exceptionVarExpr =
11701192
VariableExpr.withVariable(
11711193
Variable.builder()
@@ -1833,6 +1855,16 @@ private static TypeNode getCallableType(Method protoMethod) {
18331855
ConcreteReference.builder().setClazz(callableClazz).setGenerics(generics).build());
18341856
}
18351857

1858+
private static TypeNode getPagedResponseType(Service service, Method method) {
1859+
return TypeNode.withReference(
1860+
VaporReference.builder()
1861+
.setName(String.format(PAGED_RESPONSE_TYPE_NAME_PATTERN, method.name()))
1862+
.setPakkage(service.pakkage())
1863+
.setEnclosingClassName(getClientClassName(service.name()))
1864+
.setIsStaticImport(true)
1865+
.build());
1866+
}
1867+
18361868
private static String getCallableMethodName(Method protoMethod) {
18371869
Preconditions.checkState(
18381870
!protoMethod.stream().equals(Method.Stream.NONE),

src/test/java/com/google/api/generator/gapic/composer/goldens/EchoClientTest.golden

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.google.showcase.v1beta1;
22

3+
import static com.google.showcase.v1beta1.EchoClient.PagedExpandPagedResponse;
4+
35
import com.google.api.gax.core.NoCredentialsProvider;
46
import com.google.api.gax.grpc.GaxGrpcProperties;
57
import com.google.api.gax.grpc.testing.LocalChannelProvider;
@@ -550,7 +552,7 @@ public class EchoClientTest {
550552
.setPageToken("page_token1630607433")
551553
.build();
552554

553-
PagedExpandResponse pagedListResponse = client.pagedExpand(request);
555+
PagedExpandPagedResponse pagedListResponse = client.pagedExpand(request);
554556

555557
List<EchoResponse> resources = Lists.newArrayList(pagedListResponse.iterateAll());
556558

test/integration/BUILD.bazel

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,22 @@ load(
1010

1111
package(default_visibility = ["//visibility:public"])
1212

13+
####################################################
14+
# Integration Test Rules
15+
####################################################
16+
17+
integration_test(
18+
name = "redis",
19+
data = ["//test/integration/goldens/redis:goldens_files"],
20+
target = ":redis_java_gapic",
21+
)
22+
23+
integration_test(
24+
name = "asset",
25+
target = ":asset_java_gapic",
26+
data = ["//test/integration/goldens/asset:goldens_files"],
27+
)
28+
1329
####################################################
1430
# API Library Rules
1531
####################################################
@@ -53,17 +69,4 @@ java_gapic_library(
5369
deps = [
5470
"@com_google_googleapis//google/cloud/redis/v1:redis_java_proto",
5571
],
56-
)
57-
58-
integration_test(
59-
name = "redis",
60-
data = ["//test/integration/goldens/redis:goldens_files"],
61-
target = ":redis_java_gapic",
62-
)
63-
64-
integration_test(
65-
name = "asset",
66-
target = ":asset_java_gapic",
67-
data = ["//test/integration/goldens/asset:goldens_files"],
68-
)
69-
72+
)

0 commit comments

Comments
 (0)