diff --git a/src/main/java/com/google/api/generator/engine/ast/ConcreteReference.java b/src/main/java/com/google/api/generator/engine/ast/ConcreteReference.java index 55cb1fbc13..144820c7ab 100644 --- a/src/main/java/com/google/api/generator/engine/ast/ConcreteReference.java +++ b/src/main/java/com/google/api/generator/engine/ast/ConcreteReference.java @@ -91,19 +91,18 @@ public boolean isFromPackage(String pkg) { @Override public boolean isSupertypeOrEquals(Reference other) { - if (generics().size() != other.generics().size()) { - return false; - } - + // Don't check generics for cases like "List foo = new ArrayList<>(); if (!isAssignableFrom(other)) { return false; } - for (int i = 0; i < generics().size(); i++) { - Reference thisGeneric = generics().get(i); - Reference otherGeneric = other.generics().get(i); - if (!thisGeneric.isSupertypeOrEquals(otherGeneric)) { - return false; + if (generics().size() == other.generics().size()) { + for (int i = 0; i < generics().size(); i++) { + Reference thisGeneric = generics().get(i); + Reference otherGeneric = other.generics().get(i); + if (!thisGeneric.isSupertypeOrEquals(otherGeneric)) { + return false; + } } } diff --git a/src/main/java/com/google/api/generator/gapic/composer/MockServiceImplClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/MockServiceImplClassComposer.java index e1de1f04aa..a3f4a4530c 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/MockServiceImplClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/MockServiceImplClassComposer.java @@ -27,9 +27,12 @@ import com.google.api.generator.engine.ast.InstanceofExpr; import com.google.api.generator.engine.ast.MethodDefinition; import com.google.api.generator.engine.ast.MethodInvocationExpr; +import com.google.api.generator.engine.ast.NewObjectExpr; import com.google.api.generator.engine.ast.ScopeNode; import com.google.api.generator.engine.ast.Statement; +import com.google.api.generator.engine.ast.ThisObjectValue; import com.google.api.generator.engine.ast.TypeNode; +import com.google.api.generator.engine.ast.ValueExpr; import com.google.api.generator.engine.ast.VaporReference; import com.google.api.generator.engine.ast.Variable; import com.google.api.generator.engine.ast.VariableExpr; @@ -134,7 +137,7 @@ private static List createClassMethods( types.get(String.format(MOCK_SERVICE_IMPL_NAME_PATTERN, service.name())))); javaMethods.add(createGetRequestsMethod()); javaMethods.add(createAddResponseMethod()); - javaMethods.add(createSetResponsesMethod()); + javaMethods.add(createSetResponsesMethod(service)); javaMethods.add(createAddExceptionMethod()); javaMethods.add(createResetMethod()); javaMethods.addAll(createProtoMethodOverrides(service)); @@ -142,9 +145,9 @@ private static List createClassMethods( } private static MethodDefinition createConstructor(TypeNode classType) { - // TODO(miraleung): Instantiate fields here. return MethodDefinition.constructorBuilder() .setScope(ScopeNode.PUBLIC) + .setBody(createRequestResponseAssignStatements()) .setReturnType(classType) .build(); } @@ -182,30 +185,46 @@ private static MethodDefinition createAddResponseMethod() { .build(); } - private static MethodDefinition createSetResponsesMethod() { + private static MethodDefinition createSetResponsesMethod(Service service) { // TODO(miraleung): Re-instantiate the fields here. + VariableExpr responsesArgVarExpr = + VariableExpr.withVariable( + Variable.builder() + .setName("responses") + .setType( + TypeNode.withReference( + ConcreteReference.builder() + .setClazz(List.class) + .setGenerics( + Arrays.asList(staticTypes.get("AbstractMessage").reference())) + .build())) + .build()); + Expr responseAssignExpr = + AssignmentExpr.builder() + .setVariableExpr( + responsesVarExpr.toBuilder() + .setExprReferenceExpr( + ValueExpr.withValue(ThisObjectValue.withType(getThisClassType(service)))) + .build()) + .setValueExpr( + NewObjectExpr.builder() + .setType( + TypeNode.withReference( + ConcreteReference.builder() + .setClazz(LinkedList.class) + .setGenerics( + Arrays.asList(ConcreteReference.withClazz(Object.class))) + .build())) + .setArguments(Arrays.asList(responsesArgVarExpr)) + .build()) + .build(); return MethodDefinition.builder() .setIsOverride(true) .setScope(ScopeNode.PUBLIC) .setReturnType(TypeNode.VOID) .setName("setResponses") - .setArguments( - Arrays.asList( - VariableExpr.builder() - .setVariable( - Variable.builder() - .setName("responses") - .setType( - TypeNode.withReference( - ConcreteReference.builder() - .setClazz(List.class) - .setGenerics( - Arrays.asList( - staticTypes.get("AbstractMessage").reference())) - .build())) - .build()) - .setIsDecl(true) - .build())) + .setArguments(Arrays.asList(responsesArgVarExpr.toBuilder().setIsDecl(true).build())) + .setBody(Arrays.asList(ExprStatement.withExpr(responseAssignExpr))) .build(); } @@ -233,12 +252,12 @@ private static MethodDefinition createAddExceptionMethod() { } private static MethodDefinition createResetMethod() { - // TODO(miraleung): Re-instantiate the fields here. return MethodDefinition.builder() .setIsOverride(true) .setScope(ScopeNode.PUBLIC) .setReturnType(TypeNode.VOID) .setName("reset") + .setBody(createRequestResponseAssignStatements()) .build(); } @@ -550,4 +569,36 @@ private static Map createDynamicTypes(Service service) { .build())); return types; } + + private static TypeNode getThisClassType(Service service) { + return TypeNode.withReference( + VaporReference.builder() + .setName(String.format(MOCK_SERVICE_IMPL_NAME_PATTERN, service.name())) + .setPakkage(service.pakkage()) + .build()); + } + + private static List createRequestResponseAssignStatements() { + Expr assignRequestVarExpr = + AssignmentExpr.builder() + .setVariableExpr(requestsVarExpr) + .setValueExpr( + NewObjectExpr.builder() + .setType(TypeNode.withReference(ConcreteReference.withClazz(ArrayList.class))) + .setIsGeneric(true) + .build()) + .build(); + Expr assignResponsesVarExpr = + AssignmentExpr.builder() + .setVariableExpr(responsesVarExpr) + .setValueExpr( + NewObjectExpr.builder() + .setType(TypeNode.withReference(ConcreteReference.withClazz(LinkedList.class))) + .setIsGeneric(true) + .build()) + .build(); + return Arrays.asList(assignRequestVarExpr, assignResponsesVarExpr).stream() + .map(e -> ExprStatement.withExpr(e)) + .collect(Collectors.toList()); + } } diff --git a/src/test/java/com/google/api/generator/gapic/composer/MockServiceImplClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/MockServiceImplClassComposerTest.java index 5234847638..e2f56d13a6 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/MockServiceImplClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/MockServiceImplClassComposerTest.java @@ -69,6 +69,8 @@ public void generateServiceClasses() { + "import com.google.protobuf.AbstractMessage;\n" + "import com.google.showcase.v1beta1.EchoGrpc.EchoImplBase;\n" + "import io.grpc.stub.StreamObserver;\n" + + "import java.util.ArrayList;\n" + + "import java.util.LinkedList;\n" + "import java.util.List;\n" + "import java.util.Queue;\n" + "import javax.annotation.Generated;\n" @@ -79,7 +81,10 @@ public void generateServiceClasses() { + " private List requests;\n" + " private Queue responses;\n" + "\n" - + " public MockEchoImpl() {}\n" + + " public MockEchoImpl() {\n" + + " requests = new ArrayList<>();\n" + + " responses = new LinkedList<>();\n" + + " }\n" + "\n" + " @Override\n" + " public List getRequests() {\n" @@ -92,7 +97,9 @@ public void generateServiceClasses() { + " }\n" + "\n" + " @Override\n" - + " public void setResponses(List responses) {}\n" + + " public void setResponses(List responses) {\n" + + " this.responses = new LinkedList(responses);\n" + + " }\n" + "\n" + " @Override\n" + " public void addException(Exception exception) {\n" @@ -100,7 +107,10 @@ public void generateServiceClasses() { + " }\n" + "\n" + " @Override\n" - + " public void reset() {}\n" + + " public void reset() {\n" + + " requests = new ArrayList<>();\n" + + " responses = new LinkedList<>();\n" + + " }\n" + "\n" + " @Override\n" + " public void echo(EchoRequest request, StreamObserver"