func TestBufferedReader(t *testing.T) { assert := assert.On(t) content := alloc.NewLargeBuffer() len := content.Len() reader := NewBufferedReader(content) assert.Bool(reader.Cached()).IsTrue() payload := make([]byte, 16) nBytes, err := reader.Read(payload) assert.Int(nBytes).Equals(16) assert.Error(err).IsNil() len2 := content.Len() assert.Int(len - len2).GreaterThan(16) nBytes, err = reader.Read(payload) assert.Int(nBytes).Equals(16) assert.Error(err).IsNil() assert.Int(content.Len()).Equals(len2) reader.SetCached(false) payload2 := alloc.NewBuffer() reader.Read(payload2.Value) assert.Int(content.Len()).Equals(len2) reader.Read(payload2.Value) assert.Int(content.Len()).LessThan(len2) }
func (this *ChunkReader) Read() (*alloc.Buffer, error) { buffer := alloc.NewLargeBuffer() if _, err := io.ReadFull(this.reader, buffer.Value[:2]); err != nil { buffer.Release() return nil, err } // There is a potential buffer overflow here. Large buffer is 64K bytes, // while uin16 + 10 will be more than that length := serial.BytesToUint16(buffer.Value[:2]) + AuthSize if _, err := io.ReadFull(this.reader, buffer.Value[:length]); err != nil { buffer.Release() return nil, err } buffer.Slice(0, int(length)) authBytes := buffer.Value[:AuthSize] payload := buffer.Value[AuthSize:] actualAuthBytes := this.auth.Authenticate(nil, payload) if !bytes.Equal(authBytes, actualAuthBytes) { buffer.Release() log.Debug("AuthenticationReader: Unexpected auth: ", authBytes) return nil, transport.ErrCorruptedPacket } buffer.SliceFrom(AuthSize) return buffer, nil }
func TestAdaptiveWriter(t *testing.T) { assert := assert.On(t) lb := alloc.NewLargeBuffer() rand.Read(lb.Value) writeBuffer := make([]byte, 0, 1024*1024) writer := NewAdaptiveWriter(NewBufferedWriter(bytes.NewBuffer(writeBuffer))) err := writer.Write(lb) assert.Error(err).IsNil() assert.Bytes(lb.Bytes()).Equals(writeBuffer) }
func TestBufferedWriter(t *testing.T) { assert := assert.On(t) content := alloc.NewLargeBuffer().Clear() writer := NewBufferedWriter(content) assert.Bool(writer.Cached()).IsTrue() payload := make([]byte, 16) nBytes, err := writer.Write(payload) assert.Int(nBytes).Equals(16) assert.Error(err).IsNil() assert.Bool(content.IsEmpty()).IsTrue() writer.SetCached(false) assert.Int(content.Len()).Equals(16) }
func TestLargeIO(t *testing.T) { assert := assert.On(t) content := make([]byte, 1024*1024) rand.Read(content) chunckContent := bytes.NewBuffer(make([]byte, 0, len(content)*2)) writer := NewAuthChunkWriter(v2io.NewAdaptiveWriter(chunckContent)) writeSize := 0 for { chunkSize := 7 * 1024 if chunkSize+writeSize > len(content) { chunkSize = len(content) - writeSize } writer.Write(alloc.NewBuffer().Clear().Append(content[writeSize : writeSize+chunkSize])) writeSize += chunkSize if writeSize == len(content) { break } chunkSize = 8 * 1024 if chunkSize+writeSize > len(content) { chunkSize = len(content) - writeSize } writer.Write(alloc.NewLargeBuffer().Clear().Append(content[writeSize : writeSize+chunkSize])) writeSize += chunkSize if writeSize == len(content) { break } chunkSize = 63 * 1024 if chunkSize+writeSize > len(content) { chunkSize = len(content) - writeSize } writer.Write(alloc.NewLargeBuffer().Clear().Append(content[writeSize : writeSize+chunkSize])) writeSize += chunkSize if writeSize == len(content) { break } chunkSize = 64*1024 - 16 if chunkSize+writeSize > len(content) { chunkSize = len(content) - writeSize } writer.Write(alloc.NewLargeBuffer().Clear().Append(content[writeSize : writeSize+chunkSize])) writeSize += chunkSize if writeSize == len(content) { break } } writer.Write(alloc.NewBuffer().Clear()) writer.Release() actualContent := make([]byte, 0, len(content)) reader := NewAuthChunkReader(chunckContent) for { buffer, err := reader.Read() if err == io.EOF { break } assert.Error(err).IsNil() actualContent = append(actualContent, buffer.Value...) } assert.Int(len(actualContent)).Equals(len(content)) assert.Bytes(actualContent).Equals(content) }