From 712f6d2d7cf09104e1388f40298e50a7ff3f5b38 Mon Sep 17 00:00:00 2001 From: Ludovic Chenut Date: Tue, 24 Jan 2023 10:37:05 +0100 Subject: [PATCH 01/30] first draft --- protobuf_serialization/codec.nim | 7 +++++-- protobuf_serialization/internal.nim | 2 ++ protobuf_serialization/reader.nim | 14 +++++++++++++- protobuf_serialization/writer.nim | 6 +++++- tests/test_objects.nim | 16 +++++++++++++--- 5 files changed, 38 insertions(+), 7 deletions(-) diff --git a/protobuf_serialization/codec.nim b/protobuf_serialization/codec.nim index 43d953a..b6aede2 100644 --- a/protobuf_serialization/codec.nim +++ b/protobuf_serialization/codec.nim @@ -54,19 +54,20 @@ type sfixed64* = distinct int64 ## fixed-width signed integer pbool* = distinct bool + penum* = distinct int32 pstring* = distinct string ## UTF-8-encoded string pbytes* = distinct seq[byte] ## byte sequence SomeScalar* = - pint32 | pint64 | puint32 | puint64 | sint32 | sint64 | pbool | + pint32 | pint64 | puint32 | puint64 | sint32 | sint64 | pbool | penum | fixed64 | sfixed64 | pdouble | pstring | pbytes | fixed32 | sfixed32 | pfloat # Mappings of proto type to wire type SomeVarint* = - pint32 | pint64 | puint32 | puint64 | sint32 | sint64 | pbool + pint32 | pint64 | puint32 | puint64 | sint32 | sint64 | pbool | penum SomeFixed64* = fixed64 | sfixed64 | pdouble SomeLengthDelim* = pstring | pbytes # Also messages and packed repeated fields SomeFixed32* = fixed32 | sfixed32 | pfloat @@ -116,6 +117,7 @@ func toUleb(x: sint32): uint32 = template toUleb(x: pint64): uint64 = cast[uint64](x) template toUleb(x: pint32): uint32 = cast[uint32](x) template toUleb(x: pbool): uint8 = cast[uint8](x) +template toUleb(x: penum): uint64 = cast[uint32](x) template fromUleb(x: uint64, T: type puint64): T = puint64(x) template fromUleb(x: uint64, T: type pbool): T = pbool(x != 0) @@ -130,6 +132,7 @@ template fromUleb(x: uint64, T: type sint32): T = template fromUleb(x: uint64, T: type pint64): T = cast[T](x) template fromUleb(x: uint64, T: type pint32): T = cast[T](x) +template fromUleb(x: uint64, T: type penum): T = cast[T](x) template toBytes*(x: SomeVarint): openArray[byte] = toBytes(toUleb(x), Leb128).toOpenArray() diff --git a/protobuf_serialization/internal.nim b/protobuf_serialization/internal.nim index 37f5ec7..d272335 100644 --- a/protobuf_serialization/internal.nim +++ b/protobuf_serialization/internal.nim @@ -91,6 +91,8 @@ template protoType*(InnerType, RootType, FieldType: untyped, fieldName: untyped) type InnerType = pstring elif FlatType is seq[byte]: type InnerType = pbytes + elif FlatType is enum: + type InnerType = penum elif FlatType is object: type InnerType = FieldType else: diff --git a/protobuf_serialization/reader.nim b/protobuf_serialization/reader.nim index 2a8e748..95c337d 100644 --- a/protobuf_serialization/reader.nim +++ b/protobuf_serialization/reader.nim @@ -3,6 +3,7 @@ import std/[typetraits, sets], stew/assign2, + stew/objects, stew/shims/macros, faststreams/inputs, serialization, @@ -42,7 +43,18 @@ proc readFieldInto[T: object]( raise (ref ValueError)(msg: "not enough bytes") memoryInput(tmp).readValueInternal(value) -proc readFieldInto[T: not object and (seq[byte] or not seq)]( +proc readFieldInto[T: enum]( + stream: InputStream, + value: var T, + header: FieldHeader, + ProtoType: type +) = + header.requireKind(WireKind.Varint) + let enumValue = stream.readValue(ProtoType) + if not checkedEnumAssign(value, enumValue.int32): + raise (ref ValueError)(msg: "Attempted to decode an invalid enum value") + +proc readFieldInto[T: not object and not enum and (seq[byte] or not seq)]( stream: InputStream, value: var T, header: FieldHeader, diff --git a/protobuf_serialization/writer.nim b/protobuf_serialization/writer.nim index 0d95146..334a413 100644 --- a/protobuf_serialization/writer.nim +++ b/protobuf_serialization/writer.nim @@ -28,7 +28,7 @@ proc writeField[T: object and not PBOption]( stream: OutputStream, fieldNum: int, fieldVal: T, ProtoType: type) = stream.writeField(fieldNum, fieldVal) -proc writeField[T: not object]( +proc writeField[T: not object and not enum]( stream: OutputStream, fieldNum: int, fieldVal: T, ProtoType: type) = stream.writeField(fieldNum, ProtoType(fieldVal)) @@ -37,6 +37,10 @@ proc writeField( if fieldVal.isSome(): # TODO required field checking stream.writeField(fieldNum, fieldVal.get(), ProtoType) +proc writeField[T: enum]( + stream: OutputStream, fieldNum: int, fieldVal: T, ProtoType: type) = + stream.writeField(fieldNum, pint32(fieldVal.ord())) + proc writeFieldPacked*[T: not byte, ProtoType: SomePrimitive]( output: OutputStream, field: int, values: openArray[T], _: type ProtoType) = doAssert validFieldNumber(field) diff --git a/tests/test_objects.nim b/tests/test_objects.nim index 48ae45c..a76ea0a 100644 --- a/tests/test_objects.nim +++ b/tests/test_objects.nim @@ -5,6 +5,11 @@ import ../protobuf_serialization/codec type + TestEnum = enum + A1 = 0 + B1 = 1000 + C1 = 1000000 + Basic {.proto3.} = object a {.fieldNumber: 1, pint.}: uint64 b {.fieldNumber: 2.}: string @@ -16,6 +21,7 @@ type f {.fieldNumber: 3.}: Basic g {.fieldNumber: 4.}: string h {.fieldNumber: 5.}: bool + i {.fieldNumber: 6.}: TestEnum discard Protobuf.supports(Basic) discard Protobuf.supports(Wrapped) @@ -34,7 +40,8 @@ suite "Test Object Encoding/Decoding": e: 200, f: Basic(a: 100, b: "Test string."), # TODO, c: 'C'), g: "Other test string.", - h: true + h: true, + i: A1 ) check Protobuf.decode(Protobuf.encode(obj), type(Wrapped)) == obj @@ -45,7 +52,8 @@ suite "Test Object Encoding/Decoding": e: 200, f: Basic(a: 100, b: "Test string."), # c: 'C'), g: "Other test string.", - h: true + h: true, + i: B1 ) writer = memoryOutput() @@ -67,11 +75,13 @@ suite "Test Object Encoding/Decoding": e: 200, f: Basic(a: 100, b: "Test string."), # c: 'C'), g: "Other test string.", - h: true + h: true, + i: C1 ) writer = memoryOutput() writer.writeField(3, obj.f) + writer.writeField(6, penum(obj.i)) writer.writeField(1, sint64(obj.d)) writer.writeField(2, sint64(obj.e)) writer.writeField(5, pbool(obj.h)) From c219b5d3efda2ddc90a3926e23efd009358b5dfd Mon Sep 17 00:00:00 2001 From: Ludovic Chenut Date: Tue, 24 Jan 2023 10:37:26 +0100 Subject: [PATCH 02/30] add tests --- tests/test_enum.nim | 77 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 tests/test_enum.nim diff --git a/tests/test_enum.nim b/tests/test_enum.nim new file mode 100644 index 0000000..1f145f5 --- /dev/null +++ b/tests/test_enum.nim @@ -0,0 +1,77 @@ +import unittest2 + +import + ../protobuf_serialization, + ../protobuf_serialization/codec + +type + Classic = enum + A1 + B1 + C1 + + WithHoles = enum + A2 = -10 + B2 = 0 + C2 = 10 + D2 + + Limits = enum + A3 = int32.low() + B3 = 0 + C3 = int32.high() + + ObjClassicP2 {.proto2.} = object + x {.fieldNumber: 1, required.}: Classic + + ObjWithHolesP2 {.proto2.} = object + x {.fieldNumber: 1, required.}: WithHoles + + ObjLimitsP2 {.proto2.} = object + x {.fieldNumber: 1, required.}: Limits + + ObjClassicP3 {.proto3.} = object + x {.fieldNumber: 1.}: Classic + + ObjWithHolesP3 {.proto3.} = object + x {.fieldNumber: 1.}: WithHoles + + ObjLimitsP3 {.proto3.} = object + x {.fieldNumber: 1.}: Limits + +suite "Test Enum Encoding/Decoding": + test "Can encode/decode enum": + for x in @[A1, B1, C1]: + let + objp2 = ObjClassicP2(x: x) + objp3 = ObjClassicP3(x: x) + encodedp2 = Protobuf.encode(objp2) + encodedp3 = Protobuf.encode(objp3) + check Protobuf.decode(encodedp2, ObjClassicP2) == objp2 + check Protobuf.decode(encodedp3, ObjClassicP3) == objp3 + + test "Can encode/decode enum with holes": + for x in @[A2, B2, C2, D2]: + let + objp2 = ObjWithHolesP2(x: x) + objp3 = ObjWithHolesP3(x: x) + encodedp2 = Protobuf.encode(objp2) + encodedp3 = Protobuf.encode(objp3) + check Protobuf.decode(encodedp2, ObjWithHolesP2) == objp2 + check Protobuf.decode(encodedp3, ObjWithHolesP3) == objp3 + + test "Can encode/decode enum limits": + for x in @[A3, B3, C3]: + let + objp2 = ObjLimitsP2(x: x) + objp3 = ObjLimitsP3(x: x) + encodedp2 = Protobuf.encode(objp2) + encodedp3 = Protobuf.encode(objp3) + check Protobuf.decode(encodedp2, ObjLimitsP2) == objp2 + check Protobuf.decode(encodedp3, ObjLimitsP3) == objp3 + + test "Cannot decode out of range enum": + expect ValueError: discard Protobuf.decode(@[8'u8, 4], ObjWithHolesP2) # Inside the hole + expect ValueError: discard Protobuf.decode(@[8'u8, 4], ObjWithHolesP3) # Inside the hole + expect ValueError: discard Protobuf.decode(@[8'u8, 24], ObjWithHolesP2) # Outside the hole + expect ValueError: discard Protobuf.decode(@[8'u8, 24], ObjWithHolesP3) # Outside the hole From 452f91b7f320da44eefe01e027841444840703ff Mon Sep 17 00:00:00 2001 From: Ludovic Chenut Date: Tue, 24 Jan 2023 12:35:27 +0100 Subject: [PATCH 03/30] add fatal in case of enum without 0 --- protobuf_serialization/reader.nim | 2 ++ protobuf_serialization/writer.nim | 2 ++ 2 files changed, 4 insertions(+) diff --git a/protobuf_serialization/reader.nim b/protobuf_serialization/reader.nim index 95c337d..4876329 100644 --- a/protobuf_serialization/reader.nim +++ b/protobuf_serialization/reader.nim @@ -49,6 +49,8 @@ proc readFieldInto[T: enum]( header: FieldHeader, ProtoType: type ) = + when 0 notin T: + {.fatal: $T & " definition must contain a constant that maps to zero".} header.requireKind(WireKind.Varint) let enumValue = stream.readValue(ProtoType) if not checkedEnumAssign(value, enumValue.int32): diff --git a/protobuf_serialization/writer.nim b/protobuf_serialization/writer.nim index 334a413..bf488bc 100644 --- a/protobuf_serialization/writer.nim +++ b/protobuf_serialization/writer.nim @@ -39,6 +39,8 @@ proc writeField( proc writeField[T: enum]( stream: OutputStream, fieldNum: int, fieldVal: T, ProtoType: type) = + when 0 notin T: + {.fatal: $T & " definition must contain a constant that maps to zero".} stream.writeField(fieldNum, pint32(fieldVal.ord())) proc writeFieldPacked*[T: not byte, ProtoType: SomePrimitive]( From 64f7113d373ecd871180b7fb0df1bec7d699acee Mon Sep 17 00:00:00 2001 From: Ludovic Chenut Date: Tue, 24 Jan 2023 14:01:06 +0100 Subject: [PATCH 04/30] fix & replace unrecognized value behaviour --- protobuf_serialization/reader.nim | 3 ++- protobuf_serialization/writer.nim | 1 + tests/test_enum.nim | 12 +++++++----- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/protobuf_serialization/reader.nim b/protobuf_serialization/reader.nim index 4876329..08a3b1f 100644 --- a/protobuf_serialization/reader.nim +++ b/protobuf_serialization/reader.nim @@ -53,7 +53,8 @@ proc readFieldInto[T: enum]( {.fatal: $T & " definition must contain a constant that maps to zero".} header.requireKind(WireKind.Varint) let enumValue = stream.readValue(ProtoType) - if not checkedEnumAssign(value, enumValue.int32): + if not checkedEnumAssign(value, enumValue.int32) and + not checkedEnumAssign(value, 0): raise (ref ValueError)(msg: "Attempted to decode an invalid enum value") proc readFieldInto[T: not object and not enum and (seq[byte] or not seq)]( diff --git a/protobuf_serialization/writer.nim b/protobuf_serialization/writer.nim index bf488bc..2418cc5 100644 --- a/protobuf_serialization/writer.nim +++ b/protobuf_serialization/writer.nim @@ -3,6 +3,7 @@ import std/typetraits, stew/shims/macros, + stew/objects, faststreams/outputs, serialization, "."/[codec, internal, types] diff --git a/tests/test_enum.nim b/tests/test_enum.nim index 1f145f5..f61bf8c 100644 --- a/tests/test_enum.nim +++ b/tests/test_enum.nim @@ -70,8 +70,10 @@ suite "Test Enum Encoding/Decoding": check Protobuf.decode(encodedp2, ObjLimitsP2) == objp2 check Protobuf.decode(encodedp3, ObjLimitsP3) == objp3 - test "Cannot decode out of range enum": - expect ValueError: discard Protobuf.decode(@[8'u8, 4], ObjWithHolesP2) # Inside the hole - expect ValueError: discard Protobuf.decode(@[8'u8, 4], ObjWithHolesP3) # Inside the hole - expect ValueError: discard Protobuf.decode(@[8'u8, 24], ObjWithHolesP2) # Outside the hole - expect ValueError: discard Protobuf.decode(@[8'u8, 24], ObjWithHolesP3) # Outside the hole + test "Decode out of range enum": + # TODO: Find a way to save the unrecognized value + check: + Protobuf.decode(@[8'u8, 4], ObjWithHolesP2) == ObjWithHolesP2() # Inside the hole + Protobuf.decode(@[8'u8, 4], ObjWithHolesP3) == ObjWithHolesP3() # Inside the hole + Protobuf.decode(@[8'u8, 24], ObjWithHolesP2) == ObjWithHolesP2() # Outside the hole + Protobuf.decode(@[8'u8, 24], ObjWithHolesP3) == ObjWithHolesP3() # Outside the hole From 0095fbddc1f6f0e82f350a1408aa10b44a8bc0a6 Mon Sep 17 00:00:00 2001 From: Tanguy Date: Fri, 27 Jan 2023 13:19:03 +0100 Subject: [PATCH 05/30] Show line on parsing failure --- protobuf_serialization/files/proto_parser.nim | 42 ++++++++++++------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/protobuf_serialization/files/proto_parser.nim b/protobuf_serialization/files/proto_parser.nim index 495d909..58aeae8 100644 --- a/protobuf_serialization/files/proto_parser.nim +++ b/protobuf_serialization/files/proto_parser.nim @@ -9,6 +9,7 @@ type typ: TokenType text: string index: int + filePos: int proc `$`(t: Token): string = $t.typ & ": " & t.text @@ -22,7 +23,7 @@ proc `==`(t: Token, tt: TokenType): bool = proc `==`(t: Token, c: char): bool = t.typ == Symbol and t.text[0] == c -proc tokenize(text: string): seq[Token] = +proc tokenize(filename, text: string): seq[Token] = let lexer = peg(tokens, res: seq[Token]): space <- +Space comment <- "//" * *(1 - '\n') @@ -35,20 +36,20 @@ proc tokenize(text: string): seq[Token] = charEscape <- '\\' * {'a', 'b', 'f', 'n', 'r', 't', 'v', '\\', '\'', '"'} escapes <- hexEscape | octEscape | charEscape dblstring <- '"' * *(escapes | 1 - '"') * '"': - res.add Token(typ: String, text: ($0).unescape) + res.add Token(typ: String, text: ($0).unescape, filePos: @0) regstring <- '\'' * *(escapes | 1 - '\'') * '\'': - res.add Token(typ: String, text: ($0).unescape(prefix = "'", suffix = "'")) + res.add Token(typ: String, text: ($0).unescape(prefix = "'", suffix = "'"), filePos: @0) string <- dblstring | regstring sym <- {'=', ';', '{', '}', '[', ']', '<', '>', ','}: - res.add Token(typ: Symbol, text: $0) + res.add Token(typ: Symbol, text: $0, filePos: @0) # according to the official syntax, this is correct. # but in reality, leading underscores are accepted #ident <- Alpha * *(Alpha | '_' | Digit) ident <- (Alpha | '_') * *(Alpha | '_' | Digit) fullIdent <- ?'.' * ident * *('.' * ident): - res.add Token(typ: Ident, text: $0) + res.add Token(typ: Ident, text: $0, filePos: @0) int <- ?('-' | '+') * +(Digit): - res.add Token(typ: Integer, text: $0) + res.add Token(typ: Integer, text: $0, filePos: @0) tokens <- *(comment | comment2 | space | string | sym | int | fullIdent) let @@ -58,11 +59,13 @@ proc tokenize(text: string): seq[Token] = tok.index = index if match.matchLen != text.len: - var msg = "Failed to lex: '" & text[match.matchMax] & "'\n" - let - minToShow = max(0, match.matchMax - 20) - maxToShow = min(text.len, match.matchMax + 20) - msg &= text[minToShow .. maxToShow] + let line = text[0.. Date: Fri, 27 Jan 2023 15:17:15 +0100 Subject: [PATCH 06/30] better proto2 parsing --- protobuf_serialization/files/decldef.nim | 13 ++++- protobuf_serialization/files/proto_parser.nim | 53 +++++++++++++++++-- 2 files changed, 60 insertions(+), 6 deletions(-) diff --git a/protobuf_serialization/files/decldef.nim b/protobuf_serialization/files/decldef.nim index 2026e23..2c96500 100644 --- a/protobuf_serialization/files/decldef.nim +++ b/protobuf_serialization/files/decldef.nim @@ -26,7 +26,7 @@ type ReservedType* = enum String, Number, Range ProtoType* = enum - Field, Enum, EnumVal, ReservedBlock, Reserved, Message, File, Imported, Oneof, Package, ProtoDef + Field, Enum, EnumVal, ReservedBlock, Reserved, Message, File, Imported, Oneof, Package, ProtoDef, Extend Presence* = enum Singular, Repeated, Optional, Required ProtoNode* = ref object @@ -62,6 +62,9 @@ type definedEnums*: seq[ProtoNode] fields*: seq[ProtoNode] nested*: seq[ProtoNode] + of Extend: + extending*: string + extendedFields*: seq[ProtoNode] of Package: packageName*: string messages*: seq[ProtoNode] @@ -148,6 +151,14 @@ proc `$`*(node: ProtoNode): string = messages &= $message & "\n" data &= messages[0..^2].indent(1, " ") result &= data.indent(1, " ") + of Extend: + result = "Extension of $1 with fields:".format(node.extending) + var data = "" + var fields = "\n" + for field in node.extendedFields: + fields &= $field & "\n" + data &= fields[0..^2].indent(1, " ") + result &= data.indent(1, " ") of File: result = "Protobuf file with syntax $1\n".format( node.syntax) diff --git a/protobuf_serialization/files/proto_parser.nim b/protobuf_serialization/files/proto_parser.nim index 58aeae8..93b76db 100644 --- a/protobuf_serialization/files/proto_parser.nim +++ b/protobuf_serialization/files/proto_parser.nim @@ -29,6 +29,7 @@ proc tokenize(filename, text: string): seq[Token] = comment <- "//" * *(1 - '\n') comment2 <- "/*" * @"*/" + decDigit <- {'0'..'9'} octDigit <- {'0'..'7'} hexDigit <- {'0'..'9', 'a'..'f', 'A'..'F'} octEscape <- '\\' * octDigit[3] @@ -48,9 +49,14 @@ proc tokenize(filename, text: string): seq[Token] = ident <- (Alpha | '_') * *(Alpha | '_' | Digit) fullIdent <- ?'.' * ident * *('.' * ident): res.add Token(typ: Ident, text: $0, filePos: @0) + + decimals <- +decDigit + exponent <- {'e', 'E'} * ?('+' | '-') * decimals + floatLit <- "inf" | "nan" | ((decimals * '.' * ?decimals * ?exponent) | (decimals * exponent) | ('.' * decimals * ?exponent)): + res.add Token(typ: Float, text: $0, filePos: @0) int <- ?('-' | '+') * +(Digit): res.add Token(typ: Integer, text: $0, filePos: @0) - tokens <- *(comment | comment2 | space | string | sym | int | fullIdent) + tokens <- *(comment | comment2 | space | string | sym | floatLit | int | fullIdent) let match = lexer.match(text, result) @@ -104,15 +110,16 @@ proc parseProtoPackage(file: string, toImport: var HashSet[string]): ProtoNode = ident <- [Ident] string <- [String] int <- [Integer] + float <- [Float] pkg <- ["package"] * >ident * [';']: ps.currentPackage = ProtoNode(kind: Package, packageName: ($1).text) - option <- ["option"] * ident * ['='] * (ident | string) * [';'] + option <- ["option"] * ident * ['='] * (ident | string | int | float) * [';'] syntax <- ["syntax"] * ['='] * string * [';'] impor <- ["import"] * >string * [';']: ps.imports.add ProtoNode(kind: Imported, filename: ($1).text) - fieldopt <- ident * ['='] * ident + fieldopt <- ident * ['='] * (ident | int | string | float) fieldopts <- ['['] * fieldopt * *([','] * fieldopt) * [']'] oneoffield <- >ident * >ident * ['='] * >int * ?fieldopts * [';']: @@ -192,7 +199,42 @@ proc parseProtoPackage(file: string, toImport: var HashSet[string]): ProtoNode = number: parseInt(fieldValue), protoType: fieldType, name: fieldName))) - msg <- ["message"] * >ident * ['{'] * *(typedecl | mapfield | oneof2 | msgfield | reserved | extensions) * ['}']: + + # protobuf2 + groupfield <- ?multiple * >["group"] * >ident * ['='] * >int * msgbody: + let fields = ps.fields.extract($0) + ps.messages.add(($0, ProtoNode( + messageName: ($2).text, + kind: Message, + nested: ps.messages.extract($0), + definedEnums: ps.enums.extract($0), + reserved: ps.reservedBlocks.extract($0), + fields: fields + ))) + + let + fieldType = ($2).text + fieldName = ($2).text + fieldValue = ($3).text + let node = ProtoNode( + kind: Field, + number: parseInt(fieldValue), + protoType: fieldType, + name: fieldName) + if @1 != @2: + node.presence = parseEnum[Presence](($0).text.toUpper) + ps.fields.add (($0, node)) + + extend <- ["extend"] * >ident * msgbody: + let fields = ps.fields.extract($0) + ps.messages.add(($0, ProtoNode( + extending: ($1).text, + kind: Extend, + extendedFields: fields + ))) + + msgbody <- ['{'] * *(typedecl | mapfield | oneof2 | msgfield | reserved | extensions | groupfield | option | extend) * ['}'] + msg <- ["message"] * >ident * msgbody: let fields = ps.fields.extract($0) ps.messages.add(($0, ProtoNode( messageName: ($1).text, @@ -203,6 +245,7 @@ proc parseProtoPackage(file: string, toImport: var HashSet[string]): ProtoNode = fields: fields ))) + enumfield <- >ident * ['='] * >int * [';']: let fieldName = ($1).text @@ -218,7 +261,7 @@ proc parseProtoPackage(file: string, toImport: var HashSet[string]): ProtoNode = values: ps.fields.extract($0) ))) typedecl <- (msg | enumdecl) - onething <- (pkg | option | syntax | impor | typedecl) + onething <- (pkg | option | syntax | impor | typedecl | extend) g <- +onething var state = ParseState(currentPackage: ProtoNode(kind: Package)) From 853bfe065eb5e02cfa1e3a4f8058681d820cf4ed Mon Sep 17 00:00:00 2001 From: Ludovic Chenut Date: Tue, 31 Jan 2023 14:04:19 +0100 Subject: [PATCH 07/30] First draft conformance tests --- protobuf_serialization/files/proto_parser.nim | 11 +- .../files/type_generator.nim | 172 ++++++++++++------ 2 files changed, 119 insertions(+), 64 deletions(-) diff --git a/protobuf_serialization/files/proto_parser.nim b/protobuf_serialization/files/proto_parser.nim index 93b76db..facdda5 100644 --- a/protobuf_serialization/files/proto_parser.nim +++ b/protobuf_serialization/files/proto_parser.nim @@ -52,7 +52,8 @@ proc tokenize(filename, text: string): seq[Token] = decimals <- +decDigit exponent <- {'e', 'E'} * ?('+' | '-') * decimals - floatLit <- "inf" | "nan" | ((decimals * '.' * ?decimals * ?exponent) | (decimals * exponent) | ('.' * decimals * ?exponent)): + floatLit <- ((decimals * '.' * ?decimals * ?exponent) | (decimals * exponent) | ('.' * decimals * ?exponent)): + # TODO: find a way to add "inf" and "nan", currently if a Field name starts with nan or inf, it will fail to parse res.add Token(typ: Float, text: $0, filePos: @0) int <- ?('-' | '+') * +(Digit): res.add Token(typ: Integer, text: $0, filePos: @0) @@ -191,7 +192,7 @@ proc parseProtoPackage(file: string, toImport: var HashSet[string]): ProtoNode = ps.fields.add (($0, node)) mapfield <- ["map"] * ['<'] * >ident * [','] * >ident * ['>'] * * >ident * ['='] * >int * ?fieldopts * [';']: let - fieldType = "map<" & ($1).text & ", " & ($2).text & ">" + fieldType = "map<" & ($1).text & "," & ($2).text & ">" fieldName = ($3).text fieldValue = ($4).text ps.fields.add (($0, ProtoNode( @@ -225,7 +226,7 @@ proc parseProtoPackage(file: string, toImport: var HashSet[string]): ProtoNode = node.presence = parseEnum[Presence](($0).text.toUpper) ps.fields.add (($0, node)) - extend <- ["extend"] * >ident * msgbody: + extend2 <- ["extend"] * >ident * msgbody: let fields = ps.fields.extract($0) ps.messages.add(($0, ProtoNode( extending: ($1).text, @@ -233,7 +234,7 @@ proc parseProtoPackage(file: string, toImport: var HashSet[string]): ProtoNode = extendedFields: fields ))) - msgbody <- ['{'] * *(typedecl | mapfield | oneof2 | msgfield | reserved | extensions | groupfield | option | extend) * ['}'] + msgbody <- ['{'] * *(typedecl | mapfield | oneof2 | msgfield | reserved | extensions | groupfield | option | extend2) * ['}'] msg <- ["message"] * >ident * msgbody: let fields = ps.fields.extract($0) ps.messages.add(($0, ProtoNode( @@ -261,7 +262,7 @@ proc parseProtoPackage(file: string, toImport: var HashSet[string]): ProtoNode = values: ps.fields.extract($0) ))) typedecl <- (msg | enumdecl) - onething <- (pkg | option | syntax | impor | typedecl | extend) + onething <- (pkg | option | syntax | impor | typedecl | extend2) g <- +onething var state = ParseState(currentPackage: ProtoNode(kind: Package)) diff --git a/protobuf_serialization/files/type_generator.nim b/protobuf_serialization/files/type_generator.nim index 32ecfc0..f789481 100644 --- a/protobuf_serialization/files/type_generator.nim +++ b/protobuf_serialization/files/type_generator.nim @@ -1,12 +1,76 @@ -import os +import os, algorithm, strutils, tables import macros import decldef -export decldef +export decldef, tables import proto_parser -#Exported for the tests. -proc protoToTypesInternal*(filepath: string): NimNode = +proc getTypeAndPragma(strVal: string): (NimNode, NimNode) = + result[0] = ident(strVal.split('.')[^1]) # TODO: Find a better way to handle namespaces + case strVal: + of "double": + result[0] = ident("float64") + of "int32": + result[1] = ident("pint") + of "int64": + result[1] = ident("pint") + of "uint32": + result[1] = ident("pint") + of "uint64": + result[1] = ident("pint") + of "sint32": + result[1] = ident("sint") + result[0] = ident("int32") + of "sint64": + result[1] = ident("sint") + result[0] = ident("int64") + of "fixed32": + result[1] = ident("fixed") + result[0] = ident("uint32") + of "fixed64": + result[1] = ident("fixed") + result[0] = ident("uint64") + of "sfixed32": + result[1] = ident("fixed") + result[0] = ident("int32") + of "sfixed64": + result[1] = ident("fixed") + result[0] = ident("int64") + of "bytes": + result[0] = newNimNode(nnkBracketExpr).add( + ident("seq"), + ident("byte") + ) + +proc getMessage(name: string, messages: seq[ProtoNode]): ProtoNode = + for msg in messages: + if msg.kind == ProtoType.Extend: + continue + if name == msg.messageName: + return msg + let res = name.getMessage(msg.nested) + if not res.isNil(): + return res + return nil + +proc isNested(base: string, currentName: string, messages: seq[ProtoNode]): bool = + let msg = currentName.getMessage(messages) + if msg.isNil(): + return false + for field in msg.fields: + if field.kind == ProtoType.Field: + if field.presence == Repeated: continue + if base == field.protoType or base.isNested(field.protoType, messages): + return true + elif field.kind == ProtoType.Oneof: + for f in field.oneof: + if f.presence == Repeated: continue + if base == f.protoType or base.isNested(f.protoType, messages): + return true + +# Exported for the tests. +proc protoToTypesInternal*(filepath: string, log: string): NimNode {.compileTime.} = + echo filepath var packages: seq[ProtoNode] = parseProtobuf(filepath).packages queue: seq[ProtoNode] = @[] @@ -23,21 +87,24 @@ proc protoToTypesInternal*(filepath: string): NimNode = name: string value: NimNode if next.kind == ProtoType.Enum: + # TODO: allow_alias + var alreadySeen: seq[int] = @[] name = next.enumName value = newNimNode(nnkEnumTy).add(newEmptyNode()) - for enumField in next.values: + for enumField in next.values.sortedByIt(it.num): + if enumField.num in alreadySeen: + continue + alreadySeen.add(enumField.num) value.add(newNimNode(nnkEnumFieldDef).add( ident(enumField.fieldName), newIntLitNode(enumField.num) )) else: + if next.kind == ProtoType.Extend: + continue if (next.definedEnums.len != 0) or (next.nested.len != 0): - queue.add(next) for nestee in (next.definedEnums & next.nested): queue.add(nestee) - next.definedEnums = @[] - next.nested = @[] - continue name = next.messageName value = newNimNode(nnkObjectTy).add( @@ -45,8 +112,16 @@ proc protoToTypesInternal*(filepath: string): NimNode = newEmptyNode(), newNimNode(nnkRecList) ) - + var fieldsQueue: seq[ProtoNode] = @[] for field in next.fields: + fieldsQueue.add(field) + while fieldsQueue.len != 0: + let field = fieldsQueue.pop() + if field.kind == Oneof: + # TODO: ATM the oneof is ignore. Find a way to make it work + for f in field.oneof: + fieldsQueue.add(f) + continue value[2].add(newNimNode(nnkIdentDefs).add( newNimNode(nnkPragmaExpr).add( newNimNode(nnkPostfix).add( @@ -64,73 +139,52 @@ proc protoToTypesInternal*(filepath: string): NimNode = newEmptyNode() )) - var repeated: int = 0 - if field.presence == Repeated: - repeated = 1 + var isReference = false + for parsed in packages: + if next.messageName.isNested(field.protoType, parsed.messages): + isReference = true + break - case value[2][^1][1].strVal: - of "double": - value[2][^1][0][1].add(ident("pfloat64")) - value[2][^1][1] = ident("float32") - of "float32": - value[2][^1][0][1].add(ident("pfloat32")) - of "int32": - value[2][^1][0][1].add(ident("pint")) - of "int64": - value[2][^1][0][1].add(ident("pint")) - of "uint32": - value[2][^1][0][1].add(ident("pint")) - of "uint64": - value[2][^1][0][1].add(ident("pint")) - of "sint32": - value[2][^1][0][1].add(ident("sint")) - value[2][^1][1] = ident("int32") - of "sint64": - value[2][^1][0][1].add(ident("sint")) - value[2][^1][1] = ident("int64") - of "fixed32": - value[2][^1][0][1].add(ident("fixed")) - value[2][^1][1] = ident("uint32") - of "fixed64": - value[2][^1][0][1].add(ident("fixed")) - value[2][^1][1] = ident("uint64") - of "sfixed32": - value[2][^1][0][1].add(ident("fixed")) - value[2][^1][1] = ident("int32") - of "sfixed64": - value[2][^1][0][1].add(ident("fixed")) - value[2][^1][1] = ident("int64") - of "bool": - discard - of "string": - discard - of "bytes": - repeated += 1 - value[2][^1][1] = ident("byte") + if value[2][^1][1].strVal.startsWith("map<"): + var matches = value[2][^1][1].strVal.split({'<', '>', ','}) + let (typ1, _) = getTypeAndPragma(matches[1]) + let (typ2, _) = getTypeAndPragma(matches[2]) + value[2][^1][1] = nnkBracketExpr.newTree(newIdentNode("Table"), typ1, typ2) + else: + let (typ, pragma) = getTypeAndPragma(value[2][^1][1].strVal) + value[2][^1][1] = typ + if not pragma.isNil(): + value[2][^1][0][1].add(pragma) - for _ in 0 ..< repeated: + if field.presence == Repeated: value[2][^1][1] = newNimNode(nnkBracketExpr).add( ident("seq"), value[2][^1][1] ) - + elif isReference: + value[2][^1][1] = newNimNode(nnkRefTy).add(value[2][^1][1]) if value[2].len == 0: value[2] = newEmptyNode() + result.add( newNimNode(nnkTypeDef).add( newNimNode(nnkPragmaExpr).add( newNimNode(nnkPostfix).add(ident("*"), ident(name)), - newNimNode(nnkPragma).add(ident("proto3")) + if next.kind == ProtoType.Enum: + newNimNode(nnkPragma).add(ident("pure")) + else: + newNimNode(nnkPragma).add(ident("proto3")) ), newEmptyNode(), value ) ) + writeFile(log, repr(result)) -macro protoToTypes*(filepath: static[string]): untyped = - result = protoToTypesInternal(filepath) +macro protoToTypes*(filepath: static[string], log: static[string]): untyped = + result = protoToTypesInternal(filepath, log) -template import_proto3*(file: static[string]): untyped = +template import_proto3*(file: static[string], log: static[string]): untyped = const filepath = parentDir(instantiationInfo(-1, true).filename) / file - protoToTypes(filepath) + protoToTypes(filepath, log) From 0937f9b3941543849845a1acfbfb47f60b997728 Mon Sep 17 00:00:00 2001 From: Ludovic Chenut Date: Mon, 6 Feb 2023 14:15:06 +0100 Subject: [PATCH 08/30] add a lot of stuff --- conformance_nim.nim | 65 +++++++++++++++++++ protobuf_serialization/files/proto_parser.nim | 4 +- protobuf_serialization/internal.nim | 7 +- protobuf_serialization/reader.nim | 20 +++++- protobuf_serialization/writer.nim | 17 ++++- 5 files changed, 107 insertions(+), 6 deletions(-) create mode 100644 conformance_nim.nim diff --git a/conformance_nim.nim b/conformance_nim.nim new file mode 100644 index 0000000..da85bc4 --- /dev/null +++ b/conformance_nim.nim @@ -0,0 +1,65 @@ +import os, sequtils, streams, endians, strutils +import ../minnim/protobuf-ser/protobuf_serialization +import ../minnim/protobuf-ser/protobuf_serialization/files/type_generator +import stew/byteutils +import_proto3 "conformance/conformance.proto", "/tmp/s1.nim" +import test_proto2 +import test_proto3 + +var testCount = 0 +let + inputStream = newFileStream(stdin) + outputStream = newFileStream(stdout) + +proc readIntLE(s: Stream): int32 = + let v = s.readInt32() + var x: int32 + littleEndian32(addr(result), addr(v)) + bigEndian32(addr(x), addr(v)) + +proc writeIntLE(s: Stream, value: int32) = + var value = value + var buf: int32 + littleEndian32(addr(buf), addr(value)) + s.write(buf) + +proc doTestIO(): bool = + let length = inputStream.readIntLE() + var serializedRequestChar = newSeq[char](length) + if stdin.readChars(serializedRequestChar) != length: + raise newException(IOError, "IProtobuf./O error") + let serializedRequest = serializedRequestChar.mapIt(it.ord().byte) +# stderr.writeLine("=> ", length, " <", serializedRequest.foldl(if a == "": toHex(b) else: a & " " & toHex(b), ""), ">") +# stderr.writeLine("pouf: ", serializedRequest) + let request = Protobuf.decode(serializedRequest, ConformanceRequest) +# stderr.writeLine("decoded => ", request) + var response = ConformanceResponse() + if request.requested_output_format != WireFormat.PROTOBUF or + request.protobuf_payload.len() == 0: + response.skipped = "skip not protobuf" + else: + try: + #if request.message_type == "protobuf_test_messages.proto3.TestAllTypesProto3": + if request.message_type == "protobuf_test_messages.proto3.TestAllTypesProto3": + #stderr.writeLine("TYYYYYPE: ", type(request.protobuf_payload)) + stderr.writeLine("TADA") + let xx: seq[byte] = request.protobuf_payload + let payload = Protobuf.decode(xx, TestAllTypesProto3) + response.protobuf_payload = Protobuf.encode(payload) + else: + response.skipped = "skip" + except Exception as exc: + response.runtime_error = exc.msg + let serializedResponse = Protobuf.encode(response) + #stderr.writeLine("Output response: " & $response, serializedResponse) + outputStream.writeIntLE(serializedResponse.len().int32) + outputStream.write(string.fromBytes(serializedResponse)) + outputStream.flush() + testCount.inc() + return true + +while true: + if not doTestIO(): + stderr.writeLine("conformance_nim: received EOF from test runner after ", + testCount, " tests, exiting") + break diff --git a/protobuf_serialization/files/proto_parser.nim b/protobuf_serialization/files/proto_parser.nim index facdda5..ba79f63 100644 --- a/protobuf_serialization/files/proto_parser.nim +++ b/protobuf_serialization/files/proto_parser.nim @@ -104,8 +104,8 @@ proc extract(x: var seq[(Token, ProtoNode)], s: Token): seq[ProtoNode] = proc parseProtoPackage(file: string, toImport: var HashSet[string]): ProtoNode = let fileContent = file.readFile - fileName = file.extractFilename - tokens = tokenize(fileName, fileContent) + filename = file.extractFilename + tokens = tokenize(filename, fileContent) let parser = peg(g, Token, ps: ParseState): ident <- [Ident] diff --git a/protobuf_serialization/internal.nim b/protobuf_serialization/internal.nim index 3266318..d1e1e15 100644 --- a/protobuf_serialization/internal.nim +++ b/protobuf_serialization/internal.nim @@ -1,6 +1,6 @@ #Variables needed by the Reader and Writer which should NOT be exported outside of this library. -import std/[options, sets] +import std/[options, sets, tables] import stew/shims/macros #Depending on the situation, one of these two are used. #Sometimes, one works where the other doesn't. @@ -123,6 +123,8 @@ template protoType*(InnerType, RootType, FieldType: untyped, fieldName: untyped) type InnerType = UnsupportedType[FieldType, RootType, fieldName] template elementType[T](_: type seq[T]): type = typeof(T) +template elementTypeKey[K, V](_: type Table[K, V]): type = typeof(K) +template elementTypeVal[K, V](_: type Table[K, V]): type = typeof(V) func verifySerializable*[T](ty: typedesc[T]) {.compileTime.} = type FlatType = flatType(default(T)) @@ -131,6 +133,9 @@ func verifySerializable*[T](ty: typedesc[T]) {.compileTime.} = elif FlatType is seq: when FlatType isnot seq[byte]: verifySerializable(elementType(FlatType)) + elif FlatType is Table: + verifySerializable(elementTypeKey(FlatType)) + verifySerializable(elementTypeVal(FlatType)) elif FlatType is object and T isnot PBOption: var inst: T diff --git a/protobuf_serialization/reader.nim b/protobuf_serialization/reader.nim index 08a3b1f..2ddbf89 100644 --- a/protobuf_serialization/reader.nim +++ b/protobuf_serialization/reader.nim @@ -1,7 +1,7 @@ #Parses the Protobuf binary wire protocol into the specified type. import - std/[typetraits, sets], + std/[typetraits, sets, tables], stew/assign2, stew/objects, stew/shims/macros, @@ -23,7 +23,7 @@ template requireKind(header: FieldHeader, expected: WireKind) = msg: "Unexpected data kind " & $(header.number()) & ": " & $header.kind() & ", exprected " & $expected) -proc readFieldInto[T: object]( +proc readFieldInto[T: object and not Table]( stream: InputStream, value: var T, header: FieldHeader, @@ -43,6 +43,22 @@ proc readFieldInto[T: object]( raise (ref ValueError)(msg: "not enough bytes") memoryInput(tmp).readValueInternal(value) +proc readFieldInto[K, V]( + stream: InputStream, + value: var Table[K, V], + header: FieldHeader, + ProtoType: type +) = + # TODO: Makes it a proto3 exclusive + # This is certainly not the best way to do it, but nobody cares about map + type + TableObject {.proto3.} = object + key {.fieldNumber: 1.}: K + value {.fieldNumber: 2.}: V + var tmp = default(TableObject) + stream.readFieldInto(tmp, header, ProtoType) + value[tmp.key] = tmp.value + proc readFieldInto[T: enum]( stream: InputStream, value: var T, diff --git a/protobuf_serialization/writer.nim b/protobuf_serialization/writer.nim index 2418cc5..cd4e5f9 100644 --- a/protobuf_serialization/writer.nim +++ b/protobuf_serialization/writer.nim @@ -1,7 +1,7 @@ #Writes the specified type into a buffer using the Protobuf binary wire format. import - std/typetraits, + std/[typetraits, tables], stew/shims/macros, stew/objects, faststreams/outputs, @@ -74,6 +74,21 @@ proc writeFieldPacked*[T: not byte, ProtoType: SomePrimitive]( for value in values: output.write(toBytes(ProtoType(value))) +proc writeField*[K, V]( + stream: OutputStream, + fieldNum: int, + value: Table[K, V], + ProtoType: type +) = + type + TableObject {.proto3.} = object + key {.fieldNumber: 1.}: K + value {.fieldNumber: 2.}: V + for k, v in value.pairs(): + let tmp = TableObject(key: k, value: v) + #protoType(p, TableObject, FlatType, "") + stream.writeField(fieldNum, tmp, ProtoType) + proc writeValue*[T: object](stream: OutputStream, value: T) = const isProto2: bool = T.isProto2() From 3fbaa989bdc8e8dd50bc181c9bccbfca3f3f25c8 Mon Sep 17 00:00:00 2001 From: Ludovic Chenut Date: Mon, 6 Feb 2023 14:21:34 +0100 Subject: [PATCH 09/30] adding conformance protofiles --- conformance.proto | 180 ++++++++++++++++++++++ conformance_nim.nim | 6 +- test_messages_proto2.proto | 303 +++++++++++++++++++++++++++++++++++++ test_messages_proto3.proto | 288 +++++++++++++++++++++++++++++++++++ test_proto2.nim | 3 + test_proto3.nim | 3 + 6 files changed, 780 insertions(+), 3 deletions(-) create mode 100644 conformance.proto create mode 100644 test_messages_proto2.proto create mode 100644 test_messages_proto3.proto create mode 100644 test_proto2.nim create mode 100644 test_proto3.nim diff --git a/conformance.proto b/conformance.proto new file mode 100644 index 0000000..bee04d1 --- /dev/null +++ b/conformance.proto @@ -0,0 +1,180 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +package conformance; + +option java_package = "com.google.protobuf.conformance"; +option objc_class_prefix = "Conformance"; + +// This defines the conformance testing protocol. This protocol exists between +// the conformance test suite itself and the code being tested. For each test, +// the suite will send a ConformanceRequest message and expect a +// ConformanceResponse message. +// +// You can either run the tests in two different ways: +// +// 1. in-process (using the interface in conformance_test.h). +// +// 2. as a sub-process communicating over a pipe. Information about how to +// do this is in conformance_test_runner.cc. +// +// Pros/cons of the two approaches: +// +// - running as a sub-process is much simpler for languages other than C/C++. +// +// - running as a sub-process may be more tricky in unusual environments like +// iOS apps, where fork/stdin/stdout are not available. + +enum WireFormat { + UNSPECIFIED = 0; + PROTOBUF = 1; + JSON = 2; + JSPB = 3; // Only used inside Google. Opensource testees just skip it. + TEXT_FORMAT = 4; +} + +enum TestCategory { + UNSPECIFIED_TEST = 0; + BINARY_TEST = 1; // Test binary wire format. + JSON_TEST = 2; // Test json wire format. + // Similar to JSON_TEST. However, during parsing json, testee should ignore + // unknown fields. This feature is optional. Each implementation can decide + // whether to support it. See + // https://developers.google.com/protocol-buffers/docs/proto3#json_options + // for more detail. + JSON_IGNORE_UNKNOWN_PARSING_TEST = 3; + // Test jspb wire format. Only used inside Google. Opensource testees just + // skip it. + JSPB_TEST = 4; + // Test text format. For cpp, java and python, testees can already deal with + // this type. Testees of other languages can simply skip it. + TEXT_FORMAT_TEST = 5; +} + +// The conformance runner will request a list of failures as the first request. +// This will be known by message_type == "conformance.FailureSet", a conformance +// test should return a serialized FailureSet in protobuf_payload. +message FailureSet { + repeated string failure = 1; +} + +// Represents a single test case's input. The testee should: +// +// 1. parse this proto (which should always succeed) +// 2. parse the protobuf or JSON payload in "payload" (which may fail) +// 3. if the parse succeeded, serialize the message in the requested format. +message ConformanceRequest { + // The payload (whether protobuf of JSON) is always for a + // protobuf_test_messages.proto3.TestAllTypes proto (as defined in + // src/google/protobuf/proto3_test_messages.proto). + oneof payload { + bytes protobuf_payload = 1; + string json_payload = 2; + // Only used inside Google. Opensource testees just skip it. + string jspb_payload = 7; + string text_payload = 8; + } + + // Which format should the testee serialize its message to? + WireFormat requested_output_format = 3; + + // The full name for the test message to use; for the moment, either: + // protobuf_test_messages.proto3.TestAllTypesProto3 or + // protobuf_test_messages.google.protobuf.TestAllTypesProto2. + string message_type = 4; + + // Each test is given a specific test category. Some category may need + // specific support in testee programs. Refer to the definition of + // TestCategory for more information. + TestCategory test_category = 5; + + // Specify details for how to encode jspb. + JspbEncodingConfig jspb_encoding_options = 6; + + // This can be used in json and text format. If true, testee should print + // unknown fields instead of ignore. This feature is optional. + bool print_unknown_fields = 9; +} + +// Represents a single test case's output. +message ConformanceResponse { + oneof result { + // This string should be set to indicate parsing failed. The string can + // provide more information about the parse error if it is available. + // + // Setting this string does not necessarily mean the testee failed the + // test. Some of the test cases are intentionally invalid input. + string parse_error = 1; + + // If the input was successfully parsed but errors occurred when + // serializing it to the requested output format, set the error message in + // this field. + string serialize_error = 6; + + // This should be set if the test program timed out. The string should + // provide more information about what the child process was doing when it + // was killed. + string timeout_error = 9; + + // This should be set if some other error occurred. This will always + // indicate that the test failed. The string can provide more information + // about the failure. + string runtime_error = 2; + + // If the input was successfully parsed and the requested output was + // protobuf, serialize it to protobuf and set it in this field. + bytes protobuf_payload = 3; + + // If the input was successfully parsed and the requested output was JSON, + // serialize to JSON and set it in this field. + string json_payload = 4; + + // For when the testee skipped the test, likely because a certain feature + // wasn't supported, like JSON input/output. + string skipped = 5; + + // If the input was successfully parsed and the requested output was JSPB, + // serialize to JSPB and set it in this field. JSPB is only used inside + // Google. Opensource testees can just skip it. + string jspb_payload = 7; + + // If the input was successfully parsed and the requested output was + // TEXT_FORMAT, serialize to TEXT_FORMAT and set it in this field. + string text_payload = 8; + } +} + +// Encoding options for jspb format. +message JspbEncodingConfig { + // Encode the value field of Any as jspb array if true, otherwise binary. + bool use_jspb_array_any_format = 1; +} diff --git a/conformance_nim.nim b/conformance_nim.nim index da85bc4..cfe18a3 100644 --- a/conformance_nim.nim +++ b/conformance_nim.nim @@ -1,8 +1,8 @@ import os, sequtils, streams, endians, strutils -import ../minnim/protobuf-ser/protobuf_serialization -import ../minnim/protobuf-ser/protobuf_serialization/files/type_generator +import protobuf_serialization +import protobuf_serialization/files/type_generator import stew/byteutils -import_proto3 "conformance/conformance.proto", "/tmp/s1.nim" +import_proto3 "conformance.proto", "/tmp/s1.nim" import test_proto2 import test_proto3 diff --git a/test_messages_proto2.proto b/test_messages_proto2.proto new file mode 100644 index 0000000..1cc7c86 --- /dev/null +++ b/test_messages_proto2.proto @@ -0,0 +1,303 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Test schema for proto2 messages. This test schema is used by: +// +// - conformance tests +// + +// LINT: ALLOW_GROUPS + +syntax = "proto2"; + +package protobuf_test_messages.proto2; + +option java_package = "com.google.protobuf_test_messages.proto2"; +option objc_class_prefix = "Proto2"; + +// This is the default, but we specify it here explicitly. +option optimize_for = SPEED; + +option cc_enable_arenas = true; + +// This proto includes every type of field in both singular and repeated +// forms. +// +// Also, crucially, all messages and enums in this file are eventually +// submessages of this message. So for example, a fuzz test of TestAllTypes +// could trigger bugs that occur in any message type in this file. We verify +// this stays true in a unit test. +message TestAllTypesProto2 { + message NestedMessage { + optional int32 a = 1; + optional TestAllTypesProto2 corecursive = 2; + } + + enum NestedEnum { + FOO = 0; + BAR = 1; + BAZ = 2; + NEG = -1; // Intentionally negative. + } + + // Singular + optional int32 optional_int32 = 1; + optional int64 optional_int64 = 2; + optional uint32 optional_uint32 = 3; + optional uint64 optional_uint64 = 4; + optional sint32 optional_sint32 = 5; + optional sint64 optional_sint64 = 6; + optional fixed32 optional_fixed32 = 7; + optional fixed64 optional_fixed64 = 8; + optional sfixed32 optional_sfixed32 = 9; + optional sfixed64 optional_sfixed64 = 10; + optional float optional_float = 11; + optional double optional_double = 12; + optional bool optional_bool = 13; + optional string optional_string = 14; + optional bytes optional_bytes = 15; + + optional NestedMessage optional_nested_message = 18; + optional ForeignMessageProto2 optional_foreign_message = 19; + + optional NestedEnum optional_nested_enum = 21; + optional ForeignEnumProto2 optional_foreign_enum = 22; + + optional string optional_string_piece = 24 [ctype = STRING_PIECE]; + optional string optional_cord = 25 [ctype = CORD]; + + optional TestAllTypesProto2 recursive_message = 27; + + // Repeated + repeated int32 repeated_int32 = 31; + repeated int64 repeated_int64 = 32; + repeated uint32 repeated_uint32 = 33; + repeated uint64 repeated_uint64 = 34; + repeated sint32 repeated_sint32 = 35; + repeated sint64 repeated_sint64 = 36; + repeated fixed32 repeated_fixed32 = 37; + repeated fixed64 repeated_fixed64 = 38; + repeated sfixed32 repeated_sfixed32 = 39; + repeated sfixed64 repeated_sfixed64 = 40; + repeated float repeated_float = 41; + repeated double repeated_double = 42; + repeated bool repeated_bool = 43; + repeated string repeated_string = 44; + repeated bytes repeated_bytes = 45; + + repeated NestedMessage repeated_nested_message = 48; + repeated ForeignMessageProto2 repeated_foreign_message = 49; + + repeated NestedEnum repeated_nested_enum = 51; + repeated ForeignEnumProto2 repeated_foreign_enum = 52; + + repeated string repeated_string_piece = 54 [ctype = STRING_PIECE]; + repeated string repeated_cord = 55 [ctype = CORD]; + + // Packed + repeated int32 packed_int32 = 75 [packed = true]; + repeated int64 packed_int64 = 76 [packed = true]; + repeated uint32 packed_uint32 = 77 [packed = true]; + repeated uint64 packed_uint64 = 78 [packed = true]; + repeated sint32 packed_sint32 = 79 [packed = true]; + repeated sint64 packed_sint64 = 80 [packed = true]; + repeated fixed32 packed_fixed32 = 81 [packed = true]; + repeated fixed64 packed_fixed64 = 82 [packed = true]; + repeated sfixed32 packed_sfixed32 = 83 [packed = true]; + repeated sfixed64 packed_sfixed64 = 84 [packed = true]; + repeated float packed_float = 85 [packed = true]; + repeated double packed_double = 86 [packed = true]; + repeated bool packed_bool = 87 [packed = true]; + repeated NestedEnum packed_nested_enum = 88 [packed = true]; + + // Unpacked + repeated int32 unpacked_int32 = 89 [packed = false]; + repeated int64 unpacked_int64 = 90 [packed = false]; + repeated uint32 unpacked_uint32 = 91 [packed = false]; + repeated uint64 unpacked_uint64 = 92 [packed = false]; + repeated sint32 unpacked_sint32 = 93 [packed = false]; + repeated sint64 unpacked_sint64 = 94 [packed = false]; + repeated fixed32 unpacked_fixed32 = 95 [packed = false]; + repeated fixed64 unpacked_fixed64 = 96 [packed = false]; + repeated sfixed32 unpacked_sfixed32 = 97 [packed = false]; + repeated sfixed64 unpacked_sfixed64 = 98 [packed = false]; + repeated float unpacked_float = 99 [packed = false]; + repeated double unpacked_double = 100 [packed = false]; + repeated bool unpacked_bool = 101 [packed = false]; + repeated NestedEnum unpacked_nested_enum = 102 [packed = false]; + + // Map + map map_int32_int32 = 56; + map map_int64_int64 = 57; + map map_uint32_uint32 = 58; + map map_uint64_uint64 = 59; + map map_sint32_sint32 = 60; + map map_sint64_sint64 = 61; + map map_fixed32_fixed32 = 62; + map map_fixed64_fixed64 = 63; + map map_sfixed32_sfixed32 = 64; + map map_sfixed64_sfixed64 = 65; + map map_int32_float = 66; + map map_int32_double = 67; + map map_bool_bool = 68; + map map_string_string = 69; + map map_string_bytes = 70; + map map_string_nested_message = 71; + map map_string_foreign_message = 72; + map map_string_nested_enum = 73; + map map_string_foreign_enum = 74; + + oneof oneof_field { + uint32 oneof_uint32 = 111; + NestedMessage oneof_nested_message = 112; + string oneof_string = 113; + bytes oneof_bytes = 114; + bool oneof_bool = 115; + uint64 oneof_uint64 = 116; + float oneof_float = 117; + double oneof_double = 118; + NestedEnum oneof_enum = 119; + } + + // extensions + extensions 120 to 200; + + // groups + optional group Data = 201 { + optional int32 group_int32 = 202; + optional uint32 group_uint32 = 203; + } + + // default values + optional int32 default_int32 = 241 [default = -123456789]; + optional int64 default_int64 = 242 [default = -9123456789123456789]; + optional uint32 default_uint32 = 243 [default = 2123456789]; + optional uint64 default_uint64 = 244 [default = 10123456789123456789]; + optional sint32 default_sint32 = 245 [default = -123456789]; + optional sint64 default_sint64 = 246 [default = -9123456789123456789]; + optional fixed32 default_fixed32 = 247 [default = 2123456789]; + optional fixed64 default_fixed64 = 248 [default = 10123456789123456789]; + optional sfixed32 default_sfixed32 = 249 [default = -123456789]; + optional sfixed64 default_sfixed64 = 250 [default = -9123456789123456789]; + optional float default_float = 251 [default = 9e9]; + optional double default_double = 252 [default = 7e22]; + optional bool default_bool = 253 [default = true]; + optional string default_string = 254 [default = "Rosebud"]; + optional bytes default_bytes = 255 [default = "joshua"]; + + // Test field-name-to-JSON-name convention. + // (protobuf says names can be any valid C/C++ identifier.) + optional int32 fieldname1 = 401; + optional int32 field_name2 = 402; + optional int32 _field_name3 = 403; + optional int32 field__name4_ = 404; + optional int32 field0name5 = 405; + optional int32 field_0_name6 = 406; + optional int32 fieldName7 = 407; + optional int32 FieldName8 = 408; + optional int32 field_Name9 = 409; + optional int32 Field_Name10 = 410; + optional int32 FIELD_NAME11 = 411; + optional int32 FIELD_name12 = 412; + optional int32 __field_name13 = 413; + optional int32 __Field_name14 = 414; + optional int32 field__name15 = 415; + optional int32 field__Name16 = 416; + optional int32 field_name17__ = 417; + optional int32 Field_name18__ = 418; + + // Reserved for unknown fields test. + reserved 1000 to 9999; + + // message_set test case. + message MessageSetCorrect { + option message_set_wire_format = true; + + extensions 4 to max; + } + + message MessageSetCorrectExtension1 { + extend MessageSetCorrect { + optional MessageSetCorrectExtension1 message_set_extension = 1547769; + } + optional string str = 25; + } + + message MessageSetCorrectExtension2 { + extend MessageSetCorrect { + optional MessageSetCorrectExtension2 message_set_extension = 4135312; + } + optional int32 i = 9; + } +} + +message ForeignMessageProto2 { + optional int32 c = 1; +} + +enum ForeignEnumProto2 { + FOREIGN_FOO = 0; + FOREIGN_BAR = 1; + FOREIGN_BAZ = 2; +} + +extend TestAllTypesProto2 { + optional int32 extension_int32 = 120; +} + +message UnknownToTestAllTypes { + optional int32 optional_int32 = 1001; + optional string optional_string = 1002; + optional ForeignMessageProto2 nested_message = 1003; + optional group OptionalGroup = 1004 { + optional int32 a = 1; + } + optional bool optional_bool = 1006; + repeated int32 repeated_int32 = 1011; +} + +message NullHypothesisProto2 {} + +message EnumOnlyProto2 { + enum Bool { + kFalse = 0; + kTrue = 1; + } +} + +message OneStringProto2 { + optional string data = 1; +} + +message ProtoWithKeywords { + optional int32 inline = 1; + optional string concept = 2; + repeated string requires = 3; +} diff --git a/test_messages_proto3.proto b/test_messages_proto3.proto new file mode 100644 index 0000000..1e1285e --- /dev/null +++ b/test_messages_proto3.proto @@ -0,0 +1,288 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Test schema for proto3 messages. This test schema is used by: +// +// - benchmarks +// - fuzz tests +// - conformance tests +// + +syntax = "proto3"; + +package protobuf_test_messages.proto3; + +option java_package = "com.google.protobuf_test_messages.proto3"; +option objc_class_prefix = "Proto3"; + +// This is the default, but we specify it here explicitly. +option optimize_for = SPEED; + +import "google/protobuf/any.proto"; +import "google/protobuf/duration.proto"; +import "google/protobuf/field_mask.proto"; +import "google/protobuf/struct.proto"; +import "google/protobuf/timestamp.proto"; +import "google/protobuf/wrappers.proto"; + +option cc_enable_arenas = true; + +// This proto includes every type of field in both singular and repeated +// forms. +// +// Also, crucially, all messages and enums in this file are eventually +// submessages of this message. So for example, a fuzz test of TestAllTypes +// could trigger bugs that occur in any message type in this file. We verify +// this stays true in a unit test. +message TestAllTypesProto3 { + message NestedMessage { + int32 a = 1; + TestAllTypesProto3 corecursive = 2; + } + + enum NestedEnum { + FOO = 0; + BAR = 1; + BAZ = 2; + NEG = -1; // Intentionally negative. + } + + enum AliasedEnum { + option allow_alias = true; + + ALIAS_FOO = 0; + ALIAS_BAR = 1; + ALIAS_BAZ = 2; + MOO = 2; + moo = 2; + bAz = 2; + } + + // Singular + int32 optional_int32 = 1; + int64 optional_int64 = 2; + uint32 optional_uint32 = 3; + uint64 optional_uint64 = 4; + sint32 optional_sint32 = 5; + sint64 optional_sint64 = 6; + fixed32 optional_fixed32 = 7; + fixed64 optional_fixed64 = 8; + sfixed32 optional_sfixed32 = 9; + sfixed64 optional_sfixed64 = 10; + float optional_float = 11; + double optional_double = 12; + bool optional_bool = 13; + string optional_string = 14; + bytes optional_bytes = 15; + + NestedMessage optional_nested_message = 18; + ForeignMessage optional_foreign_message = 19; + + NestedEnum optional_nested_enum = 21; + ForeignEnum optional_foreign_enum = 22; + AliasedEnum optional_aliased_enum = 23; + + string optional_string_piece = 24 [ctype = STRING_PIECE]; + string optional_cord = 25 [ctype = CORD]; + + TestAllTypesProto3 recursive_message = 27; + + // Repeated + repeated int32 repeated_int32 = 31; + repeated int64 repeated_int64 = 32; + repeated uint32 repeated_uint32 = 33; + repeated uint64 repeated_uint64 = 34; + repeated sint32 repeated_sint32 = 35; + repeated sint64 repeated_sint64 = 36; + repeated fixed32 repeated_fixed32 = 37; + repeated fixed64 repeated_fixed64 = 38; + repeated sfixed32 repeated_sfixed32 = 39; + repeated sfixed64 repeated_sfixed64 = 40; + repeated float repeated_float = 41; + repeated double repeated_double = 42; + repeated bool repeated_bool = 43; + repeated string repeated_string = 44; + repeated bytes repeated_bytes = 45; + + repeated NestedMessage repeated_nested_message = 48; + repeated ForeignMessage repeated_foreign_message = 49; + + repeated NestedEnum repeated_nested_enum = 51; + repeated ForeignEnum repeated_foreign_enum = 52; + + repeated string repeated_string_piece = 54 [ctype = STRING_PIECE]; + repeated string repeated_cord = 55 [ctype = CORD]; + + // Packed + repeated int32 packed_int32 = 75 [packed = true]; + repeated int64 packed_int64 = 76 [packed = true]; + repeated uint32 packed_uint32 = 77 [packed = true]; + repeated uint64 packed_uint64 = 78 [packed = true]; + repeated sint32 packed_sint32 = 79 [packed = true]; + repeated sint64 packed_sint64 = 80 [packed = true]; + repeated fixed32 packed_fixed32 = 81 [packed = true]; + repeated fixed64 packed_fixed64 = 82 [packed = true]; + repeated sfixed32 packed_sfixed32 = 83 [packed = true]; + repeated sfixed64 packed_sfixed64 = 84 [packed = true]; + repeated float packed_float = 85 [packed = true]; + repeated double packed_double = 86 [packed = true]; + repeated bool packed_bool = 87 [packed = true]; + repeated NestedEnum packed_nested_enum = 88 [packed = true]; + + // Unpacked + repeated int32 unpacked_int32 = 89 [packed = false]; + repeated int64 unpacked_int64 = 90 [packed = false]; + repeated uint32 unpacked_uint32 = 91 [packed = false]; + repeated uint64 unpacked_uint64 = 92 [packed = false]; + repeated sint32 unpacked_sint32 = 93 [packed = false]; + repeated sint64 unpacked_sint64 = 94 [packed = false]; + repeated fixed32 unpacked_fixed32 = 95 [packed = false]; + repeated fixed64 unpacked_fixed64 = 96 [packed = false]; + repeated sfixed32 unpacked_sfixed32 = 97 [packed = false]; + repeated sfixed64 unpacked_sfixed64 = 98 [packed = false]; + repeated float unpacked_float = 99 [packed = false]; + repeated double unpacked_double = 100 [packed = false]; + repeated bool unpacked_bool = 101 [packed = false]; + repeated NestedEnum unpacked_nested_enum = 102 [packed = false]; + + // Map + map map_int32_int32 = 56; + map map_int64_int64 = 57; + map map_uint32_uint32 = 58; + map map_uint64_uint64 = 59; + map map_sint32_sint32 = 60; + map map_sint64_sint64 = 61; + map map_fixed32_fixed32 = 62; + map map_fixed64_fixed64 = 63; + map map_sfixed32_sfixed32 = 64; + map map_sfixed64_sfixed64 = 65; + map map_int32_float = 66; + map map_int32_double = 67; + map map_bool_bool = 68; + map map_string_string = 69; + map map_string_bytes = 70; + map map_string_nested_message = 71; + map map_string_foreign_message = 72; + map map_string_nested_enum = 73; + map map_string_foreign_enum = 74; + + oneof oneof_field { + uint32 oneof_uint32 = 111; + NestedMessage oneof_nested_message = 112; + string oneof_string = 113; + bytes oneof_bytes = 114; + bool oneof_bool = 115; + uint64 oneof_uint64 = 116; + float oneof_float = 117; + double oneof_double = 118; + NestedEnum oneof_enum = 119; + google.protobuf.NullValue oneof_null_value = 120; + } + + // Well-known types + google.protobuf.BoolValue optional_bool_wrapper = 201; + google.protobuf.Int32Value optional_int32_wrapper = 202; + google.protobuf.Int64Value optional_int64_wrapper = 203; + google.protobuf.UInt32Value optional_uint32_wrapper = 204; + google.protobuf.UInt64Value optional_uint64_wrapper = 205; + google.protobuf.FloatValue optional_float_wrapper = 206; + google.protobuf.DoubleValue optional_double_wrapper = 207; + google.protobuf.StringValue optional_string_wrapper = 208; + google.protobuf.BytesValue optional_bytes_wrapper = 209; + + repeated google.protobuf.BoolValue repeated_bool_wrapper = 211; + repeated google.protobuf.Int32Value repeated_int32_wrapper = 212; + repeated google.protobuf.Int64Value repeated_int64_wrapper = 213; + repeated google.protobuf.UInt32Value repeated_uint32_wrapper = 214; + repeated google.protobuf.UInt64Value repeated_uint64_wrapper = 215; + repeated google.protobuf.FloatValue repeated_float_wrapper = 216; + repeated google.protobuf.DoubleValue repeated_double_wrapper = 217; + repeated google.protobuf.StringValue repeated_string_wrapper = 218; + repeated google.protobuf.BytesValue repeated_bytes_wrapper = 219; + + google.protobuf.Duration optional_duration = 301; + google.protobuf.Timestamp optional_timestamp = 302; + google.protobuf.FieldMask optional_field_mask = 303; + google.protobuf.Struct optional_struct = 304; + google.protobuf.Any optional_any = 305; + google.protobuf.Value optional_value = 306; + google.protobuf.NullValue optional_null_value = 307; + + repeated google.protobuf.Duration repeated_duration = 311; + repeated google.protobuf.Timestamp repeated_timestamp = 312; + repeated google.protobuf.FieldMask repeated_fieldmask = 313; + repeated google.protobuf.Struct repeated_struct = 324; + repeated google.protobuf.Any repeated_any = 315; + repeated google.protobuf.Value repeated_value = 316; + repeated google.protobuf.ListValue repeated_list_value = 317; + + // Test field-name-to-JSON-name convention. + // (protobuf says names can be any valid C/C++ identifier.) + int32 fieldname1 = 401; + int32 field_name2 = 402; + int32 _field_name3 = 403; + int32 field__name4_ = 404; + int32 field0name5 = 405; + int32 field_0_name6 = 406; + int32 fieldName7 = 407; + int32 FieldName8 = 408; + int32 field_Name9 = 409; + int32 Field_Name10 = 410; + int32 FIELD_NAME11 = 411; + int32 FIELD_name12 = 412; + int32 __field_name13 = 413; + int32 __Field_name14 = 414; + int32 field__name15 = 415; + int32 field__Name16 = 416; + int32 field_name17__ = 417; + int32 Field_name18__ = 418; + + // Reserved for testing unknown fields + reserved 501 to 510; +} + +message ForeignMessage { + int32 c = 1; +} + +enum ForeignEnum { + FOREIGN_FOO = 0; + FOREIGN_BAR = 1; + FOREIGN_BAZ = 2; +} + +message NullHypothesisProto3 {} + +message EnumOnlyProto3 { + enum Bool { + kFalse = 0; + kTrue = 1; + } +} diff --git a/test_proto2.nim b/test_proto2.nim new file mode 100644 index 0000000..6ba9437 --- /dev/null +++ b/test_proto2.nim @@ -0,0 +1,3 @@ +import protobuf_serialization +import protobuf_serialization/files/type_generator +import_proto3 "test_messages_proto2.proto", "/tmp/s2.nim" diff --git a/test_proto3.nim b/test_proto3.nim new file mode 100644 index 0000000..e8fccba --- /dev/null +++ b/test_proto3.nim @@ -0,0 +1,3 @@ +import protobuf_serialization +import protobuf_serialization/files/type_generator +import_proto3 "test_messages_proto3.proto", "/tmp/s3.nim" From e06f8264d77a77dff749f975d41af9dce96016a8 Mon Sep 17 00:00:00 2001 From: Ludovic Chenut Date: Thu, 9 Feb 2023 12:42:03 +0100 Subject: [PATCH 10/30] add table/ref and clear conformance_nim --- conformance_nim.nim | 64 +++++++------------ protobuf_serialization/codec.nim | 2 + .../files/type_generator.nim | 1 - protobuf_serialization/internal.nim | 16 +++-- protobuf_serialization/reader.nim | 34 +++++++--- protobuf_serialization/writer.nim | 36 +++++++++-- 6 files changed, 93 insertions(+), 60 deletions(-) diff --git a/conformance_nim.nim b/conformance_nim.nim index cfe18a3..e90dd42 100644 --- a/conformance_nim.nim +++ b/conformance_nim.nim @@ -1,4 +1,4 @@ -import os, sequtils, streams, endians, strutils +import os import protobuf_serialization import protobuf_serialization/files/type_generator import stew/byteutils @@ -6,60 +6,42 @@ import_proto3 "conformance.proto", "/tmp/s1.nim" import test_proto2 import test_proto3 -var testCount = 0 -let - inputStream = newFileStream(stdin) - outputStream = newFileStream(stdout) +proc readIntLE(): int32 = + if stdin.readBuffer(addr(result), 4) != 4: + raise newException(IOError, "readInt error") -proc readIntLE(s: Stream): int32 = - let v = s.readInt32() - var x: int32 - littleEndian32(addr(result), addr(v)) - bigEndian32(addr(x), addr(v)) +proc writeIntLE(v: int32) = + var value = v + if stdout.writeBuffer(addr(value), 4) != 4: + raise newException(IOError, "writeInt error") -proc writeIntLE(s: Stream, value: int32) = - var value = value - var buf: int32 - littleEndian32(addr(buf), addr(value)) - s.write(buf) +while true: + let length = readIntLE() -proc doTestIO(): bool = - let length = inputStream.readIntLE() - var serializedRequestChar = newSeq[char](length) - if stdin.readChars(serializedRequestChar) != length: + var serializedRequest = newSeq[byte](length) + if stdin.readBuffer(addr(serializedRequest[0]), length) != length: raise newException(IOError, "IProtobuf./O error") - let serializedRequest = serializedRequestChar.mapIt(it.ord().byte) -# stderr.writeLine("=> ", length, " <", serializedRequest.foldl(if a == "": toHex(b) else: a & " " & toHex(b), ""), ">") -# stderr.writeLine("pouf: ", serializedRequest) + let request = Protobuf.decode(serializedRequest, ConformanceRequest) -# stderr.writeLine("decoded => ", request) + var response = ConformanceResponse() + if request.requested_output_format != WireFormat.PROTOBUF or request.protobuf_payload.len() == 0: response.skipped = "skip not protobuf" else: try: - #if request.message_type == "protobuf_test_messages.proto3.TestAllTypesProto3": if request.message_type == "protobuf_test_messages.proto3.TestAllTypesProto3": - #stderr.writeLine("TYYYYYPE: ", type(request.protobuf_payload)) - stderr.writeLine("TADA") - let xx: seq[byte] = request.protobuf_payload - let payload = Protobuf.decode(xx, TestAllTypesProto3) - response.protobuf_payload = Protobuf.encode(payload) + let x = Protobuf.decode(request.protobuf_payload, TestAllTypesProto3) + response.protobuf_payload = Protobuf.encode(x) else: response.skipped = "skip" except Exception as exc: - response.runtime_error = exc.msg + response.parse_error = exc.msg + let serializedResponse = Protobuf.encode(response) - #stderr.writeLine("Output response: " & $response, serializedResponse) - outputStream.writeIntLE(serializedResponse.len().int32) - outputStream.write(string.fromBytes(serializedResponse)) - outputStream.flush() - testCount.inc() - return true -while true: - if not doTestIO(): - stderr.writeLine("conformance_nim: received EOF from test runner after ", - testCount, " tests, exiting") - break + writeIntLE(serializedResponse.len().int32) + + stdout.write(string.fromBytes(serializedResponse)) + stdout.flushFile() diff --git a/protobuf_serialization/codec.nim b/protobuf_serialization/codec.nim index b6aede2..1db1aa9 100644 --- a/protobuf_serialization/codec.nim +++ b/protobuf_serialization/codec.nim @@ -31,6 +31,8 @@ type # EndGroup = 4 # Not used Fixed32 = 5 + SomePBInt* = int32 | int64 | uint32 | uint64 + FieldHeader* = distinct uint32 # Scalar types used in `.proto` files diff --git a/protobuf_serialization/files/type_generator.nim b/protobuf_serialization/files/type_generator.nim index f789481..e27619c 100644 --- a/protobuf_serialization/files/type_generator.nim +++ b/protobuf_serialization/files/type_generator.nim @@ -70,7 +70,6 @@ proc isNested(base: string, currentName: string, messages: seq[ProtoNode]): bool # Exported for the tests. proc protoToTypesInternal*(filepath: string, log: string): NimNode {.compileTime.} = - echo filepath var packages: seq[ProtoNode] = parseProtobuf(filepath).packages queue: seq[ProtoNode] = @[] diff --git a/protobuf_serialization/internal.nim b/protobuf_serialization/internal.nim index d1e1e15..e03790f 100644 --- a/protobuf_serialization/internal.nim +++ b/protobuf_serialization/internal.nim @@ -117,7 +117,7 @@ template protoType*(InnerType, RootType, FieldType: untyped, fieldName: untyped) type InnerType = pbytes elif FlatType is enum: type InnerType = penum - elif FlatType is object: + elif FlatType is object or FlatType is ref: type InnerType = FieldType else: type InnerType = UnsupportedType[FieldType, RootType, fieldName] @@ -132,10 +132,16 @@ func verifySerializable*[T](ty: typedesc[T]) {.compileTime.} = {.fatal: $T & ": Serializing a number requires specifying the amount of bits via the type.".} elif FlatType is seq: when FlatType isnot seq[byte]: - verifySerializable(elementType(FlatType)) + return # TODO make it work in case of recursivity + # type List = object (value: Value) + # type Value = object (list: List) + # verifySerializable(elementType(FlatType)) elif FlatType is Table: - verifySerializable(elementTypeKey(FlatType)) - verifySerializable(elementTypeVal(FlatType)) + return # TODO make it work in case of recursivity + # type Struct = object (map: Table[..., Value]) + # type Value = object (struct: Struct) + # verifySerializable(elementTypeKey(FlatType)) + # verifySerializable(elementTypeVal(FlatType)) elif FlatType is object and T isnot PBOption: var inst: T @@ -145,7 +151,7 @@ func verifySerializable*[T](ty: typedesc[T]) {.compileTime.} = isProto2 = T.isProto2() isProto3 = T.isProto3() when isProto2 == isProto3: - {.fatal: $T & ": missing {.proto2.} or {.proto3}".} + {.fatal: $T & ": missing {.proto2.} or {.proto3.}".} enumInstanceSerializedFields(inst, fieldName, fieldVar): when isProto2 and not T.isRequired(fieldName): diff --git a/protobuf_serialization/reader.nim b/protobuf_serialization/reader.nim index 2ddbf89..17d9f6f 100644 --- a/protobuf_serialization/reader.nim +++ b/protobuf_serialization/reader.nim @@ -49,12 +49,28 @@ proc readFieldInto[K, V]( header: FieldHeader, ProtoType: type ) = - # TODO: Makes it a proto3 exclusive - # This is certainly not the best way to do it, but nobody cares about map - type - TableObject {.proto3.} = object - key {.fieldNumber: 1.}: K - value {.fieldNumber: 2.}: V + # I know it's ugly, but I cannot find a clean way to do it + # ... And nobody cares about map + when K is SomePBInt and V is SomePBInt: + type + TableObject {.proto3.} = object + key {.fieldNumber: 1, pint.}: K + value {.fieldNumber: 2, pint.}: V + elif K is SomePBInt: + type + TableObject {.proto3.} = object + key {.fieldNumber: 1, pint.}: K + value {.fieldNumber: 2.}: V + elif V is SomePBInt: + type + TableObject {.proto3.} = object + key {.fieldNumber: 1.}: K + value {.fieldNumber: 2, pint.}: V + else: + type + TableObject {.proto3.} = object + key {.fieldNumber: 1.}: K + value {.fieldNumber: 2.}: V var tmp = default(TableObject) stream.readFieldInto(tmp, header, ProtoType) value[tmp.key] = tmp.value @@ -129,8 +145,7 @@ proc readFieldPackedInto[T]( elif ProtoType is SomeFixed32: WireKind.Fixed32 else: - static: doAssert ProtoType is SomeFixed64 - ProtoType.SomeFixed64 + WireKind.Fixed64 inner.readFieldInto(value[^1], FieldHeader.init(header.number, kind), ProtoType) @@ -168,6 +183,9 @@ proc readValueInternal[T: object](stream: InputStream, value: var T, silent: boo stream.readFieldPackedInto(fieldVar, header, ProtoType) else: stream.readFieldInto(fieldVar, header, ProtoType) + elif ProtoType is ref: + fieldVar = new ProtoType + stream.readFieldInto(fieldVar[], header, ProtoType) else: stream.readFieldInto(fieldVar, header, ProtoType) diff --git a/protobuf_serialization/writer.nim b/protobuf_serialization/writer.nim index cd4e5f9..128364f 100644 --- a/protobuf_serialization/writer.nim +++ b/protobuf_serialization/writer.nim @@ -17,6 +17,14 @@ proc writeField( # TODO turn this into an extension point unsupportedProtoType ProtoType.FieldType, ProtoType.RootType, ProtoType.fieldName +proc writeField*[T: object](stream: OutputStream, fieldNum: int, fieldVal: ref T) = + # TODO Pre-compute size of inner object then write it without the intermediate + # memory output + var inner = memoryOutput() + inner.writeValue(fieldVal) + let bytes = inner.getOutput() + stream.writeField(fieldNum, pbytes(bytes)) + proc writeField*[T: object](stream: OutputStream, fieldNum: int, fieldVal: T) = # TODO Pre-compute size of inner object then write it without the intermediate # memory output @@ -80,13 +88,28 @@ proc writeField*[K, V]( value: Table[K, V], ProtoType: type ) = - type - TableObject {.proto3.} = object - key {.fieldNumber: 1.}: K - value {.fieldNumber: 2.}: V + when K is SomePBInt and V is SomePBInt: + type + TableObject {.proto3.} = object + key {.fieldNumber: 1, pint.}: K + value {.fieldNumber: 2, pint.}: V + elif K is SomePBInt: + type + TableObject {.proto3.} = object + key {.fieldNumber: 1, pint.}: K + value {.fieldNumber: 2.}: V + elif V is SomePBInt: + type + TableObject {.proto3.} = object + key {.fieldNumber: 1.}: K + value {.fieldNumber: 2, pint.}: V + else: + type + TableObject {.proto3.} = object + key {.fieldNumber: 1.}: K + value {.fieldNumber: 2.}: V for k, v in value.pairs(): let tmp = TableObject(key: k, value: v) - #protoType(p, TableObject, FlatType, "") stream.writeField(fieldNum, tmp, ProtoType) proc writeValue*[T: object](stream: OutputStream, value: T) = @@ -116,6 +139,9 @@ proc writeValue*[T: object](stream: OutputStream, value: T) = elif FlatType is object: # TODO avoid writing empty objects in proto3 stream.writeField(fieldNum, fieldVal, ProtoType) + elif FlatType is ref: + if not fieldVal.isNil(): + stream.writeField(fieldNum, fieldVal[], ProtoType) else: when isProto2: stream.writeField(fieldNum, fieldVal, ProtoType) From 488ccb713cd0fe305fe0d39d66b649199695c704 Mon Sep 17 00:00:00 2001 From: Ludovic Chenut Date: Fri, 10 Feb 2023 17:07:51 +0100 Subject: [PATCH 11/30] Add conformance test's nimble task --- protobuf_serialization.nimble | 15 ++ test_proto2.nim | 3 - test_proto3.nim | 3 - tests/conformance/conformance.proto | 180 ++++++++++++++++++ .../conformance/conformance_nim.nim | 4 +- .../conformance/test_messages_proto2.proto | 0 .../conformance/test_messages_proto3.proto | 0 tests/conformance/test_proto2.nim | 3 + tests/conformance/test_proto3.nim | 3 + 9 files changed, 203 insertions(+), 8 deletions(-) delete mode 100644 test_proto2.nim delete mode 100644 test_proto3.nim create mode 100644 tests/conformance/conformance.proto rename conformance_nim.nim => tests/conformance/conformance_nim.nim (93%) rename test_messages_proto2.proto => tests/conformance/test_messages_proto2.proto (100%) rename test_messages_proto3.proto => tests/conformance/test_messages_proto3.proto (100%) create mode 100644 tests/conformance/test_proto2.nim create mode 100644 tests/conformance/test_proto3.nim diff --git a/protobuf_serialization.nimble b/protobuf_serialization.nimble index 299b0ea..490eefe 100644 --- a/protobuf_serialization.nimble +++ b/protobuf_serialization.nimble @@ -50,3 +50,18 @@ task test, "Run all tests": echo " \x1B[0;31m[FAILED]\x1B[0;37m ", path.split(DirSep)[^1] exec "exit 1" +task conformance_test, "Run conformance tests": + let + pwd = thisDir() + conformance = pwd / "conformance" + test = pwd / "tests" / "conformance" + if not dirExists(conformance): + exec "git clone --recurse-submodules https://github.com/protocolbuffers/protobuf/ " & conformance + # exec "git clone --recursive https://github.com/protocolbuffers/protobuf/ " & conformance + # exec "bash -c 'cd " & conformance & " && cmake . -Dprotobuf_BUILD_CONFORMANCE=ON && cmake --build .'" + withDir conformance: + exec "cmake . -Dprotobuf_BUILD_CONFORMANCE=ON" + exec "make conformance_test_runner" + exec "cp " & conformance / "conformance_test_runner" & " " & test + exec "nim c " & test / "conformance_nim.nim" + exec test / "conformance_test_runner --verbose " & test / "conformance_nim" diff --git a/test_proto2.nim b/test_proto2.nim deleted file mode 100644 index 6ba9437..0000000 --- a/test_proto2.nim +++ /dev/null @@ -1,3 +0,0 @@ -import protobuf_serialization -import protobuf_serialization/files/type_generator -import_proto3 "test_messages_proto2.proto", "/tmp/s2.nim" diff --git a/test_proto3.nim b/test_proto3.nim deleted file mode 100644 index e8fccba..0000000 --- a/test_proto3.nim +++ /dev/null @@ -1,3 +0,0 @@ -import protobuf_serialization -import protobuf_serialization/files/type_generator -import_proto3 "test_messages_proto3.proto", "/tmp/s3.nim" diff --git a/tests/conformance/conformance.proto b/tests/conformance/conformance.proto new file mode 100644 index 0000000..bee04d1 --- /dev/null +++ b/tests/conformance/conformance.proto @@ -0,0 +1,180 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +package conformance; + +option java_package = "com.google.protobuf.conformance"; +option objc_class_prefix = "Conformance"; + +// This defines the conformance testing protocol. This protocol exists between +// the conformance test suite itself and the code being tested. For each test, +// the suite will send a ConformanceRequest message and expect a +// ConformanceResponse message. +// +// You can either run the tests in two different ways: +// +// 1. in-process (using the interface in conformance_test.h). +// +// 2. as a sub-process communicating over a pipe. Information about how to +// do this is in conformance_test_runner.cc. +// +// Pros/cons of the two approaches: +// +// - running as a sub-process is much simpler for languages other than C/C++. +// +// - running as a sub-process may be more tricky in unusual environments like +// iOS apps, where fork/stdin/stdout are not available. + +enum WireFormat { + UNSPECIFIED = 0; + PROTOBUF = 1; + JSON = 2; + JSPB = 3; // Only used inside Google. Opensource testees just skip it. + TEXT_FORMAT = 4; +} + +enum TestCategory { + UNSPECIFIED_TEST = 0; + BINARY_TEST = 1; // Test binary wire format. + JSON_TEST = 2; // Test json wire format. + // Similar to JSON_TEST. However, during parsing json, testee should ignore + // unknown fields. This feature is optional. Each implementation can decide + // whether to support it. See + // https://developers.google.com/protocol-buffers/docs/proto3#json_options + // for more detail. + JSON_IGNORE_UNKNOWN_PARSING_TEST = 3; + // Test jspb wire format. Only used inside Google. Opensource testees just + // skip it. + JSPB_TEST = 4; + // Test text format. For cpp, java and python, testees can already deal with + // this type. Testees of other languages can simply skip it. + TEXT_FORMAT_TEST = 5; +} + +// The conformance runner will request a list of failures as the first request. +// This will be known by message_type == "conformance.FailureSet", a conformance +// test should return a serialized FailureSet in protobuf_payload. +message FailureSet { + repeated string failure = 1; +} + +// Represents a single test case's input. The testee should: +// +// 1. parse this proto (which should always succeed) +// 2. parse the protobuf or JSON payload in "payload" (which may fail) +// 3. if the parse succeeded, serialize the message in the requested format. +message ConformanceRequest { + // The payload (whether protobuf of JSON) is always for a + // protobuf_test_messages.proto3.TestAllTypes proto (as defined in + // src/google/protobuf/proto3_test_messages.proto). + oneof payload { + bytes protobuf_payload = 1; + string json_payload = 2; + // Only used inside Google. Opensource testees just skip it. + string jspb_payload = 7; + string text_payload = 8; + } + + // Which format should the testee serialize its message to? + WireFormat requested_output_format = 3; + + // The full name for the test message to use; for the moment, either: + // protobuf_test_messages.proto3.TestAllTypesProto3 or + // protobuf_test_messages.google.protobuf.TestAllTypesProto2. + string message_type = 4; + + // Each test is given a specific test category. Some category may need + // specific support in testee programs. Refer to the definition of + // TestCategory for more information. + TestCategory test_category = 5; + + // Specify details for how to encode jspb. + JspbEncodingConfig jspb_encoding_options = 6; + + // This can be used in json and text format. If true, testee should print + // unknown fields instead of ignore. This feature is optional. + bool print_unknown_fields = 9; +} + +// Represents a single test case's output. +message ConformanceResponse { + oneof result { + // This string should be set to indicate parsing failed. The string can + // provide more information about the parse error if it is available. + // + // Setting this string does not necessarily mean the testee failed the + // test. Some of the test cases are intentionally invalid input. + string parse_error = 1; + + // If the input was successfully parsed but errors occurred when + // serializing it to the requested output format, set the error message in + // this field. + string serialize_error = 6; + + // This should be set if the test program timed out. The string should + // provide more information about what the child process was doing when it + // was killed. + string timeout_error = 9; + + // This should be set if some other error occurred. This will always + // indicate that the test failed. The string can provide more information + // about the failure. + string runtime_error = 2; + + // If the input was successfully parsed and the requested output was + // protobuf, serialize it to protobuf and set it in this field. + bytes protobuf_payload = 3; + + // If the input was successfully parsed and the requested output was JSON, + // serialize to JSON and set it in this field. + string json_payload = 4; + + // For when the testee skipped the test, likely because a certain feature + // wasn't supported, like JSON input/output. + string skipped = 5; + + // If the input was successfully parsed and the requested output was JSPB, + // serialize to JSPB and set it in this field. JSPB is only used inside + // Google. Opensource testees can just skip it. + string jspb_payload = 7; + + // If the input was successfully parsed and the requested output was + // TEXT_FORMAT, serialize to TEXT_FORMAT and set it in this field. + string text_payload = 8; + } +} + +// Encoding options for jspb format. +message JspbEncodingConfig { + // Encode the value field of Any as jspb array if true, otherwise binary. + bool use_jspb_array_any_format = 1; +} diff --git a/conformance_nim.nim b/tests/conformance/conformance_nim.nim similarity index 93% rename from conformance_nim.nim rename to tests/conformance/conformance_nim.nim index e90dd42..ccc69d9 100644 --- a/conformance_nim.nim +++ b/tests/conformance/conformance_nim.nim @@ -1,6 +1,6 @@ import os -import protobuf_serialization -import protobuf_serialization/files/type_generator +import ../../protobuf_serialization +import ../../protobuf_serialization/files/type_generator import stew/byteutils import_proto3 "conformance.proto", "/tmp/s1.nim" import test_proto2 diff --git a/test_messages_proto2.proto b/tests/conformance/test_messages_proto2.proto similarity index 100% rename from test_messages_proto2.proto rename to tests/conformance/test_messages_proto2.proto diff --git a/test_messages_proto3.proto b/tests/conformance/test_messages_proto3.proto similarity index 100% rename from test_messages_proto3.proto rename to tests/conformance/test_messages_proto3.proto diff --git a/tests/conformance/test_proto2.nim b/tests/conformance/test_proto2.nim new file mode 100644 index 0000000..3f6edc0 --- /dev/null +++ b/tests/conformance/test_proto2.nim @@ -0,0 +1,3 @@ +import ../../protobuf_serialization +import ../../protobuf_serialization/files/type_generator +import_proto3 "test_messages_proto2.proto", "/tmp/s2.nim" diff --git a/tests/conformance/test_proto3.nim b/tests/conformance/test_proto3.nim new file mode 100644 index 0000000..4910a7c --- /dev/null +++ b/tests/conformance/test_proto3.nim @@ -0,0 +1,3 @@ +import ../../protobuf_serialization +import ../../protobuf_serialization/files/type_generator +import_proto3 "test_messages_proto3.proto", "/tmp/s3.nim" From 5acc4c06956a239d791e0159a9dae8a5d5a8326f Mon Sep 17 00:00:00 2001 From: Ludovic Chenut Date: Fri, 10 Feb 2023 17:26:33 +0100 Subject: [PATCH 12/30] Add conformance jobs --- .github/workflows/conformance.yml | 162 ++++++++++++++++++++++++++++++ protobuf_serialization.nimble | 5 +- 2 files changed, 165 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/conformance.yml diff --git a/.github/workflows/conformance.yml b/.github/workflows/conformance.yml new file mode 100644 index 0000000..193af11 --- /dev/null +++ b/.github/workflows/conformance.yml @@ -0,0 +1,162 @@ +name: Conformance Test + +on: + manual: + types: [run] + +concurrency: # Cancel stale PR builds (but not push builds) + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} + cancel-in-progress: true + +jobs: + build: + strategy: + fail-fast: false + matrix: + target: + - os: linux + cpu: amd64 + - os: linux + cpu: i386 + - os: macos + cpu: amd64 + - os: windows + cpu: amd64 + #- os: windows + #cpu: i386 + branch: [version-1-2, version-1-4, version-1-6, devel] + include: + - target: + os: linux + builder: ubuntu-18.04 + shell: bash + - target: + os: macos + builder: macos-10.15 + shell: bash + - target: + os: windows + builder: windows-2019 + shell: msys2 {0} + + defaults: + run: + shell: ${{ matrix.shell }} + + name: '${{ matrix.target.os }}-${{ matrix.target.cpu }} (Nim ${{ matrix.branch }})' + runs-on: ${{ matrix.builder }} + continue-on-error: ${{ matrix.branch == 'devel' }} + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Install build dependencies (Linux i386) + if: runner.os == 'Linux' && matrix.target.cpu == 'i386' + run: | + sudo dpkg --add-architecture i386 + sudo apt-fast update -qq + sudo DEBIAN_FRONTEND='noninteractive' apt-fast install \ + --no-install-recommends -yq gcc-multilib g++-multilib \ + libssl-dev:i386 + mkdir -p external/bin + cat << EOF > external/bin/gcc + #!/bin/bash + exec $(which gcc) -m32 "\$@" + EOF + cat << EOF > external/bin/g++ + #!/bin/bash + exec $(which g++) -m32 "\$@" + EOF + chmod 755 external/bin/gcc external/bin/g++ + echo '${{ github.workspace }}/external/bin' >> $GITHUB_PATH + + - name: MSYS2 (Windows i386) + if: runner.os == 'Windows' && matrix.target.cpu == 'i386' + uses: msys2/setup-msys2@v2 + with: + path-type: inherit + msystem: MINGW32 + install: >- + base-devel + git + mingw-w64-i686-toolchain + + - name: MSYS2 (Windows amd64) + if: runner.os == 'Windows' && matrix.target.cpu == 'amd64' + uses: msys2/setup-msys2@v2 + with: + path-type: inherit + install: >- + base-devel + git + mingw-w64-x86_64-toolchain + + - name: Restore Nim DLLs dependencies (Windows) from cache + if: runner.os == 'Windows' + id: windows-dlls-cache + uses: actions/cache@v2 + with: + path: external/dlls-${{ matrix.target.cpu }} + key: 'dlls-${{ matrix.target.cpu }}' + + - name: Install DLLs dependencies (Windows) + if: > + steps.windows-dlls-cache.outputs.cache-hit != 'true' && + runner.os == 'Windows' + run: | + mkdir -p external + curl -L "https://nim-lang.org/download/windeps.zip" -o external/windeps.zip + 7z x -y external/windeps.zip -oexternal/dlls-${{ matrix.target.cpu }} + + - name: Path to cached dependencies (Windows) + if: > + runner.os == 'Windows' + run: | + echo "${{ github.workspace }}/external/dlls-${{ matrix.target.cpu }}" >> $GITHUB_PATH + + - name: Derive environment variables + run: | + if [[ '${{ matrix.target.cpu }}' == 'amd64' ]]; then + PLATFORM=x64 + else + PLATFORM=x86 + fi + echo "PLATFORM=$PLATFORM" >> $GITHUB_ENV + + ncpu= + MAKE_CMD="make" + case '${{ runner.os }}' in + 'Linux') + ncpu=$(nproc) + ;; + 'macOS') + ncpu=$(sysctl -n hw.ncpu) + ;; + 'Windows') + ncpu=$NUMBER_OF_PROCESSORS + MAKE_CMD="mingw32-make" + ;; + esac + [[ -z "$ncpu" || $ncpu -le 0 ]] && ncpu=1 + echo "ncpu=$ncpu" >> $GITHUB_ENV + echo "MAKE_CMD=${MAKE_CMD}" >> $GITHUB_ENV + + - name: Build Nim and Nimble + run: | + curl -O -L -s -S https://raw.githubusercontent.com/status-im/nimbus-build-system/master/scripts/build_nim.sh + env MAKE="${MAKE_CMD} -j${ncpu}" ARCH_OVERRIDE=${PLATFORM} NIM_COMMIT=${{ matrix.branch }} \ + QUICK_AND_DIRTY_COMPILER=1 QUICK_AND_DIRTY_NIMBLE=1 CC=gcc \ + bash build_nim.sh nim csources dist/nimble NimBinaries + echo '${{ github.workspace }}/nim/bin' >> $GITHUB_PATH + + - name: Run tests + run: | + if [[ "${{ matrix.target.os }}" == "windows" ]]; then + # https://github.com/status-im/nimbus-eth2/issues/3121 + export NIMFLAGS="-d:nimRawSetjmp" + fi + nim --version + nimble --version + nimble install -y --depsOnly + env NIMLANG="c" nimble conformance_test + env NIMLANG="cpp" nimble conformance_test diff --git a/protobuf_serialization.nimble b/protobuf_serialization.nimble index 490eefe..08ae694 100644 --- a/protobuf_serialization.nimble +++ b/protobuf_serialization.nimble @@ -55,13 +55,14 @@ task conformance_test, "Run conformance tests": pwd = thisDir() conformance = pwd / "conformance" test = pwd / "tests" / "conformance" + if not dirExists(conformance): exec "git clone --recurse-submodules https://github.com/protocolbuffers/protobuf/ " & conformance - # exec "git clone --recursive https://github.com/protocolbuffers/protobuf/ " & conformance - # exec "bash -c 'cd " & conformance & " && cmake . -Dprotobuf_BUILD_CONFORMANCE=ON && cmake --build .'" + withDir conformance: exec "cmake . -Dprotobuf_BUILD_CONFORMANCE=ON" exec "make conformance_test_runner" + exec "cp " & conformance / "conformance_test_runner" & " " & test exec "nim c " & test / "conformance_nim.nim" exec test / "conformance_test_runner --verbose " & test / "conformance_nim" From b93f4ea659359ed2f43e500d1b75986780ae4ef3 Mon Sep 17 00:00:00 2001 From: Ludovic Chenut Date: Mon, 13 Feb 2023 11:47:37 +0100 Subject: [PATCH 13/30] Add cmake installation --- .github/workflows/conformance.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/conformance.yml b/.github/workflows/conformance.yml index 193af11..7598eba 100644 --- a/.github/workflows/conformance.yml +++ b/.github/workflows/conformance.yml @@ -141,6 +141,17 @@ jobs: echo "ncpu=$ncpu" >> $GITHUB_ENV echo "MAKE_CMD=${MAKE_CMD}" >> $GITHUB_ENV + - name: Install CMake + run: | + if [ "${{ runner.os }}" == "Linux" ]; then + sudo apt-get install cmake + elif [ "${{ runner.os }}" == "macOS" ]; then + brew install cmake + elif [ "${{ runner.os }}" == "Windows" ]; then + curl -LO https://github.com/Kitware/CMake/releases/download/v3.19.3/cmake-3.19.3-win64-x64.msi + msiexec /i cmake-3.19.3-win64-x64.msi /quiet + fi + - name: Build Nim and Nimble run: | curl -O -L -s -S https://raw.githubusercontent.com/status-im/nimbus-build-system/master/scripts/build_nim.sh From a809ce363bd427e9f54534f758449bc3bd0bc054 Mon Sep 17 00:00:00 2001 From: Ludovic Chenut Date: Mon, 13 Feb 2023 11:50:05 +0100 Subject: [PATCH 14/30] Add brew update --- .github/workflows/conformance.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/conformance.yml b/.github/workflows/conformance.yml index 7598eba..c33e2f5 100644 --- a/.github/workflows/conformance.yml +++ b/.github/workflows/conformance.yml @@ -146,6 +146,8 @@ jobs: if [ "${{ runner.os }}" == "Linux" ]; then sudo apt-get install cmake elif [ "${{ runner.os }}" == "macOS" ]; then + brew update + brew upgrade brew install cmake elif [ "${{ runner.os }}" == "Windows" ]; then curl -LO https://github.com/Kitware/CMake/releases/download/v3.19.3/cmake-3.19.3-win64-x64.msi From d70f90d6e4450443d8d1abf9e4228e6e31dbb88f Mon Sep 17 00:00:00 2001 From: Ludovic Chenut Date: Mon, 13 Feb 2023 12:03:47 +0100 Subject: [PATCH 15/30] Add protobuf 2 conformance test --- tests/conformance/conformance_nim.nim | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/conformance/conformance_nim.nim b/tests/conformance/conformance_nim.nim index ccc69d9..ed781b6 100644 --- a/tests/conformance/conformance_nim.nim +++ b/tests/conformance/conformance_nim.nim @@ -34,8 +34,11 @@ while true: if request.message_type == "protobuf_test_messages.proto3.TestAllTypesProto3": let x = Protobuf.decode(request.protobuf_payload, TestAllTypesProto3) response.protobuf_payload = Protobuf.encode(x) + elif request.message_type == "protobuf_test_messages.proto2.TestAllTypesProto2": + let x = Protobuf.decode(request.protobuf_payload, TestAllTypesProto2) + response.protobuf_payload = Protobuf.encode(x) else: - response.skipped = "skip" + response.skipped = "skip unknown message type: " & request.message_type except Exception as exc: response.parse_error = exc.msg From 6393cb3121c5b71c622e0324d376a6acef4644af Mon Sep 17 00:00:00 2001 From: Ludovic Chenut Date: Mon, 13 Feb 2023 15:04:57 +0100 Subject: [PATCH 16/30] Fix conformance.yml (1) --- .github/workflows/conformance.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/conformance.yml b/.github/workflows/conformance.yml index c33e2f5..b9f5ab4 100644 --- a/.github/workflows/conformance.yml +++ b/.github/workflows/conformance.yml @@ -1,7 +1,7 @@ name: Conformance Test on: - manual: + workflow_dispatch: types: [run] concurrency: # Cancel stale PR builds (but not push builds) From 86b4180957317cfa312755741c0599c957ececd9 Mon Sep 17 00:00:00 2001 From: Ludovic Chenut Date: Mon, 13 Feb 2023 15:21:02 +0100 Subject: [PATCH 17/30] Remove duplicate file --- conformance.proto | 180 ---------------------------------------------- 1 file changed, 180 deletions(-) delete mode 100644 conformance.proto diff --git a/conformance.proto b/conformance.proto deleted file mode 100644 index bee04d1..0000000 --- a/conformance.proto +++ /dev/null @@ -1,180 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -syntax = "proto3"; - -package conformance; - -option java_package = "com.google.protobuf.conformance"; -option objc_class_prefix = "Conformance"; - -// This defines the conformance testing protocol. This protocol exists between -// the conformance test suite itself and the code being tested. For each test, -// the suite will send a ConformanceRequest message and expect a -// ConformanceResponse message. -// -// You can either run the tests in two different ways: -// -// 1. in-process (using the interface in conformance_test.h). -// -// 2. as a sub-process communicating over a pipe. Information about how to -// do this is in conformance_test_runner.cc. -// -// Pros/cons of the two approaches: -// -// - running as a sub-process is much simpler for languages other than C/C++. -// -// - running as a sub-process may be more tricky in unusual environments like -// iOS apps, where fork/stdin/stdout are not available. - -enum WireFormat { - UNSPECIFIED = 0; - PROTOBUF = 1; - JSON = 2; - JSPB = 3; // Only used inside Google. Opensource testees just skip it. - TEXT_FORMAT = 4; -} - -enum TestCategory { - UNSPECIFIED_TEST = 0; - BINARY_TEST = 1; // Test binary wire format. - JSON_TEST = 2; // Test json wire format. - // Similar to JSON_TEST. However, during parsing json, testee should ignore - // unknown fields. This feature is optional. Each implementation can decide - // whether to support it. See - // https://developers.google.com/protocol-buffers/docs/proto3#json_options - // for more detail. - JSON_IGNORE_UNKNOWN_PARSING_TEST = 3; - // Test jspb wire format. Only used inside Google. Opensource testees just - // skip it. - JSPB_TEST = 4; - // Test text format. For cpp, java and python, testees can already deal with - // this type. Testees of other languages can simply skip it. - TEXT_FORMAT_TEST = 5; -} - -// The conformance runner will request a list of failures as the first request. -// This will be known by message_type == "conformance.FailureSet", a conformance -// test should return a serialized FailureSet in protobuf_payload. -message FailureSet { - repeated string failure = 1; -} - -// Represents a single test case's input. The testee should: -// -// 1. parse this proto (which should always succeed) -// 2. parse the protobuf or JSON payload in "payload" (which may fail) -// 3. if the parse succeeded, serialize the message in the requested format. -message ConformanceRequest { - // The payload (whether protobuf of JSON) is always for a - // protobuf_test_messages.proto3.TestAllTypes proto (as defined in - // src/google/protobuf/proto3_test_messages.proto). - oneof payload { - bytes protobuf_payload = 1; - string json_payload = 2; - // Only used inside Google. Opensource testees just skip it. - string jspb_payload = 7; - string text_payload = 8; - } - - // Which format should the testee serialize its message to? - WireFormat requested_output_format = 3; - - // The full name for the test message to use; for the moment, either: - // protobuf_test_messages.proto3.TestAllTypesProto3 or - // protobuf_test_messages.google.protobuf.TestAllTypesProto2. - string message_type = 4; - - // Each test is given a specific test category. Some category may need - // specific support in testee programs. Refer to the definition of - // TestCategory for more information. - TestCategory test_category = 5; - - // Specify details for how to encode jspb. - JspbEncodingConfig jspb_encoding_options = 6; - - // This can be used in json and text format. If true, testee should print - // unknown fields instead of ignore. This feature is optional. - bool print_unknown_fields = 9; -} - -// Represents a single test case's output. -message ConformanceResponse { - oneof result { - // This string should be set to indicate parsing failed. The string can - // provide more information about the parse error if it is available. - // - // Setting this string does not necessarily mean the testee failed the - // test. Some of the test cases are intentionally invalid input. - string parse_error = 1; - - // If the input was successfully parsed but errors occurred when - // serializing it to the requested output format, set the error message in - // this field. - string serialize_error = 6; - - // This should be set if the test program timed out. The string should - // provide more information about what the child process was doing when it - // was killed. - string timeout_error = 9; - - // This should be set if some other error occurred. This will always - // indicate that the test failed. The string can provide more information - // about the failure. - string runtime_error = 2; - - // If the input was successfully parsed and the requested output was - // protobuf, serialize it to protobuf and set it in this field. - bytes protobuf_payload = 3; - - // If the input was successfully parsed and the requested output was JSON, - // serialize to JSON and set it in this field. - string json_payload = 4; - - // For when the testee skipped the test, likely because a certain feature - // wasn't supported, like JSON input/output. - string skipped = 5; - - // If the input was successfully parsed and the requested output was JSPB, - // serialize to JSPB and set it in this field. JSPB is only used inside - // Google. Opensource testees can just skip it. - string jspb_payload = 7; - - // If the input was successfully parsed and the requested output was - // TEXT_FORMAT, serialize to TEXT_FORMAT and set it in this field. - string text_payload = 8; - } -} - -// Encoding options for jspb format. -message JspbEncodingConfig { - // Encode the value field of Any as jspb array if true, otherwise binary. - bool use_jspb_array_any_format = 1; -} From a41766c58a3fc724a16c9e246f221e7f000014fd Mon Sep 17 00:00:00 2001 From: Ludovic Chenut Date: Mon, 13 Feb 2023 17:35:32 +0100 Subject: [PATCH 18/30] Fix CI --- .../files/type_generator.nim | 11 ++++---- tests/conformance/conformance_nim.nim | 2 +- tests/conformance/test_proto2.nim | 2 +- tests/conformance/test_proto3.nim | 2 +- tests/files/test_proto3.nim | 26 +++++++++---------- 5 files changed, 21 insertions(+), 22 deletions(-) diff --git a/protobuf_serialization/files/type_generator.nim b/protobuf_serialization/files/type_generator.nim index e27619c..8aed6ea 100644 --- a/protobuf_serialization/files/type_generator.nim +++ b/protobuf_serialization/files/type_generator.nim @@ -69,7 +69,7 @@ proc isNested(base: string, currentName: string, messages: seq[ProtoNode]): bool return true # Exported for the tests. -proc protoToTypesInternal*(filepath: string, log: string): NimNode {.compileTime.} = +proc protoToTypesInternal*(filepath: string): NimNode {.compileTime.} = var packages: seq[ProtoNode] = parseProtobuf(filepath).packages queue: seq[ProtoNode] = @[] @@ -179,11 +179,10 @@ proc protoToTypesInternal*(filepath: string, log: string): NimNode {.compileTime value ) ) - writeFile(log, repr(result)) -macro protoToTypes*(filepath: static[string], log: static[string]): untyped = - result = protoToTypesInternal(filepath, log) +macro protoToTypes*(filepath: static[string]): untyped = + result = protoToTypesInternal(filepath) -template import_proto3*(file: static[string], log: static[string]): untyped = +template import_proto3*(file: static[string]): untyped = const filepath = parentDir(instantiationInfo(-1, true).filename) / file - protoToTypes(filepath, log) + protoToTypes(filepath) diff --git a/tests/conformance/conformance_nim.nim b/tests/conformance/conformance_nim.nim index ed781b6..2bd12e4 100644 --- a/tests/conformance/conformance_nim.nim +++ b/tests/conformance/conformance_nim.nim @@ -2,7 +2,7 @@ import os import ../../protobuf_serialization import ../../protobuf_serialization/files/type_generator import stew/byteutils -import_proto3 "conformance.proto", "/tmp/s1.nim" +import_proto3 "conformance.proto" import test_proto2 import test_proto3 diff --git a/tests/conformance/test_proto2.nim b/tests/conformance/test_proto2.nim index 3f6edc0..06f15f1 100644 --- a/tests/conformance/test_proto2.nim +++ b/tests/conformance/test_proto2.nim @@ -1,3 +1,3 @@ import ../../protobuf_serialization import ../../protobuf_serialization/files/type_generator -import_proto3 "test_messages_proto2.proto", "/tmp/s2.nim" +import_proto3 "test_messages_proto2.proto" diff --git a/tests/conformance/test_proto3.nim b/tests/conformance/test_proto3.nim index 4910a7c..c0a2aba 100644 --- a/tests/conformance/test_proto3.nim +++ b/tests/conformance/test_proto3.nim @@ -1,3 +1,3 @@ import ../../protobuf_serialization import ../../protobuf_serialization/files/type_generator -import_proto3 "test_messages_proto3.proto", "/tmp/s3.nim" +import_proto3 "test_messages_proto3.proto" diff --git a/tests/files/test_proto3.nim b/tests/files/test_proto3.nim index 6ed39ac..65aaaaf 100644 --- a/tests/files/test_proto3.nim +++ b/tests/files/test_proto3.nim @@ -10,23 +10,29 @@ macro test() = parsed: NimNode = protoToTypesInternal(currentSourcePath.parentDir / "test.proto3") vector: NimNode = quote do: type - TestEnum* {.proto3.} = enum + TestEnum* {.pure.} = enum UNKNOWN = 0 STARTED = 1 ErrorStatus* {.proto3.} = object - message* {.fieldNumber: 1.}: string details* {.fieldNumber: 2.}: seq[seq[byte]] + message* {.fieldNumber: 1.}: string + + SearchResponse* {.proto3.} = object + results* {.fieldNumber: 1.}: seq[Result] Result* {.proto3.} = object - url* {.fieldNumber: 1.}: string - title* {.fieldNumber: 2.}: string snippets* {.fieldNumber: 3.}: seq[string] + title* {.fieldNumber: 2.}: string + url* {.fieldNumber: 1.}: string - SearchResponse* {.proto3.} = object - results* {.fieldNumber: 1.}: seq[Result] + SearchRequest* {.proto3.} = object + corpus* {.fieldNumber: 4.}: Corpus + result_per_page* {.fieldNumber: 3, pint.}: int32 + page_number* {.fieldNumber: 2, pint.}: int32 + query* {.fieldNumber: 1.}: string - Corpus* {.proto3.} = enum + Corpus* {.pure.} = enum UNIVERSAL = 0 WEB = 1 IMAGES = 2 @@ -35,12 +41,6 @@ macro test() = PRODUCTS = 5 VIDEO = 6 - SearchRequest* {.proto3.} = object - query* {.fieldNumber: 1.}: string - page_number* {.fieldNumber: 2, pint.}: int32 - result_per_page* {.fieldNumber: 3, pint.}: int32 - corpus* {.fieldNumber: 4.}: Corpus - Foo* {.proto3.} = object proc convertFromSym(parent: NimNode, i: int) = From 7e3bdd20128d0038e3a91c16aa57c92c033ea11e Mon Sep 17 00:00:00 2001 From: Ludovic Chenut Date: Tue, 14 Feb 2023 14:02:00 +0100 Subject: [PATCH 19/30] Fix CI in nim 1.2 --- protobuf_serialization.nimble | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/protobuf_serialization.nimble b/protobuf_serialization.nimble index 08ae694..ea85ea7 100644 --- a/protobuf_serialization.nimble +++ b/protobuf_serialization.nimble @@ -56,7 +56,7 @@ task conformance_test, "Run conformance tests": conformance = pwd / "conformance" test = pwd / "tests" / "conformance" - if not dirExists(conformance): + if not system.dirExists(conformance): exec "git clone --recurse-submodules https://github.com/protocolbuffers/protobuf/ " & conformance withDir conformance: From f0bef097c0e661ab74fc5bdb288a0784fd263a36 Mon Sep 17 00:00:00 2001 From: Ludovic Chenut Date: Tue, 14 Feb 2023 17:21:26 +0100 Subject: [PATCH 20/30] Add expected failure list --- protobuf_serialization.nimble | 5 +- tests/conformance/conformance_nim.nim | 9 +- tests/conformance/failure_list.txt | 1247 +++++++++++++++++++++++++ 3 files changed, 1258 insertions(+), 3 deletions(-) create mode 100644 tests/conformance/failure_list.txt diff --git a/protobuf_serialization.nimble b/protobuf_serialization.nimble index ea85ea7..e0f91fa 100644 --- a/protobuf_serialization.nimble +++ b/protobuf_serialization.nimble @@ -64,5 +64,6 @@ task conformance_test, "Run conformance tests": exec "make conformance_test_runner" exec "cp " & conformance / "conformance_test_runner" & " " & test - exec "nim c " & test / "conformance_nim.nim" - exec test / "conformance_test_runner --verbose " & test / "conformance_nim" + withDir test: + exec "nim c conformance_nim.nim" + exec "./conformance_test_runner --failure_list failure_list.txt conformance_nim" diff --git a/tests/conformance/conformance_nim.nim b/tests/conformance/conformance_nim.nim index 2bd12e4..b475348 100644 --- a/tests/conformance/conformance_nim.nim +++ b/tests/conformance/conformance_nim.nim @@ -15,7 +15,7 @@ proc writeIntLE(v: int32) = if stdout.writeBuffer(addr(value), 4) != 4: raise newException(IOError, "writeInt error") -while true: +proc doTest() = let length = readIntLE() var serializedRequest = newSeq[byte](length) @@ -48,3 +48,10 @@ while true: stdout.write(string.fromBytes(serializedResponse)) stdout.flushFile() + +while true: + try: + doTest() + except IOError as exc: + stderr.writeLine(exc.msg) + break diff --git a/tests/conformance/failure_list.txt b/tests/conformance/failure_list.txt new file mode 100644 index 0000000..e1a433f --- /dev/null +++ b/tests/conformance/failure_list.txt @@ -0,0 +1,1247 @@ +Required.Proto2.ProtobufInput.IllegalZeroFieldNum_Case_1 +Required.Proto2.ProtobufInput.IllegalZeroFieldNum_Case_1 +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.BOOL +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.BOOL +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.BYTES +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.BYTES +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.DOUBLE +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.DOUBLE +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.ENUM +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.ENUM +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.FIXED32 +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.FIXED32 +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.FIXED64 +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.FIXED64 +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.FLOAT +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.FLOAT +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.INT32 +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.INT32 +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.INT64 +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.INT64 +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.MESSAGE +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.MESSAGE +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.SFIXED32 +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.SFIXED32 +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.SFIXED64 +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.SFIXED64 +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.SINT32 +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.SINT32 +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.SINT64 +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.SINT64 +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.STRING +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.STRING +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.UINT32 +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.UINT32 +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.UINT64 +Required.Proto2.ProtobufInput.PrematureEofBeforeUnknownValue.UINT64 +Required.Proto2.ProtobufInput.PrematureEofInDelimitedDataForUnknownValue.BYTES +Required.Proto2.ProtobufInput.PrematureEofInDelimitedDataForUnknownValue.BYTES +Required.Proto2.ProtobufInput.PrematureEofInDelimitedDataForUnknownValue.MESSAGE +Required.Proto2.ProtobufInput.PrematureEofInDelimitedDataForUnknownValue.MESSAGE +Required.Proto2.ProtobufInput.PrematureEofInDelimitedDataForUnknownValue.STRING +Required.Proto2.ProtobufInput.PrematureEofInDelimitedDataForUnknownValue.STRING +Required.Proto2.ProtobufInput.RepeatedScalarMessageMerge.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarMessageMerge.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.BOOL.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.BOOL.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.BYTES.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.BYTES.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.DOUBLE.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.DOUBLE.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.ENUM.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.ENUM.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.FIXED32.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.FIXED32.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.FIXED64.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.FIXED64.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.FLOAT.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.FLOAT.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.INT32.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.INT32.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.INT64.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.INT64.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.SFIXED32.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.SFIXED32.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.SFIXED64.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.SFIXED64.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.SINT32.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.SINT32.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.SINT64.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.SINT64.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.STRING.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.STRING.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.UINT32.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.UINT32.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.UINT64.ProtobufOutput +Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.UINT64.ProtobufOutput +Required.Proto2.ProtobufInput.UnknownVarint.ProtobufOutput +Required.Proto2.ProtobufInput.UnknownVarint.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.BOOL.BOOL.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.BOOL.BOOL.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.BOOL.BOOL.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.BOOL.BOOL.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.BOOL.BOOL.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.BOOL.BOOL.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.BOOL.BOOL.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.BOOL.BOOL.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.BOOL.BOOL.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.BOOL.BOOL.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.BOOL.BOOL.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.BOOL.BOOL.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.BOOL.BOOL.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.BOOL.BOOL.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.FIXED32.FIXED32.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.FIXED32.FIXED32.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.FIXED32.FIXED32.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.FIXED32.FIXED32.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.FIXED32.FIXED32.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.FIXED32.FIXED32.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.FIXED32.FIXED32.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.FIXED32.FIXED32.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.FIXED32.FIXED32.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.FIXED32.FIXED32.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.FIXED32.FIXED32.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.FIXED32.FIXED32.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.FIXED32.FIXED32.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.FIXED32.FIXED32.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.FIXED64.FIXED64.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.FIXED64.FIXED64.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.FIXED64.FIXED64.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.FIXED64.FIXED64.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.FIXED64.FIXED64.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.FIXED64.FIXED64.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.FIXED64.FIXED64.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.FIXED64.FIXED64.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.FIXED64.FIXED64.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.FIXED64.FIXED64.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.FIXED64.FIXED64.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.FIXED64.FIXED64.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.FIXED64.FIXED64.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.FIXED64.FIXED64.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.DOUBLE.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.DOUBLE.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.DOUBLE.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.DOUBLE.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.DOUBLE.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.DOUBLE.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.DOUBLE.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.DOUBLE.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.DOUBLE.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.DOUBLE.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.DOUBLE.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.DOUBLE.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.DOUBLE.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.DOUBLE.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.FLOAT.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.FLOAT.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.FLOAT.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.FLOAT.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.FLOAT.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.FLOAT.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.FLOAT.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.FLOAT.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.FLOAT.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.FLOAT.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.FLOAT.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.FLOAT.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.FLOAT.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.FLOAT.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.INT32.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.INT32.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.INT32.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.INT32.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.INT32.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.INT32.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.INT32.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.INT32.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.INT32.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.INT32.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.INT32.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.INT32.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.INT32.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT32.INT32.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT64.INT64.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT64.INT64.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT64.INT64.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT64.INT64.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT64.INT64.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT64.INT64.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT64.INT64.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT64.INT64.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT64.INT64.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT64.INT64.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT64.INT64.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT64.INT64.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT64.INT64.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.INT64.INT64.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SFIXED32.SFIXED32.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SFIXED32.SFIXED32.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SFIXED32.SFIXED32.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SFIXED32.SFIXED32.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SFIXED32.SFIXED32.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SFIXED32.SFIXED32.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SFIXED32.SFIXED32.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SFIXED32.SFIXED32.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SFIXED32.SFIXED32.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SFIXED32.SFIXED32.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SFIXED32.SFIXED32.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SFIXED32.SFIXED32.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SFIXED32.SFIXED32.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SFIXED32.SFIXED32.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SFIXED64.SFIXED64.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SFIXED64.SFIXED64.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SFIXED64.SFIXED64.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SFIXED64.SFIXED64.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SFIXED64.SFIXED64.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SFIXED64.SFIXED64.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SFIXED64.SFIXED64.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SFIXED64.SFIXED64.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SFIXED64.SFIXED64.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SFIXED64.SFIXED64.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SFIXED64.SFIXED64.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SFIXED64.SFIXED64.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SFIXED64.SFIXED64.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SFIXED64.SFIXED64.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SINT32.SINT32.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SINT32.SINT32.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SINT32.SINT32.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SINT32.SINT32.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SINT32.SINT32.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SINT32.SINT32.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SINT32.SINT32.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SINT32.SINT32.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SINT32.SINT32.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SINT32.SINT32.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SINT32.SINT32.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SINT32.SINT32.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SINT32.SINT32.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SINT32.SINT32.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SINT64.SINT64.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SINT64.SINT64.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SINT64.SINT64.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SINT64.SINT64.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SINT64.SINT64.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SINT64.SINT64.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SINT64.SINT64.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SINT64.SINT64.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SINT64.SINT64.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SINT64.SINT64.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SINT64.SINT64.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SINT64.SINT64.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SINT64.SINT64.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.SINT64.SINT64.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.BYTES.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.BYTES.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.BYTES.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.BYTES.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.BYTES.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.BYTES.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.BYTES.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.BYTES.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.BYTES.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.BYTES.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.BYTES.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.BYTES.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.BYTES.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.BYTES.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.ENUM.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.ENUM.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.ENUM.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.ENUM.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.ENUM.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.ENUM.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.ENUM.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.ENUM.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.ENUM.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.ENUM.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.ENUM.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.ENUM.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.ENUM.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.ENUM.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.MESSAGE.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.MESSAGE.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.MESSAGE.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.MESSAGE.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.MESSAGE.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.MESSAGE.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.MESSAGE.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.MESSAGE.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.MESSAGE.MergeValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.MESSAGE.MergeValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.MESSAGE.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.MESSAGE.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.MESSAGE.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.MESSAGE.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.MESSAGE.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.MESSAGE.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.STRING.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.STRING.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.STRING.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.STRING.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.STRING.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.STRING.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.STRING.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.STRING.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.STRING.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.STRING.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.STRING.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.STRING.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.STRING.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.STRING.STRING.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.UINT32.UINT32.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.UINT32.UINT32.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.UINT32.UINT32.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.UINT32.UINT32.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.UINT32.UINT32.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.UINT32.UINT32.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.UINT32.UINT32.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.UINT32.UINT32.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.UINT32.UINT32.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.UINT32.UINT32.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.UINT32.UINT32.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.UINT32.UINT32.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.UINT32.UINT32.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.UINT32.UINT32.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.UINT64.UINT64.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.UINT64.UINT64.Default.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.UINT64.UINT64.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.UINT64.UINT64.DuplicateKey.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.UINT64.UINT64.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.UINT64.UINT64.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.UINT64.UINT64.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.UINT64.UINT64.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.UINT64.UINT64.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.UINT64.UINT64.MissingDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.UINT64.UINT64.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.UINT64.UINT64.NonDefault.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.UINT64.UINT64.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataMap.UINT64.UINT64.Unordered.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.BOOL.DefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.BOOL.DefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.BOOL.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.BOOL.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.BOOL.MultipleValuesForSameField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.BOOL.MultipleValuesForSameField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.BOOL.NonDefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.BOOL.NonDefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.BYTES.DefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.BYTES.DefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.BYTES.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.BYTES.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.BYTES.MultipleValuesForSameField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.BYTES.MultipleValuesForSameField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.BYTES.NonDefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.BYTES.NonDefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.DOUBLE.DefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.DOUBLE.DefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.DOUBLE.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.DOUBLE.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.DOUBLE.MultipleValuesForSameField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.DOUBLE.MultipleValuesForSameField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.DOUBLE.NonDefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.DOUBLE.NonDefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.ENUM.DefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.ENUM.DefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.ENUM.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.ENUM.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.ENUM.MultipleValuesForSameField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.ENUM.MultipleValuesForSameField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.ENUM.NonDefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.ENUM.NonDefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.FLOAT.DefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.FLOAT.DefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.FLOAT.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.FLOAT.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.FLOAT.MultipleValuesForSameField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.FLOAT.MultipleValuesForSameField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.FLOAT.NonDefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.FLOAT.NonDefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.MESSAGE.DefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.MESSAGE.DefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.MESSAGE.Merge.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.MESSAGE.Merge.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.MESSAGE.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.MESSAGE.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.MESSAGE.MultipleValuesForSameField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.MESSAGE.MultipleValuesForSameField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.MESSAGE.NonDefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.MESSAGE.NonDefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.STRING.DefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.STRING.DefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.STRING.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.STRING.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.STRING.MultipleValuesForSameField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.STRING.MultipleValuesForSameField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.STRING.NonDefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.STRING.NonDefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.UINT32.DefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.UINT32.DefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.UINT32.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.UINT32.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.UINT32.MultipleValuesForSameField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.UINT32.MultipleValuesForSameField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.UINT32.NonDefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.UINT32.NonDefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.UINT64.DefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.UINT64.DefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.UINT64.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.UINT64.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.UINT64.MultipleValuesForSameField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.UINT64.MultipleValuesForSameField.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.UINT64.NonDefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataOneof.UINT64.NonDefaultValue.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.BOOL.PackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.BOOL.PackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.BOOL.UnpackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.BOOL.UnpackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.BYTES.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.BYTES.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.DOUBLE.PackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.DOUBLE.PackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.DOUBLE.UnpackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.DOUBLE.UnpackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.ENUM.PackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.ENUM.PackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.ENUM.UnpackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.ENUM.UnpackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.FIXED32.PackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.FIXED32.PackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.FIXED32.UnpackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.FIXED32.UnpackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.FIXED64.PackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.FIXED64.PackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.FIXED64.UnpackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.FIXED64.UnpackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.FLOAT.PackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.FLOAT.PackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.FLOAT.UnpackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.FLOAT.UnpackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.INT32.PackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.INT32.PackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.INT32.UnpackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.INT32.UnpackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.INT64.PackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.INT64.PackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.INT64.UnpackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.INT64.UnpackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.MESSAGE.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.MESSAGE.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.SFIXED32.PackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.SFIXED32.PackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.SFIXED32.UnpackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.SFIXED32.UnpackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.SFIXED64.PackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.SFIXED64.PackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.SFIXED64.UnpackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.SFIXED64.UnpackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.SINT32.PackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.SINT32.PackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.SINT32.UnpackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.SINT32.UnpackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.SINT64.PackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.SINT64.PackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.SINT64.UnpackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.SINT64.UnpackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.STRING.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.STRING.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.UINT32.PackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.UINT32.PackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.UINT32.UnpackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.UINT32.UnpackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.UINT64.PackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.UINT64.PackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.UINT64.UnpackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataRepeated.UINT64.UnpackedInput.ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.BOOL[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.BOOL[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.BOOL[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.BOOL[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.BOOL[2].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.BOOL[2].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.BOOL[3].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.BOOL[3].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.BOOL[4].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.BOOL[4].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.BOOL[5].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.BOOL[5].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.BOOL[6].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.BOOL[6].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.BYTES[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.BYTES[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.BYTES[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.BYTES[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.BYTES[2].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.BYTES[2].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.BYTES[3].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.BYTES[3].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.DOUBLE[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.DOUBLE[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.DOUBLE[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.DOUBLE[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.DOUBLE[2].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.DOUBLE[2].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.DOUBLE[3].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.DOUBLE[3].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.ENUM[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.ENUM[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.ENUM[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.ENUM[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.ENUM[2].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.ENUM[2].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.ENUM[3].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.ENUM[3].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.ENUM[4].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.ENUM[4].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.ENUM[5].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.ENUM[5].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.FIXED32[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.FIXED32[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.FIXED32[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.FIXED32[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.FIXED32[2].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.FIXED32[2].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.FIXED64[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.FIXED64[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.FIXED64[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.FIXED64[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.FIXED64[2].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.FIXED64[2].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.FLOAT[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.FLOAT[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.FLOAT[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.FLOAT[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.FLOAT[2].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.FLOAT[2].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.FLOAT[3].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.FLOAT[3].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.FLOAT[4].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.FLOAT[4].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.INT32[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.INT32[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.INT32[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.INT32[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.INT32[2].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.INT32[2].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.INT32[3].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.INT32[3].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.INT32[4].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.INT32[4].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.INT32[5].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.INT32[5].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.INT32[6].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.INT32[6].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.INT32[7].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.INT32[7].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.INT32[8].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.INT32[8].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.INT32[9].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.INT32[9].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.INT64[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.INT64[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.INT64[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.INT64[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.INT64[2].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.INT64[2].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.INT64[3].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.INT64[3].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.MESSAGE[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.MESSAGE[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.MESSAGE[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.MESSAGE[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SFIXED32[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SFIXED32[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SFIXED32[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SFIXED32[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SFIXED32[2].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SFIXED32[2].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SFIXED32[3].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SFIXED32[3].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SFIXED64[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SFIXED64[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SFIXED64[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SFIXED64[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SFIXED64[2].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SFIXED64[2].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SFIXED64[3].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SFIXED64[3].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SINT32[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SINT32[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SINT32[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SINT32[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SINT32[2].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SINT32[2].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SINT32[3].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SINT32[3].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SINT32[4].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SINT32[4].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SINT64[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SINT64[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SINT64[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SINT64[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SINT64[2].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SINT64[2].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SINT64[3].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.SINT64[3].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.STRING[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.STRING[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.STRING[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.STRING[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.STRING[2].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.STRING[2].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.STRING[3].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.STRING[3].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.STRING[4].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.STRING[4].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.STRING[5].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.STRING[5].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.STRING[6].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.STRING[6].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.UINT32[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.UINT32[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.UINT32[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.UINT32[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.UINT32[2].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.UINT32[2].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.UINT32[3].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.UINT32[3].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.UINT32[4].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.UINT32[4].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.UINT32[5].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.UINT32[5].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.UINT32[6].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.UINT32[6].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.UINT32[7].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.UINT32[7].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.UINT32[8].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.UINT32[8].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.UINT32[9].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.UINT32[9].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.UINT64[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.UINT64[0].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.UINT64[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.UINT64[1].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.UINT64[2].ProtobufOutput +Required.Proto2.ProtobufInput.ValidDataScalar.UINT64[2].ProtobufOutput +Required.Proto3.ProtobufInput.IllegalZeroFieldNum_Case_1 +Required.Proto3.ProtobufInput.IllegalZeroFieldNum_Case_1 +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.BOOL +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.BOOL +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.BYTES +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.BYTES +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.DOUBLE +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.DOUBLE +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.ENUM +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.ENUM +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.FIXED32 +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.FIXED32 +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.FIXED64 +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.FIXED64 +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.FLOAT +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.FLOAT +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.INT32 +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.INT32 +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.INT64 +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.INT64 +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.MESSAGE +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.MESSAGE +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.SFIXED32 +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.SFIXED32 +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.SFIXED64 +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.SFIXED64 +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.SINT32 +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.SINT32 +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.SINT64 +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.SINT64 +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.STRING +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.STRING +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.UINT32 +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.UINT32 +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.UINT64 +Required.Proto3.ProtobufInput.PrematureEofBeforeUnknownValue.UINT64 +Required.Proto3.ProtobufInput.PrematureEofInDelimitedDataForUnknownValue.BYTES +Required.Proto3.ProtobufInput.PrematureEofInDelimitedDataForUnknownValue.BYTES +Required.Proto3.ProtobufInput.PrematureEofInDelimitedDataForUnknownValue.MESSAGE +Required.Proto3.ProtobufInput.PrematureEofInDelimitedDataForUnknownValue.MESSAGE +Required.Proto3.ProtobufInput.PrematureEofInDelimitedDataForUnknownValue.STRING +Required.Proto3.ProtobufInput.PrematureEofInDelimitedDataForUnknownValue.STRING +Required.Proto3.ProtobufInput.RepeatedScalarMessageMerge.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarMessageMerge.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.BOOL.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.BOOL.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.BYTES.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.BYTES.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.DOUBLE.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.DOUBLE.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.ENUM.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.ENUM.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.FIXED32.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.FIXED32.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.FIXED64.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.FIXED64.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.FLOAT.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.FLOAT.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.INT32.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.INT32.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.INT64.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.INT64.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.SFIXED32.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.SFIXED32.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.SFIXED64.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.SFIXED64.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.SINT32.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.SINT32.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.SINT64.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.SINT64.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.STRING.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.STRING.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.UINT32.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.UINT32.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.UINT64.ProtobufOutput +Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.UINT64.ProtobufOutput +Required.Proto3.ProtobufInput.UnknownVarint.ProtobufOutput +Required.Proto3.ProtobufInput.UnknownVarint.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.BOOL.BOOL.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.BOOL.BOOL.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.BOOL.BOOL.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.BOOL.BOOL.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.BOOL.BOOL.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.BOOL.BOOL.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.BOOL.BOOL.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.BOOL.BOOL.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.BOOL.BOOL.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.BOOL.BOOL.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.BOOL.BOOL.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.BOOL.BOOL.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.BOOL.BOOL.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.BOOL.BOOL.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.FIXED32.FIXED32.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.FIXED32.FIXED32.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.FIXED32.FIXED32.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.FIXED32.FIXED32.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.FIXED32.FIXED32.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.FIXED32.FIXED32.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.FIXED32.FIXED32.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.FIXED32.FIXED32.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.FIXED32.FIXED32.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.FIXED32.FIXED32.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.FIXED32.FIXED32.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.FIXED32.FIXED32.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.FIXED32.FIXED32.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.FIXED32.FIXED32.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.FIXED64.FIXED64.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.FIXED64.FIXED64.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.FIXED64.FIXED64.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.FIXED64.FIXED64.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.FIXED64.FIXED64.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.FIXED64.FIXED64.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.FIXED64.FIXED64.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.FIXED64.FIXED64.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.FIXED64.FIXED64.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.FIXED64.FIXED64.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.FIXED64.FIXED64.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.FIXED64.FIXED64.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.FIXED64.FIXED64.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.FIXED64.FIXED64.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.DOUBLE.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.DOUBLE.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.DOUBLE.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.DOUBLE.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.DOUBLE.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.DOUBLE.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.DOUBLE.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.DOUBLE.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.DOUBLE.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.DOUBLE.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.DOUBLE.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.DOUBLE.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.DOUBLE.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.DOUBLE.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.FLOAT.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.FLOAT.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.FLOAT.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.FLOAT.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.FLOAT.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.FLOAT.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.FLOAT.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.FLOAT.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.FLOAT.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.FLOAT.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.FLOAT.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.FLOAT.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.FLOAT.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.FLOAT.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.INT32.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.INT32.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.INT32.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.INT32.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.INT32.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.INT32.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.INT32.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.INT32.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.INT32.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.INT32.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.INT32.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.INT32.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.INT32.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT32.INT32.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT64.INT64.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT64.INT64.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT64.INT64.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT64.INT64.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT64.INT64.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT64.INT64.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT64.INT64.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT64.INT64.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT64.INT64.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT64.INT64.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT64.INT64.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT64.INT64.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT64.INT64.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.INT64.INT64.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SFIXED32.SFIXED32.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SFIXED32.SFIXED32.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SFIXED32.SFIXED32.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SFIXED32.SFIXED32.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SFIXED32.SFIXED32.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SFIXED32.SFIXED32.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SFIXED32.SFIXED32.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SFIXED32.SFIXED32.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SFIXED32.SFIXED32.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SFIXED32.SFIXED32.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SFIXED32.SFIXED32.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SFIXED32.SFIXED32.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SFIXED32.SFIXED32.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SFIXED32.SFIXED32.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SFIXED64.SFIXED64.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SFIXED64.SFIXED64.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SFIXED64.SFIXED64.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SFIXED64.SFIXED64.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SFIXED64.SFIXED64.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SFIXED64.SFIXED64.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SFIXED64.SFIXED64.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SFIXED64.SFIXED64.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SFIXED64.SFIXED64.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SFIXED64.SFIXED64.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SFIXED64.SFIXED64.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SFIXED64.SFIXED64.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SFIXED64.SFIXED64.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SFIXED64.SFIXED64.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SINT32.SINT32.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SINT32.SINT32.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SINT32.SINT32.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SINT32.SINT32.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SINT32.SINT32.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SINT32.SINT32.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SINT32.SINT32.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SINT32.SINT32.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SINT32.SINT32.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SINT32.SINT32.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SINT32.SINT32.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SINT32.SINT32.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SINT32.SINT32.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SINT32.SINT32.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SINT64.SINT64.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SINT64.SINT64.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SINT64.SINT64.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SINT64.SINT64.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SINT64.SINT64.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SINT64.SINT64.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SINT64.SINT64.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SINT64.SINT64.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SINT64.SINT64.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SINT64.SINT64.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SINT64.SINT64.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SINT64.SINT64.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SINT64.SINT64.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.SINT64.SINT64.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.BYTES.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.BYTES.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.BYTES.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.BYTES.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.BYTES.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.BYTES.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.BYTES.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.BYTES.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.BYTES.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.BYTES.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.BYTES.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.BYTES.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.BYTES.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.BYTES.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.ENUM.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.ENUM.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.ENUM.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.ENUM.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.ENUM.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.ENUM.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.ENUM.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.ENUM.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.ENUM.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.ENUM.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.ENUM.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.ENUM.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.ENUM.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.ENUM.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.MESSAGE.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.MESSAGE.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.MESSAGE.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.MESSAGE.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.MESSAGE.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.MESSAGE.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.MESSAGE.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.MESSAGE.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.MESSAGE.MergeValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.MESSAGE.MergeValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.MESSAGE.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.MESSAGE.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.MESSAGE.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.MESSAGE.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.MESSAGE.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.MESSAGE.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.STRING.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.STRING.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.STRING.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.STRING.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.STRING.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.STRING.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.STRING.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.STRING.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.STRING.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.STRING.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.STRING.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.STRING.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.STRING.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.STRING.STRING.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.UINT32.UINT32.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.UINT32.UINT32.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.UINT32.UINT32.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.UINT32.UINT32.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.UINT32.UINT32.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.UINT32.UINT32.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.UINT32.UINT32.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.UINT32.UINT32.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.UINT32.UINT32.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.UINT32.UINT32.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.UINT32.UINT32.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.UINT32.UINT32.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.UINT32.UINT32.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.UINT32.UINT32.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.UINT64.UINT64.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.UINT64.UINT64.Default.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.UINT64.UINT64.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.UINT64.UINT64.DuplicateKey.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.UINT64.UINT64.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.UINT64.UINT64.DuplicateKeyInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.UINT64.UINT64.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.UINT64.UINT64.DuplicateValueInMapEntry.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.UINT64.UINT64.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.UINT64.UINT64.MissingDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.UINT64.UINT64.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.UINT64.UINT64.NonDefault.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.UINT64.UINT64.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataMap.UINT64.UINT64.Unordered.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.BOOL.DefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.BOOL.DefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.BOOL.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.BOOL.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.BOOL.MultipleValuesForSameField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.BOOL.MultipleValuesForSameField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.BOOL.NonDefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.BOOL.NonDefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.BYTES.DefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.BYTES.DefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.BYTES.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.BYTES.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.BYTES.MultipleValuesForSameField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.BYTES.MultipleValuesForSameField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.BYTES.NonDefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.BYTES.NonDefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.DOUBLE.DefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.DOUBLE.DefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.DOUBLE.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.DOUBLE.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.DOUBLE.MultipleValuesForSameField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.DOUBLE.MultipleValuesForSameField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.DOUBLE.NonDefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.DOUBLE.NonDefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.ENUM.DefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.ENUM.DefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.ENUM.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.ENUM.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.ENUM.MultipleValuesForSameField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.ENUM.MultipleValuesForSameField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.ENUM.NonDefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.ENUM.NonDefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.FLOAT.DefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.FLOAT.DefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.FLOAT.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.FLOAT.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.FLOAT.MultipleValuesForSameField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.FLOAT.MultipleValuesForSameField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.FLOAT.NonDefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.FLOAT.NonDefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.MESSAGE.DefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.MESSAGE.DefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.MESSAGE.Merge.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.MESSAGE.Merge.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.MESSAGE.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.MESSAGE.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.MESSAGE.MultipleValuesForSameField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.MESSAGE.MultipleValuesForSameField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.MESSAGE.NonDefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.MESSAGE.NonDefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.STRING.DefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.STRING.DefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.STRING.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.STRING.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.STRING.MultipleValuesForSameField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.STRING.MultipleValuesForSameField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.STRING.NonDefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.STRING.NonDefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.UINT32.DefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.UINT32.DefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.UINT32.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.UINT32.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.UINT32.MultipleValuesForSameField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.UINT32.MultipleValuesForSameField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.UINT32.NonDefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.UINT32.NonDefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.UINT64.DefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.UINT64.DefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.UINT64.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.UINT64.MultipleValuesForDifferentField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.UINT64.MultipleValuesForSameField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.UINT64.MultipleValuesForSameField.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.UINT64.NonDefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataOneof.UINT64.NonDefaultValue.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.BOOL.PackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.BOOL.PackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.BOOL.UnpackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.BOOL.UnpackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.BYTES.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.BYTES.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.DOUBLE.PackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.DOUBLE.PackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.DOUBLE.UnpackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.DOUBLE.UnpackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.ENUM.PackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.ENUM.PackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.ENUM.UnpackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.ENUM.UnpackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.FIXED32.PackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.FIXED32.PackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.FIXED32.UnpackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.FIXED32.UnpackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.FIXED64.PackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.FIXED64.PackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.FIXED64.UnpackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.FIXED64.UnpackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.FLOAT.PackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.FLOAT.PackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.FLOAT.UnpackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.FLOAT.UnpackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.INT32.PackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.INT32.PackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.INT32.UnpackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.INT32.UnpackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.INT64.PackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.INT64.PackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.INT64.UnpackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.INT64.UnpackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.MESSAGE.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.MESSAGE.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.SFIXED32.PackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.SFIXED32.PackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.SFIXED32.UnpackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.SFIXED32.UnpackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.SFIXED64.PackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.SFIXED64.PackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.SFIXED64.UnpackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.SFIXED64.UnpackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.SINT32.PackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.SINT32.PackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.SINT32.UnpackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.SINT32.UnpackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.SINT64.PackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.SINT64.PackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.SINT64.UnpackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.SINT64.UnpackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.STRING.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.STRING.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.UINT32.PackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.UINT32.PackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.UINT32.UnpackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.UINT32.UnpackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.UINT64.PackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.UINT64.PackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.UINT64.UnpackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataRepeated.UINT64.UnpackedInput.ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.BOOL[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.BOOL[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.BOOL[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.BOOL[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.BOOL[2].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.BOOL[2].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.BOOL[3].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.BOOL[3].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.BOOL[4].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.BOOL[4].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.BOOL[5].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.BOOL[5].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.BOOL[6].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.BOOL[6].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.BYTES[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.BYTES[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.BYTES[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.BYTES[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.BYTES[2].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.BYTES[2].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.BYTES[3].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.BYTES[3].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.DOUBLE[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.DOUBLE[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.DOUBLE[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.DOUBLE[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.DOUBLE[2].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.DOUBLE[2].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.DOUBLE[3].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.DOUBLE[3].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.ENUM[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.ENUM[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.ENUM[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.ENUM[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.ENUM[2].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.ENUM[2].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.ENUM[3].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.ENUM[3].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.ENUM[4].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.ENUM[4].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.ENUM[5].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.ENUM[5].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.FIXED32[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.FIXED32[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.FIXED32[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.FIXED32[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.FIXED32[2].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.FIXED32[2].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.FIXED64[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.FIXED64[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.FIXED64[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.FIXED64[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.FIXED64[2].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.FIXED64[2].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.FLOAT[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.FLOAT[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.FLOAT[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.FLOAT[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.FLOAT[2].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.FLOAT[2].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.FLOAT[3].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.FLOAT[3].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.FLOAT[4].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.FLOAT[4].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.INT32[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.INT32[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.INT32[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.INT32[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.INT32[2].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.INT32[2].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.INT32[3].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.INT32[3].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.INT32[4].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.INT32[4].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.INT32[5].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.INT32[5].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.INT32[6].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.INT32[6].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.INT32[7].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.INT32[7].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.INT32[8].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.INT32[8].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.INT32[9].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.INT32[9].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.INT64[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.INT64[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.INT64[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.INT64[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.INT64[2].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.INT64[2].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.INT64[3].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.INT64[3].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.MESSAGE[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.MESSAGE[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.MESSAGE[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.MESSAGE[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SFIXED32[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SFIXED32[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SFIXED32[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SFIXED32[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SFIXED32[2].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SFIXED32[2].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SFIXED32[3].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SFIXED32[3].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SFIXED64[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SFIXED64[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SFIXED64[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SFIXED64[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SFIXED64[2].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SFIXED64[2].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SFIXED64[3].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SFIXED64[3].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SINT32[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SINT32[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SINT32[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SINT32[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SINT32[2].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SINT32[2].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SINT32[3].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SINT32[3].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SINT32[4].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SINT32[4].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SINT64[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SINT64[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SINT64[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SINT64[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SINT64[2].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SINT64[2].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SINT64[3].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.SINT64[3].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.STRING[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.STRING[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.STRING[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.STRING[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.STRING[2].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.STRING[2].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.STRING[3].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.STRING[3].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.STRING[4].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.STRING[4].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.STRING[5].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.STRING[5].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.STRING[6].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.STRING[6].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.UINT32[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.UINT32[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.UINT32[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.UINT32[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.UINT32[2].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.UINT32[2].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.UINT32[3].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.UINT32[3].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.UINT32[4].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.UINT32[4].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.UINT32[5].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.UINT32[5].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.UINT32[6].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.UINT32[6].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.UINT32[7].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.UINT32[7].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.UINT32[8].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.UINT32[8].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.UINT32[9].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.UINT32[9].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.UINT64[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.UINT64[0].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.UINT64[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.UINT64[1].ProtobufOutput +Required.Proto3.ProtobufInput.ValidDataScalar.UINT64[2].ProtobufOutput From edfd961ab4566f87d6637c3db4aee647a9521313 Mon Sep 17 00:00:00 2001 From: Ludovic Chenut Date: Wed, 15 Feb 2023 15:40:48 +0100 Subject: [PATCH 21/30] Add a log option to import_proto3 --- protobuf_serialization/files/type_generator.nim | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/protobuf_serialization/files/type_generator.nim b/protobuf_serialization/files/type_generator.nim index 8aed6ea..f9e7e36 100644 --- a/protobuf_serialization/files/type_generator.nim +++ b/protobuf_serialization/files/type_generator.nim @@ -69,7 +69,7 @@ proc isNested(base: string, currentName: string, messages: seq[ProtoNode]): bool return true # Exported for the tests. -proc protoToTypesInternal*(filepath: string): NimNode {.compileTime.} = +proc protoToTypesInternal*(filepath: string, logFile: string = ""): NimNode {.compileTime.} = var packages: seq[ProtoNode] = parseProtobuf(filepath).packages queue: seq[ProtoNode] = @[] @@ -179,10 +179,12 @@ proc protoToTypesInternal*(filepath: string): NimNode {.compileTime.} = value ) ) + if logFile != "": + logFile.writeFile(repr(result)) -macro protoToTypes*(filepath: static[string]): untyped = - result = protoToTypesInternal(filepath) +macro protoToTypes*(filepath: static[string], logFile: static[string] = ""): untyped = + result = protoToTypesInternal(filepath, logFile) -template import_proto3*(file: static[string]): untyped = +template import_proto3*(file: static[string], logFile: static[string] = ""): untyped = const filepath = parentDir(instantiationInfo(-1, true).filename) / file - protoToTypes(filepath) + protoToTypes(filepath, logFile) From 783244c317529cd6a6783d785a3e7d896e1dd2a3 Mon Sep 17 00:00:00 2001 From: Ludovic Chenut Date: Thu, 16 Feb 2023 12:30:33 +0100 Subject: [PATCH 22/30] Update workflows os --- .github/workflows/ci.yml | 6 +++--- .github/workflows/conformance.yml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c88eff9..9fb72ff 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -30,11 +30,11 @@ jobs: include: - target: os: linux - builder: ubuntu-18.04 + builder: ubuntu-20.04 shell: bash - target: os: macos - builder: macos-10.15 + builder: macos-12 shell: bash - target: os: windows @@ -96,7 +96,7 @@ jobs: - name: Restore Nim DLLs dependencies (Windows) from cache if: runner.os == 'Windows' id: windows-dlls-cache - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: external/dlls-${{ matrix.target.cpu }} key: 'dlls-${{ matrix.target.cpu }}' diff --git a/.github/workflows/conformance.yml b/.github/workflows/conformance.yml index b9f5ab4..bc1fd5f 100644 --- a/.github/workflows/conformance.yml +++ b/.github/workflows/conformance.yml @@ -28,11 +28,11 @@ jobs: include: - target: os: linux - builder: ubuntu-18.04 + builder: ubuntu-20.04 shell: bash - target: os: macos - builder: macos-10.15 + builder: macos-12 shell: bash - target: os: windows @@ -94,7 +94,7 @@ jobs: - name: Restore Nim DLLs dependencies (Windows) from cache if: runner.os == 'Windows' id: windows-dlls-cache - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: external/dlls-${{ matrix.target.cpu }} key: 'dlls-${{ matrix.target.cpu }}' From 1a52b6a1bfb6cba5cd942f4e183566dfa2198662 Mon Sep 17 00:00:00 2001 From: Ludovic Chenut Date: Thu, 16 Feb 2023 13:18:36 +0100 Subject: [PATCH 23/30] Hide map and ref behind a ConformanceTest flag --- protobuf_serialization.nimble | 2 +- .../files/type_generator.nim | 2 +- protobuf_serialization/reader.nim | 65 ++++++++++--------- protobuf_serialization/writer.nim | 61 ++++++++--------- 4 files changed, 66 insertions(+), 64 deletions(-) diff --git a/protobuf_serialization.nimble b/protobuf_serialization.nimble index e0f91fa..75fd02f 100644 --- a/protobuf_serialization.nimble +++ b/protobuf_serialization.nimble @@ -65,5 +65,5 @@ task conformance_test, "Run conformance tests": exec "cp " & conformance / "conformance_test_runner" & " " & test withDir test: - exec "nim c conformance_nim.nim" + exec "nim c -d:ConformanceTest conformance_nim.nim" exec "./conformance_test_runner --failure_list failure_list.txt conformance_nim" diff --git a/protobuf_serialization/files/type_generator.nim b/protobuf_serialization/files/type_generator.nim index f9e7e36..71a60a9 100644 --- a/protobuf_serialization/files/type_generator.nim +++ b/protobuf_serialization/files/type_generator.nim @@ -117,7 +117,7 @@ proc protoToTypesInternal*(filepath: string, logFile: string = ""): NimNode {.co while fieldsQueue.len != 0: let field = fieldsQueue.pop() if field.kind == Oneof: - # TODO: ATM the oneof is ignore. Find a way to make it work + # TODO: ATM the oneof is ignored. Find a way to make it work for f in field.oneof: fieldsQueue.add(f) continue diff --git a/protobuf_serialization/reader.nim b/protobuf_serialization/reader.nim index 17d9f6f..c4f036c 100644 --- a/protobuf_serialization/reader.nim +++ b/protobuf_serialization/reader.nim @@ -43,37 +43,38 @@ proc readFieldInto[T: object and not Table]( raise (ref ValueError)(msg: "not enough bytes") memoryInput(tmp).readValueInternal(value) -proc readFieldInto[K, V]( - stream: InputStream, - value: var Table[K, V], - header: FieldHeader, - ProtoType: type -) = - # I know it's ugly, but I cannot find a clean way to do it - # ... And nobody cares about map - when K is SomePBInt and V is SomePBInt: - type - TableObject {.proto3.} = object - key {.fieldNumber: 1, pint.}: K - value {.fieldNumber: 2, pint.}: V - elif K is SomePBInt: - type - TableObject {.proto3.} = object - key {.fieldNumber: 1, pint.}: K - value {.fieldNumber: 2.}: V - elif V is SomePBInt: - type - TableObject {.proto3.} = object - key {.fieldNumber: 1.}: K - value {.fieldNumber: 2, pint.}: V - else: - type - TableObject {.proto3.} = object - key {.fieldNumber: 1.}: K - value {.fieldNumber: 2.}: V - var tmp = default(TableObject) - stream.readFieldInto(tmp, header, ProtoType) - value[tmp.key] = tmp.value +when defined(ConformanceTest): + proc readFieldInto[K, V]( + stream: InputStream, + value: var Table[K, V], + header: FieldHeader, + ProtoType: type + ) = + # I know it's ugly, but I cannot find a clean way to do it + # ... And nobody cares about map + when K is SomePBInt and V is SomePBInt: + type + TableObject {.proto3.} = object + key {.fieldNumber: 1, pint.}: K + value {.fieldNumber: 2, pint.}: V + elif K is SomePBInt: + type + TableObject {.proto3.} = object + key {.fieldNumber: 1, pint.}: K + value {.fieldNumber: 2.}: V + elif V is SomePBInt: + type + TableObject {.proto3.} = object + key {.fieldNumber: 1.}: K + value {.fieldNumber: 2, pint.}: V + else: + type + TableObject {.proto3.} = object + key {.fieldNumber: 1.}: K + value {.fieldNumber: 2.}: V + var tmp = default(TableObject) + stream.readFieldInto(tmp, header, ProtoType) + value[tmp.key] = tmp.value proc readFieldInto[T: enum]( stream: InputStream, @@ -183,7 +184,7 @@ proc readValueInternal[T: object](stream: InputStream, value: var T, silent: boo stream.readFieldPackedInto(fieldVar, header, ProtoType) else: stream.readFieldInto(fieldVar, header, ProtoType) - elif ProtoType is ref: + elif ProtoType is ref and defined(ConformanceTest): fieldVar = new ProtoType stream.readFieldInto(fieldVar[], header, ProtoType) else: diff --git a/protobuf_serialization/writer.nim b/protobuf_serialization/writer.nim index 128364f..45632b6 100644 --- a/protobuf_serialization/writer.nim +++ b/protobuf_serialization/writer.nim @@ -82,35 +82,36 @@ proc writeFieldPacked*[T: not byte, ProtoType: SomePrimitive]( for value in values: output.write(toBytes(ProtoType(value))) -proc writeField*[K, V]( - stream: OutputStream, - fieldNum: int, - value: Table[K, V], - ProtoType: type -) = - when K is SomePBInt and V is SomePBInt: - type - TableObject {.proto3.} = object - key {.fieldNumber: 1, pint.}: K - value {.fieldNumber: 2, pint.}: V - elif K is SomePBInt: - type - TableObject {.proto3.} = object - key {.fieldNumber: 1, pint.}: K - value {.fieldNumber: 2.}: V - elif V is SomePBInt: - type - TableObject {.proto3.} = object - key {.fieldNumber: 1.}: K - value {.fieldNumber: 2, pint.}: V - else: - type - TableObject {.proto3.} = object - key {.fieldNumber: 1.}: K - value {.fieldNumber: 2.}: V - for k, v in value.pairs(): - let tmp = TableObject(key: k, value: v) - stream.writeField(fieldNum, tmp, ProtoType) +when defined(ConformanceTest): + proc writeField*[K, V]( + stream: OutputStream, + fieldNum: int, + value: Table[K, V], + ProtoType: type + ) = + when K is SomePBInt and V is SomePBInt: + type + TableObject {.proto3.} = object + key {.fieldNumber: 1, pint.}: K + value {.fieldNumber: 2, pint.}: V + elif K is SomePBInt: + type + TableObject {.proto3.} = object + key {.fieldNumber: 1, pint.}: K + value {.fieldNumber: 2.}: V + elif V is SomePBInt: + type + TableObject {.proto3.} = object + key {.fieldNumber: 1.}: K + value {.fieldNumber: 2, pint.}: V + else: + type + TableObject {.proto3.} = object + key {.fieldNumber: 1.}: K + value {.fieldNumber: 2.}: V + for k, v in value.pairs(): + let tmp = TableObject(key: k, value: v) + stream.writeField(fieldNum, tmp, ProtoType) proc writeValue*[T: object](stream: OutputStream, value: T) = const @@ -139,7 +140,7 @@ proc writeValue*[T: object](stream: OutputStream, value: T) = elif FlatType is object: # TODO avoid writing empty objects in proto3 stream.writeField(fieldNum, fieldVal, ProtoType) - elif FlatType is ref: + elif FlatType is ref and defined(ConformanceTest): if not fieldVal.isNil(): stream.writeField(fieldNum, fieldVal[], ProtoType) else: From 60ff290d269c0c785b1cd8fcbbf943b7964a5a59 Mon Sep 17 00:00:00 2001 From: Ludovic Chenut Date: Thu, 16 Feb 2023 17:32:22 +0100 Subject: [PATCH 24/30] Various fix --- protobuf_serialization/internal.nim | 12 +++++++----- protobuf_serialization/reader.nim | 3 +-- protobuf_serialization/writer.nim | 8 -------- 3 files changed, 8 insertions(+), 15 deletions(-) diff --git a/protobuf_serialization/internal.nim b/protobuf_serialization/internal.nim index e03790f..eb5fbbf 100644 --- a/protobuf_serialization/internal.nim +++ b/protobuf_serialization/internal.nim @@ -132,11 +132,13 @@ func verifySerializable*[T](ty: typedesc[T]) {.compileTime.} = {.fatal: $T & ": Serializing a number requires specifying the amount of bits via the type.".} elif FlatType is seq: when FlatType isnot seq[byte]: - return # TODO make it work in case of recursivity - # type List = object (value: Value) - # type Value = object (list: List) - # verifySerializable(elementType(FlatType)) - elif FlatType is Table: + when defined(ConformanceTest): + return # TODO make it work in case of recursivity + # type List = object (value: Value) + # type Value = object (list: List) + else: + verifySerializable(elementType(FlatType)) + elif FlatType is Table and defined(ConformanceTest): return # TODO make it work in case of recursivity # type Struct = object (map: Table[..., Value]) # type Value = object (struct: Struct) diff --git a/protobuf_serialization/reader.nim b/protobuf_serialization/reader.nim index c4f036c..6d300c5 100644 --- a/protobuf_serialization/reader.nim +++ b/protobuf_serialization/reader.nim @@ -86,8 +86,7 @@ proc readFieldInto[T: enum]( {.fatal: $T & " definition must contain a constant that maps to zero".} header.requireKind(WireKind.Varint) let enumValue = stream.readValue(ProtoType) - if not checkedEnumAssign(value, enumValue.int32) and - not checkedEnumAssign(value, 0): + if not checkedEnumAssign(value, enumValue.int32): raise (ref ValueError)(msg: "Attempted to decode an invalid enum value") proc readFieldInto[T: not object and not enum and (seq[byte] or not seq)]( diff --git a/protobuf_serialization/writer.nim b/protobuf_serialization/writer.nim index 45632b6..be76bc2 100644 --- a/protobuf_serialization/writer.nim +++ b/protobuf_serialization/writer.nim @@ -17,14 +17,6 @@ proc writeField( # TODO turn this into an extension point unsupportedProtoType ProtoType.FieldType, ProtoType.RootType, ProtoType.fieldName -proc writeField*[T: object](stream: OutputStream, fieldNum: int, fieldVal: ref T) = - # TODO Pre-compute size of inner object then write it without the intermediate - # memory output - var inner = memoryOutput() - inner.writeValue(fieldVal) - let bytes = inner.getOutput() - stream.writeField(fieldNum, pbytes(bytes)) - proc writeField*[T: object](stream: OutputStream, fieldNum: int, fieldVal: T) = # TODO Pre-compute size of inner object then write it without the intermediate # memory output From b2116340b9a6043dc82406fd84e9ae121c62ed44 Mon Sep 17 00:00:00 2001 From: Ludovic Chenut Date: Fri, 17 Feb 2023 10:57:53 +0100 Subject: [PATCH 25/30] Readded the pragma proto3 to the enum --- protobuf_serialization/files/type_generator.nim | 2 +- protobuf_serialization/reader.nim | 5 +++-- tests/files/test_proto3.nim | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/protobuf_serialization/files/type_generator.nim b/protobuf_serialization/files/type_generator.nim index 71a60a9..c7eb394 100644 --- a/protobuf_serialization/files/type_generator.nim +++ b/protobuf_serialization/files/type_generator.nim @@ -171,7 +171,7 @@ proc protoToTypesInternal*(filepath: string, logFile: string = ""): NimNode {.co newNimNode(nnkPragmaExpr).add( newNimNode(nnkPostfix).add(ident("*"), ident(name)), if next.kind == ProtoType.Enum: - newNimNode(nnkPragma).add(ident("pure")) + newNimNode(nnkPragma).add(ident("pure"), ident("proto3")) else: newNimNode(nnkPragma).add(ident("proto3")) ), diff --git a/protobuf_serialization/reader.nim b/protobuf_serialization/reader.nim index 6d300c5..1311e33 100644 --- a/protobuf_serialization/reader.nim +++ b/protobuf_serialization/reader.nim @@ -82,12 +82,13 @@ proc readFieldInto[T: enum]( header: FieldHeader, ProtoType: type ) = - when 0 notin T: + # TODO: This function doesn't work for proto2 edge cases. Make it work + when 0 notin T and T.isProto3(): {.fatal: $T & " definition must contain a constant that maps to zero".} header.requireKind(WireKind.Varint) let enumValue = stream.readValue(ProtoType) if not checkedEnumAssign(value, enumValue.int32): - raise (ref ValueError)(msg: "Attempted to decode an invalid enum value") + discard checkedEnumAssign(value, 0) proc readFieldInto[T: not object and not enum and (seq[byte] or not seq)]( stream: InputStream, diff --git a/tests/files/test_proto3.nim b/tests/files/test_proto3.nim index 65aaaaf..d643035 100644 --- a/tests/files/test_proto3.nim +++ b/tests/files/test_proto3.nim @@ -10,7 +10,7 @@ macro test() = parsed: NimNode = protoToTypesInternal(currentSourcePath.parentDir / "test.proto3") vector: NimNode = quote do: type - TestEnum* {.pure.} = enum + TestEnum* {.pure, proto3.} = enum UNKNOWN = 0 STARTED = 1 @@ -32,7 +32,7 @@ macro test() = page_number* {.fieldNumber: 2, pint.}: int32 query* {.fieldNumber: 1.}: string - Corpus* {.pure.} = enum + Corpus* {.pure, proto3.} = enum UNIVERSAL = 0 WEB = 1 IMAGES = 2 From 8ac2d171cd88307e0f6e96351a930fcc99993b41 Mon Sep 17 00:00:00 2001 From: Tanguy Date: Fri, 17 Feb 2023 16:58:06 +0100 Subject: [PATCH 26/30] Pin conformance tests versions --- .github/workflows/conformance.yml | 1 + protobuf_serialization.nimble | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/conformance.yml b/.github/workflows/conformance.yml index bc1fd5f..e6afac9 100644 --- a/.github/workflows/conformance.yml +++ b/.github/workflows/conformance.yml @@ -3,6 +3,7 @@ name: Conformance Test on: workflow_dispatch: types: [run] + pull_request: concurrency: # Cancel stale PR builds (but not push builds) group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} diff --git a/protobuf_serialization.nimble b/protobuf_serialization.nimble index 75fd02f..1d70b5a 100644 --- a/protobuf_serialization.nimble +++ b/protobuf_serialization.nimble @@ -57,7 +57,7 @@ task conformance_test, "Run conformance tests": test = pwd / "tests" / "conformance" if not system.dirExists(conformance): - exec "git clone --recurse-submodules https://github.com/protocolbuffers/protobuf/ " & conformance + exec "git clone -b v22.0 --recurse-submodules https://github.com/protocolbuffers/protobuf/ " & conformance withDir conformance: exec "cmake . -Dprotobuf_BUILD_CONFORMANCE=ON" From faba393c3fd34411b101cc3682181af73da224c2 Mon Sep 17 00:00:00 2001 From: Ludovic Chenut Date: Fri, 17 Feb 2023 17:25:20 +0100 Subject: [PATCH 27/30] Make conformance tests for linux only --- .github/workflows/conformance.yml | 79 +------------------------------ 1 file changed, 2 insertions(+), 77 deletions(-) diff --git a/.github/workflows/conformance.yml b/.github/workflows/conformance.yml index e6afac9..b5ed20f 100644 --- a/.github/workflows/conformance.yml +++ b/.github/workflows/conformance.yml @@ -19,26 +19,13 @@ jobs: cpu: amd64 - os: linux cpu: i386 - - os: macos - cpu: amd64 - - os: windows - cpu: amd64 - #- os: windows - #cpu: i386 - branch: [version-1-2, version-1-4, version-1-6, devel] + + branch: [version-1-4, version-1-6, devel] include: - target: os: linux builder: ubuntu-20.04 shell: bash - - target: - os: macos - builder: macos-12 - shell: bash - - target: - os: windows - builder: windows-2019 - shell: msys2 {0} defaults: run: @@ -71,50 +58,6 @@ jobs: chmod 755 external/bin/gcc external/bin/g++ echo '${{ github.workspace }}/external/bin' >> $GITHUB_PATH - - name: MSYS2 (Windows i386) - if: runner.os == 'Windows' && matrix.target.cpu == 'i386' - uses: msys2/setup-msys2@v2 - with: - path-type: inherit - msystem: MINGW32 - install: >- - base-devel - git - mingw-w64-i686-toolchain - - - name: MSYS2 (Windows amd64) - if: runner.os == 'Windows' && matrix.target.cpu == 'amd64' - uses: msys2/setup-msys2@v2 - with: - path-type: inherit - install: >- - base-devel - git - mingw-w64-x86_64-toolchain - - - name: Restore Nim DLLs dependencies (Windows) from cache - if: runner.os == 'Windows' - id: windows-dlls-cache - uses: actions/cache@v3 - with: - path: external/dlls-${{ matrix.target.cpu }} - key: 'dlls-${{ matrix.target.cpu }}' - - - name: Install DLLs dependencies (Windows) - if: > - steps.windows-dlls-cache.outputs.cache-hit != 'true' && - runner.os == 'Windows' - run: | - mkdir -p external - curl -L "https://nim-lang.org/download/windeps.zip" -o external/windeps.zip - 7z x -y external/windeps.zip -oexternal/dlls-${{ matrix.target.cpu }} - - - name: Path to cached dependencies (Windows) - if: > - runner.os == 'Windows' - run: | - echo "${{ github.workspace }}/external/dlls-${{ matrix.target.cpu }}" >> $GITHUB_PATH - - name: Derive environment variables run: | if [[ '${{ matrix.target.cpu }}' == 'amd64' ]]; then @@ -130,13 +73,6 @@ jobs: 'Linux') ncpu=$(nproc) ;; - 'macOS') - ncpu=$(sysctl -n hw.ncpu) - ;; - 'Windows') - ncpu=$NUMBER_OF_PROCESSORS - MAKE_CMD="mingw32-make" - ;; esac [[ -z "$ncpu" || $ncpu -le 0 ]] && ncpu=1 echo "ncpu=$ncpu" >> $GITHUB_ENV @@ -146,13 +82,6 @@ jobs: run: | if [ "${{ runner.os }}" == "Linux" ]; then sudo apt-get install cmake - elif [ "${{ runner.os }}" == "macOS" ]; then - brew update - brew upgrade - brew install cmake - elif [ "${{ runner.os }}" == "Windows" ]; then - curl -LO https://github.com/Kitware/CMake/releases/download/v3.19.3/cmake-3.19.3-win64-x64.msi - msiexec /i cmake-3.19.3-win64-x64.msi /quiet fi - name: Build Nim and Nimble @@ -165,10 +94,6 @@ jobs: - name: Run tests run: | - if [[ "${{ matrix.target.os }}" == "windows" ]]; then - # https://github.com/status-im/nimbus-eth2/issues/3121 - export NIMFLAGS="-d:nimRawSetjmp" - fi nim --version nimble --version nimble install -y --depsOnly From 3592b13b7354900b34baab9ebd4ff8d38d2041d2 Mon Sep 17 00:00:00 2001 From: Ludovic Chenut Date: Tue, 21 Feb 2023 10:46:58 +0100 Subject: [PATCH 28/30] Hide enum behind flag + use stew logger --- .../files/type_generator.nim | 16 +++++------ protobuf_serialization/reader.nim | 28 +++++++++---------- protobuf_serialization/writer.nim | 12 ++++---- tests/test_objects.nim | 21 ++++++-------- 4 files changed, 37 insertions(+), 40 deletions(-) diff --git a/protobuf_serialization/files/type_generator.nim b/protobuf_serialization/files/type_generator.nim index c7eb394..4336147 100644 --- a/protobuf_serialization/files/type_generator.nim +++ b/protobuf_serialization/files/type_generator.nim @@ -1,6 +1,6 @@ import os, algorithm, strutils, tables import macros - +import stew/shims/macros as stewmacros import decldef export decldef, tables import proto_parser @@ -69,7 +69,7 @@ proc isNested(base: string, currentName: string, messages: seq[ProtoNode]): bool return true # Exported for the tests. -proc protoToTypesInternal*(filepath: string, logFile: string = ""): NimNode {.compileTime.} = +proc protoToTypesInternal*(filepath: string, log: bool = false): NimNode {.compileTime.} = var packages: seq[ProtoNode] = parseProtobuf(filepath).packages queue: seq[ProtoNode] = @[] @@ -179,12 +179,12 @@ proc protoToTypesInternal*(filepath: string, logFile: string = ""): NimNode {.co value ) ) - if logFile != "": - logFile.writeFile(repr(result)) + if log: + result.storeMacroResult(true) -macro protoToTypes*(filepath: static[string], logFile: static[string] = ""): untyped = - result = protoToTypesInternal(filepath, logFile) +macro protoToTypes*(filepath: static[string], log: static[bool] = false): untyped = + result = protoToTypesInternal(filepath, log) -template import_proto3*(file: static[string], logFile: static[string] = ""): untyped = +template import_proto3*(file: static[string], log: static[bool] = false): untyped = const filepath = parentDir(instantiationInfo(-1, true).filename) / file - protoToTypes(filepath, logFile) + protoToTypes(filepath, log) diff --git a/protobuf_serialization/reader.nim b/protobuf_serialization/reader.nim index 1311e33..fcd6527 100644 --- a/protobuf_serialization/reader.nim +++ b/protobuf_serialization/reader.nim @@ -44,6 +44,20 @@ proc readFieldInto[T: object and not Table]( memoryInput(tmp).readValueInternal(value) when defined(ConformanceTest): + proc readFieldInto[T: enum]( + stream: InputStream, + value: var T, + header: FieldHeader, + ProtoType: type + ) = + # TODO: This function doesn't work for proto2 edge cases. Make it work + when 0 notin T and T.isProto3(): + {.fatal: $T & " definition must contain a constant that maps to zero".} + header.requireKind(WireKind.Varint) + let enumValue = stream.readValue(ProtoType) + if not checkedEnumAssign(value, enumValue.int32): + discard checkedEnumAssign(value, 0) + proc readFieldInto[K, V]( stream: InputStream, value: var Table[K, V], @@ -76,20 +90,6 @@ when defined(ConformanceTest): stream.readFieldInto(tmp, header, ProtoType) value[tmp.key] = tmp.value -proc readFieldInto[T: enum]( - stream: InputStream, - value: var T, - header: FieldHeader, - ProtoType: type -) = - # TODO: This function doesn't work for proto2 edge cases. Make it work - when 0 notin T and T.isProto3(): - {.fatal: $T & " definition must contain a constant that maps to zero".} - header.requireKind(WireKind.Varint) - let enumValue = stream.readValue(ProtoType) - if not checkedEnumAssign(value, enumValue.int32): - discard checkedEnumAssign(value, 0) - proc readFieldInto[T: not object and not enum and (seq[byte] or not seq)]( stream: InputStream, value: var T, diff --git a/protobuf_serialization/writer.nim b/protobuf_serialization/writer.nim index be76bc2..2ccc84b 100644 --- a/protobuf_serialization/writer.nim +++ b/protobuf_serialization/writer.nim @@ -38,12 +38,6 @@ proc writeField( if fieldVal.isSome(): # TODO required field checking stream.writeField(fieldNum, fieldVal.get(), ProtoType) -proc writeField[T: enum]( - stream: OutputStream, fieldNum: int, fieldVal: T, ProtoType: type) = - when 0 notin T: - {.fatal: $T & " definition must contain a constant that maps to zero".} - stream.writeField(fieldNum, pint32(fieldVal.ord())) - proc writeFieldPacked*[T: not byte, ProtoType: SomePrimitive]( output: OutputStream, field: int, values: openArray[T], _: type ProtoType) = doAssert validFieldNumber(field) @@ -75,6 +69,12 @@ proc writeFieldPacked*[T: not byte, ProtoType: SomePrimitive]( output.write(toBytes(ProtoType(value))) when defined(ConformanceTest): + proc writeField[T: enum]( + stream: OutputStream, fieldNum: int, fieldVal: T, ProtoType: type) = + when 0 notin T: + {.fatal: $T & " definition must contain a constant that maps to zero".} + stream.writeField(fieldNum, pint32(fieldVal.ord())) + proc writeField*[K, V]( stream: OutputStream, fieldNum: int, diff --git a/tests/test_objects.nim b/tests/test_objects.nim index a76ea0a..1a09b7f 100644 --- a/tests/test_objects.nim +++ b/tests/test_objects.nim @@ -5,10 +5,10 @@ import ../protobuf_serialization/codec type - TestEnum = enum - A1 = 0 - B1 = 1000 - C1 = 1000000 +# TestEnum = enum +# A1 = 0 +# B1 = 1000 +# C1 = 1000000 Basic {.proto3.} = object a {.fieldNumber: 1, pint.}: uint64 @@ -21,7 +21,7 @@ type f {.fieldNumber: 3.}: Basic g {.fieldNumber: 4.}: string h {.fieldNumber: 5.}: bool - i {.fieldNumber: 6.}: TestEnum + #i {.fieldNumber: 6.}: TestEnum discard Protobuf.supports(Basic) discard Protobuf.supports(Wrapped) @@ -40,8 +40,7 @@ suite "Test Object Encoding/Decoding": e: 200, f: Basic(a: 100, b: "Test string."), # TODO, c: 'C'), g: "Other test string.", - h: true, - i: A1 + h: true ) check Protobuf.decode(Protobuf.encode(obj), type(Wrapped)) == obj @@ -52,8 +51,7 @@ suite "Test Object Encoding/Decoding": e: 200, f: Basic(a: 100, b: "Test string."), # c: 'C'), g: "Other test string.", - h: true, - i: B1 + h: true ) writer = memoryOutput() @@ -75,13 +73,12 @@ suite "Test Object Encoding/Decoding": e: 200, f: Basic(a: 100, b: "Test string."), # c: 'C'), g: "Other test string.", - h: true, - i: C1 + h: true ) writer = memoryOutput() writer.writeField(3, obj.f) - writer.writeField(6, penum(obj.i)) + #writer.writeField(6, penum(obj.i)) writer.writeField(1, sint64(obj.d)) writer.writeField(2, sint64(obj.e)) writer.writeField(5, pbool(obj.h)) From 9553d39c7065c042f3ccd3e31e015080a2a30b5f Mon Sep 17 00:00:00 2001 From: Ludovic Chenut Date: Tue, 21 Feb 2023 11:08:37 +0100 Subject: [PATCH 29/30] Change type generated log --- protobuf_serialization/files/type_generator.nim | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/protobuf_serialization/files/type_generator.nim b/protobuf_serialization/files/type_generator.nim index 4336147..f446cbc 100644 --- a/protobuf_serialization/files/type_generator.nim +++ b/protobuf_serialization/files/type_generator.nim @@ -69,7 +69,7 @@ proc isNested(base: string, currentName: string, messages: seq[ProtoNode]): bool return true # Exported for the tests. -proc protoToTypesInternal*(filepath: string, log: bool = false): NimNode {.compileTime.} = +proc protoToTypesInternal*(filepath: string): NimNode {.compileTime.} = var packages: seq[ProtoNode] = parseProtobuf(filepath).packages queue: seq[ProtoNode] = @[] @@ -179,12 +179,12 @@ proc protoToTypesInternal*(filepath: string, log: bool = false): NimNode {.compi value ) ) - if log: + if defined(LogGeneratedTypes): result.storeMacroResult(true) -macro protoToTypes*(filepath: static[string], log: static[bool] = false): untyped = - result = protoToTypesInternal(filepath, log) +macro protoToTypes*(filepath: static[string]): untyped = + result = protoToTypesInternal(filepath) -template import_proto3*(file: static[string], log: static[bool] = false): untyped = +template import_proto3*(file: static[string]): untyped = const filepath = parentDir(instantiationInfo(-1, true).filename) / file - protoToTypes(filepath, log) + protoToTypes(filepath) From b70cb9b4004820670890587037b5e09617a017b6 Mon Sep 17 00:00:00 2001 From: Ludovic Chenut Date: Tue, 21 Feb 2023 11:10:50 +0100 Subject: [PATCH 30/30] fix if / when --- protobuf_serialization/files/type_generator.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/protobuf_serialization/files/type_generator.nim b/protobuf_serialization/files/type_generator.nim index f446cbc..3a9b607 100644 --- a/protobuf_serialization/files/type_generator.nim +++ b/protobuf_serialization/files/type_generator.nim @@ -179,7 +179,7 @@ proc protoToTypesInternal*(filepath: string): NimNode {.compileTime.} = value ) ) - if defined(LogGeneratedTypes): + when defined(LogGeneratedTypes): result.storeMacroResult(true) macro protoToTypes*(filepath: static[string]): untyped =