From b7305692029dc964c7b3e65249945233fc772392 Mon Sep 17 00:00:00 2001 From: summerji Date: Thu, 1 Oct 2020 00:14:16 -0700 Subject: [PATCH 01/18] Add Equals method in ResourceName --- .../ResourceNameHelperClassComposer.java | 111 ++++++++++++++++++ .../gapic/composer/goldens/FoobarName.golden | 15 +++ 2 files changed, 126 insertions(+) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java index f686469607..9fc5b701ad 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java @@ -17,6 +17,7 @@ import com.google.api.core.BetaApi; import com.google.api.generator.engine.ast.AnnotationNode; import com.google.api.generator.engine.ast.AssignmentExpr; +import com.google.api.generator.engine.ast.CastExpr; import com.google.api.generator.engine.ast.ClassDefinition; import com.google.api.generator.engine.ast.CommentStatement; import com.google.api.generator.engine.ast.ConcreteReference; @@ -30,7 +31,9 @@ import com.google.api.generator.engine.ast.MethodInvocationExpr; import com.google.api.generator.engine.ast.NewObjectExpr; import com.google.api.generator.engine.ast.NullObjectValue; +import com.google.api.generator.engine.ast.PrimitiveValue; import com.google.api.generator.engine.ast.Reference; +import com.google.api.generator.engine.ast.RelationalOperationExpr; import com.google.api.generator.engine.ast.ReturnExpr; import com.google.api.generator.engine.ast.ScopeNode; import com.google.api.generator.engine.ast.Statement; @@ -57,6 +60,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -269,6 +273,7 @@ private static List createClassMethods( createFieldValueGetterMethods(resourceName, patternTokenVarExprs, tokenHierarchies, types)); javaMethods.add( createToStringMethod(templateFinalVarExprs, patternTokenVarExprs, tokenHierarchies)); + javaMethods.add(createEqualsMethod(resourceName, tokenHierarchies, types)); return javaMethods; } @@ -1140,6 +1145,112 @@ private static MethodDefinition createToStringMethod( .build(); } + private static MethodDefinition createEqualsMethod( + ResourceName resourceName, List> tokenHierarchies, Map types) { + Variable oVariable = Variable.builder().setType(TypeNode.OBJECT).setName("o").build(); + VariableExpr argVarExprDecl = + VariableExpr.builder().setIsDecl(true).setVariable(oVariable).build(); + VariableExpr argVarExprNotDecl = + VariableExpr.builder().setIsDecl(false).setVariable(oVariable).build(); + TypeNode thisClassType = types.get(getThisClassName(resourceName)); + ValueExpr thisValueExpr = ValueExpr.withValue(ThisObjectValue.withType(thisClassType)); + ValueExpr trueValueExpr = + ValueExpr.withValue( + PrimitiveValue.builder().setType(TypeNode.BOOLEAN).setValue("true").build()); + ValueExpr falseValueExpr = + ValueExpr.withValue( + PrimitiveValue.builder().setType(TypeNode.BOOLEAN).setValue("false").build()); + + ReturnExpr returnTrueExpr = ReturnExpr.withExpr(trueValueExpr); + RelationalOperationExpr oEqualsThisExpr = + RelationalOperationExpr.equalToWithExprs(argVarExprNotDecl, thisValueExpr); + RelationalOperationExpr oNotEqualsNullExpr = + RelationalOperationExpr.notEqualToWithExprs( + argVarExprNotDecl, ValueExpr.withValue(NullObjectValue.create())); + MethodInvocationExpr getClassMethodInvocationExpr = + MethodInvocationExpr.builder().setMethodName("getClass").build(); + RelationalOperationExpr getClassEqualsExpr = + RelationalOperationExpr.equalToWithExprs( + getClassMethodInvocationExpr, + getClassMethodInvocationExpr + .toBuilder() + .setExprReferenceExpr(argVarExprNotDecl) + .build()); + LogicalOperationExpr orLogicalExpr = + LogicalOperationExpr.logicalOrWithExprs(oNotEqualsNullExpr, getClassEqualsExpr); + + Variable thatVariable = Variable.builder().setName("that").setType(thisClassType).build(); + VariableExpr thatVariableExpr = + VariableExpr.builder().setIsDecl(true).setVariable(thatVariable).build(); + CastExpr oCastExpr = + CastExpr.builder().setExpr(argVarExprNotDecl).setType(thisClassType).build(); + AssignmentExpr thatAssignmentExpr = + AssignmentExpr.builder().setVariableExpr(thatVariableExpr).setValueExpr(oCastExpr).build(); + + thatVariableExpr = thatVariableExpr.toBuilder().setIsDecl(false).build(); + Set tokenSet = getTokenSet(tokenHierarchies); + Iterator itToken = tokenSet.iterator(); + Expr curTokenExpr = + createObjectsEqualsForTokenMethodEpxr( + thisValueExpr, + thatVariableExpr, + Variable.builder() + .setType(TypeNode.STRING) + .setName(JavaStyle.toLowerCamelCase(itToken.next())) + .build()); + + while (itToken.hasNext()) { + Expr nextTokenExpr = + createObjectsEqualsForTokenMethodEpxr( + thisValueExpr, + thatVariableExpr, + Variable.builder() + .setType(TypeNode.STRING) + .setName(JavaStyle.toLowerCamelCase(itToken.next())) + .build()); + curTokenExpr = LogicalOperationExpr.logicalAndWithExprs(curTokenExpr, nextTokenExpr); + } + ReturnExpr secondIfReturnExpr = ReturnExpr.withExpr(curTokenExpr); + + IfStatement firstIfStatement = + IfStatement.builder() + .setConditionExpr(oEqualsThisExpr) + .setBody(Arrays.asList(ExprStatement.withExpr(returnTrueExpr))) + .build(); + IfStatement secondIfStatement = + IfStatement.builder() + .setConditionExpr(orLogicalExpr) + .setBody( + Arrays.asList( + ExprStatement.withExpr(thatAssignmentExpr), + ExprStatement.withExpr(secondIfReturnExpr))) + .build(); + + return MethodDefinition.builder() + .setIsOverride(true) + .setScope(ScopeNode.PUBLIC) + .setArguments(argVarExprDecl) + .setReturnType(TypeNode.BOOLEAN) + .setName("equals") + .setReturnExpr(falseValueExpr) + .setBody(Arrays.asList(firstIfStatement, secondIfStatement)) + .build(); + } + + private static MethodInvocationExpr createObjectsEqualsForTokenMethodEpxr( + Expr thisExpr, Expr thatExpr, Variable tokenVar) { + VariableExpr varThisExpr = + VariableExpr.builder().setVariable(tokenVar).setExprReferenceExpr(thisExpr).build(); + VariableExpr varThatExpr = + VariableExpr.builder().setVariable(tokenVar).setExprReferenceExpr(thatExpr).build(); + return MethodInvocationExpr.builder() + .setStaticReferenceType(STATIC_TYPES.get("Objects")) + .setMethodName("equals") + .setArguments(Arrays.asList(varThisExpr, varThatExpr)) + .setReturnType(TypeNode.BOOLEAN) + .build(); + } + private static List createNestedBuilderClasses( ResourceName resourceName, List> tokenHierarchies, diff --git a/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden b/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden index 7676c60e08..e1ac6819c7 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden +++ b/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden @@ -349,6 +349,21 @@ public class FoobarName implements ResourceName { } } + @Override + public boolean equals(Object o) { + if (o == this) { + return true; + } + if (o != null || getClass() == o.getClass()) { + FoobarName that = ((FoobarName) o); + return Objects.equals(this.project, that.project) + && Objects.equals(this.foobar, that.foobar) + && Objects.equals(this.variant, that.variant) + && Objects.equals(this.barFoo, that.barFoo); + } + return false; + } + /** Builder for bar_foos/{bar_foo}/foobars/{foobar}. */ @BetaApi("The per-pattern Builders are not stable yet and may be changed in the future.") public static class BarFooFoobarBuilder { From d82d56b797cec1131f74d8cfeb503a27fa4a7ab5 Mon Sep 17 00:00:00 2001 From: summerji Date: Thu, 1 Oct 2020 00:27:08 -0700 Subject: [PATCH 02/18] correct function position --- .../ResourceNameHelperClassComposer.java | 3 +- .../gapic/composer/goldens/FoobarName.golden | 30 +++++++++---------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java index 9fc5b701ad..e4772a070d 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java @@ -1198,7 +1198,6 @@ private static MethodDefinition createEqualsMethod( .setType(TypeNode.STRING) .setName(JavaStyle.toLowerCamelCase(itToken.next())) .build()); - while (itToken.hasNext()) { Expr nextTokenExpr = createObjectsEqualsForTokenMethodEpxr( @@ -1212,11 +1211,13 @@ private static MethodDefinition createEqualsMethod( } ReturnExpr secondIfReturnExpr = ReturnExpr.withExpr(curTokenExpr); + // if (o == this) { return true;} IfStatement firstIfStatement = IfStatement.builder() .setConditionExpr(oEqualsThisExpr) .setBody(Arrays.asList(ExprStatement.withExpr(returnTrueExpr))) .build(); + // if (o != null || getClass() == o.getClass()) { FoobarName that = ((FoobarName) o); return ..} IfStatement secondIfStatement = IfStatement.builder() .setConditionExpr(orLogicalExpr) diff --git a/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden b/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden index e1ac6819c7..ac8d8995d2 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden +++ b/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden @@ -249,6 +249,21 @@ public class FoobarName implements ResourceName { return !Objects.isNull(fixedValue) ? fixedValue : pathTemplate.instantiate(getFieldValuesMap()); } + @Override + public boolean equals(Object o) { + if (o == this) { + return true; + } + if (o != null || getClass() == o.getClass()) { + FoobarName that = ((FoobarName) o); + return Objects.equals(this.project, that.project) + && Objects.equals(this.foobar, that.foobar) + && Objects.equals(this.variant, that.variant) + && Objects.equals(this.barFoo, that.barFoo); + } + return false; + } + /** Builder for projects/{project}/foobars/{foobar}. */ public static class Builder { private String project; @@ -349,21 +364,6 @@ public class FoobarName implements ResourceName { } } - @Override - public boolean equals(Object o) { - if (o == this) { - return true; - } - if (o != null || getClass() == o.getClass()) { - FoobarName that = ((FoobarName) o); - return Objects.equals(this.project, that.project) - && Objects.equals(this.foobar, that.foobar) - && Objects.equals(this.variant, that.variant) - && Objects.equals(this.barFoo, that.barFoo); - } - return false; - } - /** Builder for bar_foos/{bar_foo}/foobars/{foobar}. */ @BetaApi("The per-pattern Builders are not stable yet and may be changed in the future.") public static class BarFooFoobarBuilder { From 7859d17b9c0aa21a136a3bad8d8081cfe6ba1936 Mon Sep 17 00:00:00 2001 From: summerji Date: Thu, 1 Oct 2020 00:38:46 -0700 Subject: [PATCH 03/18] Add equals method in SessionName.golden --- .../gapic/composer/goldens/SessionName.golden | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/test/java/com/google/api/generator/gapic/composer/goldens/SessionName.golden b/src/test/java/com/google/api/generator/gapic/composer/goldens/SessionName.golden index 4dbe76e88e..58e15add60 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/goldens/SessionName.golden +++ b/src/test/java/com/google/api/generator/gapic/composer/goldens/SessionName.golden @@ -101,6 +101,18 @@ public class SessionName implements ResourceName { return SESSION.instantiate("session", session); } + @Override + public boolean equals(Object o) { + if (o == this) { + return true; + } + if (o != null || getClass() == o.getClass()) { + SessionName that = ((SessionName) o); + return Objects.equals(this.session, that.session); + } + return false; + } + /** Builder for sessions/{session}. */ public static class Builder { private String session; From f15f2a12fc09fa46efe57701abe37077ed9e68e5 Mon Sep 17 00:00:00 2001 From: summerji Date: Fri, 2 Oct 2020 03:24:52 -0700 Subject: [PATCH 04/18] Add comments in method --- .../ResourceNameHelperClassComposer.java | 45 ++++++++++--------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java index e4772a070d..2ae659617b 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java @@ -1147,47 +1147,46 @@ private static MethodDefinition createToStringMethod( private static MethodDefinition createEqualsMethod( ResourceName resourceName, List> tokenHierarchies, Map types) { + // Create method definition variables. Variable oVariable = Variable.builder().setType(TypeNode.OBJECT).setName("o").build(); - VariableExpr argVarExprDecl = - VariableExpr.builder().setIsDecl(true).setVariable(oVariable).build(); - VariableExpr argVarExprNotDecl = + VariableExpr argVarExpr = VariableExpr.builder().setIsDecl(false).setVariable(oVariable).build(); TypeNode thisClassType = types.get(getThisClassName(resourceName)); ValueExpr thisValueExpr = ValueExpr.withValue(ThisObjectValue.withType(thisClassType)); ValueExpr trueValueExpr = ValueExpr.withValue( PrimitiveValue.builder().setType(TypeNode.BOOLEAN).setValue("true").build()); - ValueExpr falseValueExpr = - ValueExpr.withValue( - PrimitiveValue.builder().setType(TypeNode.BOOLEAN).setValue("false").build()); + // Create first if statement's return expression ReturnExpr returnTrueExpr = ReturnExpr.withExpr(trueValueExpr); + + // Create second if statement's condition expression RelationalOperationExpr oEqualsThisExpr = - RelationalOperationExpr.equalToWithExprs(argVarExprNotDecl, thisValueExpr); + RelationalOperationExpr.equalToWithExprs(argVarExpr, thisValueExpr); RelationalOperationExpr oNotEqualsNullExpr = RelationalOperationExpr.notEqualToWithExprs( - argVarExprNotDecl, ValueExpr.withValue(NullObjectValue.create())); + argVarExpr, ValueExpr.withValue(NullObjectValue.create())); MethodInvocationExpr getClassMethodInvocationExpr = MethodInvocationExpr.builder().setMethodName("getClass").build(); RelationalOperationExpr getClassEqualsExpr = RelationalOperationExpr.equalToWithExprs( getClassMethodInvocationExpr, - getClassMethodInvocationExpr - .toBuilder() - .setExprReferenceExpr(argVarExprNotDecl) - .build()); + getClassMethodInvocationExpr.toBuilder().setExprReferenceExpr(argVarExpr).build()); LogicalOperationExpr orLogicalExpr = LogicalOperationExpr.logicalOrWithExprs(oNotEqualsNullExpr, getClassEqualsExpr); + // Create second if statement's body assignment expression. Variable thatVariable = Variable.builder().setName("that").setType(thisClassType).build(); VariableExpr thatVariableExpr = - VariableExpr.builder().setIsDecl(true).setVariable(thatVariable).build(); - CastExpr oCastExpr = - CastExpr.builder().setExpr(argVarExprNotDecl).setType(thisClassType).build(); + VariableExpr.builder().setIsDecl(false).setVariable(thatVariable).build(); + CastExpr oCastExpr = CastExpr.builder().setExpr(argVarExpr).setType(thisClassType).build(); AssignmentExpr thatAssignmentExpr = - AssignmentExpr.builder().setVariableExpr(thatVariableExpr).setValueExpr(oCastExpr).build(); + AssignmentExpr.builder() + .setVariableExpr(thatVariableExpr.toBuilder().setIsDecl(true).build()) + .setValueExpr(oCastExpr) + .build(); - thatVariableExpr = thatVariableExpr.toBuilder().setIsDecl(false).build(); + // Create return expression in the second if statement's body. Set tokenSet = getTokenSet(tokenHierarchies); Iterator itToken = tokenSet.iterator(); Expr curTokenExpr = @@ -1211,13 +1210,14 @@ private static MethodDefinition createEqualsMethod( } ReturnExpr secondIfReturnExpr = ReturnExpr.withExpr(curTokenExpr); - // if (o == this) { return true;} + // Code: if (o == this) { return true;} IfStatement firstIfStatement = IfStatement.builder() .setConditionExpr(oEqualsThisExpr) .setBody(Arrays.asList(ExprStatement.withExpr(returnTrueExpr))) .build(); - // if (o != null || getClass() == o.getClass()) { FoobarName that = ((FoobarName) o); return ..} + // Code: if (o != null || getClass() == o.getClass()) { FoobarName that = ((FoobarName) o); + // return ..} IfStatement secondIfStatement = IfStatement.builder() .setConditionExpr(orLogicalExpr) @@ -1227,10 +1227,15 @@ private static MethodDefinition createEqualsMethod( ExprStatement.withExpr(secondIfReturnExpr))) .build(); + // Create method's return expression. + ValueExpr falseValueExpr = + ValueExpr.withValue( + PrimitiveValue.builder().setType(TypeNode.BOOLEAN).setValue("false").build()); + return MethodDefinition.builder() .setIsOverride(true) .setScope(ScopeNode.PUBLIC) - .setArguments(argVarExprDecl) + .setArguments(argVarExpr.toBuilder().setIsDecl(true).build()) .setReturnType(TypeNode.BOOLEAN) .setName("equals") .setReturnExpr(falseValueExpr) From b1d92c41776cda1e2f4f9840e0a3a35ff4bc7125 Mon Sep 17 00:00:00 2001 From: summerji Date: Mon, 5 Oct 2020 22:35:25 -0700 Subject: [PATCH 05/18] feat: Add HashCode in resource name --- .../ResourceNameHelperClassComposer.java | 70 +++++++++++++++++++ .../gapic/composer/goldens/FoobarName.golden | 16 +++++ .../gapic/composer/goldens/SessionName.golden | 8 +++ 3 files changed, 94 insertions(+) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java index f686469607..46a399a498 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java @@ -17,6 +17,7 @@ import com.google.api.core.BetaApi; import com.google.api.generator.engine.ast.AnnotationNode; import com.google.api.generator.engine.ast.AssignmentExpr; +import com.google.api.generator.engine.ast.AssignmentOperationExpr; import com.google.api.generator.engine.ast.ClassDefinition; import com.google.api.generator.engine.ast.CommentStatement; import com.google.api.generator.engine.ast.ConcreteReference; @@ -30,6 +31,7 @@ import com.google.api.generator.engine.ast.MethodInvocationExpr; import com.google.api.generator.engine.ast.NewObjectExpr; import com.google.api.generator.engine.ast.NullObjectValue; +import com.google.api.generator.engine.ast.PrimitiveValue; import com.google.api.generator.engine.ast.Reference; import com.google.api.generator.engine.ast.ReturnExpr; import com.google.api.generator.engine.ast.ScopeNode; @@ -269,6 +271,7 @@ private static List createClassMethods( createFieldValueGetterMethods(resourceName, patternTokenVarExprs, tokenHierarchies, types)); javaMethods.add( createToStringMethod(templateFinalVarExprs, patternTokenVarExprs, tokenHierarchies)); + javaMethods.add(createHashCodeMethod(templateFinalVarExprs, tokenHierarchies)); return javaMethods; } @@ -1140,6 +1143,73 @@ private static MethodDefinition createToStringMethod( .build(); } + private static MethodDefinition createHashCodeMethod( + List templateFinalVarExprs, List> tokenHierarchies) { + List asgmtBody = new ArrayList<>(); + // code: int h = 1; + Variable hVar = Variable.builder().setType(TypeNode.INT).setName("h").build(); + VariableExpr hVarExpr = VariableExpr.builder().setVariable(hVar).build(); + ValueExpr hValueExpr = + ValueExpr.withValue(PrimitiveValue.builder().setType(TypeNode.INT).setValue("1").build()); + AssignmentExpr hAssignmentExpr = + AssignmentExpr.builder() + .setVariableExpr(hVarExpr.toBuilder().setIsDecl(true).build()) + .setValueExpr(hValueExpr) + .build(); + asgmtBody.add(ExprStatement.withExpr(hAssignmentExpr)); + // code: h *= 1000003; + ValueExpr numValueExpr = + ValueExpr.withValue( + PrimitiveValue.builder().setType(TypeNode.INT).setValue("1000003").build()); + AssignmentOperationExpr multiplyAsgmtOpExpr = + AssignmentOperationExpr.multiplyAssignmentWithExprs(hVarExpr, numValueExpr); + // code: h ^= Objects.hashCode(...); + boolean hasVariants = tokenHierarchies.size() > 1; + if (hasVariants) { + VariableExpr fixedValueVarExpr = FIXED_CLASS_VARS.get("fixedValue"); + asgmtBody.add(ExprStatement.withExpr(multiplyAsgmtOpExpr)); + asgmtBody.add( + ExprStatement.withExpr( + AssignmentOperationExpr.xorAssignmentWithExprs( + hVarExpr, createObjectsHashCodeForVarMethod(fixedValueVarExpr)))); + } + Set tokenSet = getTokenSet(tokenHierarchies); + tokenSet.stream() + .forEach( + token -> { + VariableExpr tokenVarExpr = + VariableExpr.withVariable( + Variable.builder() + .setName(JavaStyle.toLowerCamelCase(token)) + .setType(TypeNode.STRING) + .build()); + asgmtBody.add(ExprStatement.withExpr(multiplyAsgmtOpExpr)); + asgmtBody.add( + ExprStatement.withExpr( + AssignmentOperationExpr.xorAssignmentWithExprs( + hVarExpr, createObjectsHashCodeForVarMethod(tokenVarExpr)))); + }); + + return MethodDefinition.builder() + .setIsOverride(true) + .setScope(ScopeNode.PUBLIC) + .setReturnType(TypeNode.INT) + .setName("hashCode") + .setBody(asgmtBody) + .setReturnExpr(hVarExpr) + .build(); + } + + private static MethodInvocationExpr createObjectsHashCodeForVarMethod(VariableExpr varExpr) { + // code: Objects.hashCode(varExpr) + return MethodInvocationExpr.builder() + .setMethodName("hashCode") + .setStaticReferenceType(STATIC_TYPES.get("Objects")) + .setArguments(varExpr) + .setReturnType(TypeNode.INT) + .build(); + } + private static List createNestedBuilderClasses( ResourceName resourceName, List> tokenHierarchies, diff --git a/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden b/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden index 7676c60e08..dc6ec7ee84 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden +++ b/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden @@ -249,6 +249,22 @@ public class FoobarName implements ResourceName { return !Objects.isNull(fixedValue) ? fixedValue : pathTemplate.instantiate(getFieldValuesMap()); } + @Override + public int hashCode() { + int h = 1; + h *= 1000003; + h ^= Objects.hashCode(fixedValue); + h *= 1000003; + h ^= Objects.hashCode(project); + h *= 1000003; + h ^= Objects.hashCode(foobar); + h *= 1000003; + h ^= Objects.hashCode(variant); + h *= 1000003; + h ^= Objects.hashCode(barFoo); + return h; + } + /** Builder for projects/{project}/foobars/{foobar}. */ public static class Builder { private String project; diff --git a/src/test/java/com/google/api/generator/gapic/composer/goldens/SessionName.golden b/src/test/java/com/google/api/generator/gapic/composer/goldens/SessionName.golden index 4dbe76e88e..11636587bf 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/goldens/SessionName.golden +++ b/src/test/java/com/google/api/generator/gapic/composer/goldens/SessionName.golden @@ -101,6 +101,14 @@ public class SessionName implements ResourceName { return SESSION.instantiate("session", session); } + @Override + public int hashCode() { + int h = 1; + h *= 1000003; + h ^= Objects.hashCode(session); + return h; + } + /** Builder for sessions/{session}. */ public static class Builder { private String session; From dc5ae895b5222249ebe64fe8c937853f6b37d416 Mon Sep 17 00:00:00 2001 From: summerji Date: Tue, 6 Oct 2020 10:30:22 -0700 Subject: [PATCH 06/18] remove unused arg --- .../gapic/composer/ResourceNameHelperClassComposer.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java index 46a399a498..28739e3ecf 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java @@ -271,7 +271,7 @@ private static List createClassMethods( createFieldValueGetterMethods(resourceName, patternTokenVarExprs, tokenHierarchies, types)); javaMethods.add( createToStringMethod(templateFinalVarExprs, patternTokenVarExprs, tokenHierarchies)); - javaMethods.add(createHashCodeMethod(templateFinalVarExprs, tokenHierarchies)); + javaMethods.add(createHashCodeMethod(tokenHierarchies)); return javaMethods; } @@ -1143,8 +1143,7 @@ private static MethodDefinition createToStringMethod( .build(); } - private static MethodDefinition createHashCodeMethod( - List templateFinalVarExprs, List> tokenHierarchies) { + private static MethodDefinition createHashCodeMethod(List> tokenHierarchies) { List asgmtBody = new ArrayList<>(); // code: int h = 1; Variable hVar = Variable.builder().setType(TypeNode.INT).setName("h").build(); @@ -1158,12 +1157,13 @@ private static MethodDefinition createHashCodeMethod( .build(); asgmtBody.add(ExprStatement.withExpr(hAssignmentExpr)); // code: h *= 1000003; + // code: h ^= Objects.hashCode(...); ValueExpr numValueExpr = ValueExpr.withValue( PrimitiveValue.builder().setType(TypeNode.INT).setValue("1000003").build()); AssignmentOperationExpr multiplyAsgmtOpExpr = AssignmentOperationExpr.multiplyAssignmentWithExprs(hVarExpr, numValueExpr); - // code: h ^= Objects.hashCode(...); + // If it has variants, add the multiply and xor assignment operation exprs for fixedValue. boolean hasVariants = tokenHierarchies.size() > 1; if (hasVariants) { VariableExpr fixedValueVarExpr = FIXED_CLASS_VARS.get("fixedValue"); @@ -1173,6 +1173,7 @@ private static MethodDefinition createHashCodeMethod( AssignmentOperationExpr.xorAssignmentWithExprs( hVarExpr, createObjectsHashCodeForVarMethod(fixedValueVarExpr)))); } + // Add the multiply and xor assignment operation exprs for tokens. Set tokenSet = getTokenSet(tokenHierarchies); tokenSet.stream() .forEach( From 05d9c9e7ddb41b3265dae05a11b34098f28572c1 Mon Sep 17 00:00:00 2001 From: Xiaozhen Liu Date: Fri, 2 Oct 2020 12:32:39 -0700 Subject: [PATCH 07/18] [ggj][infra][5/5] support goldens updates for composer tests (#348) * add golden folder * format * move all expected strings to golden files * format * update goldens * update ast integration test * keep service client test * constant helper * format * format * support update goldens for ast integration test * support update goldens for omposer tests * fix * update * remove unneeded dependencies * remove unneeded dependencies --- BUILD.bazel | 16 ++++++++++ rules_bazel/java/java_diff_test.bzl | 2 +- .../api/generator/gapic/composer/BUILD.bazel | 32 +++++++++++++++++++ .../BatchingDescriptorComposerTest.java | 7 ++++ .../gapic/composer/ComposerTest.java | 2 ++ ...rviceCallableFactoryClassComposerTest.java | 2 ++ .../GrpcServiceStubClassComposerTest.java | 2 ++ .../MockServiceClassComposerTest.java | 2 ++ .../MockServiceImplClassComposerTest.java | 2 ++ .../ResourceNameHelperClassComposerTest.java | 3 ++ .../ServiceSettingsClassComposerTest.java | 2 ++ .../ServiceStubClassComposerTest.java | 2 ++ .../ServiceStubSettingsClassComposerTest.java | 5 +++ ...ngDescriptorComposerTestSubresponse.golden | 2 +- 14 files changed, 79 insertions(+), 2 deletions(-) diff --git a/BUILD.bazel b/BUILD.bazel index 37fd12d8b5..7edfa6b8ac 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -53,11 +53,15 @@ java_binary( srcs = [ "//src/test/java/com/google/api/generator/gapic/dummy:dummy_files", "//src/test/java/com/google/api/generator/engine:engine_files", + "//src/test/java/com/google/api/generator/gapic/composer:composer_files", "//src/test/java/com/google/api/generator/test/framework:framework_files", ], data = [ "//src/test/java/com/google/api/generator/gapic/dummy/goldens:goldens_files", "//src/test/java/com/google/api/generator/engine/goldens:goldens_files", + "//src/test/java/com/google/api/generator/gapic/composer/goldens:goldens_files", + "//src/test/java/com/google/api/generator/gapic/testdata:gapic_config_files", + "//src/test/java/com/google/api/generator/gapic/testdata:service_config_files", ], jvm_flags = ["-Xmx512m"], main_class = "com.google.api.generator.test.framework.SingleJUnitTestRunner", @@ -67,7 +71,19 @@ java_binary( "//src/main/java/com/google/api/generator/engine/writer", "//src/test/java/com/google/api/generator/test/framework", "//src/main/java/com/google/api/generator/engine/lexicon", + "//src/main/java/com/google/api/generator/gapic/composer", + "//src/main/java/com/google/api/generator/gapic/model", + "//src/main/java/com/google/api/generator/gapic/protoparser", + "//src/test/java/com/google/api/generator/gapic/testdata:showcase_java_proto", + "//src/test/java/com/google/api/generator/gapic/testdata:testgapic_java_proto", + "//src/test/java/com/google/api/generator/gapic/composer:common_resources_java_proto", "@com_google_guava_guava//:com_google_guava_guava", + "@com_google_api_gax_java//gax", + "@com_google_googleapis//google/logging/v2:logging_java_proto", + "@com_google_googleapis//google/pubsub/v1:pubsub_java_proto", + "@com_google_googleapis//google/rpc:rpc_java_proto", + "@com_google_protobuf//:protobuf_java", + "//:service_config_java_proto", "@com_google_truth_truth//jar", "@io_github_java_diff_utils//jar", "@junit_junit//jar", diff --git a/rules_bazel/java/java_diff_test.bzl b/rules_bazel/java/java_diff_test.bzl index 08ce5ebf5f..41ba278117 100644 --- a/rules_bazel/java/java_diff_test.bzl +++ b/rules_bazel/java/java_diff_test.bzl @@ -39,7 +39,7 @@ junit_output_zip = rule( ), }, outputs = { - "output": "%{name}%.zip", + "output": "%{name}.zip", }, implementation = _junit_output_impl, ) diff --git a/src/test/java/com/google/api/generator/gapic/composer/BUILD.bazel b/src/test/java/com/google/api/generator/gapic/composer/BUILD.bazel index 1e86c323b6..6e02d520d4 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/BUILD.bazel +++ b/src/test/java/com/google/api/generator/gapic/composer/BUILD.bazel @@ -1,3 +1,5 @@ +load("//:rules_bazel/java/java_diff_test.bzl", "golden_update") + package(default_visibility = ["//visibility:public"]) TESTS = [ @@ -18,6 +20,19 @@ TESTS = [ "ServiceStubClassComposerTest", ] +UPDATE_GOLDENS_TESTS = [ + "BatchingDescriptorComposerTest", + "ComposerTest", + "GrpcServiceCallableFactoryClassComposerTest", + "GrpcServiceStubClassComposerTest", + "MockServiceClassComposerTest", + "MockServiceImplClassComposerTest", + "ResourceNameHelperClassComposerTest", + "ServiceSettingsClassComposerTest", + "ServiceStubSettingsClassComposerTest", + "ServiceStubClassComposerTest", +] + filegroup( name = "composer_files", srcs = glob(["*.java"]), @@ -69,3 +84,20 @@ java_proto_library( "@junit_junit//jar", ], ) for test_name in TESTS] + + + +TEST_CLASS_DIR = "com.google.api.generator.gapic.composer." +# Run `bazel run src/test/java/com/google/api/generator/gapic/composer:testTargetName_update` +# to update goldens as expected generated code. +# `ServiceClient*` tests are not supported now since they are still in active development. + +[golden_update( + name = test_name + "_update", + srcs = [ + ":composer_files", + "//src/test/java/com/google/api/generator/gapic/testdata:gapic_config_files", + "//src/test/java/com/google/api/generator/gapic/testdata:service_config_files", + ], + test_class_name = TEST_CLASS_DIR + test_name, +) for test_name in UPDATE_GOLDENS_TESTS] diff --git a/src/test/java/com/google/api/generator/gapic/composer/BatchingDescriptorComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/BatchingDescriptorComposerTest.java index a556b191f0..8802489354 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/BatchingDescriptorComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/BatchingDescriptorComposerTest.java @@ -29,6 +29,7 @@ import com.google.api.generator.gapic.protoparser.Parser; import com.google.api.generator.gapic.protoparser.ServiceConfigParser; import com.google.api.generator.test.framework.Assert; +import com.google.api.generator.test.framework.Utils; import com.google.logging.v2.LogEntryProto; import com.google.logging.v2.LoggingConfigProto; import com.google.logging.v2.LoggingMetricsProto; @@ -99,6 +100,8 @@ public void batchingDescriptor_hasSubresponseField() { method, batchingSetting, messageTypes); batchingDescriptorExpr.accept(writerVisitor); + Utils.saveCodegenToFile( + this.getClass(), "BatchingDescriptorComposerTestSubresponse.golden", writerVisitor.write()); Path goldenFilePath = Paths.get( ComposerConstants.GOLDENFILES_DIRECTORY, @@ -155,6 +158,10 @@ public void batchingDescriptor_noSubresponseField() { method, batchingSetting, messageTypes); batchingDescriptorExpr.accept(writerVisitor); + Utils.saveCodegenToFile( + this.getClass(), + "BatchingDescriptorComposerTestNoSubresponse.golden", + writerVisitor.write()); Path goldenFilePath = Paths.get( ComposerConstants.GOLDENFILES_DIRECTORY, diff --git a/src/test/java/com/google/api/generator/gapic/composer/ComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ComposerTest.java index 3f2980bede..95270eecef 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/ComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/ComposerTest.java @@ -20,6 +20,7 @@ import com.google.api.generator.gapic.model.GapicClass; import com.google.api.generator.gapic.model.GapicClass.Kind; import com.google.api.generator.test.framework.Assert; +import com.google.api.generator.test.framework.Utils; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Arrays; @@ -39,6 +40,7 @@ public void gapicClass_addApacheLicense() { Composer.addApacheLicense(Arrays.asList(GapicClass.create(Kind.TEST, classDef))); JavaWriterVisitor visitor = new JavaWriterVisitor(); gapicClassWithHeaderList.get(0).classDefinition().accept(visitor); + Utils.saveCodegenToFile(this.getClass(), "ComposerTest.golden", visitor.write()); Path goldenFilePath = Paths.get(ComposerConstants.GOLDENFILES_DIRECTORY, "ComposerTest.golden"); Assert.assertCodeEquals(goldenFilePath, visitor.write()); } diff --git a/src/test/java/com/google/api/generator/gapic/composer/GrpcServiceCallableFactoryClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/GrpcServiceCallableFactoryClassComposerTest.java index 32414a301b..4437b3a166 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/GrpcServiceCallableFactoryClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/GrpcServiceCallableFactoryClassComposerTest.java @@ -23,6 +23,7 @@ import com.google.api.generator.gapic.model.Service; import com.google.api.generator.gapic.protoparser.Parser; import com.google.api.generator.test.framework.Assert; +import com.google.api.generator.test.framework.Utils; import com.google.protobuf.Descriptors.FileDescriptor; import com.google.protobuf.Descriptors.ServiceDescriptor; import com.google.showcase.v1beta1.EchoOuterClass; @@ -60,6 +61,7 @@ public void generateServiceClasses() { JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); + Utils.saveCodegenToFile(this.getClass(), "GrpcEchoCallableFactory.golden", visitor.write()); Path goldenFilePath = Paths.get(ComposerConstants.GOLDENFILES_DIRECTORY, "GrpcEchoCallableFactory.golden"); Assert.assertCodeEquals(goldenFilePath, visitor.write()); diff --git a/src/test/java/com/google/api/generator/gapic/composer/GrpcServiceStubClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/GrpcServiceStubClassComposerTest.java index 53ea2c413e..e3f63dcaa8 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/GrpcServiceStubClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/GrpcServiceStubClassComposerTest.java @@ -23,6 +23,7 @@ import com.google.api.generator.gapic.model.Service; import com.google.api.generator.gapic.protoparser.Parser; import com.google.api.generator.test.framework.Assert; +import com.google.api.generator.test.framework.Utils; import com.google.protobuf.Descriptors.FileDescriptor; import com.google.protobuf.Descriptors.ServiceDescriptor; import com.google.showcase.v1beta1.EchoOuterClass; @@ -59,6 +60,7 @@ public void generateServiceClasses() { JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); + Utils.saveCodegenToFile(this.getClass(), "GrpcEchoStub.golden", visitor.write()); Path goldenFilePath = Paths.get(ComposerConstants.GOLDENFILES_DIRECTORY, "GrpcEchoStub.golden"); Assert.assertCodeEquals(goldenFilePath, visitor.write()); } diff --git a/src/test/java/com/google/api/generator/gapic/composer/MockServiceClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/MockServiceClassComposerTest.java index 5303ab557a..aa4e19b271 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/MockServiceClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/MockServiceClassComposerTest.java @@ -23,6 +23,7 @@ import com.google.api.generator.gapic.model.Service; import com.google.api.generator.gapic.protoparser.Parser; import com.google.api.generator.test.framework.Assert; +import com.google.api.generator.test.framework.Utils; import com.google.protobuf.Descriptors.FileDescriptor; import com.google.protobuf.Descriptors.ServiceDescriptor; import com.google.showcase.v1beta1.EchoOuterClass; @@ -59,6 +60,7 @@ public void generateServiceClasses() { JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); + Utils.saveCodegenToFile(this.getClass(), "MockEcho.golden", visitor.write()); Path goldenFilePath = Paths.get(ComposerConstants.GOLDENFILES_DIRECTORY, "MockEcho.golden"); Assert.assertCodeEquals(goldenFilePath, visitor.write()); } 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 cd2fb25b2e..6e0295adb2 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 @@ -23,6 +23,7 @@ import com.google.api.generator.gapic.model.Service; import com.google.api.generator.gapic.protoparser.Parser; import com.google.api.generator.test.framework.Assert; +import com.google.api.generator.test.framework.Utils; import com.google.protobuf.Descriptors.FileDescriptor; import com.google.protobuf.Descriptors.ServiceDescriptor; import com.google.showcase.v1beta1.EchoOuterClass; @@ -60,6 +61,7 @@ public void generateServiceClasses() { JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); + Utils.saveCodegenToFile(this.getClass(), "MockEchoImpl.golden", visitor.write()); Path goldenFilePath = Paths.get(ComposerConstants.GOLDENFILES_DIRECTORY, "MockEchoImpl.golden"); Assert.assertCodeEquals(goldenFilePath, visitor.write()); } diff --git a/src/test/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposerTest.java index 1a8b3b954d..39b76b2d85 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposerTest.java @@ -24,6 +24,7 @@ import com.google.api.generator.gapic.model.Service; import com.google.api.generator.gapic.protoparser.Parser; import com.google.api.generator.test.framework.Assert; +import com.google.api.generator.test.framework.Utils; import com.google.protobuf.Descriptors.FileDescriptor; import com.google.protobuf.Descriptors.ServiceDescriptor; import com.google.showcase.v1beta1.EchoOuterClass; @@ -97,6 +98,7 @@ public void generateResourceNameClass_echoFoobarMultiplePatterns() { JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); + Utils.saveCodegenToFile(this.getClass(), "FoobarName.golden", visitor.write()); Path goldenFilePath = Paths.get(ComposerConstants.GOLDENFILES_DIRECTORY, "FoobarName.golden"); Assert.assertCodeEquals(goldenFilePath, visitor.write()); } @@ -122,6 +124,7 @@ public void generateResourceNameClass_testingSessionOnePattern() { JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); + Utils.saveCodegenToFile(this.getClass(), "SessionName.golden", visitor.write()); Path goldenFilePath = Paths.get(ComposerConstants.GOLDENFILES_DIRECTORY, "SessionName.golden"); Assert.assertCodeEquals(goldenFilePath, visitor.write()); } diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceSettingsClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceSettingsClassComposerTest.java index 0ba1c09956..17aa47ed38 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/ServiceSettingsClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceSettingsClassComposerTest.java @@ -23,6 +23,7 @@ import com.google.api.generator.gapic.model.Service; import com.google.api.generator.gapic.protoparser.Parser; import com.google.api.generator.test.framework.Assert; +import com.google.api.generator.test.framework.Utils; import com.google.protobuf.Descriptors.FileDescriptor; import com.google.protobuf.Descriptors.ServiceDescriptor; import com.google.showcase.v1beta1.EchoOuterClass; @@ -60,6 +61,7 @@ public void generateServiceClasses() { JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); + Utils.saveCodegenToFile(this.getClass(), "EchoSettings.golden", visitor.write()); Path goldenFilePath = Paths.get(ComposerConstants.GOLDENFILES_DIRECTORY, "EchoSettings.golden"); Assert.assertCodeEquals(goldenFilePath, visitor.write()); } diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceStubClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceStubClassComposerTest.java index e282bec281..87417b7c6e 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/ServiceStubClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceStubClassComposerTest.java @@ -23,6 +23,7 @@ import com.google.api.generator.gapic.model.Service; import com.google.api.generator.gapic.protoparser.Parser; import com.google.api.generator.test.framework.Assert; +import com.google.api.generator.test.framework.Utils; import com.google.protobuf.Descriptors.FileDescriptor; import com.google.protobuf.Descriptors.ServiceDescriptor; import com.google.showcase.v1beta1.EchoOuterClass; @@ -59,6 +60,7 @@ public void generateServiceClasses() { JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); + Utils.saveCodegenToFile(this.getClass(), "EchoStub.golden", visitor.write()); Path goldenFilePath = Paths.get(ComposerConstants.GOLDENFILES_DIRECTORY, "EchoStub.golden"); Assert.assertCodeEquals(goldenFilePath, visitor.write()); } diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceStubSettingsClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceStubSettingsClassComposerTest.java index da0308a349..21048a3189 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/ServiceStubSettingsClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceStubSettingsClassComposerTest.java @@ -28,6 +28,7 @@ import com.google.api.generator.gapic.protoparser.Parser; import com.google.api.generator.gapic.protoparser.ServiceConfigParser; import com.google.api.generator.test.framework.Assert; +import com.google.api.generator.test.framework.Utils; import com.google.logging.v2.LogEntryProto; import com.google.logging.v2.LoggingConfigProto; import com.google.logging.v2.LoggingMetricsProto; @@ -93,6 +94,8 @@ public void generateServiceStubSettingsClasses_batchingWithEmptyResponses() thro JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); + Utils.saveCodegenToFile( + this.getClass(), "LoggingServiceV2StubSettings.golden", visitor.write()); Path goldenFilePath = Paths.get(ComposerConstants.GOLDENFILES_DIRECTORY, "LoggingServiceV2StubSettings.golden"); Assert.assertCodeEquals(goldenFilePath, visitor.write()); @@ -135,6 +138,7 @@ public void generateServiceStubSettingsClasses_batchingWithNonemptyResponses() JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); + Utils.saveCodegenToFile(this.getClass(), "PublisherStubSettings.golden", visitor.write()); Path goldenFilePath = Paths.get(ComposerConstants.GOLDENFILES_DIRECTORY, "PublisherStubSettings.golden"); Assert.assertCodeEquals(goldenFilePath, visitor.write()); @@ -165,6 +169,7 @@ public void generateServiceStubSettingsClasses_basic() throws IOException { JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); + Utils.saveCodegenToFile(this.getClass(), "EchoStubSettings.golden", visitor.write()); Path goldenFilePath = Paths.get(ComposerConstants.GOLDENFILES_DIRECTORY, "EchoStubSettings.golden"); Assert.assertCodeEquals(goldenFilePath, visitor.write()); diff --git a/src/test/java/com/google/api/generator/gapic/composer/goldens/BatchingDescriptorComposerTestSubresponse.golden b/src/test/java/com/google/api/generator/gapic/composer/goldens/BatchingDescriptorComposerTestSubresponse.golden index 1ebfca8696..a322c69aec 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/goldens/BatchingDescriptorComposerTestSubresponse.golden +++ b/src/test/java/com/google/api/generator/gapic/composer/goldens/BatchingDescriptorComposerTestSubresponse.golden @@ -56,4 +56,4 @@ public long countBytes(PublishRequest request) { return request.getSerializedSize(); } -} +} \ No newline at end of file From 95cd0f513de376396c7e47bc363f876794ba3ac6 Mon Sep 17 00:00:00 2001 From: Mira Leung Date: Mon, 5 Oct 2020 16:29:00 -0700 Subject: [PATCH 08/18] [ggj][engx] fix: use a VM for CircleCI builds (#367) * fix: use a VM for CircleCI builds * Update config.yml * fix: set python version --- .circleci/config.yml | 39 ++++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index cfee57f5a4..5a5afd7c9d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,21 +3,46 @@ version: 2.1 # ======================= JOBS ======================= jobs: gapic-generator-java-tests: - docker: - - image: l.gcr.io/google/bazel - working_directory: /home/circleci/project/gapic-generator-java + working_directory: /tmp/ + environment: + TEST_REPORTS_DIR: /tmp/workspace/bazel/reports/gapic-generator-java + BAZEL_VERSION: 3.5.1 + PYTHON_VERSION: 3.5.2 + machine: true steps: - - checkout + - checkout: + path: gapic-generator-java + - attach_workspace: + at: workspace + - run: + name: Set Python version + command: | + pyenv global ${PYTHON_VERSION} + - run: + name: Install Bazel + command: | + wget https://github.com/bazelbuild/bazel/releases/download/${BAZEL_VERSION}/bazel-${BAZEL_VERSION}-installer-linux-x86_64.sh -O bazel_installer.sh + chmod +x bazel_installer.sh + ./bazel_installer.sh --user + - run: + name: Make reports directory + command: | + mkdir -p ${TEST_REPORTS_DIR} - run: - name: Build targets + name: Build targets for gapic-generator-java command: | + cd /tmp/gapic-generator-java bazel --batch build //... - run: - name: Test targets + name: Run unit tests for gapic-generator-java command: | + cd /tmp/gapic-generator-java bazel --batch test //... --noshow_progress + find . -type f -regex ".*/bazel-testlogs/.*xml" -exec cp {} ${TEST_REPORTS_DIR} \; - store_test_results: - path: ~/.cache/bazel + path: bazel/reports/gapic-generator-java + - store_artifacts: + path: bazel/reports/gapic-generator-java google-java-format: docker: - image: l.gcr.io/google/bazel From 8ba5c8ef80d7f3a3e066b5a588f110323ac133c4 Mon Sep 17 00:00:00 2001 From: Mira Leung Date: Mon, 5 Oct 2020 17:14:58 -0700 Subject: [PATCH 09/18] fix: use imperative bazel rule names (#361) --- BUILD.bazel | 4 ++-- rules_bazel/java/java_diff_test.bzl | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/BUILD.bazel b/BUILD.bazel index 7edfa6b8ac..245547c69f 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -49,7 +49,7 @@ java_binary( # JUnit runner binary, this is used to generate test output for updating goldens files. # Run `bazel run testTarget_update` will trigger this runner. java_binary( - name = "junit_runner", + name = "golden_update_junit_runner", srcs = [ "//src/test/java/com/google/api/generator/gapic/dummy:dummy_files", "//src/test/java/com/google/api/generator/engine:engine_files", @@ -62,7 +62,7 @@ java_binary( "//src/test/java/com/google/api/generator/gapic/composer/goldens:goldens_files", "//src/test/java/com/google/api/generator/gapic/testdata:gapic_config_files", "//src/test/java/com/google/api/generator/gapic/testdata:service_config_files", - ], + ], jvm_flags = ["-Xmx512m"], main_class = "com.google.api.generator.test.framework.SingleJUnitTestRunner", visibility = ["//visibility:public"], diff --git a/rules_bazel/java/java_diff_test.bzl b/rules_bazel/java/java_diff_test.bzl index 41ba278117..d6290590ce 100644 --- a/rules_bazel/java/java_diff_test.bzl +++ b/rules_bazel/java/java_diff_test.bzl @@ -44,7 +44,7 @@ junit_output_zip = rule( implementation = _junit_output_impl, ) -def _overwritten_golden_impl(ctx): +def _overwrite_golden_impl(ctx): script_content = """ #!/bin/bash cd ${{BUILD_WORKSPACE_DIRECTORY}} @@ -60,7 +60,7 @@ def _overwritten_golden_impl(ctx): return [DefaultInfo(executable = ctx.outputs.bin)] -overwritten_golden = rule( +overwrite_golden = rule( attrs = { "unit_test_results": attr.label( mandatory = True, @@ -70,7 +70,7 @@ overwritten_golden = rule( "bin": "%{name}.sh", }, executable = True, - implementation = _overwritten_golden_impl, + implementation = _overwrite_golden_impl, ) def golden_update(name, test_class_name, srcs): @@ -78,10 +78,10 @@ def golden_update(name, test_class_name, srcs): junit_output_zip( name = junit_output_name, test_class_name = test_class_name, - test_runner = "//:junit_runner", + test_runner = "//:golden_update_junit_runner", srcs = srcs, ) - overwritten_golden( + overwrite_golden( name = name, unit_test_results = ":%s" % junit_output_name ) From 4eaef978f7f68a299d20a1cf31d235858b36c00d Mon Sep 17 00:00:00 2001 From: Mira Leung Date: Mon, 5 Oct 2020 18:04:52 -0700 Subject: [PATCH 10/18] [ggj][bazel][goldens] fix: refactor and fix bazel golden_update rules (#363) * fix: use imperative bazel rule names * fix: refactor and fix bazel golden_update rules --- BUILD.bazel | 44 --------- rules_bazel/java/java_diff_test.bzl | 97 +++++++++---------- .../google/api/generator/engine/BUILD.bazel | 29 +++--- .../api/generator/gapic/composer/BUILD.bazel | 81 ++++++++-------- .../api/generator/gapic/dummy/BUILD.bazel | 33 ++++--- .../api/generator/test/framework/BUILD.bazel | 22 ++++- 6 files changed, 138 insertions(+), 168 deletions(-) diff --git a/BUILD.bazel b/BUILD.bazel index 245547c69f..a767045a39 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -46,50 +46,6 @@ java_binary( ], ) -# JUnit runner binary, this is used to generate test output for updating goldens files. -# Run `bazel run testTarget_update` will trigger this runner. -java_binary( - name = "golden_update_junit_runner", - srcs = [ - "//src/test/java/com/google/api/generator/gapic/dummy:dummy_files", - "//src/test/java/com/google/api/generator/engine:engine_files", - "//src/test/java/com/google/api/generator/gapic/composer:composer_files", - "//src/test/java/com/google/api/generator/test/framework:framework_files", - ], - data = [ - "//src/test/java/com/google/api/generator/gapic/dummy/goldens:goldens_files", - "//src/test/java/com/google/api/generator/engine/goldens:goldens_files", - "//src/test/java/com/google/api/generator/gapic/composer/goldens:goldens_files", - "//src/test/java/com/google/api/generator/gapic/testdata:gapic_config_files", - "//src/test/java/com/google/api/generator/gapic/testdata:service_config_files", - ], - jvm_flags = ["-Xmx512m"], - main_class = "com.google.api.generator.test.framework.SingleJUnitTestRunner", - visibility = ["//visibility:public"], - deps = [ - "//src/main/java/com/google/api/generator/engine/ast", - "//src/main/java/com/google/api/generator/engine/writer", - "//src/test/java/com/google/api/generator/test/framework", - "//src/main/java/com/google/api/generator/engine/lexicon", - "//src/main/java/com/google/api/generator/gapic/composer", - "//src/main/java/com/google/api/generator/gapic/model", - "//src/main/java/com/google/api/generator/gapic/protoparser", - "//src/test/java/com/google/api/generator/gapic/testdata:showcase_java_proto", - "//src/test/java/com/google/api/generator/gapic/testdata:testgapic_java_proto", - "//src/test/java/com/google/api/generator/gapic/composer:common_resources_java_proto", - "@com_google_guava_guava//:com_google_guava_guava", - "@com_google_api_gax_java//gax", - "@com_google_googleapis//google/logging/v2:logging_java_proto", - "@com_google_googleapis//google/pubsub/v1:pubsub_java_proto", - "@com_google_googleapis//google/rpc:rpc_java_proto", - "@com_google_protobuf//:protobuf_java", - "//:service_config_java_proto", - "@com_google_truth_truth//jar", - "@io_github_java_diff_utils//jar", - "@junit_junit//jar", - "@org_hamcrest_hamcrest_core//jar", - ], -) # google-java-format java_binary( diff --git a/rules_bazel/java/java_diff_test.bzl b/rules_bazel/java/java_diff_test.bzl index d6290590ce..626c33b251 100644 --- a/rules_bazel/java/java_diff_test.bzl +++ b/rules_bazel/java/java_diff_test.bzl @@ -1,87 +1,84 @@ -def _junit_output_impl(ctx): - test_class_name = ctx.attr.test_class_name +def _overwrite_golden_impl(ctx): + test_class = ctx.attr.test_class inputs = ctx.files.srcs - output = ctx.outputs.output + goldens_output_zip = ctx.outputs.goldens_output_zip test_runner = ctx.executable.test_runner - command = """ - mkdir local_tmp - TEST_OUTPUT_HOME="$(pwd)/local_tmp" \ - {test_runner_path} $@ - cd local_tmp + # Generate the goldens from tests. + generate_goldens_script = """ + mkdir local_tmp + TEST_OUTPUT_HOME="$(pwd)/local_tmp" {test_runner_path} $@ + cd local_tmp # Zip all files under local_tmp with all nested parent folders except for local_tmp itself. # Zip files because there are cases that one Junit test can produce multiple goldens. - zip -r ../{output} . + zip -r ../{goldens_output_zip} . """.format( test_runner_path = test_runner.path, - output=output.path, + goldens_output_zip = goldens_output_zip.path, ) ctx.actions.run_shell( inputs = inputs, - outputs = [output], - arguments = [test_class_name], + outputs = [goldens_output_zip], + arguments = [test_class], tools = [test_runner], - command = command, + command = generate_goldens_script, ) -junit_output_zip = rule( - attrs = { - "test_class_name": attr.string(mandatory=True), - "srcs": attr.label_list( - allow_files = True, - mandatory = True, - ), - "test_runner": attr.label( - mandatory = True, - executable = True, - cfg = "host", - ), - }, - outputs = { - "output": "%{name}.zip", - }, - implementation = _junit_output_impl, -) - -def _overwrite_golden_impl(ctx): - script_content = """ + # Overwrite the goldens. + golden_update_script_content = """ #!/bin/bash cd ${{BUILD_WORKSPACE_DIRECTORY}} - unzip -ao {unit_test_results} -d src/test/java + unzip -ao {goldens_output_zip} -d src/test/java """.format( - unit_test_results = ctx.file.unit_test_results.path, + goldens_output_zip = goldens_output_zip.path, ) ctx.actions.write( - output = ctx.outputs.bin, - content = script_content, + output = ctx.outputs.golden_update_script, + content = golden_update_script_content, is_executable = True, ) - return [DefaultInfo(executable = ctx.outputs.bin)] - + return [DefaultInfo(executable = ctx.outputs.golden_update_script)] overwrite_golden = rule( attrs = { - "unit_test_results": attr.label( + "test_class": attr.string(mandatory = True), + "srcs": attr.label_list( + allow_files = True, mandatory = True, - allow_single_file = True), + ), + "test_runner": attr.label( + mandatory = True, + executable = True, + cfg = "host", + ), }, outputs = { - "bin": "%{name}.sh", + "goldens_output_zip": "%{name}.zip", + "golden_update_script": "%{name}.sh", }, executable = True, implementation = _overwrite_golden_impl, ) -def golden_update(name, test_class_name, srcs): - junit_output_name = "%s_output" % name - junit_output_zip( - name = junit_output_name, - test_class_name = test_class_name, - test_runner = "//:golden_update_junit_runner", +def golden_update( + name, + srcs, + test_class, + data = [], + deps = []): + golden_junit_runner_name = "%s_junit_runner" % name + native.java_binary( + name = golden_junit_runner_name, srcs = srcs, + data = data, + main_class = "com.google.api.generator.test.framework.SingleJUnitTestRunner", + deps = ["//src/test/java/com/google/api/generator/test/framework:junit_runner"] + deps, ) + overwrite_golden( name = name, - unit_test_results = ":%s" % junit_output_name + test_class = test_class, + test_runner = ":%s" % golden_junit_runner_name, + srcs = srcs + data, ) diff --git a/src/test/java/com/google/api/generator/engine/BUILD.bazel b/src/test/java/com/google/api/generator/engine/BUILD.bazel index 1bcbd20f5f..f1b9c96ae0 100644 --- a/src/test/java/com/google/api/generator/engine/BUILD.bazel +++ b/src/test/java/com/google/api/generator/engine/BUILD.bazel @@ -15,27 +15,30 @@ TESTS = [ "JavaCodeGeneratorTest", ] +TEST_DEPS = [ + "//src/main/java/com/google/api/generator/engine/ast", + "//src/main/java/com/google/api/generator/engine/writer", + "//src/test/java/com/google/api/generator/test/framework:asserts", + "//src/test/java/com/google/api/generator/test/framework:utils", + "@junit_junit//jar", +] + [java_test( name = test_name, srcs = ["{0}.java".format(test_name)], data = ["//src/test/java/com/google/api/generator/engine/goldens:goldens_files"], test_class = "com.google.api.generator.engine.{0}".format(test_name), - deps = [ - "//src/main/java/com/google/api/generator/engine/ast", - "//src/main/java/com/google/api/generator/engine/writer", - "//src/test/java/com/google/api/generator/test/framework", - "@junit_junit//jar", - ], + deps = TEST_DEPS, ) for test_name in TESTS] TEST_CLASS_NAME = "com.google.api.generator.engine.JavaCodeGeneratorTest" # Run `bazel run src/test/java/com/google/api/generator/engine:JavaCodeGeneratorTest_update` # to update goldens as expected generated code. -golden_update( - name = "JavaCodeGeneratorTest_update", - srcs = [ - ":engine_files", - ], - test_class_name = TEST_CLASS_NAME, -) +[golden_update( + name = "{0}_update".format(test_name), + srcs = ["{0}.java".format(test_name)], + data = ["//src/test/java/com/google/api/generator/engine/goldens:goldens_files"], + test_class = "com.google.api.generator.engine.{0}".format(test_name), + deps = TEST_DEPS, +) for test_name in TESTS] diff --git a/src/test/java/com/google/api/generator/gapic/composer/BUILD.bazel b/src/test/java/com/google/api/generator/gapic/composer/BUILD.bazel index 6e02d520d4..9211d8b5a1 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/BUILD.bazel +++ b/src/test/java/com/google/api/generator/gapic/composer/BUILD.bazel @@ -2,35 +2,47 @@ load("//:rules_bazel/java/java_diff_test.bzl", "golden_update") package(default_visibility = ["//visibility:public"]) -TESTS = [ +UPDATE_GOLDENS_TESTS = [ "BatchingDescriptorComposerTest", "ComposerTest", - "DefaultValueComposerTest", "GrpcServiceCallableFactoryClassComposerTest", "GrpcServiceStubClassComposerTest", "MockServiceClassComposerTest", "MockServiceImplClassComposerTest", "ResourceNameHelperClassComposerTest", + "ServiceSettingsClassComposerTest", + "ServiceStubSettingsClassComposerTest", + "ServiceStubClassComposerTest", +] + +TESTS = UPDATE_GOLDENS_TESTS + [ + "DefaultValueComposerTest", "ResourceNameTokenizerTest", "RetrySettingsComposerTest", "ServiceClientClassComposerTest", "ServiceClientTestClassComposerTest", - "ServiceSettingsClassComposerTest", - "ServiceStubSettingsClassComposerTest", - "ServiceStubClassComposerTest", ] -UPDATE_GOLDENS_TESTS = [ - "BatchingDescriptorComposerTest", - "ComposerTest", - "GrpcServiceCallableFactoryClassComposerTest", - "GrpcServiceStubClassComposerTest", - "MockServiceClassComposerTest", - "MockServiceImplClassComposerTest", - "ResourceNameHelperClassComposerTest", - "ServiceSettingsClassComposerTest", - "ServiceStubSettingsClassComposerTest", - "ServiceStubClassComposerTest", +TEST_DEPS = [ + ":common_resources_java_proto", + "//:service_config_java_proto", + "//src/main/java/com/google/api/generator/engine/ast", + "//src/main/java/com/google/api/generator/engine/writer", + "//src/main/java/com/google/api/generator/gapic/composer", + "//src/test/java/com/google/api/generator/test/framework:asserts", + "//src/test/java/com/google/api/generator/test/framework:utils", + "//src/main/java/com/google/api/generator/gapic/model", + "//src/main/java/com/google/api/generator/gapic/protoparser", + "//src/test/java/com/google/api/generator/gapic/testdata:showcase_java_proto", + "//src/test/java/com/google/api/generator/gapic/testdata:testgapic_java_proto", + "@com_google_api_gax_java//gax", + "@com_google_googleapis//google/logging/v2:logging_java_proto", + "@com_google_googleapis//google/pubsub/v1:pubsub_java_proto", + "@com_google_googleapis//google/rpc:rpc_java_proto", + "@com_google_guava_guava", + "@com_google_protobuf//:protobuf_java", + "@com_google_truth_truth//jar", + "@junit_junit//jar", ] filegroup( @@ -55,7 +67,7 @@ java_proto_library( [java_test( name = test_name, srcs = [ - "{0}.java".format(test_name), + "{0}.java".format(test_name), "ComposerConstants.java", ], data = [ @@ -64,40 +76,25 @@ java_proto_library( "//src/test/java/com/google/api/generator/gapic/testdata:service_config_files", ], test_class = "com.google.api.generator.gapic.composer.{0}".format(test_name), - deps = [ - ":common_resources_java_proto", - "//:service_config_java_proto", - "//src/main/java/com/google/api/generator/engine/ast", - "//src/main/java/com/google/api/generator/engine/writer", - "//src/main/java/com/google/api/generator/gapic/composer", - "//src/test/java/com/google/api/generator/test/framework", - "//src/main/java/com/google/api/generator/gapic/model", - "//src/main/java/com/google/api/generator/gapic/protoparser", - "//src/test/java/com/google/api/generator/gapic/testdata:showcase_java_proto", - "//src/test/java/com/google/api/generator/gapic/testdata:testgapic_java_proto", - "@com_google_api_gax_java//gax", - "@com_google_googleapis//google/logging/v2:logging_java_proto", - "@com_google_googleapis//google/pubsub/v1:pubsub_java_proto", - "@com_google_googleapis//google/rpc:rpc_java_proto", - "@com_google_protobuf//:protobuf_java", - "@com_google_truth_truth//jar", - "@junit_junit//jar", - ], + deps = TEST_DEPS, ) for test_name in TESTS] - - TEST_CLASS_DIR = "com.google.api.generator.gapic.composer." # Run `bazel run src/test/java/com/google/api/generator/gapic/composer:testTargetName_update` # to update goldens as expected generated code. # `ServiceClient*` tests are not supported now since they are still in active development. [golden_update( - name = test_name + "_update", + name = "{0}_update".format(test_name), srcs = [ - ":composer_files", + "{0}.java".format(test_name), + "ComposerConstants.java", + ], + data = [ + "//src/test/java/com/google/api/generator/gapic/composer/goldens:goldens_files", "//src/test/java/com/google/api/generator/gapic/testdata:gapic_config_files", "//src/test/java/com/google/api/generator/gapic/testdata:service_config_files", ], - test_class_name = TEST_CLASS_DIR + test_name, -) for test_name in UPDATE_GOLDENS_TESTS] + test_class = "com.google.api.generator.gapic.composer.{0}".format(test_name), + deps = TEST_DEPS, +) for test_name in UPDATE_GOLDENS_TESTS] diff --git a/src/test/java/com/google/api/generator/gapic/dummy/BUILD.bazel b/src/test/java/com/google/api/generator/gapic/dummy/BUILD.bazel index 3caa66fb99..0a4ae41759 100644 --- a/src/test/java/com/google/api/generator/gapic/dummy/BUILD.bazel +++ b/src/test/java/com/google/api/generator/gapic/dummy/BUILD.bazel @@ -6,6 +6,14 @@ TESTS = [ "FileDiffInfraDummyTest", ] +TEST_DEPS = [ + "//src/main/java/com/google/api/generator/engine/ast", + "//src/main/java/com/google/api/generator/engine/writer", + "//src/test/java/com/google/api/generator/test/framework:asserts", + "//src/test/java/com/google/api/generator/test/framework:utils", + "@junit_junit//jar", +] + filegroup( name = "dummy_files", srcs = ["{0}.java".format(f) for f in TESTS], @@ -14,26 +22,19 @@ filegroup( [java_test( name = test_name, srcs = ["{0}.java".format(test_name)], - data = glob(["goldens/*.golden"]), + data = ["//src/test/java/com/google/api/generator/gapic/dummy/goldens:goldens_files"], test_class = "com.google.api.generator.gapic.dummy.{0}".format(test_name), - deps = [ - "//src/main/java/com/google/api/generator/engine/ast", - "//src/main/java/com/google/api/generator/engine/writer", - "//src/test/java/com/google/api/generator/test/framework", - "@junit_junit//jar", - ], + deps = TEST_DEPS, ) for test_name in TESTS] TEST_CLASS_NAME = "com.google.api.generator.gapic.dummy.FileDiffInfraDummyTest" # Run `bazel run src/test/java/com/google/api/generator/gapic/dummy:FileDiffInfraDummyTest_update` # to update goldens as expected generated code. -golden_update( - name = "FileDiffInfraDummyTest_update", - srcs = [ - ":dummy_files", - "//src/test/java/com/google/api/generator/gapic/dummy/goldens:goldens_files", - "//src/test/java/com/google/api/generator/test/framework:framework_files", - ], - test_class_name = TEST_CLASS_NAME, -) +[golden_update( + name = "{0}_update".format(test_name), + srcs = ["{0}.java".format(test_name)], + data = ["//src/test/java/com/google/api/generator/gapic/dummy/goldens:goldens_files"], + test_class = "com.google.api.generator.gapic.dummy.{0}".format(test_name), + deps = TEST_DEPS, +) for test_name in TESTS] diff --git a/src/test/java/com/google/api/generator/test/framework/BUILD.bazel b/src/test/java/com/google/api/generator/test/framework/BUILD.bazel index 31b6d7d6f7..5d167df4bb 100644 --- a/src/test/java/com/google/api/generator/test/framework/BUILD.bazel +++ b/src/test/java/com/google/api/generator/test/framework/BUILD.bazel @@ -6,14 +6,30 @@ filegroup( ) java_library( - name = "framework", + name = "asserts", srcs = [ - ":framework_files", + "Assert.java", + "Differ.java", ], - data = ["//src/test/java/com/google/api/generator/gapic/dummy/goldens:goldens_files"], deps = [ "@io_github_java_diff_utils//jar", "@junit_junit//jar", "@org_hamcrest_hamcrest_core//jar", ], ) + +java_library( + name = "utils", + srcs = ["Utils.java"], +) + +java_library( + name = "junit_runner", + srcs = [ + "SingleJUnitTestRunner.java", + ], + deps = [ + ":utils", + "@junit_junit//jar", + ], +) From 4526eb44f19193729ea6caf85355ee67105556b9 Mon Sep 17 00:00:00 2001 From: summerji Date: Mon, 5 Oct 2020 22:35:25 -0700 Subject: [PATCH 11/18] feat: Add HashCode in resource name --- .../ResourceNameHelperClassComposer.java | 69 +++++++++++++++++++ .../gapic/composer/goldens/FoobarName.golden | 16 +++++ .../gapic/composer/goldens/SessionName.golden | 8 +++ 3 files changed, 93 insertions(+) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java index 2ae659617b..b0dfbc54d0 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java @@ -18,6 +18,7 @@ import com.google.api.generator.engine.ast.AnnotationNode; import com.google.api.generator.engine.ast.AssignmentExpr; import com.google.api.generator.engine.ast.CastExpr; +import com.google.api.generator.engine.ast.AssignmentOperationExpr; import com.google.api.generator.engine.ast.ClassDefinition; import com.google.api.generator.engine.ast.CommentStatement; import com.google.api.generator.engine.ast.ConcreteReference; @@ -274,6 +275,7 @@ private static List createClassMethods( javaMethods.add( createToStringMethod(templateFinalVarExprs, patternTokenVarExprs, tokenHierarchies)); javaMethods.add(createEqualsMethod(resourceName, tokenHierarchies, types)); + javaMethods.add(createHashCodeMethod(templateFinalVarExprs, tokenHierarchies)); return javaMethods; } @@ -1257,6 +1259,73 @@ private static MethodInvocationExpr createObjectsEqualsForTokenMethodEpxr( .build(); } + private static MethodDefinition createHashCodeMethod( + List templateFinalVarExprs, List> tokenHierarchies) { + List asgmtBody = new ArrayList<>(); + // code: int h = 1; + Variable hVar = Variable.builder().setType(TypeNode.INT).setName("h").build(); + VariableExpr hVarExpr = VariableExpr.builder().setVariable(hVar).build(); + ValueExpr hValueExpr = + ValueExpr.withValue(PrimitiveValue.builder().setType(TypeNode.INT).setValue("1").build()); + AssignmentExpr hAssignmentExpr = + AssignmentExpr.builder() + .setVariableExpr(hVarExpr.toBuilder().setIsDecl(true).build()) + .setValueExpr(hValueExpr) + .build(); + asgmtBody.add(ExprStatement.withExpr(hAssignmentExpr)); + // code: h *= 1000003; + ValueExpr numValueExpr = + ValueExpr.withValue( + PrimitiveValue.builder().setType(TypeNode.INT).setValue("1000003").build()); + AssignmentOperationExpr multiplyAsgmtOpExpr = + AssignmentOperationExpr.multiplyAssignmentWithExprs(hVarExpr, numValueExpr); + // code: h ^= Objects.hashCode(...); + boolean hasVariants = tokenHierarchies.size() > 1; + if (hasVariants) { + VariableExpr fixedValueVarExpr = FIXED_CLASS_VARS.get("fixedValue"); + asgmtBody.add(ExprStatement.withExpr(multiplyAsgmtOpExpr)); + asgmtBody.add( + ExprStatement.withExpr( + AssignmentOperationExpr.xorAssignmentWithExprs( + hVarExpr, createObjectsHashCodeForVarMethod(fixedValueVarExpr)))); + } + Set tokenSet = getTokenSet(tokenHierarchies); + tokenSet.stream() + .forEach( + token -> { + VariableExpr tokenVarExpr = + VariableExpr.withVariable( + Variable.builder() + .setName(JavaStyle.toLowerCamelCase(token)) + .setType(TypeNode.STRING) + .build()); + asgmtBody.add(ExprStatement.withExpr(multiplyAsgmtOpExpr)); + asgmtBody.add( + ExprStatement.withExpr( + AssignmentOperationExpr.xorAssignmentWithExprs( + hVarExpr, createObjectsHashCodeForVarMethod(tokenVarExpr)))); + }); + + return MethodDefinition.builder() + .setIsOverride(true) + .setScope(ScopeNode.PUBLIC) + .setReturnType(TypeNode.INT) + .setName("hashCode") + .setBody(asgmtBody) + .setReturnExpr(hVarExpr) + .build(); + } + + private static MethodInvocationExpr createObjectsHashCodeForVarMethod(VariableExpr varExpr) { + // code: Objects.hashCode(varExpr) + return MethodInvocationExpr.builder() + .setMethodName("hashCode") + .setStaticReferenceType(STATIC_TYPES.get("Objects")) + .setArguments(varExpr) + .setReturnType(TypeNode.INT) + .build(); + } + private static List createNestedBuilderClasses( ResourceName resourceName, List> tokenHierarchies, diff --git a/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden b/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden index ac8d8995d2..565f997703 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden +++ b/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden @@ -264,6 +264,22 @@ public class FoobarName implements ResourceName { return false; } + @Override + public int hashCode() { + int h = 1; + h *= 1000003; + h ^= Objects.hashCode(fixedValue); + h *= 1000003; + h ^= Objects.hashCode(project); + h *= 1000003; + h ^= Objects.hashCode(foobar); + h *= 1000003; + h ^= Objects.hashCode(variant); + h *= 1000003; + h ^= Objects.hashCode(barFoo); + return h; + } + /** Builder for projects/{project}/foobars/{foobar}. */ public static class Builder { private String project; diff --git a/src/test/java/com/google/api/generator/gapic/composer/goldens/SessionName.golden b/src/test/java/com/google/api/generator/gapic/composer/goldens/SessionName.golden index 58e15add60..b17c2718c1 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/goldens/SessionName.golden +++ b/src/test/java/com/google/api/generator/gapic/composer/goldens/SessionName.golden @@ -113,6 +113,14 @@ public class SessionName implements ResourceName { return false; } + @Override + public int hashCode() { + int h = 1; + h *= 1000003; + h ^= Objects.hashCode(session); + return h; + } + /** Builder for sessions/{session}. */ public static class Builder { private String session; From 79e98a61208b81abd3de784ac363d167de3ab181 Mon Sep 17 00:00:00 2001 From: summerji Date: Tue, 6 Oct 2020 10:30:22 -0700 Subject: [PATCH 12/18] remove unused arg --- .../gapic/composer/ResourceNameHelperClassComposer.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java index b0dfbc54d0..8d1f2582c4 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java @@ -275,7 +275,7 @@ private static List createClassMethods( javaMethods.add( createToStringMethod(templateFinalVarExprs, patternTokenVarExprs, tokenHierarchies)); javaMethods.add(createEqualsMethod(resourceName, tokenHierarchies, types)); - javaMethods.add(createHashCodeMethod(templateFinalVarExprs, tokenHierarchies)); + javaMethods.add(createHashCodeMethod(tokenHierarchies)); return javaMethods; } @@ -1259,8 +1259,7 @@ private static MethodInvocationExpr createObjectsEqualsForTokenMethodEpxr( .build(); } - private static MethodDefinition createHashCodeMethod( - List templateFinalVarExprs, List> tokenHierarchies) { + private static MethodDefinition createHashCodeMethod(List> tokenHierarchies) { List asgmtBody = new ArrayList<>(); // code: int h = 1; Variable hVar = Variable.builder().setType(TypeNode.INT).setName("h").build(); @@ -1274,12 +1273,13 @@ private static MethodDefinition createHashCodeMethod( .build(); asgmtBody.add(ExprStatement.withExpr(hAssignmentExpr)); // code: h *= 1000003; + // code: h ^= Objects.hashCode(...); ValueExpr numValueExpr = ValueExpr.withValue( PrimitiveValue.builder().setType(TypeNode.INT).setValue("1000003").build()); AssignmentOperationExpr multiplyAsgmtOpExpr = AssignmentOperationExpr.multiplyAssignmentWithExprs(hVarExpr, numValueExpr); - // code: h ^= Objects.hashCode(...); + // If it has variants, add the multiply and xor assignment operation exprs for fixedValue. boolean hasVariants = tokenHierarchies.size() > 1; if (hasVariants) { VariableExpr fixedValueVarExpr = FIXED_CLASS_VARS.get("fixedValue"); @@ -1289,6 +1289,7 @@ private static MethodDefinition createHashCodeMethod( AssignmentOperationExpr.xorAssignmentWithExprs( hVarExpr, createObjectsHashCodeForVarMethod(fixedValueVarExpr)))); } + // Add the multiply and xor assignment operation exprs for tokens. Set tokenSet = getTokenSet(tokenHierarchies); tokenSet.stream() .forEach( From 82bc8e67dea9d77cec27cc76bc82c9af9a192e83 Mon Sep 17 00:00:00 2001 From: Summer Ji Date: Mon, 5 Oct 2020 22:37:17 -0700 Subject: [PATCH 13/18] fix: add final keyword check on assignment expr (#366) --- .../generator/engine/ast/AssignmentExpr.java | 10 +++++++ .../engine/ast/AssignmentExprTest.java | 26 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/main/java/com/google/api/generator/engine/ast/AssignmentExpr.java b/src/main/java/com/google/api/generator/engine/ast/AssignmentExpr.java index 0e32d58c42..9223e41783 100644 --- a/src/main/java/com/google/api/generator/engine/ast/AssignmentExpr.java +++ b/src/main/java/com/google/api/generator/engine/ast/AssignmentExpr.java @@ -15,6 +15,7 @@ package com.google.api.generator.engine.ast; import com.google.auto.value.AutoValue; +import com.google.common.base.Preconditions; @AutoValue public abstract class AssignmentExpr implements Expr { @@ -67,6 +68,15 @@ public AssignmentExpr build() { lhsType.reference().name(), rhsType.reference().name())); } } + + if (!assignmentExpr.variableExpr().isDecl()) { + Preconditions.checkState( + !assignmentExpr.variableExpr().isFinal(), + String.format( + "Cannot assign a value to final variable '%s'.", + assignmentExpr.variableExpr().variable().name())); + } + return assignmentExpr; } } diff --git a/src/test/java/com/google/api/generator/engine/ast/AssignmentExprTest.java b/src/test/java/com/google/api/generator/engine/ast/AssignmentExprTest.java index 56f91f7fec..b40590f231 100644 --- a/src/test/java/com/google/api/generator/engine/ast/AssignmentExprTest.java +++ b/src/test/java/com/google/api/generator/engine/ast/AssignmentExprTest.java @@ -137,6 +137,32 @@ public void writeAssignmentExpr_invalidBoxedPrimitiveType() { assertInvalidAssignmentExpr(lVariableExpr, rVariableExpr); } + @Test + public void writeAssignmentExpr_validIsDeclFinalVariableExpr() { + Variable lVariable = Variable.builder().setName("x").setType(TypeNode.INT).build(); + VariableExpr lVariableExpr = + VariableExpr.builder().setVariable(lVariable).setIsDecl(true).setIsFinal(true).build(); + + ValueExpr valueExpr = + ValueExpr.withValue(PrimitiveValue.builder().setType(TypeNode.INT).setValue("0").build()); + assertValidAssignmentExpr(lVariableExpr, valueExpr); + } + + @Test + public void writeAssignmentExpr_invalidIsNotDeclFinalVariableExpr() { + Variable lVariable = Variable.builder().setName("x").setType(TypeNode.INT).build(); + VariableExpr lVariableExpr = + VariableExpr.builder().setVariable(lVariable).setIsDecl(false).setIsFinal(true).build(); + + ValueExpr valueExpr = + ValueExpr.withValue(PrimitiveValue.builder().setType(TypeNode.INT).setValue("0").build()); + assertThrows( + IllegalStateException.class, + () -> { + AssignmentExpr.builder().setVariableExpr(lVariableExpr).setValueExpr(valueExpr).build(); + }); + } + private static void assertInvalidAssignmentExpr(VariableExpr variableExpr, Expr valueExpr) { assertThrows( TypeMismatchException.class, From 218c7ff92364064927433d12b6a4018a79aa130a Mon Sep 17 00:00:00 2001 From: Summer Ji Date: Tue, 6 Oct 2020 10:10:50 -0700 Subject: [PATCH 14/18] fix: add final keyword checking in post increment operation expr (#365) --- .../engine/ast/UnaryOperationExpr.java | 12 +++++++++ .../engine/ast/UnaryOperationExprTest.java | 25 +++++++++++++------ 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/google/api/generator/engine/ast/UnaryOperationExpr.java b/src/main/java/com/google/api/generator/engine/ast/UnaryOperationExpr.java index f7d65af381..7c38beff02 100644 --- a/src/main/java/com/google/api/generator/engine/ast/UnaryOperationExpr.java +++ b/src/main/java/com/google/api/generator/engine/ast/UnaryOperationExpr.java @@ -72,6 +72,18 @@ private UnaryOperationExpr build() { UnaryOperationExpr unaryOperationExpr = autoBuild(); TypeNode exprType = unaryOperationExpr.expr().type(); OperatorKind operator = unaryOperationExpr.operatorKind(); + + // TODO: (summerji) Add Decl Check for variable. + // Add final keyword checking for post/prefix ++, -- when needed. + if (operator.equals(OperatorKind.UNARY_POST_INCREMENT) + && unaryOperationExpr.expr() instanceof VariableExpr) { + Preconditions.checkState( + !((VariableExpr) unaryOperationExpr.expr()).isFinal(), + String.format( + "Cannot assign a value to final variable '%s'.", + ((VariableExpr) unaryOperationExpr.expr()).variable().name())); + } + final String errorMsg = String.format( "Unary operator %s can not be applied to %s. ", operator, exprType.toString()); diff --git a/src/test/java/com/google/api/generator/engine/ast/UnaryOperationExprTest.java b/src/test/java/com/google/api/generator/engine/ast/UnaryOperationExprTest.java index c2321d1577..734156cf9c 100644 --- a/src/test/java/com/google/api/generator/engine/ast/UnaryOperationExprTest.java +++ b/src/test/java/com/google/api/generator/engine/ast/UnaryOperationExprTest.java @@ -21,7 +21,7 @@ public class UnaryOperationExprTest { /** =============================== Logic Not Operation Expr =============================== */ @Test - public void logicalNotOperationExpr_validBasic() { + public void validLogicalNotOperationExpr_basic() { VariableExpr variableExpr = VariableExpr.withVariable( Variable.builder().setName("x").setType(TypeNode.BOOLEAN).build()); @@ -30,7 +30,7 @@ public void logicalNotOperationExpr_validBasic() { } @Test - public void logicalNot_validBoxedType() { + public void validLogicalNot_boxedType() { VariableExpr variableExpr = VariableExpr.withVariable( Variable.builder().setName("x").setType(TypeNode.BOOLEAN_OBJECT).build()); @@ -39,7 +39,7 @@ public void logicalNot_validBoxedType() { } @Test - public void logicalNot_invalidNumericType() { + public void invalidLogicalNot_numericType() { VariableExpr variableExpr = VariableExpr.withVariable(Variable.builder().setName("x").setType(TypeNode.INT).build()); assertThrows( @@ -47,7 +47,7 @@ public void logicalNot_invalidNumericType() { } @Test - public void logicalNot_invalidReferenceType() { + public void invalidLogicalNot_referenceType() { VariableExpr variableExpr = VariableExpr.withVariable(Variable.builder().setName("x").setType(TypeNode.STRING).build()); assertThrows( @@ -58,7 +58,7 @@ public void logicalNot_invalidReferenceType() { * =============================== Post Increment Operation Expr =============================== */ @Test - public void postIncrement_validBasic() { + public void validPostIncrement_basic() { VariableExpr variableExpr = VariableExpr.withVariable(Variable.builder().setName("x").setType(TypeNode.INT).build()); UnaryOperationExpr.postfixIncrementWithExpr(variableExpr); @@ -66,7 +66,7 @@ public void postIncrement_validBasic() { } @Test - public void postIncrement_validBoxedType() { + public void validPostIncrement_boxedType() { VariableExpr variableExpr = VariableExpr.withVariable( Variable.builder().setName("x").setType(TypeNode.FLOAT_OBJECT).build()); @@ -75,7 +75,7 @@ public void postIncrement_validBoxedType() { } @Test - public void postIncrement_invalidBoxedBooleanType() { + public void invalidPostIncrement_boxedBooleanType() { VariableExpr variableExpr = VariableExpr.withVariable( Variable.builder().setName("x").setType(TypeNode.BOOLEAN_OBJECT).build()); @@ -85,11 +85,20 @@ public void postIncrement_invalidBoxedBooleanType() { } @Test - public void postIncrement_invalidReferenceType() { + public void invalidPostIncrement_referenceType() { VariableExpr variableExpr = VariableExpr.withVariable(Variable.builder().setName("x").setType(TypeNode.STRING).build()); assertThrows( IllegalStateException.class, () -> UnaryOperationExpr.postfixIncrementWithExpr(variableExpr)); } + + @Test + public void invalidPostIncrement_finalVariable() { + Variable var = Variable.builder().setName("i").setType(TypeNode.INT).build(); + VariableExpr variableExpr = VariableExpr.builder().setIsFinal(true).setVariable(var).build(); + assertThrows( + IllegalStateException.class, + () -> UnaryOperationExpr.postfixIncrementWithExpr(variableExpr)); + } } From 9dd01bc91d577fb63f77862c64f4b82f30ee88c0 Mon Sep 17 00:00:00 2001 From: summerji Date: Tue, 6 Oct 2020 23:10:56 -0700 Subject: [PATCH 15/18] remove files --- DEVELOPMENT.md | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 4320c37a42..026cfbdfcd 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -85,23 +85,3 @@ below are temporary and better ones will be coming. ```sh bazel run :google_java_format ``` - -## Test Running - -- Run all unit tests. - - ```sh - bazel test //... - ``` - -- Run a single unit test like `JavaCodeGeneratorTest.java` - - ```sh - bazel run //src/test/java/com/google/api/generator/engine:JavaCodeGeneratorTest - ``` - -- Update goldens files based on code generation in unit test, for example `JavaCodeGeneratorTest.java` - - ```sh - bazel run //src/test/java/com/google/api/generator/engine:JavaCodeGeneratorTest_update - ``` From aaf0d957252da592160e5a8b0eb9f049aef44dd4 Mon Sep 17 00:00:00 2001 From: summerji Date: Tue, 6 Oct 2020 23:29:49 -0700 Subject: [PATCH 16/18] rebase --- .../ResourceNameHelperClassComposer.java | 69 ------------------- .../gapic/composer/goldens/FoobarName.golden | 16 ----- 2 files changed, 85 deletions(-) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java index e7d0abbc79..5594ffb16a 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java @@ -19,7 +19,6 @@ import com.google.api.generator.engine.ast.AssignmentExpr; import com.google.api.generator.engine.ast.AssignmentOperationExpr; import com.google.api.generator.engine.ast.CastExpr; -import com.google.api.generator.engine.ast.AssignmentOperationExpr; import com.google.api.generator.engine.ast.ClassDefinition; import com.google.api.generator.engine.ast.CommentStatement; import com.google.api.generator.engine.ast.ConcreteReference; @@ -1328,74 +1327,6 @@ private static MethodInvocationExpr createObjectsHashCodeForVarMethod(VariableEx .build(); } - private static MethodDefinition createHashCodeMethod(List> tokenHierarchies) { - List asgmtBody = new ArrayList<>(); - // code: int h = 1; - Variable hVar = Variable.builder().setType(TypeNode.INT).setName("h").build(); - VariableExpr hVarExpr = VariableExpr.builder().setVariable(hVar).build(); - ValueExpr hValueExpr = - ValueExpr.withValue(PrimitiveValue.builder().setType(TypeNode.INT).setValue("1").build()); - AssignmentExpr hAssignmentExpr = - AssignmentExpr.builder() - .setVariableExpr(hVarExpr.toBuilder().setIsDecl(true).build()) - .setValueExpr(hValueExpr) - .build(); - asgmtBody.add(ExprStatement.withExpr(hAssignmentExpr)); - // code: h *= 1000003; - // code: h ^= Objects.hashCode(...); - ValueExpr numValueExpr = - ValueExpr.withValue( - PrimitiveValue.builder().setType(TypeNode.INT).setValue("1000003").build()); - AssignmentOperationExpr multiplyAsgmtOpExpr = - AssignmentOperationExpr.multiplyAssignmentWithExprs(hVarExpr, numValueExpr); - // If it has variants, add the multiply and xor assignment operation exprs for fixedValue. - boolean hasVariants = tokenHierarchies.size() > 1; - if (hasVariants) { - VariableExpr fixedValueVarExpr = FIXED_CLASS_VARS.get("fixedValue"); - asgmtBody.add(ExprStatement.withExpr(multiplyAsgmtOpExpr)); - asgmtBody.add( - ExprStatement.withExpr( - AssignmentOperationExpr.xorAssignmentWithExprs( - hVarExpr, createObjectsHashCodeForVarMethod(fixedValueVarExpr)))); - } - // Add the multiply and xor assignment operation exprs for tokens. - Set tokenSet = getTokenSet(tokenHierarchies); - tokenSet.stream() - .forEach( - token -> { - VariableExpr tokenVarExpr = - VariableExpr.withVariable( - Variable.builder() - .setName(JavaStyle.toLowerCamelCase(token)) - .setType(TypeNode.STRING) - .build()); - asgmtBody.add(ExprStatement.withExpr(multiplyAsgmtOpExpr)); - asgmtBody.add( - ExprStatement.withExpr( - AssignmentOperationExpr.xorAssignmentWithExprs( - hVarExpr, createObjectsHashCodeForVarMethod(tokenVarExpr)))); - }); - - return MethodDefinition.builder() - .setIsOverride(true) - .setScope(ScopeNode.PUBLIC) - .setReturnType(TypeNode.INT) - .setName("hashCode") - .setBody(asgmtBody) - .setReturnExpr(hVarExpr) - .build(); - } - - private static MethodInvocationExpr createObjectsHashCodeForVarMethod(VariableExpr varExpr) { - // code: Objects.hashCode(varExpr) - return MethodInvocationExpr.builder() - .setMethodName("hashCode") - .setStaticReferenceType(STATIC_TYPES.get("Objects")) - .setArguments(varExpr) - .setReturnType(TypeNode.INT) - .build(); - } - private static List createNestedBuilderClasses( ResourceName resourceName, List> tokenHierarchies, diff --git a/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden b/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden index 1a0f7d61fe..565f997703 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden +++ b/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden @@ -280,22 +280,6 @@ public class FoobarName implements ResourceName { return h; } - @Override - public int hashCode() { - int h = 1; - h *= 1000003; - h ^= Objects.hashCode(fixedValue); - h *= 1000003; - h ^= Objects.hashCode(project); - h *= 1000003; - h ^= Objects.hashCode(foobar); - h *= 1000003; - h ^= Objects.hashCode(variant); - h *= 1000003; - h ^= Objects.hashCode(barFoo); - return h; - } - /** Builder for projects/{project}/foobars/{foobar}. */ public static class Builder { private String project; From 0f5681ad01d40bc5dacd32d2c89499d54b132d3f Mon Sep 17 00:00:00 2001 From: summerji Date: Tue, 6 Oct 2020 23:46:41 -0700 Subject: [PATCH 17/18] fix resolve --- .../ResourceNameHelperClassComposer.java | 97 ------------------- .../gapic/composer/goldens/FoobarName.golden | 15 --- .../gapic/composer/goldens/SessionName.golden | 12 --- 3 files changed, 124 deletions(-) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java index f23a8f9cb5..5594ffb16a 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java @@ -1259,103 +1259,6 @@ private static MethodInvocationExpr createObjectsEqualsForTokenMethodEpxr( .build(); } - private static MethodDefinition createEqualsMethod( - ResourceName resourceName, List> tokenHierarchies, Map types) { - // Create method definition variables. - Variable oVariable = Variable.builder().setType(TypeNode.OBJECT).setName("o").build(); - VariableExpr argVarExpr = - VariableExpr.builder().setIsDecl(false).setVariable(oVariable).build(); - TypeNode thisClassType = types.get(getThisClassName(resourceName)); - ValueExpr thisValueExpr = ValueExpr.withValue(ThisObjectValue.withType(thisClassType)); - ValueExpr trueValueExpr = - ValueExpr.withValue( - PrimitiveValue.builder().setType(TypeNode.BOOLEAN).setValue("true").build()); - - // Create first if statement's return expression - ReturnExpr returnTrueExpr = ReturnExpr.withExpr(trueValueExpr); - - // Create second if statement's condition expression - RelationalOperationExpr oEqualsThisExpr = - RelationalOperationExpr.equalToWithExprs(argVarExpr, thisValueExpr); - RelationalOperationExpr oNotEqualsNullExpr = - RelationalOperationExpr.notEqualToWithExprs( - argVarExpr, ValueExpr.withValue(NullObjectValue.create())); - MethodInvocationExpr getClassMethodInvocationExpr = - MethodInvocationExpr.builder().setMethodName("getClass").build(); - RelationalOperationExpr getClassEqualsExpr = - RelationalOperationExpr.equalToWithExprs( - getClassMethodInvocationExpr, - getClassMethodInvocationExpr.toBuilder().setExprReferenceExpr(argVarExpr).build()); - LogicalOperationExpr orLogicalExpr = - LogicalOperationExpr.logicalOrWithExprs(oNotEqualsNullExpr, getClassEqualsExpr); - - // Create second if statement's body assignment expression. - Variable thatVariable = Variable.builder().setName("that").setType(thisClassType).build(); - VariableExpr thatVariableExpr = - VariableExpr.builder().setIsDecl(false).setVariable(thatVariable).build(); - CastExpr oCastExpr = CastExpr.builder().setExpr(argVarExpr).setType(thisClassType).build(); - AssignmentExpr thatAssignmentExpr = - AssignmentExpr.builder() - .setVariableExpr(thatVariableExpr.toBuilder().setIsDecl(true).build()) - .setValueExpr(oCastExpr) - .build(); - - // Create return expression in the second if statement's body. - Set tokenSet = getTokenSet(tokenHierarchies); - Iterator itToken = tokenSet.iterator(); - Expr curTokenExpr = - createObjectsEqualsForTokenMethodEpxr( - thisValueExpr, - thatVariableExpr, - Variable.builder() - .setType(TypeNode.STRING) - .setName(JavaStyle.toLowerCamelCase(itToken.next())) - .build()); - while (itToken.hasNext()) { - Expr nextTokenExpr = - createObjectsEqualsForTokenMethodEpxr( - thisValueExpr, - thatVariableExpr, - Variable.builder() - .setType(TypeNode.STRING) - .setName(JavaStyle.toLowerCamelCase(itToken.next())) - .build()); - curTokenExpr = LogicalOperationExpr.logicalAndWithExprs(curTokenExpr, nextTokenExpr); - } - ReturnExpr secondIfReturnExpr = ReturnExpr.withExpr(curTokenExpr); - - // Code: if (o == this) { return true;} - IfStatement firstIfStatement = - IfStatement.builder() - .setConditionExpr(oEqualsThisExpr) - .setBody(Arrays.asList(ExprStatement.withExpr(returnTrueExpr))) - .build(); - // Code: if (o != null || getClass() == o.getClass()) { FoobarName that = ((FoobarName) o); - // return ..} - IfStatement secondIfStatement = - IfStatement.builder() - .setConditionExpr(orLogicalExpr) - .setBody( - Arrays.asList( - ExprStatement.withExpr(thatAssignmentExpr), - ExprStatement.withExpr(secondIfReturnExpr))) - .build(); - - // Create method's return expression. - ValueExpr falseValueExpr = - ValueExpr.withValue( - PrimitiveValue.builder().setType(TypeNode.BOOLEAN).setValue("false").build()); - - return MethodDefinition.builder() - .setIsOverride(true) - .setScope(ScopeNode.PUBLIC) - .setReturnType(TypeNode.INT) - .setName("hashCode") - .setBody(asgmtBody) - .setReturnExpr(hVarExpr) - .build(); - } - private static MethodDefinition createHashCodeMethod(List> tokenHierarchies) { List asgmtBody = new ArrayList<>(); // code: int h = 1; diff --git a/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden b/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden index dac439b6c8..565f997703 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden +++ b/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden @@ -279,21 +279,6 @@ public class FoobarName implements ResourceName { h ^= Objects.hashCode(barFoo); return h; } - - @Override - public boolean equals(Object o) { - if (o == this) { - return true; - } - if (o != null || getClass() == o.getClass()) { - FoobarName that = ((FoobarName) o); - return Objects.equals(this.project, that.project) - && Objects.equals(this.foobar, that.foobar) - && Objects.equals(this.variant, that.variant) - && Objects.equals(this.barFoo, that.barFoo); - } - return false; - } /** Builder for projects/{project}/foobars/{foobar}. */ public static class Builder { diff --git a/src/test/java/com/google/api/generator/gapic/composer/goldens/SessionName.golden b/src/test/java/com/google/api/generator/gapic/composer/goldens/SessionName.golden index 08f4587fdb..b17c2718c1 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/goldens/SessionName.golden +++ b/src/test/java/com/google/api/generator/gapic/composer/goldens/SessionName.golden @@ -120,18 +120,6 @@ public class SessionName implements ResourceName { h ^= Objects.hashCode(session); return h; } - - @Override - public boolean equals(Object o) { - if (o == this) { - return true; - } - if (o != null || getClass() == o.getClass()) { - SessionName that = ((SessionName) o); - return Objects.equals(this.session, that.session); - } - return false; - } /** Builder for sessions/{session}. */ public static class Builder { From 758e89856ebb4cd7c27195b39a1d6903a185db66 Mon Sep 17 00:00:00 2001 From: summerji Date: Wed, 7 Oct 2020 00:00:28 -0700 Subject: [PATCH 18/18] revert readme --- DEVELOPMENT.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 026cfbdfcd..4320c37a42 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -85,3 +85,23 @@ below are temporary and better ones will be coming. ```sh bazel run :google_java_format ``` + +## Test Running + +- Run all unit tests. + + ```sh + bazel test //... + ``` + +- Run a single unit test like `JavaCodeGeneratorTest.java` + + ```sh + bazel run //src/test/java/com/google/api/generator/engine:JavaCodeGeneratorTest + ``` + +- Update goldens files based on code generation in unit test, for example `JavaCodeGeneratorTest.java` + + ```sh + bazel run //src/test/java/com/google/api/generator/engine:JavaCodeGeneratorTest_update + ```