blob: d02c61d1fe0fa0c4eb3831e2afc525e221fc52b3 [file] [log] [blame]
Rob Pikeaaa3a622010-03-20 22:32:34 -07001// Go support for Protocol Buffers - Google's data interchange format
2//
David Symondsee6e9c52012-11-29 08:51:07 +11003// Copyright 2010 The Go Authors. All rights reserved.
David Symonds558f13f2014-11-24 10:28:53 +11004// https://github.com/golang/protobuf
Rob Pikeaaa3a622010-03-20 22:32:34 -07005//
6// Redistribution and use in source and binary forms, with or without
7// modification, are permitted provided that the following conditions are
8// met:
9//
10// * Redistributions of source code must retain the above copyright
11// notice, this list of conditions and the following disclaimer.
12// * Redistributions in binary form must reproduce the above
13// copyright notice, this list of conditions and the following disclaimer
14// in the documentation and/or other materials provided with the
15// distribution.
16// * Neither the name of Google Inc. nor the names of its
17// contributors may be used to endorse or promote products derived from
18// this software without specific prior written permission.
19//
20// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
32package proto_test
33
34import (
David Symonds31faaca2012-12-06 15:51:11 +110035 "math"
Rob Pikeaaa3a622010-03-20 22:32:34 -070036 "reflect"
37 "testing"
David Symonds20c73662012-01-20 07:32:21 +110038
David Symonds558f13f2014-11-24 10:28:53 +110039 . "github.com/golang/protobuf/proto"
David Symondsa8de2842015-03-20 16:24:29 +110040 proto3pb "github.com/golang/protobuf/proto/proto3_proto"
41 . "github.com/golang/protobuf/proto/testdata"
Rob Pikeaaa3a622010-03-20 22:32:34 -070042)
43
44type UnmarshalTextTest struct {
David Symonds5ed980c2011-11-29 09:52:21 +110045 in string
46 err string // if "", no error expected
47 out *MyMessage
Rob Pikeaaa3a622010-03-20 22:32:34 -070048}
49
David Symonds54531052011-12-08 12:00:31 +110050func buildExtStructTest(text string) UnmarshalTextTest {
51 msg := &MyMessage{
52 Count: Int32(42),
53 }
54 SetExtension(msg, E_Ext_More, &Ext{
55 Data: String("Hello, world!"),
56 })
57 return UnmarshalTextTest{in: text, out: msg}
58}
59
60func buildExtDataTest(text string) UnmarshalTextTest {
61 msg := &MyMessage{
62 Count: Int32(42),
63 }
64 SetExtension(msg, E_Ext_Text, String("Hello, world!"))
65 SetExtension(msg, E_Ext_Number, Int32(1729))
66 return UnmarshalTextTest{in: text, out: msg}
67}
68
David Symonds61826da2012-05-05 09:31:28 +100069func buildExtRepStringTest(text string) UnmarshalTextTest {
70 msg := &MyMessage{
71 Count: Int32(42),
72 }
73 if err := SetExtension(msg, E_Greeting, []string{"bula", "hola"}); err != nil {
74 panic(err)
75 }
76 return UnmarshalTextTest{in: text, out: msg}
77}
78
Rob Pikeaaa3a622010-03-20 22:32:34 -070079var unMarshalTextTests = []UnmarshalTextTest{
80 // Basic
David Symonds9f402812011-04-28 18:08:44 +100081 {
Rob Pikeaaa3a622010-03-20 22:32:34 -070082 in: " count:42\n name:\"Dave\" ",
83 out: &MyMessage{
84 Count: Int32(42),
Rob Pike9caa5b92010-05-11 16:04:57 -070085 Name: String("Dave"),
Rob Pikeaaa3a622010-03-20 22:32:34 -070086 },
87 },
88
89 // Empty quoted string
David Symonds9f402812011-04-28 18:08:44 +100090 {
Rob Pikeaaa3a622010-03-20 22:32:34 -070091 in: `count:42 name:""`,
92 out: &MyMessage{
93 Count: Int32(42),
Rob Pike9caa5b92010-05-11 16:04:57 -070094 Name: String(""),
Rob Pikeaaa3a622010-03-20 22:32:34 -070095 },
96 },
97
98 // Quoted string concatenation
David Symonds9f402812011-04-28 18:08:44 +100099 {
Rob Pikeaaa3a622010-03-20 22:32:34 -0700100 in: `count:42 name: "My name is "` + "\n" + `"elsewhere"`,
101 out: &MyMessage{
102 Count: Int32(42),
Rob Pike9caa5b92010-05-11 16:04:57 -0700103 Name: String("My name is elsewhere"),
Rob Pikeaaa3a622010-03-20 22:32:34 -0700104 },
105 },
106
David Symonds183124e2012-03-23 13:20:23 +1100107 // Quoted string with escaped apostrophe
108 {
109 in: `count:42 name: "HOLIDAY - New Year\'s Day"`,
110 out: &MyMessage{
111 Count: Int32(42),
112 Name: String("HOLIDAY - New Year's Day"),
113 },
114 },
115
David Symonds162d0032012-06-28 09:44:46 -0700116 // Quoted string with single quote
117 {
118 in: `count:42 name: 'Roger "The Ramster" Ramjet'`,
119 out: &MyMessage{
120 Count: Int32(42),
121 Name: String(`Roger "The Ramster" Ramjet`),
122 },
123 },
124
David Symondsfa94a1e2012-09-24 13:21:49 +1000125 // Quoted string with all the accepted special characters from the C++ test
126 {
127 in: `count:42 name: ` + "\"\\\"A string with \\' characters \\n and \\r newlines and \\t tabs and \\001 slashes \\\\ and multiple spaces\"",
128 out: &MyMessage{
129 Count: Int32(42),
130 Name: String("\"A string with ' characters \n and \r newlines and \t tabs and \001 slashes \\ and multiple spaces"),
131 },
132 },
133
134 // Quoted string with quoted backslash
135 {
136 in: `count:42 name: "\\'xyz"`,
137 out: &MyMessage{
138 Count: Int32(42),
139 Name: String(`\'xyz`),
140 },
141 },
142
143 // Quoted string with UTF-8 bytes.
144 {
145 in: "count:42 name: '\303\277\302\201\xAB'",
146 out: &MyMessage{
147 Count: Int32(42),
148 Name: String("\303\277\302\201\xAB"),
149 },
150 },
151
Rob Pikeaaa3a622010-03-20 22:32:34 -0700152 // Bad quoted string
David Symonds9f402812011-04-28 18:08:44 +1000153 {
David Symonds5ed980c2011-11-29 09:52:21 +1100154 in: `inner: < host: "\0" >` + "\n",
David Symondsbafa7bc2015-07-01 07:59:00 +1000155 err: `line 1.15: invalid quoted string "\0": \0 requires 2 following digits`,
Rob Pikeaaa3a622010-03-20 22:32:34 -0700156 },
157
158 // Number too large for int64
David Symonds9f402812011-04-28 18:08:44 +1000159 {
David Symonds8bb628d2014-07-22 13:49:35 +1000160 in: "count: 1 others { key: 123456789012345678901 }",
161 err: "line 1.23: invalid int64: 123456789012345678901",
Rob Pikeaaa3a622010-03-20 22:32:34 -0700162 },
163
164 // Number too large for int32
David Symonds9f402812011-04-28 18:08:44 +1000165 {
David Symonds5ed980c2011-11-29 09:52:21 +1100166 in: "count: 1234567890123",
167 err: "line 1.7: invalid int32: 1234567890123",
Rob Pikeaaa3a622010-03-20 22:32:34 -0700168 },
169
David Symonds32612dd2012-06-15 07:59:05 -0700170 // Number in hexadecimal
171 {
172 in: "count: 0x2beef",
173 out: &MyMessage{
174 Count: Int32(0x2beef),
175 },
176 },
177
178 // Number in octal
179 {
180 in: "count: 024601",
181 out: &MyMessage{
182 Count: Int32(024601),
183 },
184 },
185
David Symonds6bd081e2012-06-28 10:46:25 -0700186 // Floating point number with "f" suffix
187 {
188 in: "count: 4 others:< weight: 17.0f >",
189 out: &MyMessage{
190 Count: Int32(4),
191 Others: []*OtherMessage{
192 {
193 Weight: Float32(17),
194 },
195 },
196 },
197 },
198
David Symonds31faaca2012-12-06 15:51:11 +1100199 // Floating point positive infinity
200 {
201 in: "count: 4 bigfloat: inf",
202 out: &MyMessage{
203 Count: Int32(4),
204 Bigfloat: Float64(math.Inf(1)),
205 },
206 },
207
208 // Floating point negative infinity
209 {
210 in: "count: 4 bigfloat: -inf",
211 out: &MyMessage{
212 Count: Int32(4),
213 Bigfloat: Float64(math.Inf(-1)),
214 },
215 },
216
Rob Pikeaaa3a622010-03-20 22:32:34 -0700217 // Number too large for float32
David Symonds9f402812011-04-28 18:08:44 +1000218 {
David Symonds5ed980c2011-11-29 09:52:21 +1100219 in: "others:< weight: 12345678901234567890123456789012345678901234567890 >",
220 err: "line 1.17: invalid float32: 12345678901234567890123456789012345678901234567890",
Rob Pikeaaa3a622010-03-20 22:32:34 -0700221 },
222
223 // Number posing as a quoted string
David Symonds9f402812011-04-28 18:08:44 +1000224 {
David Symonds5ed980c2011-11-29 09:52:21 +1100225 in: `inner: < host: 12 >` + "\n",
226 err: `line 1.15: invalid string: 12`,
Rob Pikeaaa3a622010-03-20 22:32:34 -0700227 },
228
229 // Quoted string posing as int32
David Symonds9f402812011-04-28 18:08:44 +1000230 {
David Symonds5ed980c2011-11-29 09:52:21 +1100231 in: `count: "12"`,
232 err: `line 1.7: invalid int32: "12"`,
Rob Pikeaaa3a622010-03-20 22:32:34 -0700233 },
234
235 // Quoted string posing a float32
David Symonds9f402812011-04-28 18:08:44 +1000236 {
David Symonds5ed980c2011-11-29 09:52:21 +1100237 in: `others:< weight: "17.4" >`,
238 err: `line 1.17: invalid float32: "17.4"`,
Rob Pikeaaa3a622010-03-20 22:32:34 -0700239 },
240
241 // Enum
David Symonds9f402812011-04-28 18:08:44 +1000242 {
Rob Pikeaaa3a622010-03-20 22:32:34 -0700243 in: `count:42 bikeshed: BLUE`,
244 out: &MyMessage{
Rob Pike9caa5b92010-05-11 16:04:57 -0700245 Count: Int32(42),
David Symondsefeca9a2012-05-08 10:36:04 +1000246 Bikeshed: MyMessage_BLUE.Enum(),
Rob Pikeaaa3a622010-03-20 22:32:34 -0700247 },
248 },
249
250 // Repeated field
David Symonds9f402812011-04-28 18:08:44 +1000251 {
Rob Pikeaaa3a622010-03-20 22:32:34 -0700252 in: `count:42 pet: "horsey" pet:"bunny"`,
253 out: &MyMessage{
254 Count: Int32(42),
Rob Pike9caa5b92010-05-11 16:04:57 -0700255 Pet: []string{"horsey", "bunny"},
Rob Pikeaaa3a622010-03-20 22:32:34 -0700256 },
257 },
258
Lorenzo Simionatodeb4a5e2015-10-09 07:39:00 +1100259 // Repeated field with list notation
260 {
261 in: `count:42 pet: ["horsey", "bunny"]`,
262 out: &MyMessage{
263 Count: Int32(42),
264 Pet: []string{"horsey", "bunny"},
265 },
266 },
267
Rob Pikeaaf695a2010-06-22 15:51:21 -0700268 // Repeated message with/without colon and <>/{}
David Symonds9f402812011-04-28 18:08:44 +1000269 {
Rob Pikeaaf695a2010-06-22 15:51:21 -0700270 in: `count:42 others:{} others{} others:<> others:{}`,
271 out: &MyMessage{
272 Count: Int32(42),
273 Others: []*OtherMessage{
Albert Strasheim4676f6a2013-04-07 08:59:06 +1000274 {},
275 {},
276 {},
277 {},
Rob Pikeaaf695a2010-06-22 15:51:21 -0700278 },
279 },
280 },
281
Rob Pikeaaa3a622010-03-20 22:32:34 -0700282 // Missing colon for inner message
David Symonds9f402812011-04-28 18:08:44 +1000283 {
Rob Pikeaaa3a622010-03-20 22:32:34 -0700284 in: `count:42 inner < host: "cauchy.syd" >`,
285 out: &MyMessage{
286 Count: Int32(42),
287 Inner: &InnerMessage{
288 Host: String("cauchy.syd"),
289 },
290 },
291 },
292
293 // Missing colon for string field
David Symonds9f402812011-04-28 18:08:44 +1000294 {
David Symonds5ed980c2011-11-29 09:52:21 +1100295 in: `name "Dave"`,
296 err: `line 1.5: expected ':', found "\"Dave\""`,
Rob Pikeaaa3a622010-03-20 22:32:34 -0700297 },
298
299 // Missing colon for int32 field
David Symonds9f402812011-04-28 18:08:44 +1000300 {
David Symonds5ed980c2011-11-29 09:52:21 +1100301 in: `count 42`,
302 err: `line 1.6: expected ':', found "42"`,
Rob Pikeaaa3a622010-03-20 22:32:34 -0700303 },
304
305 // Missing required field
David Symonds9f402812011-04-28 18:08:44 +1000306 {
David Symonds2a1c6b92014-10-12 16:42:41 +1100307 in: `name: "Pawel"`,
308 err: `proto: required field "testdata.MyMessage.count" not set`,
309 out: &MyMessage{
310 Name: String("Pawel"),
311 },
Rob Pikeaaa3a622010-03-20 22:32:34 -0700312 },
313
314 // Repeated non-repeated field
David Symonds9f402812011-04-28 18:08:44 +1000315 {
David Symonds5ed980c2011-11-29 09:52:21 +1100316 in: `name: "Rob" name: "Russ"`,
317 err: `line 1.12: non-repeated field "name" was repeated`,
Rob Pikeaaa3a622010-03-20 22:32:34 -0700318 },
319
David Symonds9f402812011-04-28 18:08:44 +1000320 // Group
321 {
322 in: `count: 17 SomeGroup { group_field: 12 }`,
323 out: &MyMessage{
324 Count: Int32(17),
325 Somegroup: &MyMessage_SomeGroup{
326 GroupField: Int32(12),
327 },
328 },
329 },
330
David Symonds31faaca2012-12-06 15:51:11 +1100331 // Semicolon between fields
332 {
333 in: `count:3;name:"Calvin"`,
334 out: &MyMessage{
335 Count: Int32(3),
336 Name: String("Calvin"),
337 },
338 },
339 // Comma between fields
340 {
341 in: `count:4,name:"Ezekiel"`,
342 out: &MyMessage{
343 Count: Int32(4),
344 Name: String("Ezekiel"),
345 },
346 },
347
David Symonds54531052011-12-08 12:00:31 +1100348 // Extension
Rob Pikeb7907bf2012-02-13 14:25:20 +1100349 buildExtStructTest(`count: 42 [testdata.Ext.more]:<data:"Hello, world!" >`),
350 buildExtStructTest(`count: 42 [testdata.Ext.more] {data:"Hello, world!"}`),
351 buildExtDataTest(`count: 42 [testdata.Ext.text]:"Hello, world!" [testdata.Ext.number]:1729`),
David Symonds61826da2012-05-05 09:31:28 +1000352 buildExtRepStringTest(`count: 42 [testdata.greeting]:"bula" [testdata.greeting]:"hola"`),
David Symonds54531052011-12-08 12:00:31 +1100353
Rob Pikeaaa3a622010-03-20 22:32:34 -0700354 // Big all-in-one
David Symonds9f402812011-04-28 18:08:44 +1000355 {
Rob Pikeaaa3a622010-03-20 22:32:34 -0700356 in: "count:42 # Meaning\n" +
357 `name:"Dave" ` +
358 `quote:"\"I didn't want to go.\"" ` +
359 `pet:"bunny" ` +
360 `pet:"kitty" ` +
361 `pet:"horsey" ` +
362 `inner:<` +
363 ` host:"footrest.syd" ` +
364 ` port:7001 ` +
365 ` connected:true ` +
366 `> ` +
367 `others:<` +
368 ` key:3735928559 ` +
369 ` value:"\x01A\a\f" ` +
370 `> ` +
371 `others:<` +
372 " weight:58.9 # Atomic weight of Co\n" +
373 ` inner:<` +
374 ` host:"lesha.mtv" ` +
375 ` port:8002 ` +
376 ` >` +
377 `>`,
378 out: &MyMessage{
379 Count: Int32(42),
Rob Pike9caa5b92010-05-11 16:04:57 -0700380 Name: String("Dave"),
Rob Pikeaaa3a622010-03-20 22:32:34 -0700381 Quote: String(`"I didn't want to go."`),
Rob Pike9caa5b92010-05-11 16:04:57 -0700382 Pet: []string{"bunny", "kitty", "horsey"},
Rob Pikeaaa3a622010-03-20 22:32:34 -0700383 Inner: &InnerMessage{
Rob Pike9caa5b92010-05-11 16:04:57 -0700384 Host: String("footrest.syd"),
385 Port: Int32(7001),
Rob Pikeaaa3a622010-03-20 22:32:34 -0700386 Connected: Bool(true),
387 },
388 Others: []*OtherMessage{
Albert Strasheim4676f6a2013-04-07 08:59:06 +1000389 {
Rob Pike9caa5b92010-05-11 16:04:57 -0700390 Key: Int64(3735928559),
Rob Pikeaaa3a622010-03-20 22:32:34 -0700391 Value: []byte{0x1, 'A', '\a', '\f'},
392 },
Albert Strasheim4676f6a2013-04-07 08:59:06 +1000393 {
Rob Pikeaaa3a622010-03-20 22:32:34 -0700394 Weight: Float32(58.9),
395 Inner: &InnerMessage{
396 Host: String("lesha.mtv"),
397 Port: Int32(8002),
398 },
399 },
400 },
401 },
402 },
403}
404
405func TestUnmarshalText(t *testing.T) {
406 for i, test := range unMarshalTextTests {
407 pb := new(MyMessage)
408 err := UnmarshalText(test.in, pb)
David Symonds5ed980c2011-11-29 09:52:21 +1100409 if test.err == "" {
Rob Pikeaaa3a622010-03-20 22:32:34 -0700410 // We don't expect failure.
411 if err != nil {
412 t.Errorf("Test %d: Unexpected error: %v", i, err)
413 } else if !reflect.DeepEqual(pb, test.out) {
David Symondsef8f0e82011-10-13 12:57:34 +1100414 t.Errorf("Test %d: Incorrect populated \nHave: %v\nWant: %v",
415 i, pb, test.out)
Rob Pikeaaa3a622010-03-20 22:32:34 -0700416 }
417 } else {
418 // We do expect failure.
419 if err == nil {
David Symonds5ed980c2011-11-29 09:52:21 +1100420 t.Errorf("Test %d: Didn't get expected error: %v", i, test.err)
421 } else if err.Error() != test.err {
Rob Pikeaaa3a622010-03-20 22:32:34 -0700422 t.Errorf("Test %d: Incorrect error.\nHave: %v\nWant: %v",
David Symonds5ed980c2011-11-29 09:52:21 +1100423 i, err.Error(), test.err)
David Symonds2a1c6b92014-10-12 16:42:41 +1100424 } else if _, ok := err.(*RequiredNotSetError); ok && test.out != nil && !reflect.DeepEqual(pb, test.out) {
425 t.Errorf("Test %d: Incorrect populated \nHave: %v\nWant: %v",
426 i, pb, test.out)
Rob Pikeaaa3a622010-03-20 22:32:34 -0700427 }
428 }
429 }
430}
David Symonds79eae332010-10-16 11:33:20 +1100431
David Symonds267e8052014-02-19 14:50:51 +1100432func TestUnmarshalTextCustomMessage(t *testing.T) {
433 msg := &textMessage{}
434 if err := UnmarshalText("custom", msg); err != nil {
435 t.Errorf("Unexpected error from custom unmarshal: %v", err)
436 }
437 if UnmarshalText("not custom", msg) == nil {
438 t.Errorf("Didn't get expected error from custom unmarshal")
439 }
440}
441
David Symondsef8f0e82011-10-13 12:57:34 +1100442// Regression test; this caused a panic.
443func TestRepeatedEnum(t *testing.T) {
444 pb := new(RepeatedEnum)
445 if err := UnmarshalText("color: RED", pb); err != nil {
446 t.Fatal(err)
447 }
448 exp := &RepeatedEnum{
449 Color: []RepeatedEnum_Color{RepeatedEnum_RED},
450 }
David Symonds007ed9d2012-07-24 10:59:36 +1000451 if !Equal(pb, exp) {
David Symondsef8f0e82011-10-13 12:57:34 +1100452 t.Errorf("Incorrect populated \nHave: %v\nWant: %v", pb, exp)
453 }
454}
455
David Symondsabd3b412014-11-28 11:43:44 +1100456func TestProto3TextParsing(t *testing.T) {
457 m := new(proto3pb.Message)
458 const in = `name: "Wallace" true_scotsman: true`
459 want := &proto3pb.Message{
460 Name: "Wallace",
461 TrueScotsman: true,
462 }
463 if err := UnmarshalText(in, m); err != nil {
464 t.Fatal(err)
465 }
466 if !Equal(m, want) {
467 t.Errorf("\n got %v\nwant %v", m, want)
468 }
469}
470
David Symonds3ea3e052014-12-22 16:15:28 +1100471func TestMapParsing(t *testing.T) {
472 m := new(MessageWithMap)
473 const in = `name_mapping:<key:1234 value:"Feist"> name_mapping:<key:1 value:"Beatles">` +
David Symonds056d5ce2015-05-12 19:27:00 +1000474 `msg_mapping:<key:-4, value:<f: 2.0>,>` + // separating commas are okay
David Symondsa11b6342015-01-28 17:07:47 +1100475 `msg_mapping<key:-2 value<f: 4.0>>` + // no colon after "value"
David Symonds3ea3e052014-12-22 16:15:28 +1100476 `byte_mapping:<key:true value:"so be it">`
477 want := &MessageWithMap{
478 NameMapping: map[int32]string{
479 1: "Beatles",
480 1234: "Feist",
481 },
482 MsgMapping: map[int64]*FloatingPoint{
483 -4: {F: Float64(2.0)},
David Symondsa11b6342015-01-28 17:07:47 +1100484 -2: {F: Float64(4.0)},
David Symonds3ea3e052014-12-22 16:15:28 +1100485 },
486 ByteMapping: map[bool][]byte{
487 true: []byte("so be it"),
488 },
489 }
490 if err := UnmarshalText(in, m); err != nil {
491 t.Fatal(err)
492 }
493 if !Equal(m, want) {
494 t.Errorf("\n got %v\nwant %v", m, want)
495 }
496}
497
David Symonds59b73b32015-08-24 13:22:02 +1000498func TestOneofParsing(t *testing.T) {
499 const in = `name:"Shrek"`
500 m := new(Communique)
501 want := &Communique{Union: &Communique_Name{"Shrek"}}
502 if err := UnmarshalText(in, m); err != nil {
503 t.Fatal(err)
504 }
505 if !Equal(m, want) {
506 t.Errorf("\n got %v\nwant %v", m, want)
507 }
508}
509
David Symonds79eae332010-10-16 11:33:20 +1100510var benchInput string
511
512func init() {
513 benchInput = "count: 4\n"
514 for i := 0; i < 1000; i++ {
515 benchInput += "pet: \"fido\"\n"
516 }
517
518 // Check it is valid input.
519 pb := new(MyMessage)
520 err := UnmarshalText(benchInput, pb)
521 if err != nil {
Rob Pikea17fdd92011-11-02 12:43:05 -0700522 panic("Bad benchmark input: " + err.Error())
David Symonds79eae332010-10-16 11:33:20 +1100523 }
524}
525
526func BenchmarkUnmarshalText(b *testing.B) {
527 pb := new(MyMessage)
528 for i := 0; i < b.N; i++ {
529 UnmarshalText(benchInput, pb)
530 }
531 b.SetBytes(int64(len(benchInput)))
532}