2 netstring -- netstring format serialization library
3 Copyright (C) 2015-2023 Sergey Matveev <stargrave@stargrave.org>
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, version 3 of the License.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>.
27 func TestTrivial(t *testing.T) {
30 if n, err := w.WriteChunk([]byte{}); err != nil || n != 3 || string(buf.Next(3)) != "0:," {
33 if n, err := w.WriteChunk([]byte("foo")); err != nil || n != 6 {
36 if n, err := w.WriteChunk([]byte("barz")); err != nil || n != 7 {
39 if buf.String() != "3:foo,4:barz," {
43 if n, err := r.Next(); err != nil || n != 3 {
46 if r.Discard() != nil {
49 if n, err := r.Next(); err != nil || n != 4 {
53 if n, err := r.Read(m); err != nil || n != 4 {
56 if !bytes.Equal(m, []byte("barz")) {
61 func TestSymmetric(t *testing.T) {
65 f := func(datum [][]byte) bool {
66 for _, data := range datum {
67 if n, err := w.WriteChunk(data); err != nil || n <= len(data) {
71 for _, data := range datum {
72 if n, err := r.Next(); err != nil || n != uint64(len(data)) {
75 got, err := io.ReadAll(r)
76 if err != nil || !bytes.Equal(got, data) {
82 if err := quick.Check(f, nil); err != nil {
87 func TestErrors(t *testing.T) {
88 b := bytes.NewBufferString("junk")
90 if _, err := r.Next(); err == nil {
94 b = bytes.NewBufferString("1111111111111111111111:")
96 if _, err := r.Next(); err == nil {
100 b = bytes.NewBufferString("6foobar")
102 if _, err := r.Next(); err == nil {
106 data := make([]byte, 1<<10)
108 b = bytes.NewBufferString("0:foobar,")
110 if _, err := r.Next(); err != nil {
113 if _, err := r.Read(data); err == nil {
117 b = bytes.NewBufferString("0:foobar")
119 if _, err := r.Next(); err != nil {
122 if _, err := r.Read(data); err == nil {
126 b = bytes.NewBufferString("6:foobar")
128 if _, err := r.Next(); err != nil {
131 if _, err := r.Read(data); err == nil {
135 b = bytes.NewBufferString(":foobar,")
137 if _, err := r.Next(); err == nil {
141 b = bytes.NewBufferString("06:foobar,")
143 if _, err := r.Next(); err == nil {
148 func TestExample(t *testing.T) {
151 if n, err := w.WriteChunk([]byte("hello")); err != nil || n != 8 || b.String() != "5:hello," {
154 if n, err := w.WriteSize(6); err != nil || n != 2 {
157 if n, err := w.Write([]byte("wor")); err != nil || n != 3 {
160 if n, err := w.Write([]byte("ld!")); err != nil || n != 3 || b.String() != "5:hello,6:world!," {
164 if size, err := r.Next(); err != nil || size != 5 {
167 if err := r.Discard(); err != nil {
170 if size, err := r.Next(); err != nil || size != 6 {
173 if data, err := io.ReadAll(r); err != nil || string(data) != "world!" {