Skip to content

[SampleCode][3/3]Implement LRO unary rpc method's sample code #587

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 67 commits into from
Dec 10, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
04095ac
Flattern the createVariableExpr wrapper
summer-ji-eng Dec 2, 2020
4bec878
Add resource name into ClassComposer interface
summer-ji-eng Nov 25, 2020
bd2bbe0
Remove resource name from class composer interface
summer-ji-eng Nov 25, 2020
b27edf3
Remove bug ticket
summer-ji-eng Nov 26, 2020
a14fb04
move todo
summer-ji-eng Dec 2, 2020
0f537bc
Implement Pure Unary RPC sample code
summer-ji-eng Nov 26, 2020
08e85b0
modify body expr
summer-ji-eng Dec 1, 2020
34ba6bb
flattern varialbe expr and fix default value string
summer-ji-eng Dec 3, 2020
d484780
merge HelperComposer into ServiceClientSampleCodeComposer
summer-ji-eng Dec 3, 2020
0c541d0
Add license
summer-ji-eng Dec 3, 2020
c4a4861
Flattern the createVariableExpr wrapper (#581)
summer-ji-eng Dec 3, 2020
33fedb1
Merge branch 'samplecode-master' into pure_unary_rpc_1
summer-ji-eng Dec 3, 2020
9cf4838
refactor assignment expr of default value on method arguments
summer-ji-eng Dec 4, 2020
febd576
remove unused method
summer-ji-eng Dec 4, 2020
7c42425
Add edge case for unit test, and address the comments
summer-ji-eng Dec 4, 2020
2ada597
Flattern the createVariableExpr wrapper (#581)
summer-ji-eng Dec 3, 2020
cdd25b5
Merge branch 'samplecode-master' into pure_unary_rpc_1
summer-ji-eng Dec 5, 2020
31337a5
rebase master changes
summer-ji-eng Dec 5, 2020
35dc9c6
fix unit test
summer-ji-eng Dec 5, 2020
9595ffb
Make composeUnaryRpcMethodSampleCode VisibleForTesting
summer-ji-eng Dec 6, 2020
867d601
Implement Pure Unary RPC sample code
summer-ji-eng Nov 26, 2020
82b1c3c
Implemente Unary Paged RPC method's sample code
summer-ji-eng Nov 30, 2020
37ae8bf
rebase previous PR and address the comments
summer-ji-eng Dec 5, 2020
47f1a8c
rebase previous PR and address the comments
summer-ji-eng Dec 5, 2020
bac379a
rebase previous PR
summer-ji-eng Dec 5, 2020
c3ee114
Make composeUnaryPagedRpcMethodSampleCode VisibleForTesting
summer-ji-eng Dec 6, 2020
fcbfdcf
Implement LRO unary rpc method's sample code
summer-ji-eng Dec 6, 2020
cc6addb
add check returnValue
summer-ji-eng Dec 6, 2020
0b70f9d
[samplecode][1/3]Implement Pure Unary RPC sample code (#573)
summer-ji-eng Dec 9, 2020
aeac127
Add resource name into ClassComposer interface
summer-ji-eng Nov 25, 2020
1caf9d9
Remove resource name from class composer interface
summer-ji-eng Nov 25, 2020
6337c07
Remove bug ticket
summer-ji-eng Nov 26, 2020
42beeac
move todo
summer-ji-eng Dec 2, 2020
de9e827
Implement Pure Unary RPC sample code
summer-ji-eng Nov 26, 2020
c06bc37
modify body expr
summer-ji-eng Dec 1, 2020
58b366a
flattern varialbe expr and fix default value string
summer-ji-eng Dec 3, 2020
39d75ad
merge HelperComposer into ServiceClientSampleCodeComposer
summer-ji-eng Dec 3, 2020
0d92845
Add license
summer-ji-eng Dec 3, 2020
b24146f
Flattern the createVariableExpr wrapper (#581)
summer-ji-eng Dec 3, 2020
4735c40
refactor assignment expr of default value on method arguments
summer-ji-eng Dec 4, 2020
48c308c
remove unused method
summer-ji-eng Dec 4, 2020
9d26694
Add edge case for unit test, and address the comments
summer-ji-eng Dec 4, 2020
77bcf08
rebase master changes
summer-ji-eng Dec 5, 2020
50a143e
fix unit test
summer-ji-eng Dec 5, 2020
f43b850
Make composeUnaryRpcMethodSampleCode VisibleForTesting
summer-ji-eng Dec 6, 2020
4254427
reorder the parameters
summer-ji-eng Dec 8, 2020
f43fa63
update unit test
summer-ji-eng Dec 9, 2020
443404a
Implement Pure Unary RPC sample code
summer-ji-eng Nov 26, 2020
55d2f42
Implemente Unary Paged RPC method's sample code
summer-ji-eng Nov 30, 2020
b8a9f00
rebase previous PR and address the comments
summer-ji-eng Dec 5, 2020
e20d870
rebase previous PR and address the comments
summer-ji-eng Dec 5, 2020
8e0e7e7
rebase previous PR
summer-ji-eng Dec 5, 2020
21bf8b4
Make composeUnaryPagedRpcMethodSampleCode VisibleForTesting
summer-ji-eng Dec 6, 2020
22a77aa
abstract functions for reuse
summer-ji-eng Dec 8, 2020
dbf522f
Unwrap a helper function
summer-ji-eng Dec 8, 2020
a043004
Use Function Interface
summer-ji-eng Dec 9, 2020
85c9e3a
fix typo
summer-ji-eng Dec 9, 2020
f89208e
Merge branch 'samplecode-master' into paged_unary_rpc_2
summer-ji-eng Dec 9, 2020
6d822c3
reorder parameters
summer-ji-eng Dec 9, 2020
bba7c84
reorder arguments
summer-ji-eng Dec 9, 2020
1ec1c62
Merge branch 'paged_unary_rpc_2' into lro_unary_rpc_3
summer-ji-eng Dec 9, 2020
a37357e
rebase samplecode-master
summer-ji-eng Dec 9, 2020
adf0675
Add unit test
summer-ji-eng Dec 9, 2020
03f1b1f
add unit test for lro
summer-ji-eng Dec 9, 2020
095c0ef
Merge branch 'samplecode-master' into paged_unary_rpc_2
summer-ji-eng Dec 9, 2020
15ff63b
Merge branch 'paged_unary_rpc_2' into lro_unary_rpc_3
summer-ji-eng Dec 9, 2020
56c5142
Merge branch 'samplecode-master' into lro_unary_rpc_3
summer-ji-eng Dec 10, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -565,15 +565,10 @@ private static List<MethodDefinition> createMethodVariants(
.setReturnType(methodOutputType)
.build();

Optional<String> methodSampleCode = Optional.empty();
if (!method.hasLro()) {
// TODO(summerji): Remove the condition check once finished the implementation on lro sample
// code.
methodSampleCode =
Optional.of(
ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode(
method, types.get(clientName), signature, resourceNames, messageTypes));
}
Optional<String> methodSampleCode =
Optional.of(
ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode(
method, types.get(clientName), signature, resourceNames, messageTypes));
MethodDefinition.Builder methodVariantBuilder =
MethodDefinition.builder()
.setHeaderCommentStatements(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,10 @@ public static String composeRpcMethodHeaderSampleCode(
composeUnaryPagedRpcMethodSampleCode(
method, clientType, repeatedResponseType, arguments, resourceNames));
}
if (method.hasLro()) {
return SampleCodeWriter.write(
composeUnaryLroRpcMethodSampleCode(method, clientType, arguments, resourceNames));
}
return SampleCodeWriter.write(
composeUnaryRpcMethodSampleCode(method, clientType, arguments, resourceNames));
}
Expand Down Expand Up @@ -334,6 +338,68 @@ static TryCatchStatement composeUnaryPagedRpcMethodSampleCode(
.build();
}

@VisibleForTesting
static TryCatchStatement composeUnaryLroRpcMethodSampleCode(
Method method,
TypeNode clientType,
List<MethodArgument> arguments,
Map<String, ResourceName> resourceNames) {
VariableExpr clientVarExpr =
VariableExpr.withVariable(
Variable.builder()
.setName(JavaStyle.toLowerCamelCase(clientType.reference().name()))
.setType(clientType)
.build());
List<VariableExpr> rpcMethodArgVarExprs = createRpcMethodArgumentVariableExprs(arguments);
List<Expr> rpcMethodArgDefaultValueExprs =
createRpcMethodArgumentDefaultValueExprs(arguments, resourceNames);
List<Expr> bodyExprs =
createAssignmentsForVarExprsWithValueExprs(
rpcMethodArgVarExprs, rpcMethodArgDefaultValueExprs);
// Assign response variable with invoking client's lro method.
// e.g. if return void, echoClient.waitAsync(ttl).get(); or,
// e.g. if return other type, WaitResponse response = echoClient.waitAsync(ttl).get();
Expr invokeLroMethodExpr =
MethodInvocationExpr.builder()
.setExprReferenceExpr(clientVarExpr)
.setMethodName(String.format("%sAsync", JavaStyle.toLowerCamelCase(method.name())))
.setArguments(
rpcMethodArgVarExprs.stream().map(e -> (Expr) e).collect(Collectors.toList()))
.build();
Expr getResponseMethodExpr =
MethodInvocationExpr.builder()
.setExprReferenceExpr(invokeLroMethodExpr)
.setMethodName("get")
.setReturnType(method.lro().responseType())
.build();
boolean returnsVoid = isProtoEmptyType(method.lro().responseType());
if (returnsVoid) {
bodyExprs.add(getResponseMethodExpr);
} else {
VariableExpr responseVarExpr =
VariableExpr.builder()
.setVariable(
Variable.builder()
.setName("response")
.setType(method.lro().responseType())
.build())
.setIsDecl(true)
.build();
bodyExprs.add(
AssignmentExpr.builder()
.setVariableExpr(responseVarExpr)
.setValueExpr(getResponseMethodExpr)
.build());
}

return TryCatchStatement.builder()
.setTryResourceExpr(assignClientVariableWithCreateMethodExpr(clientVarExpr))
.setTryBody(
bodyExprs.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList()))
.setIsSampleCode(true)
.build();
}

// ==================================Helpers===================================================//

// Create a list of RPC method arguments' variable expressions.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import com.google.api.generator.engine.ast.VaporReference;
import com.google.api.generator.gapic.composer.samplecode.SampleCodeWriter;
import com.google.api.generator.gapic.model.Field;
import com.google.api.generator.gapic.model.LongrunningOperation;
import com.google.api.generator.gapic.model.Message;
import com.google.api.generator.gapic.model.Method;
import com.google.api.generator.gapic.model.MethodArgument;
Expand All @@ -40,6 +41,8 @@

public class ServiceClientSampleCodeComposerTest {
private static final String SHOWCASE_PACKAGE_NAME = "com.google.showcase.v1beta1";
private static final String LRO_PACKAGE_NAME = "com.google.longrunning";
private static final String PROTO_PACKAGE_NAME = "com.google.protobuf";

// =======================================RPC Method Header Sample Code=======================//
@Test
Expand Down Expand Up @@ -128,6 +131,76 @@ public void validComposeRpcMethodHeaderSampleCode_pagedUnaryRpc() {
assertEquals(expected, results);
}

@Test
public void validComposeRpcMethodHeaderSampleCode_lroUnaryRpc() {
FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
Map<String, ResourceName> resourceNames = Parser.parseResourceNames(echoFileDescriptor);
Map<String, Message> messageTypes = Parser.parseMessages(echoFileDescriptor);
TypeNode clientType =
TypeNode.withReference(
VaporReference.builder()
.setName("EchoClient")
.setPakkage(SHOWCASE_PACKAGE_NAME)
.build());
TypeNode inputType =
TypeNode.withReference(
VaporReference.builder()
.setName("WaitRequest")
.setPakkage(SHOWCASE_PACKAGE_NAME)
.build());
TypeNode outputType =
TypeNode.withReference(
VaporReference.builder().setName("Operation").setPakkage(LRO_PACKAGE_NAME).build());
TypeNode responseType =
TypeNode.withReference(
VaporReference.builder()
.setName("WaitResponse")
.setPakkage(SHOWCASE_PACKAGE_NAME)
.build());
TypeNode metadataType =
TypeNode.withReference(
VaporReference.builder()
.setName("WaitMetadata")
.setPakkage(SHOWCASE_PACKAGE_NAME)
.build());
LongrunningOperation lro = LongrunningOperation.withTypes(responseType, metadataType);
TypeNode ttlTypeNode =
TypeNode.withReference(
VaporReference.builder().setName("Duration").setPakkage(PROTO_PACKAGE_NAME).build());
MethodArgument ttl =
MethodArgument.builder()
.setName("ttl")
.setType(ttlTypeNode)
.setField(
Field.builder()
.setName("ttl")
.setType(ttlTypeNode)
.setIsMessage(true)
.setIsContainedInOneof(true)
.build())
.build();
List<MethodArgument> arguments = Arrays.asList(ttl);
Method method =
Method.builder()
.setName("Wait")
.setInputType(inputType)
.setOutputType(outputType)
.setLro(lro)
.setMethodSignatures(Arrays.asList(arguments))
.build();

String results =
ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode(
method, clientType, arguments, resourceNames, messageTypes);
String expected =
LineFormatter.lines(
"try (EchoClient echoClient = EchoClient.create()) {\n",
" Duration ttl = Duration.newBuilder().build();\n",
" WaitResponse response = echoClient.waitAsync(ttl).get();\n",
"}");
assertEquals(results, expected);
}

@Test
public void invalidComposeRpcMethodHeaderSampleCode_noMatchedRepeatedResponseTypeInPagedMethod() {
FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
Expand Down Expand Up @@ -770,7 +843,7 @@ public void composeUnaryRpcMethodSampleCode_methodReturnVoid() {
.build());
TypeNode outputType =
TypeNode.withReference(
VaporReference.builder().setName("Empty").setPakkage("com.google.protobuf").build());
VaporReference.builder().setName("Empty").setPakkage(PROTO_PACKAGE_NAME).build());
List<List<MethodArgument>> methodSignatures =
Arrays.asList(
Arrays.asList(
Expand Down Expand Up @@ -921,4 +994,142 @@ public void composeUnaryPagedRpcMethodSampleCode_noMethodArguments() {
"}");
assertEquals(results, expected);
}

// ===================================Unary LRO RPC Method Sample Code ======================//
@Test
public void composeUnaryLroRpcMethodSampleCode_lroReturnResponseType() {
FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
Map<String, ResourceName> resourceNames = Parser.parseResourceNames(echoFileDescriptor);
TypeNode clientType =
TypeNode.withReference(
VaporReference.builder()
.setName("EchoClient")
.setPakkage(SHOWCASE_PACKAGE_NAME)
.build());
TypeNode inputType =
TypeNode.withReference(
VaporReference.builder()
.setName("WaitRequest")
.setPakkage(SHOWCASE_PACKAGE_NAME)
.build());
TypeNode outputType =
TypeNode.withReference(
VaporReference.builder().setName("Operation").setPakkage(LRO_PACKAGE_NAME).build());
TypeNode responseType =
TypeNode.withReference(
VaporReference.builder()
.setName("WaitResponse")
.setPakkage(SHOWCASE_PACKAGE_NAME)
.build());
TypeNode metadataType =
TypeNode.withReference(
VaporReference.builder()
.setName("WaitMetadata")
.setPakkage(SHOWCASE_PACKAGE_NAME)
.build());
LongrunningOperation lro = LongrunningOperation.withTypes(responseType, metadataType);
TypeNode ttlTypeNode =
TypeNode.withReference(
VaporReference.builder().setName("Duration").setPakkage(PROTO_PACKAGE_NAME).build());
MethodArgument ttl =
MethodArgument.builder()
.setName("ttl")
.setType(ttlTypeNode)
.setField(
Field.builder()
.setName("ttl")
.setType(ttlTypeNode)
.setIsMessage(true)
.setIsContainedInOneof(true)
.build())
.build();
List<MethodArgument> arguments = Arrays.asList(ttl);
Method method =
Method.builder()
.setName("Wait")
.setInputType(inputType)
.setOutputType(outputType)
.setLro(lro)
.setMethodSignatures(Arrays.asList(arguments))
.build();

String results =
SampleCodeWriter.write(
ServiceClientSampleCodeComposer.composeUnaryLroRpcMethodSampleCode(
method, clientType, arguments, resourceNames));
String expected =
LineFormatter.lines(
"try (EchoClient echoClient = EchoClient.create()) {\n",
" Duration ttl = Duration.newBuilder().build();\n",
" WaitResponse response = echoClient.waitAsync(ttl).get();\n",
"}");
assertEquals(results, expected);
}

@Test
public void composeUnaryLroRpcMethodSampleCode_lroReturnVoid() {
FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
Map<String, ResourceName> resourceNames = Parser.parseResourceNames(echoFileDescriptor);
TypeNode clientType =
TypeNode.withReference(
VaporReference.builder()
.setName("EchoClient")
.setPakkage(SHOWCASE_PACKAGE_NAME)
.build());
TypeNode inputType =
TypeNode.withReference(
VaporReference.builder()
.setName("WaitRequest")
.setPakkage(SHOWCASE_PACKAGE_NAME)
.build());
TypeNode outputType =
TypeNode.withReference(
VaporReference.builder().setName("Operation").setPakkage(LRO_PACKAGE_NAME).build());
TypeNode responseType =
TypeNode.withReference(
VaporReference.builder().setName("Empty").setPakkage(PROTO_PACKAGE_NAME).build());
TypeNode metadataType =
TypeNode.withReference(
VaporReference.builder()
.setName("WaitMetadata")
.setPakkage(SHOWCASE_PACKAGE_NAME)
.build());
LongrunningOperation lro = LongrunningOperation.withTypes(responseType, metadataType);
TypeNode ttlTypeNode =
TypeNode.withReference(
VaporReference.builder().setName("Duration").setPakkage(PROTO_PACKAGE_NAME).build());
MethodArgument ttl =
MethodArgument.builder()
.setName("ttl")
.setType(ttlTypeNode)
.setField(
Field.builder()
.setName("ttl")
.setType(ttlTypeNode)
.setIsMessage(true)
.setIsContainedInOneof(true)
.build())
.build();
List<MethodArgument> arguments = Arrays.asList(ttl);
Method method =
Method.builder()
.setName("Wait")
.setInputType(inputType)
.setOutputType(outputType)
.setLro(lro)
.setMethodSignatures(Arrays.asList(arguments))
.build();

String results =
SampleCodeWriter.write(
ServiceClientSampleCodeComposer.composeUnaryLroRpcMethodSampleCode(
method, clientType, arguments, resourceNames));
String expected =
LineFormatter.lines(
"try (EchoClient echoClient = EchoClient.create()) {\n",
" Duration ttl = Duration.newBuilder().build();\n",
" echoClient.waitAsync(ttl).get();\n",
"}");
assertEquals(results, expected);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -403,6 +403,15 @@ public class EchoClient implements BackgroundResource {

// AUTO-GENERATED DOCUMENTATION AND METHOD.
/**
* Sample code:
*
* <pre>{@code
* try (EchoClient echoClient = EchoClient.create()) {
* Duration ttl = Duration.newBuilder().build();
* WaitResponse response = echoClient.waitAsync(ttl).get();
* }
* }</pre>
*
* @param ttl
* @throws com.google.api.gax.rpc.ApiException if the remote call fails
*/
Expand All @@ -413,6 +422,15 @@ public class EchoClient implements BackgroundResource {

// AUTO-GENERATED DOCUMENTATION AND METHOD.
/**
* Sample code:
*
* <pre>{@code
* try (EchoClient echoClient = EchoClient.create()) {
* Timestamp endTime = Timestamp.newBuilder().build();
* WaitResponse response = echoClient.waitAsync(endTime).get();
* }
* }</pre>
*
* @param endTime
* @throws com.google.api.gax.rpc.ApiException if the remote call fails
*/
Expand Down
Loading