1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
|
package internal
import (
"bytes"
"encoding/hex"
"errors"
"io"
"os"
"strings"
"testing"
)
var invalidUtf8 = []string{"f0288cbc", "fc80808080af"}
var validUtf8 = []string{"Hell⌘o☏", "World", "||||", "你好,世界!"}
type noOpCloser struct {
buff *bytes.Buffer
}
func (c *noOpCloser) Write(p []byte) (n int, err error) {
return c.buff.Write(p)
}
func (c *noOpCloser) Close() (err error) {
return
}
func loadLargeData(t *testing.T) {
data, err := os.ReadFile("testdata/utf8Valid.txt")
if err != nil {
t.Fatal(err)
}
validUtf8 = append(validUtf8, string(data))
}
func TestUtf8CheckWriteCloser(t *testing.T) {
loadLargeData(t)
t.Run("invalid utf-8", func(t *testing.T) {
for _, invalid := range invalidUtf8 {
buff := bytes.NewBuffer(nil)
writeCloser := NewUtf8CheckWriteCloser(&noOpCloser{buff})
data, _ := hex.DecodeString(invalid)
var err error
for id := range data {
if _, err = writeCloser.Write(data[id : id+1]); err != nil {
break
}
}
errClose := writeCloser.Close()
if err == nil && errClose == nil {
t.Error("Should be invalid utf8")
}
}
})
t.Run("valid utf-8", func(t *testing.T) {
for _, copySize := range []int64{1, 3, 7, 11} {
for _, valid := range validUtf8 {
buff := bytes.NewBuffer(nil)
writeCloser := NewUtf8CheckWriteCloser(&noOpCloser{buff})
dataReader := strings.NewReader(valid)
for {
_, err := io.CopyN(writeCloser, dataReader, copySize)
if errors.Is(err, io.EOF) {
break
}
if err != nil {
t.Fatal(err)
}
}
if err := writeCloser.Close(); err != nil {
t.Error("Should be valid utf8")
}
}
}
})
}
|