aboutsummaryrefslogtreecommitdiff
path: root/proto/noenforceutf8_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'proto/noenforceutf8_test.go')
-rw-r--r--proto/noenforceutf8_test.go146
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),
+ },
+}