1/*-
2 * Copyright 2014 Square Inc.
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
17package jose
18
19import (
20	"bytes"
21	"strings"
22	"testing"
23)
24
25func TestDeflateRoundtrip(t *testing.T) {
26	original := []byte("Lorem ipsum dolor sit amet")
27
28	compressed, err := deflate(original)
29	if err != nil {
30		panic(err)
31	}
32
33	output, err := inflate(compressed)
34	if err != nil {
35		panic(err)
36	}
37
38	if bytes.Compare(output, original) != 0 {
39		t.Error("Input and output do not match")
40	}
41}
42
43func TestInvalidCompression(t *testing.T) {
44	_, err := compress("XYZ", []byte{})
45	if err == nil {
46		t.Error("should not accept invalid algorithm")
47	}
48
49	_, err = decompress("XYZ", []byte{})
50	if err == nil {
51		t.Error("should not accept invalid algorithm")
52	}
53
54	_, err = decompress(DEFLATE, []byte{1, 2, 3, 4})
55	if err == nil {
56		t.Error("should not accept invalid data")
57	}
58}
59
60func TestByteBufferTrim(t *testing.T) {
61	buf := newBufferFromInt(1)
62	if !bytes.Equal(buf.data, []byte{1}) {
63		t.Error("Byte buffer for integer '1' should contain [0x01]")
64	}
65
66	buf = newBufferFromInt(65537)
67	if !bytes.Equal(buf.data, []byte{1, 0, 1}) {
68		t.Error("Byte buffer for integer '65537' should contain [0x01, 0x00, 0x01]")
69	}
70}
71
72func TestFixedSizeBuffer(t *testing.T) {
73	data0 := []byte{}
74	data1 := []byte{1}
75	data2 := []byte{1, 2}
76	data3 := []byte{1, 2, 3}
77	data4 := []byte{1, 2, 3, 4}
78
79	buf0 := newFixedSizeBuffer(data0, 4)
80	buf1 := newFixedSizeBuffer(data1, 4)
81	buf2 := newFixedSizeBuffer(data2, 4)
82	buf3 := newFixedSizeBuffer(data3, 4)
83	buf4 := newFixedSizeBuffer(data4, 4)
84
85	if !bytes.Equal(buf0.data, []byte{0, 0, 0, 0}) {
86		t.Error("Invalid padded buffer for buf0")
87	}
88	if !bytes.Equal(buf1.data, []byte{0, 0, 0, 1}) {
89		t.Error("Invalid padded buffer for buf1")
90	}
91	if !bytes.Equal(buf2.data, []byte{0, 0, 1, 2}) {
92		t.Error("Invalid padded buffer for buf2")
93	}
94	if !bytes.Equal(buf3.data, []byte{0, 1, 2, 3}) {
95		t.Error("Invalid padded buffer for buf3")
96	}
97	if !bytes.Equal(buf4.data, []byte{1, 2, 3, 4}) {
98		t.Error("Invalid padded buffer for buf4")
99	}
100}
101
102func TestSerializeJSONRejectsNil(t *testing.T) {
103	defer func() {
104		r := recover()
105		if r == nil || !strings.Contains(r.(string), "nil pointer") {
106			t.Error("serialize function should not accept nil pointer")
107		}
108	}()
109
110	mustSerializeJSON(nil)
111}
112
113func TestFixedSizeBufferTooLarge(t *testing.T) {
114	defer func() {
115		r := recover()
116		if r == nil {
117			t.Error("should not be able to create fixed size buffer with oversized data")
118		}
119	}()
120
121	newFixedSizeBuffer(make([]byte, 2), 1)
122}
123