xref: /aosp_15_r20/external/golang-protobuf/proto/noenforceutf8_test.go (revision 1c12ee1efe575feb122dbf939ff15148a3b3e8f2)
1*1c12ee1eSDan Willemsen// Copyright 2019 The Go Authors. All rights reserved.
2*1c12ee1eSDan Willemsen// Use of this source code is governed by a BSD-style
3*1c12ee1eSDan Willemsen// license that can be found in the LICENSE file.
4*1c12ee1eSDan Willemsen
5*1c12ee1eSDan Willemsenpackage proto_test
6*1c12ee1eSDan Willemsen
7*1c12ee1eSDan Willemsenimport (
8*1c12ee1eSDan Willemsen	"reflect"
9*1c12ee1eSDan Willemsen
10*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/encoding/prototext"
11*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/internal/filedesc"
12*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/internal/flags"
13*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/proto"
14*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/reflect/protodesc"
15*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/reflect/protoreflect"
16*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/runtime/protoimpl"
17*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/testing/protopack"
18*1c12ee1eSDan Willemsen
19*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/types/descriptorpb"
20*1c12ee1eSDan Willemsen)
21*1c12ee1eSDan Willemsen
22*1c12ee1eSDan Willemsenfunc init() {
23*1c12ee1eSDan Willemsen	if flags.ProtoLegacy {
24*1c12ee1eSDan Willemsen		testValidMessages = append(testValidMessages, noEnforceUTF8TestProtos...)
25*1c12ee1eSDan Willemsen	} else {
26*1c12ee1eSDan Willemsen		testInvalidMessages = append(testInvalidMessages, noEnforceUTF8TestProtos...)
27*1c12ee1eSDan Willemsen	}
28*1c12ee1eSDan Willemsen}
29*1c12ee1eSDan Willemsen
30*1c12ee1eSDan Willemsenvar noEnforceUTF8TestProtos = []testProto{
31*1c12ee1eSDan Willemsen	{
32*1c12ee1eSDan Willemsen		desc: "invalid UTF-8 in optional string field",
33*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{&TestNoEnforceUTF8{
34*1c12ee1eSDan Willemsen			OptionalString: string("abc\xff"),
35*1c12ee1eSDan Willemsen		}},
36*1c12ee1eSDan Willemsen		wire: protopack.Message{
37*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.BytesType}, protopack.String("abc\xff"),
38*1c12ee1eSDan Willemsen		}.Marshal(),
39*1c12ee1eSDan Willemsen	},
40*1c12ee1eSDan Willemsen	{
41*1c12ee1eSDan Willemsen		desc: "invalid UTF-8 in optional string field of Go bytes",
42*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{&TestNoEnforceUTF8{
43*1c12ee1eSDan Willemsen			OptionalBytes: []byte("abc\xff"),
44*1c12ee1eSDan Willemsen		}},
45*1c12ee1eSDan Willemsen		wire: protopack.Message{
46*1c12ee1eSDan Willemsen			protopack.Tag{2, protopack.BytesType}, protopack.String("abc\xff"),
47*1c12ee1eSDan Willemsen		}.Marshal(),
48*1c12ee1eSDan Willemsen	},
49*1c12ee1eSDan Willemsen	{
50*1c12ee1eSDan Willemsen		desc: "invalid UTF-8 in repeated string field",
51*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{&TestNoEnforceUTF8{
52*1c12ee1eSDan Willemsen			RepeatedString: []string{string("foo"), string("abc\xff")},
53*1c12ee1eSDan Willemsen		}},
54*1c12ee1eSDan Willemsen		wire: protopack.Message{
55*1c12ee1eSDan Willemsen			protopack.Tag{3, protopack.BytesType}, protopack.String("foo"),
56*1c12ee1eSDan Willemsen			protopack.Tag{3, protopack.BytesType}, protopack.String("abc\xff"),
57*1c12ee1eSDan Willemsen		}.Marshal(),
58*1c12ee1eSDan Willemsen	},
59*1c12ee1eSDan Willemsen	{
60*1c12ee1eSDan Willemsen		desc: "invalid UTF-8 in repeated string field of Go bytes",
61*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{&TestNoEnforceUTF8{
62*1c12ee1eSDan Willemsen			RepeatedBytes: [][]byte{[]byte("foo"), []byte("abc\xff")},
63*1c12ee1eSDan Willemsen		}},
64*1c12ee1eSDan Willemsen		wire: protopack.Message{
65*1c12ee1eSDan Willemsen			protopack.Tag{4, protopack.BytesType}, protopack.String("foo"),
66*1c12ee1eSDan Willemsen			protopack.Tag{4, protopack.BytesType}, protopack.String("abc\xff"),
67*1c12ee1eSDan Willemsen		}.Marshal(),
68*1c12ee1eSDan Willemsen	},
69*1c12ee1eSDan Willemsen	{
70*1c12ee1eSDan Willemsen		desc: "invalid UTF-8 in oneof string field",
71*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
72*1c12ee1eSDan Willemsen			&TestNoEnforceUTF8{OneofField: &TestNoEnforceUTF8_OneofString{string("abc\xff")}},
73*1c12ee1eSDan Willemsen		},
74*1c12ee1eSDan Willemsen		wire: protopack.Message{protopack.Tag{5, protopack.BytesType}, protopack.String("abc\xff")}.Marshal(),
75*1c12ee1eSDan Willemsen	},
76*1c12ee1eSDan Willemsen	{
77*1c12ee1eSDan Willemsen		desc: "invalid UTF-8 in oneof string field of Go bytes",
78*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
79*1c12ee1eSDan Willemsen			&TestNoEnforceUTF8{OneofField: &TestNoEnforceUTF8_OneofBytes{[]byte("abc\xff")}},
80*1c12ee1eSDan Willemsen		},
81*1c12ee1eSDan Willemsen		wire: protopack.Message{protopack.Tag{6, protopack.BytesType}, protopack.String("abc\xff")}.Marshal(),
82*1c12ee1eSDan Willemsen	},
83*1c12ee1eSDan Willemsen}
84*1c12ee1eSDan Willemsen
85*1c12ee1eSDan Willemsentype TestNoEnforceUTF8 struct {
86*1c12ee1eSDan Willemsen	OptionalString string       `protobuf:"bytes,1,opt,name=optional_string"`
87*1c12ee1eSDan Willemsen	OptionalBytes  []byte       `protobuf:"bytes,2,opt,name=optional_bytes"`
88*1c12ee1eSDan Willemsen	RepeatedString []string     `protobuf:"bytes,3,rep,name=repeated_string"`
89*1c12ee1eSDan Willemsen	RepeatedBytes  [][]byte     `protobuf:"bytes,4,rep,name=repeated_bytes"`
90*1c12ee1eSDan Willemsen	OneofField     isOneofField `protobuf_oneof:"oneof_field"`
91*1c12ee1eSDan Willemsen}
92*1c12ee1eSDan Willemsen
93*1c12ee1eSDan Willemsentype isOneofField interface{ isOneofField() }
94*1c12ee1eSDan Willemsen
95*1c12ee1eSDan Willemsentype TestNoEnforceUTF8_OneofString struct {
96*1c12ee1eSDan Willemsen	OneofString string `protobuf:"bytes,5,opt,name=oneof_string,oneof"`
97*1c12ee1eSDan Willemsen}
98*1c12ee1eSDan Willemsentype TestNoEnforceUTF8_OneofBytes struct {
99*1c12ee1eSDan Willemsen	OneofBytes []byte `protobuf:"bytes,6,opt,name=oneof_bytes,oneof"`
100*1c12ee1eSDan Willemsen}
101*1c12ee1eSDan Willemsen
102*1c12ee1eSDan Willemsenfunc (*TestNoEnforceUTF8_OneofString) isOneofField() {}
103*1c12ee1eSDan Willemsenfunc (*TestNoEnforceUTF8_OneofBytes) isOneofField()  {}
104*1c12ee1eSDan Willemsen
105*1c12ee1eSDan Willemsenfunc (m *TestNoEnforceUTF8) ProtoReflect() protoreflect.Message {
106*1c12ee1eSDan Willemsen	return messageInfo_TestNoEnforceUTF8.MessageOf(m)
107*1c12ee1eSDan Willemsen}
108*1c12ee1eSDan Willemsen
109*1c12ee1eSDan Willemsenvar messageInfo_TestNoEnforceUTF8 = protoimpl.MessageInfo{
110*1c12ee1eSDan Willemsen	GoReflectType: reflect.TypeOf((*TestNoEnforceUTF8)(nil)),
111*1c12ee1eSDan Willemsen	Desc: func() protoreflect.MessageDescriptor {
112*1c12ee1eSDan Willemsen		pb := new(descriptorpb.FileDescriptorProto)
113*1c12ee1eSDan Willemsen		if err := prototext.Unmarshal([]byte(`
114*1c12ee1eSDan Willemsen				syntax:  "proto3"
115*1c12ee1eSDan Willemsen				name:    "test.proto"
116*1c12ee1eSDan Willemsen				message_type: [{
117*1c12ee1eSDan Willemsen					name: "TestNoEnforceUTF8"
118*1c12ee1eSDan Willemsen					field: [
119*1c12ee1eSDan Willemsen						{name:"optional_string" number:1 label:LABEL_OPTIONAL type:TYPE_STRING},
120*1c12ee1eSDan Willemsen						{name:"optional_bytes"  number:2 label:LABEL_OPTIONAL type:TYPE_STRING},
121*1c12ee1eSDan Willemsen						{name:"repeated_string" number:3 label:LABEL_REPEATED type:TYPE_STRING},
122*1c12ee1eSDan Willemsen						{name:"repeated_bytes"  number:4 label:LABEL_REPEATED type:TYPE_STRING},
123*1c12ee1eSDan Willemsen						{name:"oneof_string"    number:5 label:LABEL_OPTIONAL type:TYPE_STRING, oneof_index:0},
124*1c12ee1eSDan Willemsen						{name:"oneof_bytes"     number:6 label:LABEL_OPTIONAL type:TYPE_STRING, oneof_index:0}
125*1c12ee1eSDan Willemsen					]
126*1c12ee1eSDan Willemsen					oneof_decl: [{name:"oneof_field"}]
127*1c12ee1eSDan Willemsen				}]
128*1c12ee1eSDan Willemsen			`), pb); err != nil {
129*1c12ee1eSDan Willemsen			panic(err)
130*1c12ee1eSDan Willemsen		}
131*1c12ee1eSDan Willemsen		fd, err := protodesc.NewFile(pb, nil)
132*1c12ee1eSDan Willemsen		if err != nil {
133*1c12ee1eSDan Willemsen			panic(err)
134*1c12ee1eSDan Willemsen		}
135*1c12ee1eSDan Willemsen		md := fd.Messages().Get(0)
136*1c12ee1eSDan Willemsen		for i := 0; i < md.Fields().Len(); i++ {
137*1c12ee1eSDan Willemsen			md.Fields().Get(i).(*filedesc.Field).L1.HasEnforceUTF8 = true
138*1c12ee1eSDan Willemsen			md.Fields().Get(i).(*filedesc.Field).L1.EnforceUTF8 = false
139*1c12ee1eSDan Willemsen		}
140*1c12ee1eSDan Willemsen		return md
141*1c12ee1eSDan Willemsen	}(),
142*1c12ee1eSDan Willemsen	OneofWrappers: []interface{}{
143*1c12ee1eSDan Willemsen		(*TestNoEnforceUTF8_OneofString)(nil),
144*1c12ee1eSDan Willemsen		(*TestNoEnforceUTF8_OneofBytes)(nil),
145*1c12ee1eSDan Willemsen	},
146*1c12ee1eSDan Willemsen}
147