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 }