github.com/cloudwego/kitex@v0.9.0/pkg/remote/trans/netpoll/bytebuf_test.go (about)

     1  /*
     2   * Copyright 2021 CloudWeGo 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 netpoll
    18  
    19  import (
    20  	"bufio"
    21  	"bytes"
    22  	"strings"
    23  	"testing"
    24  
    25  	"github.com/cloudwego/netpoll"
    26  
    27  	"github.com/cloudwego/kitex/internal/test"
    28  	"github.com/cloudwego/kitex/pkg/remote"
    29  )
    30  
    31  // TestByteBuffer test bytebuf write and read success
    32  func TestByteBuffer(t *testing.T) {
    33  	// 1. prepare mock data
    34  	msg := "hello world"
    35  	reader := bufio.NewReader(strings.NewReader(msg + msg + msg + msg + msg))
    36  	writer := bufio.NewWriter(bytes.NewBufferString(msg + msg + msg + msg + msg))
    37  	bufRW := bufio.NewReadWriter(reader, writer)
    38  
    39  	// 2. test
    40  	rw := netpoll.NewReadWriter(bufRW)
    41  
    42  	buf1 := NewReaderWriterByteBuffer(rw)
    43  	// check writable
    44  	checkWritable(t, buf1)
    45  	// check readable
    46  	checkReadable(t, buf1)
    47  
    48  	buf2 := buf1.NewBuffer()
    49  	// check writable
    50  	checkWritable(t, buf2)
    51  	// check unreadable
    52  	checkUnreadable(t, buf2)
    53  
    54  	err := buf1.AppendBuffer(buf2)
    55  	test.Assert(t, err == nil)
    56  }
    57  
    58  // TestWriterBuffer test writerbytebufferr return writedirect err
    59  func TestWriterBuffer(t *testing.T) {
    60  	// 1. prepare mock data
    61  	msg := "hello world"
    62  	wi := bytes.NewBufferString(msg + msg + msg + msg + msg)
    63  	nbp := &netpollByteBuffer{}
    64  
    65  	// 2. test
    66  	w := netpoll.NewWriter(wi)
    67  
    68  	buf := NewWriterByteBuffer(w)
    69  	// check writable
    70  	checkWritable(t, buf)
    71  	// check unreadable
    72  	checkUnreadable(t, buf)
    73  
    74  	err := nbp.WriteDirect([]byte(msg), 11)
    75  	// check err not nil
    76  	test.Assert(t, err != nil, err)
    77  }
    78  
    79  // TestReaderBuffer test readerbytebufferr success
    80  func TestReaderBuffer(t *testing.T) {
    81  	// 1. prepare mock data
    82  	msg := "hello world"
    83  	ri := strings.NewReader(msg + msg + msg + msg + msg)
    84  	r := netpoll.NewReader(ri)
    85  
    86  	buf := NewReaderByteBuffer(r)
    87  	// check unwritable
    88  	checkUnwritable(t, buf)
    89  	// check readable
    90  	checkReadable(t, buf)
    91  }
    92  
    93  func checkWritable(t *testing.T, buf remote.ByteBuffer) {
    94  	msg := "hello world"
    95  
    96  	p, err := buf.Malloc(len(msg))
    97  	test.Assert(t, err == nil, err)
    98  	test.Assert(t, len(p) == len(msg))
    99  	copy(p, msg)
   100  
   101  	l := buf.MallocLen()
   102  	test.Assert(t, l == len(msg))
   103  
   104  	l, err = buf.WriteString(msg)
   105  	test.Assert(t, err == nil, err)
   106  	test.Assert(t, l == len(msg))
   107  
   108  	l, err = buf.WriteBinary([]byte(msg))
   109  	test.Assert(t, err == nil, err)
   110  	test.Assert(t, l == len(msg))
   111  
   112  	err = buf.Flush()
   113  	test.Assert(t, err == nil, err)
   114  }
   115  
   116  func checkReadable(t *testing.T, buf remote.ByteBuffer) {
   117  	msg := "hello world"
   118  	var s string
   119  
   120  	p, err := buf.Peek(len(msg))
   121  	test.Assert(t, err == nil, err)
   122  	test.Assert(t, string(p) == msg)
   123  
   124  	err = buf.Skip(1 + len(msg))
   125  	test.Assert(t, err == nil, err)
   126  
   127  	p, err = buf.Next(len(msg) - 1)
   128  	test.Assert(t, err == nil, err)
   129  	test.Assert(t, string(p) == msg[1:])
   130  
   131  	n := buf.ReadableLen()
   132  	test.Assert(t, n == 3*len(msg), n)
   133  
   134  	n = buf.ReadLen()
   135  	test.Assert(t, n == len(msg)-1, n)
   136  
   137  	s, err = buf.ReadString(len(msg))
   138  	test.Assert(t, err == nil, err)
   139  	test.Assert(t, s == msg)
   140  
   141  	p, err = buf.ReadBinary(len(msg))
   142  	test.Assert(t, err == nil, err)
   143  	test.Assert(t, string(p) == msg)
   144  }
   145  
   146  func checkUnwritable(t *testing.T, buf remote.ByteBuffer) {
   147  	msg := "hello world"
   148  	var n int
   149  
   150  	_, err := buf.Malloc(len(msg))
   151  	test.Assert(t, err != nil)
   152  
   153  	l := buf.MallocLen()
   154  	test.Assert(t, l == -1, l)
   155  
   156  	_, err = buf.WriteString(msg)
   157  	test.Assert(t, err != nil)
   158  
   159  	_, err = buf.WriteBinary([]byte(msg))
   160  	test.Assert(t, err != nil)
   161  
   162  	err = buf.Flush()
   163  	test.Assert(t, err != nil)
   164  
   165  	n, err = buf.Write([]byte(msg))
   166  	test.Assert(t, err != nil)
   167  	test.Assert(t, n == -1, n)
   168  
   169  	_, err = buf.Write(nil)
   170  	test.Assert(t, err != nil)
   171  }
   172  
   173  func checkUnreadable(t *testing.T, buf remote.ByteBuffer) {
   174  	msg := "hello world"
   175  	p := make([]byte, len(msg))
   176  	var n int
   177  
   178  	_, err := buf.Peek(len(msg))
   179  	test.Assert(t, err != nil)
   180  
   181  	err = buf.Skip(1)
   182  	test.Assert(t, err != nil)
   183  
   184  	_, err = buf.Next(len(msg) - 1)
   185  	test.Assert(t, err != nil)
   186  
   187  	n = buf.ReadableLen()
   188  	test.Assert(t, n == -1)
   189  
   190  	n = buf.ReadLen()
   191  	test.Assert(t, n == 0)
   192  
   193  	_, err = buf.ReadString(len(msg))
   194  	test.Assert(t, err != nil)
   195  
   196  	_, err = buf.ReadBinary(len(msg))
   197  	test.Assert(t, err != nil)
   198  
   199  	n, err = buf.Read(p)
   200  	test.Assert(t, err != nil)
   201  	test.Assert(t, n == -1, n)
   202  
   203  	_, err = buf.Read(nil)
   204  	test.Assert(t, err != nil)
   205  }