1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
14 type testpair struct {
15 decoded, encoded string
18 var pairs = []testpair{
20 {"\x14\xfb\x9c\x03\xd9\x7e", "FPucA9l+"},
21 {"\x14\xfb\x9c\x03\xd9", "FPucA9k="},
22 {"\x14\xfb\x9c\x03", "FPucAw=="},
30 {"fooba", "Zm9vYmE="},
31 {"foobar", "Zm9vYmFy"},
34 {"sure.", "c3VyZS4="},
38 {"leasure.", "bGVhc3VyZS4="},
39 {"easure.", "ZWFzdXJlLg=="},
40 {"asure.", "YXN1cmUu"},
41 {"sure.", "c3VyZS4="},
44 var bigtest = testpair{
45 "Twas brillig, and the slithy toves",
46 "VHdhcyBicmlsbGlnLCBhbmQgdGhlIHNsaXRoeSB0b3Zlcw==",
49 func testEqual(t *testing.T, msg string, args ...interface{}) bool {
50 if args[len(args)-2] != args[len(args)-1] {
51 t.Errorf(msg, args...)
57 func TestEncode(t *testing.T) {
58 for _, p := range pairs {
59 got := StdEncoding.EncodeToString([]byte(p.decoded))
60 testEqual(t, "Encode(%q) = %q, want %q", p.decoded, got, p.encoded)
64 func TestEncoder(t *testing.T) {
65 for _, p := range pairs {
67 encoder := NewEncoder(StdEncoding, bb)
68 encoder.Write([]byte(p.decoded))
70 testEqual(t, "Encode(%q) = %q, want %q", p.decoded, bb.String(), p.encoded)
74 func TestEncoderBuffering(t *testing.T) {
75 input := []byte(bigtest.decoded)
76 for bs := 1; bs <= 12; bs++ {
78 encoder := NewEncoder(StdEncoding, bb)
79 for pos := 0; pos < len(input); pos += bs {
84 n, err := encoder.Write(input[pos:end])
85 testEqual(t, "Write(%q) gave error %v, want %v", input[pos:end], err, os.Error(nil))
86 testEqual(t, "Write(%q) gave length %v, want %v", input[pos:end], n, end-pos)
88 err := encoder.Close()
89 testEqual(t, "Close gave error %v, want %v", err, os.Error(nil))
90 testEqual(t, "Encoding/%d of %q = %q, want %q", bs, bigtest.decoded, bb.String(), bigtest.encoded)
94 func TestDecode(t *testing.T) {
95 for _, p := range pairs {
96 dbuf := make([]byte, StdEncoding.DecodedLen(len(p.encoded)))
97 count, end, err := StdEncoding.decode(dbuf, []byte(p.encoded))
98 testEqual(t, "Decode(%q) = error %v, want %v", p.encoded, err, os.Error(nil))
99 testEqual(t, "Decode(%q) = length %v, want %v", p.encoded, count, len(p.decoded))
100 if len(p.encoded) > 0 {
101 testEqual(t, "Decode(%q) = end %v, want %v", p.encoded, end, (p.encoded[len(p.encoded)-1] == '='))
103 testEqual(t, "Decode(%q) = %q, want %q", p.encoded, string(dbuf[0:count]), p.decoded)
105 dbuf, err = StdEncoding.DecodeString(p.encoded)
106 testEqual(t, "DecodeString(%q) = error %v, want %v", p.encoded, err, os.Error(nil))
107 testEqual(t, "DecodeString(%q) = %q, want %q", string(dbuf), p.decoded)
111 func TestDecoder(t *testing.T) {
112 for _, p := range pairs {
113 decoder := NewDecoder(StdEncoding, bytes.NewBufferString(p.encoded))
114 dbuf := make([]byte, StdEncoding.DecodedLen(len(p.encoded)))
115 count, err := decoder.Read(dbuf)
116 if err != nil && err != os.EOF {
117 t.Fatal("Read failed", err)
119 testEqual(t, "Read from %q = length %v, want %v", p.encoded, count, len(p.decoded))
120 testEqual(t, "Decoding of %q = %q, want %q", p.encoded, string(dbuf[0:count]), p.decoded)
122 count, err = decoder.Read(dbuf)
124 testEqual(t, "Read from %q = %v, want %v", p.encoded, err, os.EOF)
128 func TestDecoderBuffering(t *testing.T) {
129 for bs := 1; bs <= 12; bs++ {
130 decoder := NewDecoder(StdEncoding, bytes.NewBufferString(bigtest.encoded))
131 buf := make([]byte, len(bigtest.decoded)+12)
133 for total = 0; total < len(bigtest.decoded); {
134 n, err := decoder.Read(buf[total : total+bs])
135 testEqual(t, "Read from %q at pos %d = %d, %v, want _, %v", bigtest.encoded, total, n, err, os.Error(nil))
138 testEqual(t, "Decoding/%d of %q = %q, want %q", bs, bigtest.encoded, string(buf[0:total]), bigtest.decoded)
142 func TestDecodeCorrupt(t *testing.T) {
143 type corrupt struct {
147 examples := []corrupt{
156 for _, e := range examples {
157 dbuf := make([]byte, StdEncoding.DecodedLen(len(e.e)))
158 _, err := StdEncoding.Decode(dbuf, []byte(e.e))
159 switch err := err.(type) {
160 case CorruptInputError:
161 testEqual(t, "Corruption in %q at offset %v, want %v", e.e, int(err), e.p)
163 t.Error("Decoder failed to detect corruption in", e)
168 func TestBig(t *testing.T) {
170 raw := make([]byte, n)
171 const alpha = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
172 for i := 0; i < n; i++ {
173 raw[i] = alpha[i%len(alpha)]
175 encoded := new(bytes.Buffer)
176 w := NewEncoder(StdEncoding, encoded)
177 nn, err := w.Write(raw)
178 if nn != n || err != nil {
179 t.Fatalf("Encoder.Write(raw) = %d, %v want %d, nil", nn, err, n)
183 t.Fatalf("Encoder.Close() = %v want nil", err)
185 decoded, err := ioutil.ReadAll(NewDecoder(StdEncoding, encoded))
187 t.Fatalf("ioutil.ReadAll(NewDecoder(...)): %v", err)
190 if !bytes.Equal(raw, decoded) {
192 for i = 0; i < len(decoded) && i < len(raw); i++ {
193 if decoded[i] != raw[i] {
197 t.Errorf("Decode(Encode(%d-byte string)) failed at offset %d", n, i)