k8s.io/apimachinery@v0.29.2/pkg/util/framer/framer_test.go (about) 1 /* 2 Copyright 2016 The Kubernetes Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package framer 18 19 import ( 20 "bytes" 21 "io" 22 "testing" 23 ) 24 25 func TestRead(t *testing.T) { 26 data := []byte{ 27 0x00, 0x00, 0x00, 0x04, 28 0x01, 0x02, 0x03, 0x04, 29 0x00, 0x00, 0x00, 0x03, 30 0x05, 0x06, 0x07, 31 0x00, 0x00, 0x00, 0x00, 32 0x00, 0x00, 0x00, 0x01, 33 0x08, 34 } 35 b := bytes.NewBuffer(data) 36 r := NewLengthDelimitedFrameReader(io.NopCloser(b)) 37 buf := make([]byte, 1) 38 if n, err := r.Read(buf); err != io.ErrShortBuffer && n != 1 && bytes.Equal(buf, []byte{0x01}) { 39 t.Fatalf("unexpected: %v %d %v", err, n, buf) 40 } 41 if n, err := r.Read(buf); err != io.ErrShortBuffer && n != 1 && bytes.Equal(buf, []byte{0x02}) { 42 t.Fatalf("unexpected: %v %d %v", err, n, buf) 43 } 44 // read the remaining frame 45 buf = make([]byte, 2) 46 if n, err := r.Read(buf); err != nil && n != 2 && bytes.Equal(buf, []byte{0x03, 0x04}) { 47 t.Fatalf("unexpected: %v %d %v", err, n, buf) 48 } 49 // read with buffer equal to frame 50 buf = make([]byte, 3) 51 if n, err := r.Read(buf); err != nil && n != 3 && bytes.Equal(buf, []byte{0x05, 0x06, 0x07}) { 52 t.Fatalf("unexpected: %v %d %v", err, n, buf) 53 } 54 // read empty frame 55 buf = make([]byte, 3) 56 if n, err := r.Read(buf); err != nil && n != 0 && bytes.Equal(buf, []byte{}) { 57 t.Fatalf("unexpected: %v %d %v", err, n, buf) 58 } 59 // read with larger buffer than frame 60 buf = make([]byte, 3) 61 if n, err := r.Read(buf); err != nil && n != 1 && bytes.Equal(buf, []byte{0x08}) { 62 t.Fatalf("unexpected: %v %d %v", err, n, buf) 63 } 64 // read EOF 65 if n, err := r.Read(buf); err != io.EOF && n != 0 { 66 t.Fatalf("unexpected: %v %d", err, n) 67 } 68 } 69 70 func TestReadLarge(t *testing.T) { 71 data := []byte{ 72 0x00, 0x00, 0x00, 0x04, 73 0x01, 0x02, 0x03, 0x04, 74 0x00, 0x00, 0x00, 0x03, 75 0x05, 0x06, 0x07, 76 0x00, 0x00, 0x00, 0x00, 77 0x00, 0x00, 0x00, 0x01, 78 0x08, 79 } 80 b := bytes.NewBuffer(data) 81 r := NewLengthDelimitedFrameReader(io.NopCloser(b)) 82 buf := make([]byte, 40) 83 if n, err := r.Read(buf); err != nil && n != 4 && bytes.Equal(buf, []byte{0x01, 0x02, 0x03, 0x04}) { 84 t.Fatalf("unexpected: %v %d %v", err, n, buf) 85 } 86 if n, err := r.Read(buf); err != nil && n != 3 && bytes.Equal(buf, []byte{0x05, 0x06, 0x7}) { 87 t.Fatalf("unexpected: %v %d %v", err, n, buf) 88 } 89 if n, err := r.Read(buf); err != nil && n != 0 && bytes.Equal(buf, []byte{}) { 90 t.Fatalf("unexpected: %v %d %v", err, n, buf) 91 } 92 if n, err := r.Read(buf); err != nil && n != 1 && bytes.Equal(buf, []byte{0x08}) { 93 t.Fatalf("unexpected: %v %d %v", err, n, buf) 94 } 95 // read EOF 96 if n, err := r.Read(buf); err != io.EOF && n != 0 { 97 t.Fatalf("unexpected: %v %d", err, n) 98 } 99 } 100 func TestReadInvalidFrame(t *testing.T) { 101 data := []byte{ 102 0x00, 0x00, 0x00, 0x04, 103 0x01, 0x02, 104 } 105 b := bytes.NewBuffer(data) 106 r := NewLengthDelimitedFrameReader(io.NopCloser(b)) 107 buf := make([]byte, 1) 108 if n, err := r.Read(buf); err != io.ErrShortBuffer && n != 1 && bytes.Equal(buf, []byte{0x01}) { 109 t.Fatalf("unexpected: %v %d %v", err, n, buf) 110 } 111 // read the remaining frame 112 buf = make([]byte, 3) 113 if n, err := r.Read(buf); err != io.ErrUnexpectedEOF && n != 1 && bytes.Equal(buf, []byte{0x02}) { 114 t.Fatalf("unexpected: %v %d %v", err, n, buf) 115 } 116 // read EOF 117 if n, err := r.Read(buf); err != io.EOF && n != 0 { 118 t.Fatalf("unexpected: %v %d", err, n) 119 } 120 } 121 122 func TestJSONFrameReader(t *testing.T) { 123 b := bytes.NewBufferString("{\"test\":true}\n1\n[\"a\"]") 124 r := NewJSONFramedReader(io.NopCloser(b)) 125 buf := make([]byte, 20) 126 if n, err := r.Read(buf); err != nil || n != 13 || string(buf[:n]) != `{"test":true}` { 127 t.Fatalf("unexpected: %v %d %q", err, n, buf) 128 } 129 if n, err := r.Read(buf); err != nil || n != 1 || string(buf[:n]) != `1` { 130 t.Fatalf("unexpected: %v %d %q", err, n, buf) 131 } 132 if n, err := r.Read(buf); err != nil || n != 5 || string(buf[:n]) != `["a"]` { 133 t.Fatalf("unexpected: %v %d %q", err, n, buf) 134 } 135 if n, err := r.Read(buf); err != io.EOF || n != 0 { 136 t.Fatalf("unexpected: %v %d %q", err, n, buf) 137 } 138 } 139 140 func TestJSONFrameReaderShortBuffer(t *testing.T) { 141 b := bytes.NewBufferString("{\"test\":true}\n1\n[\"a\"]") 142 r := NewJSONFramedReader(io.NopCloser(b)) 143 buf := make([]byte, 3) 144 145 if n, err := r.Read(buf); err != io.ErrShortBuffer || n != 3 || string(buf[:n]) != `{"t` { 146 t.Fatalf("unexpected: %v %d %q", err, n, buf) 147 } 148 if n, err := r.Read(buf); err != io.ErrShortBuffer || n != 3 || string(buf[:n]) != `est` { 149 t.Fatalf("unexpected: %v %d %q", err, n, buf) 150 } 151 if n, err := r.Read(buf); err != io.ErrShortBuffer || n != 3 || string(buf[:n]) != `":t` { 152 t.Fatalf("unexpected: %v %d %q", err, n, buf) 153 } 154 if n, err := r.Read(buf); err != io.ErrShortBuffer || n != 3 || string(buf[:n]) != `rue` { 155 t.Fatalf("unexpected: %v %d %q", err, n, buf) 156 } 157 if n, err := r.Read(buf); err != nil || n != 1 || string(buf[:n]) != `}` { 158 t.Fatalf("unexpected: %v %d %q", err, n, buf) 159 } 160 161 if n, err := r.Read(buf); err != nil || n != 1 || string(buf[:n]) != `1` { 162 t.Fatalf("unexpected: %v %d %q", err, n, buf) 163 } 164 165 if n, err := r.Read(buf); err != io.ErrShortBuffer || n != 3 || string(buf[:n]) != `["a` { 166 t.Fatalf("unexpected: %v %d %q", err, n, buf) 167 } 168 if n, err := r.Read(buf); err != nil || n != 2 || string(buf[:n]) != `"]` { 169 t.Fatalf("unexpected: %v %d %q", err, n, buf) 170 } 171 172 if n, err := r.Read(buf); err != io.EOF || n != 0 { 173 t.Fatalf("unexpected: %v %d %q", err, n, buf) 174 } 175 }