xref: /aosp_15_r20/external/golang-protobuf/encoding/protodelim/protodelim_test.go (revision 1c12ee1efe575feb122dbf939ff15148a3b3e8f2)
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