File: utf8_test.go

package info (click to toggle)
golang-github-protonmail-gopenpgp-v3 3.3.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,028 kB
  • sloc: sh: 87; makefile: 2
file content (78 lines) | stat: -rw-r--r-- 1,677 bytes parent folder | download | duplicates (3)
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")
				}
			}
		}
	})
}