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

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