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  }