1*1c12ee1eSDan Willemsen// Copyright 2022 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 protodelim_test 6*1c12ee1eSDan Willemsen 7*1c12ee1eSDan Willemsenimport ( 8*1c12ee1eSDan Willemsen "bufio" 9*1c12ee1eSDan Willemsen "bytes" 10*1c12ee1eSDan Willemsen "errors" 11*1c12ee1eSDan Willemsen "io" 12*1c12ee1eSDan Willemsen "testing" 13*1c12ee1eSDan Willemsen 14*1c12ee1eSDan Willemsen "github.com/google/go-cmp/cmp" 15*1c12ee1eSDan Willemsen "google.golang.org/protobuf/encoding/protodelim" 16*1c12ee1eSDan Willemsen "google.golang.org/protobuf/encoding/protowire" 17*1c12ee1eSDan Willemsen "google.golang.org/protobuf/internal/testprotos/test3" 18*1c12ee1eSDan Willemsen "google.golang.org/protobuf/testing/protocmp" 19*1c12ee1eSDan Willemsen) 20*1c12ee1eSDan Willemsen 21*1c12ee1eSDan Willemsenfunc TestRoundTrip(t *testing.T) { 22*1c12ee1eSDan Willemsen msgs := []*test3.TestAllTypes{ 23*1c12ee1eSDan Willemsen {SingularInt32: 1}, 24*1c12ee1eSDan Willemsen {SingularString: "hello"}, 25*1c12ee1eSDan Willemsen {RepeatedDouble: []float64{1.2, 3.4}}, 26*1c12ee1eSDan Willemsen { 27*1c12ee1eSDan Willemsen SingularNestedMessage: &test3.TestAllTypes_NestedMessage{A: 1}, 28*1c12ee1eSDan Willemsen RepeatedForeignMessage: []*test3.ForeignMessage{{C: 2}, {D: 3}}, 29*1c12ee1eSDan Willemsen }, 30*1c12ee1eSDan Willemsen } 31*1c12ee1eSDan Willemsen 32*1c12ee1eSDan Willemsen buf := &bytes.Buffer{} 33*1c12ee1eSDan Willemsen 34*1c12ee1eSDan Willemsen // Write all messages to buf. 35*1c12ee1eSDan Willemsen for _, m := range msgs { 36*1c12ee1eSDan Willemsen if n, err := protodelim.MarshalTo(buf, m); err != nil { 37*1c12ee1eSDan Willemsen t.Errorf("protodelim.MarshalTo(_, %v) = %d, %v", m, n, err) 38*1c12ee1eSDan Willemsen } 39*1c12ee1eSDan Willemsen } 40*1c12ee1eSDan Willemsen 41*1c12ee1eSDan Willemsen // Read and collect messages from buf. 42*1c12ee1eSDan Willemsen var got []*test3.TestAllTypes 43*1c12ee1eSDan Willemsen r := bufio.NewReader(buf) 44*1c12ee1eSDan Willemsen for { 45*1c12ee1eSDan Willemsen m := &test3.TestAllTypes{} 46*1c12ee1eSDan Willemsen err := protodelim.UnmarshalFrom(r, m) 47*1c12ee1eSDan Willemsen if errors.Is(err, io.EOF) { 48*1c12ee1eSDan Willemsen break 49*1c12ee1eSDan Willemsen } 50*1c12ee1eSDan Willemsen if err != nil { 51*1c12ee1eSDan Willemsen t.Errorf("protodelim.UnmarshalFrom(_) = %v", err) 52*1c12ee1eSDan Willemsen continue 53*1c12ee1eSDan Willemsen } 54*1c12ee1eSDan Willemsen got = append(got, m) 55*1c12ee1eSDan Willemsen } 56*1c12ee1eSDan Willemsen 57*1c12ee1eSDan Willemsen want := msgs 58*1c12ee1eSDan Willemsen if diff := cmp.Diff(want, got, protocmp.Transform()); diff != "" { 59*1c12ee1eSDan Willemsen t.Errorf("Unmarshaler collected messages: diff -want +got = %s", diff) 60*1c12ee1eSDan Willemsen } 61*1c12ee1eSDan Willemsen} 62*1c12ee1eSDan Willemsen 63*1c12ee1eSDan Willemsenfunc TestMaxSize(t *testing.T) { 64*1c12ee1eSDan Willemsen in := &test3.TestAllTypes{SingularInt32: 1} 65*1c12ee1eSDan Willemsen 66*1c12ee1eSDan Willemsen buf := &bytes.Buffer{} 67*1c12ee1eSDan Willemsen 68*1c12ee1eSDan Willemsen if n, err := protodelim.MarshalTo(buf, in); err != nil { 69*1c12ee1eSDan Willemsen t.Errorf("protodelim.MarshalTo(_, %v) = %d, %v", in, n, err) 70*1c12ee1eSDan Willemsen } 71*1c12ee1eSDan Willemsen 72*1c12ee1eSDan Willemsen out := &test3.TestAllTypes{} 73*1c12ee1eSDan Willemsen err := protodelim.UnmarshalOptions{MaxSize: 1}.UnmarshalFrom(bufio.NewReader(buf), out) 74*1c12ee1eSDan Willemsen 75*1c12ee1eSDan Willemsen var errSize *protodelim.SizeTooLargeError 76*1c12ee1eSDan Willemsen if !errors.As(err, &errSize) { 77*1c12ee1eSDan Willemsen t.Errorf("protodelim.UnmarshalOptions{MaxSize: 1}.UnmarshalFrom(_, _) = %v (%T), want %T", err, err, errSize) 78*1c12ee1eSDan Willemsen } 79*1c12ee1eSDan Willemsen got, want := errSize, &protodelim.SizeTooLargeError{Size: 3, MaxSize: 1} 80*1c12ee1eSDan Willemsen if diff := cmp.Diff(want, got); diff != "" { 81*1c12ee1eSDan Willemsen t.Errorf("protodelim.UnmarshalOptions{MaxSize: 1}.UnmarshalFrom(_, _): diff -want +got = %s", diff) 82*1c12ee1eSDan Willemsen } 83*1c12ee1eSDan Willemsen} 84*1c12ee1eSDan Willemsen 85*1c12ee1eSDan Willemsenfunc TestUnmarshalFrom_UnexpectedEOF(t *testing.T) { 86*1c12ee1eSDan Willemsen buf := &bytes.Buffer{} 87*1c12ee1eSDan Willemsen 88*1c12ee1eSDan Willemsen // Write a size (42), but no subsequent message. 89*1c12ee1eSDan Willemsen sb := protowire.AppendVarint(nil, 42) 90*1c12ee1eSDan Willemsen if _, err := buf.Write(sb); err != nil { 91*1c12ee1eSDan Willemsen t.Fatalf("buf.Write(%v) = _, %v", sb, err) 92*1c12ee1eSDan Willemsen } 93*1c12ee1eSDan Willemsen 94*1c12ee1eSDan Willemsen out := &test3.TestAllTypes{} 95*1c12ee1eSDan Willemsen err := protodelim.UnmarshalFrom(bufio.NewReader(buf), out) 96*1c12ee1eSDan Willemsen if got, want := err, io.ErrUnexpectedEOF; got != want { 97*1c12ee1eSDan Willemsen t.Errorf("protodelim.UnmarshalFrom(size-only buf, _) = %v, want %v", got, want) 98*1c12ee1eSDan Willemsen } 99*1c12ee1eSDan Willemsen} 100