diff options
Diffstat (limited to 'proto/noenforceutf8_test.go')
-rw-r--r-- | proto/noenforceutf8_test.go | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/proto/noenforceutf8_test.go b/proto/noenforceutf8_test.go new file mode 100644 index 00000000..2bd011ef --- /dev/null +++ b/proto/noenforceutf8_test.go @@ -0,0 +1,146 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package proto_test + +import ( + "reflect" + + "google.golang.org/protobuf/encoding/prototext" + "google.golang.org/protobuf/internal/filedesc" + "google.golang.org/protobuf/internal/flags" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/reflect/protodesc" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/runtime/protoimpl" + "google.golang.org/protobuf/testing/protopack" + + "google.golang.org/protobuf/types/descriptorpb" +) + +func init() { + if flags.ProtoLegacy { + testValidMessages = append(testValidMessages, noEnforceUTF8TestProtos...) + } else { + testInvalidMessages = append(testInvalidMessages, noEnforceUTF8TestProtos...) + } +} + +var noEnforceUTF8TestProtos = []testProto{ + { + desc: "invalid UTF-8 in optional string field", + decodeTo: []proto.Message{&TestNoEnforceUTF8{ + OptionalString: string("abc\xff"), + }}, + wire: protopack.Message{ + protopack.Tag{1, protopack.BytesType}, protopack.String("abc\xff"), + }.Marshal(), + }, + { + desc: "invalid UTF-8 in optional string field of Go bytes", + decodeTo: []proto.Message{&TestNoEnforceUTF8{ + OptionalBytes: []byte("abc\xff"), + }}, + wire: protopack.Message{ + protopack.Tag{2, protopack.BytesType}, protopack.String("abc\xff"), + }.Marshal(), + }, + { + desc: "invalid UTF-8 in repeated string field", + decodeTo: []proto.Message{&TestNoEnforceUTF8{ + RepeatedString: []string{string("foo"), string("abc\xff")}, + }}, + wire: protopack.Message{ + protopack.Tag{3, protopack.BytesType}, protopack.String("foo"), + protopack.Tag{3, protopack.BytesType}, protopack.String("abc\xff"), + }.Marshal(), + }, + { + desc: "invalid UTF-8 in repeated string field of Go bytes", + decodeTo: []proto.Message{&TestNoEnforceUTF8{ + RepeatedBytes: [][]byte{[]byte("foo"), []byte("abc\xff")}, + }}, + wire: protopack.Message{ + protopack.Tag{4, protopack.BytesType}, protopack.String("foo"), + protopack.Tag{4, protopack.BytesType}, protopack.String("abc\xff"), + }.Marshal(), + }, + { + desc: "invalid UTF-8 in oneof string field", + decodeTo: []proto.Message{ + &TestNoEnforceUTF8{OneofField: &TestNoEnforceUTF8_OneofString{string("abc\xff")}}, + }, + wire: protopack.Message{protopack.Tag{5, protopack.BytesType}, protopack.String("abc\xff")}.Marshal(), + }, + { + desc: "invalid UTF-8 in oneof string field of Go bytes", + decodeTo: []proto.Message{ + &TestNoEnforceUTF8{OneofField: &TestNoEnforceUTF8_OneofBytes{[]byte("abc\xff")}}, + }, + wire: protopack.Message{protopack.Tag{6, protopack.BytesType}, protopack.String("abc\xff")}.Marshal(), + }, +} + +type TestNoEnforceUTF8 struct { + OptionalString string `protobuf:"bytes,1,opt,name=optional_string"` + OptionalBytes []byte `protobuf:"bytes,2,opt,name=optional_bytes"` + RepeatedString []string `protobuf:"bytes,3,rep,name=repeated_string"` + RepeatedBytes [][]byte `protobuf:"bytes,4,rep,name=repeated_bytes"` + OneofField isOneofField `protobuf_oneof:"oneof_field"` +} + +type isOneofField interface{ isOneofField() } + +type TestNoEnforceUTF8_OneofString struct { + OneofString string `protobuf:"bytes,5,opt,name=oneof_string,oneof"` +} +type TestNoEnforceUTF8_OneofBytes struct { + OneofBytes []byte `protobuf:"bytes,6,opt,name=oneof_bytes,oneof"` +} + +func (*TestNoEnforceUTF8_OneofString) isOneofField() {} +func (*TestNoEnforceUTF8_OneofBytes) isOneofField() {} + +func (m *TestNoEnforceUTF8) ProtoReflect() protoreflect.Message { + return messageInfo_TestNoEnforceUTF8.MessageOf(m) +} + +var messageInfo_TestNoEnforceUTF8 = protoimpl.MessageInfo{ + GoReflectType: reflect.TypeOf((*TestNoEnforceUTF8)(nil)), + Desc: func() protoreflect.MessageDescriptor { + pb := new(descriptorpb.FileDescriptorProto) + if err := prototext.Unmarshal([]byte(` + syntax: "proto3" + name: "test.proto" + message_type: [{ + name: "TestNoEnforceUTF8" + field: [ + {name:"optional_string" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, + {name:"optional_bytes" number:2 label:LABEL_OPTIONAL type:TYPE_STRING}, + {name:"repeated_string" number:3 label:LABEL_REPEATED type:TYPE_STRING}, + {name:"repeated_bytes" number:4 label:LABEL_REPEATED type:TYPE_STRING}, + {name:"oneof_string" number:5 label:LABEL_OPTIONAL type:TYPE_STRING, oneof_index:0}, + {name:"oneof_bytes" number:6 label:LABEL_OPTIONAL type:TYPE_STRING, oneof_index:0} + ] + oneof_decl: [{name:"oneof_field"}] + }] + `), pb); err != nil { + panic(err) + } + fd, err := protodesc.NewFile(pb, nil) + if err != nil { + panic(err) + } + md := fd.Messages().Get(0) + for i := 0; i < md.Fields().Len(); i++ { + md.Fields().Get(i).(*filedesc.Field).L1.HasEnforceUTF8 = true + md.Fields().Get(i).(*filedesc.Field).L1.EnforceUTF8 = false + } + return md + }(), + OneofWrappers: []interface{}{ + (*TestNoEnforceUTF8_OneofString)(nil), + (*TestNoEnforceUTF8_OneofBytes)(nil), + }, +} |