From 821228276550ece1c044fc68703804ff7a10250f Mon Sep 17 00:00:00 2001 From: Andrea Lin Date: Fri, 29 Mar 2019 14:42:00 -0700 Subject: [PATCH 1/7] add configv2 validator --- .../util/ConfigNextVersionValidator.java | 75 +++++++++++++++++++ .../api/codegen/util/ConfigValidatorTest.java | 66 ++++++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 src/main/java/com/google/api/codegen/util/ConfigNextVersionValidator.java create mode 100644 src/test/java/com/google/api/codegen/util/ConfigValidatorTest.java diff --git a/src/main/java/com/google/api/codegen/util/ConfigNextVersionValidator.java b/src/main/java/com/google/api/codegen/util/ConfigNextVersionValidator.java new file mode 100644 index 0000000000..5763cd1945 --- /dev/null +++ b/src/main/java/com/google/api/codegen/util/ConfigNextVersionValidator.java @@ -0,0 +1,75 @@ +/* Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.api.codegen.util; + +import com.google.protobuf.InvalidProtocolBufferException; +import com.google.protobuf.util.JsonFormat; +import com.google.protobuf.util.JsonFormat.Parser; +import com.google.protobuf.util.JsonFormat.Printer; +import com.google.protobuf.util.JsonFormat.TypeRegistry; +import javax.annotation.Nonnull; + +public class ConfigNextVersionValidator { + + public static String CONFIG_V2_MAJOR_VERSION = "2"; + public static String CONFIG_V2_VERSION = CONFIG_V2_MAJOR_VERSION + ".0.0"; // "2.0.0" + + public void checkIsNextVersionConfig(@Nonnull com.google.api.codegen.ConfigProto configV1Proto) + throws IllegalStateException { + if (!configV1Proto.getConfigSchemaVersion().startsWith(CONFIG_V2_MAJOR_VERSION + ".") + && !configV1Proto.getConfigSchemaVersion().equals(CONFIG_V2_MAJOR_VERSION)) { + throw new IllegalStateException( + String.format( + "Provided ConfigProto version is %s but should be >= %s", + configV1Proto.getConfigSchemaVersion(), CONFIG_V2_VERSION)); + } + + try { + // Serializing utils for Config V2. + TypeRegistry typeRegistryV2 = + JsonFormat.TypeRegistry.newBuilder() + .add(com.google.api.codegen.v2.ConfigProto.getDescriptor()) + .build(); + Parser parserV2 = JsonFormat.parser().usingTypeRegistry(typeRegistryV2); + Printer printerV2 = JsonFormat.printer().usingTypeRegistry(typeRegistryV2); + + // Serialize and deserialize the Config v1 proto under the Config v2 schema to remove fields + // unknown to Config v2 schema. + com.google.api.codegen.v2.ConfigProto.Builder v2ProtoBuilder = + com.google.api.codegen.v2.ConfigProto.newBuilder(); + parserV2.merge(printerV2.print(configV1Proto), v2ProtoBuilder); + + // Serializing utils for Config V2. + TypeRegistry typeRegistryV1 = + JsonFormat.TypeRegistry.newBuilder() + .add(com.google.api.codegen.ConfigProto.getDescriptor()) + .build(); + Printer printerV1 = JsonFormat.printer().usingTypeRegistry(typeRegistryV1); + + String v1String = printerV2.print(v2ProtoBuilder.build()); + String v2String = printerV1.print(configV1Proto); + + // Compare the v1-serialized and v2-serialized strings of the same config proto object. + if (!v1String.equals(v2String)) { + throw new IllegalStateException( + String.format( + "Unknown fields in to ConfigProto v2 in configProto: %s", + configV1Proto.toString())); + } + } catch (InvalidProtocolBufferException e) { + throw new IllegalStateException(e); + } + } +} diff --git a/src/test/java/com/google/api/codegen/util/ConfigValidatorTest.java b/src/test/java/com/google/api/codegen/util/ConfigValidatorTest.java new file mode 100644 index 0000000000..c97411a4ee --- /dev/null +++ b/src/test/java/com/google/api/codegen/util/ConfigValidatorTest.java @@ -0,0 +1,66 @@ +/* Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.api.codegen.util; + +import com.google.api.codegen.ConfigProto; +import com.google.api.codegen.FlatteningConfigProto; +import com.google.api.codegen.FlatteningGroupProto; +import com.google.api.codegen.InterfaceConfigProto; +import com.google.api.codegen.MethodConfigProto; +import com.google.protobuf.BoolValue; +import org.junit.Test; + +public class ConfigValidatorTest { + private static final ConfigProto validV2Proto = + ConfigProto.newBuilder() + .setConfigSchemaVersion("2.0.0") + // This is a valid field for both Config v1 and Config v2. + .setEnableStringFormatFunctionsOverride(BoolValue.of(true)) + .build(); + + private static final ConfigNextVersionValidator validator = new ConfigNextVersionValidator(); + + @Test(expected = IllegalStateException.class) + public void testProtoIsNotConfigNextVersion() { + ConfigProto smallProto = validV2Proto.toBuilder().setConfigSchemaVersion("1.0.0").build(); + validator.checkIsNextVersionConfig(smallProto); + } + + @Test(expected = IllegalStateException.class) + public void testProtoIsNotValid() { + ConfigProto smallProto = + validV2Proto + .toBuilder() + .addInterfaces( + InterfaceConfigProto.newBuilder() + .addMethods( + MethodConfigProto.newBuilder() + .setFlattening( + FlatteningConfigProto.newBuilder() + .addGroups( + FlatteningGroupProto.newBuilder() + .addParameters("flattenedParam") + .build()) + .build())) + .build()) + .build(); + validator.checkIsNextVersionConfig(smallProto); + } + + @Test + public void testProtoIsValid() { + validator.checkIsNextVersionConfig(validV2Proto); + } +} From 98fe47a928a4ae9581a23d07a938df8ff1a45029 Mon Sep 17 00:00:00 2001 From: Andrea Lin Date: Fri, 29 Mar 2019 14:44:18 -0700 Subject: [PATCH 2/7] javadoc --- .../google/api/codegen/util/ConfigNextVersionValidator.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/google/api/codegen/util/ConfigNextVersionValidator.java b/src/main/java/com/google/api/codegen/util/ConfigNextVersionValidator.java index 5763cd1945..381ffd5bba 100644 --- a/src/main/java/com/google/api/codegen/util/ConfigNextVersionValidator.java +++ b/src/main/java/com/google/api/codegen/util/ConfigNextVersionValidator.java @@ -26,6 +26,10 @@ public class ConfigNextVersionValidator { public static String CONFIG_V2_MAJOR_VERSION = "2"; public static String CONFIG_V2_VERSION = CONFIG_V2_MAJOR_VERSION + ".0.0"; // "2.0.0" + /** + * Throw {@link IllegalStateException} iff the given input contains fields unknown to the {@link + * com.google.api.codegen.v2.ConfigProto} schema. + */ public void checkIsNextVersionConfig(@Nonnull com.google.api.codegen.ConfigProto configV1Proto) throws IllegalStateException { if (!configV1Proto.getConfigSchemaVersion().startsWith(CONFIG_V2_MAJOR_VERSION + ".") From fe7464a5acc0e323f2aa5c059877e637d3769468 Mon Sep 17 00:00:00 2001 From: Andrea Lin Date: Fri, 29 Mar 2019 15:35:54 -0700 Subject: [PATCH 3/7] ConfigVersionValidator --- ...figNextVersionValidator.java => ConfigVersionValidator.java} | 2 +- .../java/com/google/api/codegen/util/ConfigValidatorTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/main/java/com/google/api/codegen/util/{ConfigNextVersionValidator.java => ConfigVersionValidator.java} (98%) diff --git a/src/main/java/com/google/api/codegen/util/ConfigNextVersionValidator.java b/src/main/java/com/google/api/codegen/util/ConfigVersionValidator.java similarity index 98% rename from src/main/java/com/google/api/codegen/util/ConfigNextVersionValidator.java rename to src/main/java/com/google/api/codegen/util/ConfigVersionValidator.java index 381ffd5bba..cc020176dc 100644 --- a/src/main/java/com/google/api/codegen/util/ConfigNextVersionValidator.java +++ b/src/main/java/com/google/api/codegen/util/ConfigVersionValidator.java @@ -21,7 +21,7 @@ import com.google.protobuf.util.JsonFormat.TypeRegistry; import javax.annotation.Nonnull; -public class ConfigNextVersionValidator { +public class ConfigVersionValidator { public static String CONFIG_V2_MAJOR_VERSION = "2"; public static String CONFIG_V2_VERSION = CONFIG_V2_MAJOR_VERSION + ".0.0"; // "2.0.0" diff --git a/src/test/java/com/google/api/codegen/util/ConfigValidatorTest.java b/src/test/java/com/google/api/codegen/util/ConfigValidatorTest.java index c97411a4ee..32e0059884 100644 --- a/src/test/java/com/google/api/codegen/util/ConfigValidatorTest.java +++ b/src/test/java/com/google/api/codegen/util/ConfigValidatorTest.java @@ -30,7 +30,7 @@ public class ConfigValidatorTest { .setEnableStringFormatFunctionsOverride(BoolValue.of(true)) .build(); - private static final ConfigNextVersionValidator validator = new ConfigNextVersionValidator(); + private static final ConfigVersionValidator validator = new ConfigVersionValidator(); @Test(expected = IllegalStateException.class) public void testProtoIsNotConfigNextVersion() { From ab645038f48f77d8eb169ce4249fa2faaafa7fe7 Mon Sep 17 00:00:00 2001 From: Andrea Lin Date: Fri, 29 Mar 2019 15:37:34 -0700 Subject: [PATCH 4/7] validateV2Config --- .../com/google/api/codegen/util/ConfigVersionValidator.java | 2 +- .../com/google/api/codegen/util/ConfigValidatorTest.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/google/api/codegen/util/ConfigVersionValidator.java b/src/main/java/com/google/api/codegen/util/ConfigVersionValidator.java index cc020176dc..7951c11adc 100644 --- a/src/main/java/com/google/api/codegen/util/ConfigVersionValidator.java +++ b/src/main/java/com/google/api/codegen/util/ConfigVersionValidator.java @@ -30,7 +30,7 @@ public class ConfigVersionValidator { * Throw {@link IllegalStateException} iff the given input contains fields unknown to the {@link * com.google.api.codegen.v2.ConfigProto} schema. */ - public void checkIsNextVersionConfig(@Nonnull com.google.api.codegen.ConfigProto configV1Proto) + public void validateV2Config(@Nonnull com.google.api.codegen.ConfigProto configV1Proto) throws IllegalStateException { if (!configV1Proto.getConfigSchemaVersion().startsWith(CONFIG_V2_MAJOR_VERSION + ".") && !configV1Proto.getConfigSchemaVersion().equals(CONFIG_V2_MAJOR_VERSION)) { diff --git a/src/test/java/com/google/api/codegen/util/ConfigValidatorTest.java b/src/test/java/com/google/api/codegen/util/ConfigValidatorTest.java index 32e0059884..4632449b8a 100644 --- a/src/test/java/com/google/api/codegen/util/ConfigValidatorTest.java +++ b/src/test/java/com/google/api/codegen/util/ConfigValidatorTest.java @@ -35,7 +35,7 @@ public class ConfigValidatorTest { @Test(expected = IllegalStateException.class) public void testProtoIsNotConfigNextVersion() { ConfigProto smallProto = validV2Proto.toBuilder().setConfigSchemaVersion("1.0.0").build(); - validator.checkIsNextVersionConfig(smallProto); + validator.validateV2Config(smallProto); } @Test(expected = IllegalStateException.class) @@ -56,11 +56,11 @@ public void testProtoIsNotValid() { .build())) .build()) .build(); - validator.checkIsNextVersionConfig(smallProto); + validator.validateV2Config(smallProto); } @Test public void testProtoIsValid() { - validator.checkIsNextVersionConfig(validV2Proto); + validator.validateV2Config(validV2Proto); } } From 56b0d28f2631cfcfbca24433c445c1a366953f4a Mon Sep 17 00:00:00 2001 From: Andrea Lin Date: Sun, 31 Mar 2019 21:13:58 -0700 Subject: [PATCH 5/7] use DiscardUnkonwnFieldsParser --- .../codegen/util/ConfigVersionValidator.java | 33 +++++-------------- 1 file changed, 8 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/google/api/codegen/util/ConfigVersionValidator.java b/src/main/java/com/google/api/codegen/util/ConfigVersionValidator.java index 7951c11adc..d8deda140e 100644 --- a/src/main/java/com/google/api/codegen/util/ConfigVersionValidator.java +++ b/src/main/java/com/google/api/codegen/util/ConfigVersionValidator.java @@ -14,11 +14,10 @@ */ package com.google.api.codegen.util; +import com.google.protobuf.DiscardUnknownFieldsParser; import com.google.protobuf.InvalidProtocolBufferException; -import com.google.protobuf.util.JsonFormat; -import com.google.protobuf.util.JsonFormat.Parser; -import com.google.protobuf.util.JsonFormat.Printer; -import com.google.protobuf.util.JsonFormat.TypeRegistry; +import com.google.protobuf.Parser; +import java.util.Arrays; import javax.annotation.Nonnull; public class ConfigVersionValidator { @@ -41,32 +40,16 @@ public void validateV2Config(@Nonnull com.google.api.codegen.ConfigProto configV } try { - // Serializing utils for Config V2. - TypeRegistry typeRegistryV2 = - JsonFormat.TypeRegistry.newBuilder() - .add(com.google.api.codegen.v2.ConfigProto.getDescriptor()) - .build(); - Parser parserV2 = JsonFormat.parser().usingTypeRegistry(typeRegistryV2); - Printer printerV2 = JsonFormat.printer().usingTypeRegistry(typeRegistryV2); // Serialize and deserialize the Config v1 proto under the Config v2 schema to remove fields // unknown to Config v2 schema. - com.google.api.codegen.v2.ConfigProto.Builder v2ProtoBuilder = - com.google.api.codegen.v2.ConfigProto.newBuilder(); - parserV2.merge(printerV2.print(configV1Proto), v2ProtoBuilder); - - // Serializing utils for Config V2. - TypeRegistry typeRegistryV1 = - JsonFormat.TypeRegistry.newBuilder() - .add(com.google.api.codegen.ConfigProto.getDescriptor()) - .build(); - Printer printerV1 = JsonFormat.printer().usingTypeRegistry(typeRegistryV1); - - String v1String = printerV2.print(v2ProtoBuilder.build()); - String v2String = printerV1.print(configV1Proto); + Parser parser = + DiscardUnknownFieldsParser.wrap(com.google.api.codegen.v2.ConfigProto.parser()); + com.google.api.codegen.v2.ConfigProto configV2 = + parser.parseFrom(configV1Proto.toByteString()); // Compare the v1-serialized and v2-serialized strings of the same config proto object. - if (!v1String.equals(v2String)) { + if (!Arrays.equals(configV2.toByteArray(), configV1Proto.toByteArray())) { throw new IllegalStateException( String.format( "Unknown fields in to ConfigProto v2 in configProto: %s", From 617fc9ae46cd70778928498233d301ef6546799b Mon Sep 17 00:00:00 2001 From: Andrea Lin Date: Mon, 1 Apr 2019 08:47:21 -0700 Subject: [PATCH 6/7] cleanup --- .../com/google/api/codegen/util/ConfigVersionValidator.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/google/api/codegen/util/ConfigVersionValidator.java b/src/main/java/com/google/api/codegen/util/ConfigVersionValidator.java index d8deda140e..6a83c4760b 100644 --- a/src/main/java/com/google/api/codegen/util/ConfigVersionValidator.java +++ b/src/main/java/com/google/api/codegen/util/ConfigVersionValidator.java @@ -40,7 +40,6 @@ public void validateV2Config(@Nonnull com.google.api.codegen.ConfigProto configV } try { - // Serialize and deserialize the Config v1 proto under the Config v2 schema to remove fields // unknown to Config v2 schema. Parser parser = @@ -52,7 +51,7 @@ public void validateV2Config(@Nonnull com.google.api.codegen.ConfigProto configV if (!Arrays.equals(configV2.toByteArray(), configV1Proto.toByteArray())) { throw new IllegalStateException( String.format( - "Unknown fields in to ConfigProto v2 in configProto: %s", + "Unknown fields to ConfigProto v2 in configProto: %s", configV1Proto.toString())); } } catch (InvalidProtocolBufferException e) { From 43a9a6c89fbb532d9460ce422a39241549945f1b Mon Sep 17 00:00:00 2001 From: Andrea Lin Date: Mon, 1 Apr 2019 08:47:26 -0700 Subject: [PATCH 7/7] cleanup --- .../com/google/api/codegen/util/ConfigVersionValidator.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/google/api/codegen/util/ConfigVersionValidator.java b/src/main/java/com/google/api/codegen/util/ConfigVersionValidator.java index 6a83c4760b..b0abd472f6 100644 --- a/src/main/java/com/google/api/codegen/util/ConfigVersionValidator.java +++ b/src/main/java/com/google/api/codegen/util/ConfigVersionValidator.java @@ -51,8 +51,7 @@ public void validateV2Config(@Nonnull com.google.api.codegen.ConfigProto configV if (!Arrays.equals(configV2.toByteArray(), configV1Proto.toByteArray())) { throw new IllegalStateException( String.format( - "Unknown fields to ConfigProto v2 in configProto: %s", - configV1Proto.toString())); + "Unknown fields to ConfigProto v2 in configProto: %s", configV1Proto.toString())); } } catch (InvalidProtocolBufferException e) { throw new IllegalStateException(e);