diff --git a/src/main/java/com/google/api/generator/engine/ast/VaporReference.java b/src/main/java/com/google/api/generator/engine/ast/VaporReference.java index fbd75afc2e..c3b237bdf3 100644 --- a/src/main/java/com/google/api/generator/engine/ast/VaporReference.java +++ b/src/main/java/com/google/api/generator/engine/ast/VaporReference.java @@ -78,7 +78,14 @@ public boolean isFromPackage(String pkg) { @Override public boolean isSupertypeOrEquals(Reference other) { // Not handling more complex cases for VaporReference. - return equals(other); + if (!(other instanceof VaporReference)) { + return false; + } + + VaporReference ref = (VaporReference) other; + return pakkage().equals(ref.pakkage()) + && plainName().equals(ref.plainName()) + && Objects.equals(enclosingClassName(), ref.enclosingClassName()); } @Override diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientTestClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientTestClassComposer.java index 3b3902b2ab..796f023d87 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientTestClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientTestClassComposer.java @@ -22,6 +22,7 @@ import com.google.api.gax.rpc.ApiClientHeaderProvider; import com.google.api.gax.rpc.ApiStreamObserver; import com.google.api.gax.rpc.BidiStreamingCallable; +import com.google.api.gax.rpc.ClientStreamingCallable; import com.google.api.gax.rpc.InvalidArgumentException; import com.google.api.gax.rpc.OperationCallSettings; import com.google.api.gax.rpc.PagedCallSettings; @@ -39,6 +40,7 @@ import com.google.api.generator.engine.ast.EnumRefExpr; import com.google.api.generator.engine.ast.Expr; import com.google.api.generator.engine.ast.ExprStatement; +import com.google.api.generator.engine.ast.InstanceofExpr; import com.google.api.generator.engine.ast.LineComment; import com.google.api.generator.engine.ast.MethodDefinition; import com.google.api.generator.engine.ast.MethodInvocationExpr; @@ -411,16 +413,38 @@ private static List createTestMethods( method, Collections.emptyList(), 0, + service.name(), classMemberVarExprs, resourceNames, messageTypes)); } else { - for (int i = 0; i < method.methodSignatures().size(); i++) { + // Make the method signature order deterministic, which helps with unit testing and + // per-version + // diffs. + List> sortedMethodSignatures = + method.methodSignatures().stream() + .sorted( + (s1, s2) -> { + if (s1.size() != s2.size()) { + return s1.size() - s2.size(); + } + for (int i = 0; i < s1.size(); i++) { + int compareVal = s1.get(i).compareTo(s2.get(i)); + if (compareVal != 0) { + return compareVal; + } + } + return 0; + }) + .collect(Collectors.toList()); + + for (int i = 0; i < sortedMethodSignatures.size(); i++) { javaMethods.add( createRpcExceptionTestMethod( method, - method.methodSignatures().get(i), + sortedMethodSignatures.get(i), i, + service.name(), classMemberVarExprs, resourceNames, messageTypes)); @@ -434,6 +458,7 @@ private static MethodDefinition createRpcExceptionTestMethod( Method method, List methodSignature, int variantIndex, + String serviceName, Map classMemberVarExprs, Map resourceNames, Map messageTypes) { @@ -460,9 +485,7 @@ private static MethodDefinition createRpcExceptionTestMethod( .build(); Expr addExceptionExpr = MethodInvocationExpr.builder() - .setExprReferenceExpr( - classMemberVarExprs.get( - String.format("mock%s", JavaStyle.toUpperCamelCase(method.name())))) + .setExprReferenceExpr(classMemberVarExprs.get(getMockServiceVarName(serviceName))) .setMethodName("addException") .setArguments(exceptionVarExpr) .build(); @@ -473,6 +496,198 @@ private static MethodDefinition createRpcExceptionTestMethod( "%sExceptionTest%s", JavaStyle.toLowerCamelCase(method.name()), variantIndex > 0 ? variantIndex + 1 : ""); + boolean isStreaming = !method.stream().equals(Method.Stream.NONE); + List methodBody = new ArrayList<>(); + methodBody.add(ExprStatement.withExpr(exceptionAssignExpr)); + methodBody.add(ExprStatement.withExpr(addExceptionExpr)); + if (isStreaming) { + methodBody.addAll( + createRpcExceptionTestStreamingStatements( + method, classMemberVarExprs, resourceNames, messageTypes)); + } else { + methodBody.addAll( + createRpcExceptionTestNonStreamingStatements( + method, methodSignature, classMemberVarExprs, resourceNames, messageTypes)); + } + + return MethodDefinition.builder() + .setAnnotations(Arrays.asList(TEST_ANNOTATION)) + .setScope(ScopeNode.PUBLIC) + .setReturnType(TypeNode.VOID) + .setName(exceptionTestMethodName) + .setThrowsExceptions(Arrays.asList(TypeNode.withExceptionClazz(Exception.class))) + .setBody(methodBody) + .build(); + } + + private static List createRpcExceptionTestStreamingStatements( + Method method, + Map classMemberVarExprs, + Map resourceNames, + Map messageTypes) { + // Build the request variable and assign it. + VariableExpr requestVarExpr = + VariableExpr.withVariable( + Variable.builder().setType(method.inputType()).setName("request").build()); + Message requestMessage = messageTypes.get(method.inputType().reference().name()); + Preconditions.checkNotNull(requestMessage); + Expr valExpr = + DefaultValueComposer.createSimpleMessageBuilderExpr( + requestMessage, resourceNames, messageTypes); + + List exprs = new ArrayList<>(); + exprs.add( + AssignmentExpr.builder() + .setVariableExpr(requestVarExpr.toBuilder().setIsDecl(true).build()) + .setValueExpr(valExpr) + .build()); + + // Build the responseObserver variable. + VariableExpr responseObserverVarExpr = + VariableExpr.withVariable( + Variable.builder() + .setType( + TypeNode.withReference( + STATIC_TYPES + .get("MockStreamObserver") + .reference() + .copyAndSetGenerics(Arrays.asList(method.outputType().reference())))) + .setName("responseObserver") + .build()); + + exprs.add( + AssignmentExpr.builder() + .setVariableExpr(responseObserverVarExpr.toBuilder().setIsDecl(true).build()) + .setValueExpr( + NewObjectExpr.builder() + .setType(STATIC_TYPES.get("MockStreamObserver")) + .setIsGeneric(true) + .build()) + .build()); + + // Build the callable variable and assign it. + VariableExpr callableVarExpr = + VariableExpr.withVariable( + Variable.builder().setType(getCallableType(method)).setName("callable").build()); + Expr streamingCallExpr = + MethodInvocationExpr.builder() + .setExprReferenceExpr(classMemberVarExprs.get("client")) + .setMethodName(String.format("%sCallable", JavaStyle.toLowerCamelCase(method.name()))) + .setReturnType(callableVarExpr.type()) + .build(); + if (method.stream().equals(Method.Stream.SERVER)) { + exprs.add(streamingCallExpr); + } else { + exprs.add( + AssignmentExpr.builder() + .setVariableExpr(callableVarExpr.toBuilder().setIsDecl(true).build()) + .setValueExpr(streamingCallExpr) + .build()); + } + + if (!method.stream().equals(Method.Stream.SERVER)) { + // Call the streaming-variant callable method. + VariableExpr requestObserverVarExpr = + VariableExpr.withVariable( + Variable.builder() + .setType( + TypeNode.withReference( + STATIC_TYPES + .get("ApiStreamObserver") + .reference() + .copyAndSetGenerics(Arrays.asList(method.inputType().reference())))) + .setName("requestObserver") + .build()); + exprs.add( + AssignmentExpr.builder() + .setVariableExpr(requestObserverVarExpr.toBuilder().setIsDecl(true).build()) + .setValueExpr( + MethodInvocationExpr.builder() + .setExprReferenceExpr(callableVarExpr) + .setMethodName(getCallableMethodName(method)) + .setArguments(requestVarExpr, responseObserverVarExpr) + .setReturnType(requestObserverVarExpr.type()) + .build()) + .build()); + + exprs.add( + MethodInvocationExpr.builder() + .setExprReferenceExpr(requestObserverVarExpr) + .setMethodName("onNext") + .setArguments(requestVarExpr) + .build()); + } + + List tryBodyExprs = new ArrayList<>(); + // TODO(v2): This variable is unused in the generated test, it can be deleted. + VariableExpr actualResponsesVarExpr = + VariableExpr.withVariable( + Variable.builder() + .setType( + TypeNode.withReference( + ConcreteReference.builder() + .setClazz(List.class) + .setGenerics(Arrays.asList(method.outputType().reference())) + .build())) + .setName("actualResponses") + .build()); + + Expr getFutureResponseExpr = + MethodInvocationExpr.builder() + .setExprReferenceExpr(responseObserverVarExpr) + .setMethodName("future") + .build(); + getFutureResponseExpr = + MethodInvocationExpr.builder() + .setExprReferenceExpr(getFutureResponseExpr) + .setMethodName("get") + .setReturnType(actualResponsesVarExpr.type()) + .build(); + tryBodyExprs.add( + AssignmentExpr.builder() + .setVariableExpr(actualResponsesVarExpr.toBuilder().setIsDecl(true).build()) + .setValueExpr(getFutureResponseExpr) + .build()); + // Assert a failure if no exception was raised. + tryBodyExprs.add( + MethodInvocationExpr.builder() + .setStaticReferenceType(STATIC_TYPES.get("Assert")) + .setMethodName("fail") + .setArguments(ValueExpr.withValue(StringObjectValue.withValue("No exception thrown"))) + .build()); + + VariableExpr catchExceptionVarExpr = + VariableExpr.builder() + .setVariable( + Variable.builder() + .setType(TypeNode.withExceptionClazz(ExecutionException.class)) + .setName("e") + .build()) + .build(); + + TryCatchStatement tryCatchBlock = + TryCatchStatement.builder() + .setTryBody( + tryBodyExprs.stream() + .map(e -> ExprStatement.withExpr(e)) + .collect(Collectors.toList())) + .setCatchVariableExpr(catchExceptionVarExpr.toBuilder().setIsDecl(true).build()) + .setCatchBody(createRpcLroExceptionTestCatchBody(catchExceptionVarExpr, true)) + .build(); + + List statements = new ArrayList<>(); + statements.addAll( + exprs.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList())); + statements.add(tryCatchBlock); + return statements; + } + + private static List createRpcExceptionTestNonStreamingStatements( + Method method, + List methodSignature, + Map classMemberVarExprs, + Map resourceNames, + Map messageTypes) { List argVarExprs = new ArrayList<>(); List tryBodyExprs = new ArrayList<>(); if (methodSignature.isEmpty()) { @@ -540,10 +755,9 @@ private static MethodDefinition createRpcExceptionTestMethod( List catchBody = method.hasLro() - ? createRpcLroExceptionTestCatchBody(catchExceptionVarExpr) + ? createRpcLroExceptionTestCatchBody(catchExceptionVarExpr, false) : Arrays.asList( CommentStatement.withComment(LineComment.withComment("Expected exception."))); - // Assert a failure if no exception was raised. tryBodyExprs.add( MethodInvocationExpr.builder() @@ -562,21 +776,11 @@ private static MethodDefinition createRpcExceptionTestMethod( .setCatchBody(catchBody) .build(); - return MethodDefinition.builder() - .setAnnotations(Arrays.asList(TEST_ANNOTATION)) - .setScope(ScopeNode.PUBLIC) - .setReturnType(TypeNode.VOID) - .setName(exceptionTestMethodName) - .setThrowsExceptions(Arrays.asList(TypeNode.withExceptionClazz(Exception.class))) - .setBody( - Arrays.asList( - ExprStatement.withExpr(exceptionAssignExpr), - ExprStatement.withExpr(addExceptionExpr), - tryCatchBlock)) - .build(); + return Arrays.asList(tryCatchBlock); } - private static List createRpcLroExceptionTestCatchBody(VariableExpr exceptionExpr) { + private static List createRpcLroExceptionTestCatchBody( + VariableExpr exceptionExpr, boolean isStreaming) { List catchBodyExprs = new ArrayList<>(); Expr testExpectedValueExpr = @@ -600,13 +804,27 @@ private static List createRpcLroExceptionTestCatchBody(VariableExpr e .setMethodName("getClass") .build(); - // Constructs `Assert.assertEquals(InvalidArgumentException.class, e.getCaus().getClass());`. - catchBodyExprs.add( - MethodInvocationExpr.builder() - .setStaticReferenceType(STATIC_TYPES.get("Assert")) - .setMethodName("assertEquals") - .setArguments(testExpectedValueExpr, testActualValueExpr) - .build()); + if (isStreaming) { + InstanceofExpr checkInstanceExpr = + InstanceofExpr.builder() + .setExpr(getCauseExpr) + .setCheckType(STATIC_TYPES.get("InvalidArgumentException")) + .build(); + catchBodyExprs.add( + MethodInvocationExpr.builder() + .setStaticReferenceType(STATIC_TYPES.get("Assert")) + .setMethodName("assertTrue") + .setArguments(checkInstanceExpr) + .build()); + } else { + // Constructs `Assert.assertEquals(InvalidArgumentException.class, e.getCaus().getClass());`. + catchBodyExprs.add( + MethodInvocationExpr.builder() + .setStaticReferenceType(STATIC_TYPES.get("Assert")) + .setMethodName("assertEquals") + .setArguments(testExpectedValueExpr, testActualValueExpr) + .build()); + } // Construct the apiException variable. VariableExpr apiExceptionVarExpr = @@ -676,6 +894,7 @@ private static Map createStaticTypes() { Before.class, BeforeClass.class, BidiStreamingCallable.class, + ClientStreamingCallable.class, ExecutionException.class, GaxGrpcProperties.class, Generated.class, @@ -865,6 +1084,54 @@ private static TypeNode getCallSettingsTypeHelper( ConcreteReference.builder().setClazz(callSettingsClazz).setGenerics(generics).build()); } + private static TypeNode getCallableType(Method protoMethod) { + Preconditions.checkState( + !protoMethod.stream().equals(Method.Stream.NONE), + "No callable type exists for non-streaming methods."); + + Class callableClazz = ClientStreamingCallable.class; + switch (protoMethod.stream()) { + case BIDI: + callableClazz = BidiStreamingCallable.class; + break; + case SERVER: + callableClazz = ServerStreamingCallable.class; + break; + case CLIENT: + // Fall through. + case NONE: + // Fall through + default: + // Fall through + } + + List generics = new ArrayList<>(); + generics.add(protoMethod.inputType().reference()); + generics.add(protoMethod.outputType().reference()); + + return TypeNode.withReference( + ConcreteReference.builder().setClazz(callableClazz).setGenerics(generics).build()); + } + + private static String getCallableMethodName(Method protoMethod) { + Preconditions.checkState( + !protoMethod.stream().equals(Method.Stream.NONE), + "No callable type exists for non-streaming methods."); + + switch (protoMethod.stream()) { + case BIDI: + return "bidiStreamingCall"; + case SERVER: + return "serverStreamingCall"; + case CLIENT: + // Fall through. + case NONE: + // Fall through + default: + return "clientStreamingCall"; + } + } + private static String getClientClassName(String serviceName) { return String.format(SERVICE_CLIENT_CLASS_NAME_PATTERN, serviceName); } diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientTestClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientTestClassComposerTest.java index 47619ade83..40afe0dc60 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientTestClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientTestClassComposerTest.java @@ -69,13 +69,19 @@ public void generateServiceClasses() { + "import com.google.api.gax.grpc.testing.LocalChannelProvider;\n" + "import com.google.api.gax.grpc.testing.MockGrpcService;\n" + "import com.google.api.gax.grpc.testing.MockServiceHelper;\n" + + "import com.google.api.gax.grpc.testing.MockStreamObserver;\n" + + "import com.google.api.gax.rpc.ApiStreamObserver;\n" + + "import com.google.api.gax.rpc.BidiStreamingCallable;\n" + + "import com.google.api.gax.rpc.ClientStreamingCallable;\n" + "import com.google.api.gax.rpc.InvalidArgumentException;\n" + + "import com.google.api.gax.rpc.ServerStreamingCallable;\n" + "import com.google.api.gax.rpc.StatusCode;\n" + "import com.google.api.resourcenames.ResourceName;\n" + "import com.google.rpc.Status;\n" + "import io.grpc.StatusRuntimeException;\n" + "import java.io.IOException;\n" + "import java.util.Arrays;\n" + + "import java.util.List;\n" + "import java.util.UUID;\n" + "import java.util.concurrent.ExecutionException;\n" + "import javax.annotation.Generated;\n" @@ -131,8 +137,9 @@ public void generateServiceClasses() { + " StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT);\n" + " mockEcho.addException(exception);\n" + " try {\n" - + " String content = \"content951530617\";\n" - + " client.echo(content);\n" + + " ResourceName parent = FoobarName.ofProjectFoobarName(\"[PROJECT]\"," + + " \"[FOOBAR]\");\n" + + " client.echo(parent);\n" + " Assert.fail(\"No exception raised\");\n" + " } catch (InvalidArgumentException e) {\n" + " // Expected exception.\n" @@ -159,9 +166,9 @@ public void generateServiceClasses() { + " StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT);\n" + " mockEcho.addException(exception);\n" + " try {\n" - + " String content = \"content951530617\";\n" - + " Severity severity = Severity.forNumber(0);\n" - + " client.echo(content, severity);\n" + + " FoobarName name = FoobarName.ofProjectFoobarName(\"[PROJECT]\"," + + " \"[FOOBAR]\");\n" + + " client.echo(name);\n" + " Assert.fail(\"No exception raised\");\n" + " } catch (InvalidArgumentException e) {\n" + " // Expected exception.\n" @@ -174,8 +181,8 @@ public void generateServiceClasses() { + " StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT);\n" + " mockEcho.addException(exception);\n" + " try {\n" - + " String name = \"name3373707\";\n" - + " client.echo(name);\n" + + " String content = \"content951530617\";\n" + + " client.echo(content);\n" + " Assert.fail(\"No exception raised\");\n" + " } catch (InvalidArgumentException e) {\n" + " // Expected exception.\n" @@ -188,8 +195,7 @@ public void generateServiceClasses() { + " StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT);\n" + " mockEcho.addException(exception);\n" + " try {\n" - + " FoobarName name = FoobarName.ofProjectFoobarName(\"[PROJECT]\"," - + " \"[FOOBAR]\");\n" + + " String name = \"name3373707\";\n" + " client.echo(name);\n" + " Assert.fail(\"No exception raised\");\n" + " } catch (InvalidArgumentException e) {\n" @@ -217,9 +223,9 @@ public void generateServiceClasses() { + " StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT);\n" + " mockEcho.addException(exception);\n" + " try {\n" - + " ResourceName parent = FoobarName.ofProjectFoobarName(\"[PROJECT]\"," - + " \"[FOOBAR]\");\n" - + " client.echo(parent);\n" + + " String content = \"content951530617\";\n" + + " Severity severity = Severity.forNumber(0);\n" + + " client.echo(content, severity);\n" + " Assert.fail(\"No exception raised\");\n" + " } catch (InvalidArgumentException e) {\n" + " // Expected exception.\n" @@ -230,14 +236,21 @@ public void generateServiceClasses() { + " public void expandExceptionTest() throws Exception {\n" + " StatusRuntimeException exception = new" + " StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT);\n" - + " addException(exception);\n" + + " mockEcho.addException(exception);\n" + + " ExpandRequest request =\n" + + " " + + " ExpandRequest.newBuilder().setContent(\"content951530617\").setInfo(\"info3237038\").build();\n" + + " MockStreamObserver responseObserver = new MockStreamObserver<>();\n" + + " client.expandCallable();\n" + " try {\n" - + " String content = \"content951530617\";\n" - + " Status error = Status.newBuilder().build();\n" - + " client.expand(content, error);\n" - + " Assert.fail(\"No exception raised\");\n" - + " } catch (InvalidArgumentException e) {\n" - + " // Expected exception.\n" + + " List actualResponses = responseObserver.future().get();\n" + + " Assert.fail(\"No exception thrown\");\n" + + " } catch (ExecutionException e) {\n" + + " Assert.assertTrue(e.getCause() instanceof InvalidArgumentException);\n" + + " InvalidArgumentException apiException = ((InvalidArgumentException)" + + " e.getCause());\n" + + " Assert.assertEquals(StatusCode.Code.INVALID_ARGUMENT," + + " apiException.getStatusCode().getCode());\n" + " }\n" + " }\n" + "\n" @@ -245,13 +258,30 @@ public void generateServiceClasses() { + " public void collectExceptionTest() throws Exception {\n" + " StatusRuntimeException exception = new" + " StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT);\n" - + " addException(exception);\n" + + " mockEcho.addException(exception);\n" + + " EchoRequest request =\n" + + " EchoRequest.newBuilder()\n" + + " .setName(FoobarName.ofProjectFoobarName(\"[PROJECT]\"," + + " \"[FOOBAR]\").toString())\n" + + " .setParent(FoobarName.ofProjectFoobarName(\"[PROJECT]\"," + + " \"[FOOBAR]\").toString())\n" + + " .setFoobar(Foobar.newBuilder().build())\n" + + " .build();\n" + + " MockStreamObserver responseObserver = new MockStreamObserver<>();\n" + + " ClientStreamingCallable callable =" + + " client.collectCallable();\n" + + " ApiStreamObserver requestObserver =\n" + + " callable.clientStreamingCall(request, responseObserver);\n" + + " requestObserver.onNext(request);\n" + " try {\n" - + " String content = \"content951530617\";\n" - + " client.collect(content);\n" - + " Assert.fail(\"No exception raised\");\n" - + " } catch (InvalidArgumentException e) {\n" - + " // Expected exception.\n" + + " List actualResponses = responseObserver.future().get();\n" + + " Assert.fail(\"No exception thrown\");\n" + + " } catch (ExecutionException e) {\n" + + " Assert.assertTrue(e.getCause() instanceof InvalidArgumentException);\n" + + " InvalidArgumentException apiException = ((InvalidArgumentException)" + + " e.getCause());\n" + + " Assert.assertEquals(StatusCode.Code.INVALID_ARGUMENT," + + " apiException.getStatusCode().getCode());\n" + " }\n" + " }\n" + "\n" @@ -259,20 +289,30 @@ public void generateServiceClasses() { + " public void chatExceptionTest() throws Exception {\n" + " StatusRuntimeException exception = new" + " StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT);\n" - + " addException(exception);\n" - + " try {\n" - + " EchoRequest request =\n" - + " EchoRequest.newBuilder()\n" - + " .setName(FoobarName.ofProjectFoobarName(\"[PROJECT]\"," + + " mockEcho.addException(exception);\n" + + " EchoRequest request =\n" + + " EchoRequest.newBuilder()\n" + + " .setName(FoobarName.ofProjectFoobarName(\"[PROJECT]\"," + " \"[FOOBAR]\").toString())\n" - + " .setParent(FoobarName.ofProjectFoobarName(\"[PROJECT]\"," + + " .setParent(FoobarName.ofProjectFoobarName(\"[PROJECT]\"," + " \"[FOOBAR]\").toString())\n" - + " .setFoobar(Foobar.newBuilder().build())\n" - + " .build();\n" - + " client.chat(request);\n" - + " Assert.fail(\"No exception raised\");\n" - + " } catch (InvalidArgumentException e) {\n" - + " // Expected exception.\n" + + " .setFoobar(Foobar.newBuilder().build())\n" + + " .build();\n" + + " MockStreamObserver responseObserver = new MockStreamObserver<>();\n" + + " BidiStreamingCallable callable =" + + " client.chatCallable();\n" + + " ApiStreamObserver requestObserver =\n" + + " callable.bidiStreamingCall(request, responseObserver);\n" + + " requestObserver.onNext(request);\n" + + " try {\n" + + " List actualResponses = responseObserver.future().get();\n" + + " Assert.fail(\"No exception thrown\");\n" + + " } catch (ExecutionException e) {\n" + + " Assert.assertTrue(e.getCause() instanceof InvalidArgumentException);\n" + + " InvalidArgumentException apiException = ((InvalidArgumentException)" + + " e.getCause());\n" + + " Assert.assertEquals(StatusCode.Code.INVALID_ARGUMENT," + + " apiException.getStatusCode().getCode());\n" + " }\n" + " }\n" + "\n" @@ -280,13 +320,30 @@ public void generateServiceClasses() { + " public void chatAgainExceptionTest() throws Exception {\n" + " StatusRuntimeException exception = new" + " StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT);\n" - + " addException(exception);\n" + + " mockEcho.addException(exception);\n" + + " EchoRequest request =\n" + + " EchoRequest.newBuilder()\n" + + " .setName(FoobarName.ofProjectFoobarName(\"[PROJECT]\"," + + " \"[FOOBAR]\").toString())\n" + + " .setParent(FoobarName.ofProjectFoobarName(\"[PROJECT]\"," + + " \"[FOOBAR]\").toString())\n" + + " .setFoobar(Foobar.newBuilder().build())\n" + + " .build();\n" + + " MockStreamObserver responseObserver = new MockStreamObserver<>();\n" + + " BidiStreamingCallable callable =" + + " client.chatAgainCallable();\n" + + " ApiStreamObserver requestObserver =\n" + + " callable.bidiStreamingCall(request, responseObserver);\n" + + " requestObserver.onNext(request);\n" + " try {\n" - + " String content = \"content951530617\";\n" - + " client.chatAgain(content);\n" - + " Assert.fail(\"No exception raised\");\n" - + " } catch (InvalidArgumentException e) {\n" - + " // Expected exception.\n" + + " List actualResponses = responseObserver.future().get();\n" + + " Assert.fail(\"No exception thrown\");\n" + + " } catch (ExecutionException e) {\n" + + " Assert.assertTrue(e.getCause() instanceof InvalidArgumentException);\n" + + " InvalidArgumentException apiException = ((InvalidArgumentException)" + + " e.getCause());\n" + + " Assert.assertEquals(StatusCode.Code.INVALID_ARGUMENT," + + " apiException.getStatusCode().getCode());\n" + " }\n" + " }\n" + "\n" @@ -294,7 +351,7 @@ public void generateServiceClasses() { + " public void pagedExpandExceptionTest() throws Exception {\n" + " StatusRuntimeException exception = new" + " StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT);\n" - + " addException(exception);\n" + + " mockEcho.addException(exception);\n" + " try {\n" + " PagedExpandRequest request =\n" + " PagedExpandRequest.newBuilder()\n" @@ -313,7 +370,7 @@ public void generateServiceClasses() { + " public void waitExceptionTest() throws Exception {\n" + " StatusRuntimeException exception = new" + " StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT);\n" - + " addException(exception);\n" + + " mockEcho.addException(exception);\n" + " try {\n" + " WaitRequest request = WaitRequest.newBuilder().build();\n" + " client.waitAsync(request).get();\n" @@ -331,7 +388,7 @@ public void generateServiceClasses() { + " public void blockExceptionTest() throws Exception {\n" + " StatusRuntimeException exception = new" + " StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT);\n" - + " addException(exception);\n" + + " mockEcho.addException(exception);\n" + " try {\n" + " BlockRequest request = BlockRequest.newBuilder().build();\n" + " client.block(request);\n"