1 package storage
2
3 import (
4 "bytes"
5 "compress/gzip"
6 "io"
7 "os"
8 "testing"
9 )
10
11 func TestDuplicateFail(t *testing.T) {
12 e := []Entry{
13 {
14 Type: FileType,
15 Name: "./hurr.txt",
16 Payload: []byte("abcde"),
17 },
18 {
19 Type: FileType,
20 Name: "./hurr.txt",
21 Payload: []byte("deadbeef"),
22 },
23 {
24 Type: FileType,
25 Name: "hurr.txt",
26 Payload: []byte("deadbeef"),
27 },
28 }
29 buf := []byte{}
30 b := bytes.NewBuffer(buf)
31
32 jp := NewJSONPacker(b)
33 if _, err := jp.AddEntry(e[0]); err != nil {
34 t.Error(err)
35 }
36 if _, err := jp.AddEntry(e[1]); err != ErrDuplicatePath {
37 t.Errorf("expected failure on duplicate path")
38 }
39 if _, err := jp.AddEntry(e[2]); err != ErrDuplicatePath {
40 t.Errorf("expected failure on duplicate path")
41 }
42 }
43
44 func TestJSONPackerUnpacker(t *testing.T) {
45 e := []Entry{
46 {
47 Type: SegmentType,
48 Payload: []byte("how"),
49 },
50 {
51 Type: SegmentType,
52 Payload: []byte("y'all"),
53 },
54 {
55 Type: FileType,
56 Name: "./hurr.txt",
57 Payload: []byte("deadbeef"),
58 },
59 {
60 Type: SegmentType,
61 Payload: []byte("doin"),
62 },
63 }
64
65 buf := []byte{}
66 b := bytes.NewBuffer(buf)
67
68 func() {
69 jp := NewJSONPacker(b)
70 for i := range e {
71 if _, err := jp.AddEntry(e[i]); err != nil {
72 t.Error(err)
73 }
74 }
75 }()
76
77
78
79
80 b = bytes.NewBuffer(b.Bytes())
81 entries := Entries{}
82 func() {
83 jup := NewJSONUnpacker(b)
84 for {
85 entry, err := jup.Next()
86 if err != nil {
87 if err == io.EOF {
88 break
89 }
90 t.Error(err)
91 }
92 entries = append(entries, *entry)
93 t.Logf("got %#v", entry)
94 }
95 }()
96 if len(entries) != len(e) {
97 t.Errorf("expected %d entries, got %d", len(e), len(entries))
98 }
99 }
100
101
102
103
104
105 func TestGzip(t *testing.T) {
106 e := []Entry{
107 {
108 Type: SegmentType,
109 Payload: []byte("how"),
110 },
111 {
112 Type: SegmentType,
113 Payload: []byte("y'all"),
114 },
115 {
116 Type: FileType,
117 Name: "./hurr.txt",
118 Payload: []byte("deadbeef"),
119 },
120 {
121 Type: SegmentType,
122 Payload: []byte("doin"),
123 },
124 }
125
126 buf := []byte{}
127 b := bytes.NewBuffer(buf)
128 gzW := gzip.NewWriter(b)
129 jp := NewJSONPacker(gzW)
130 for i := range e {
131 if _, err := jp.AddEntry(e[i]); err != nil {
132 t.Error(err)
133 }
134 }
135 gzW.Close()
136
137
138
139
140 b = bytes.NewBuffer(b.Bytes())
141 gzR, err := gzip.NewReader(b)
142 if err != nil {
143 t.Fatal(err)
144 }
145 entries := Entries{}
146 func() {
147 jup := NewJSONUnpacker(gzR)
148 for {
149 entry, err := jup.Next()
150 if err != nil {
151 if err == io.EOF {
152 break
153 }
154 t.Error(err)
155 }
156 entries = append(entries, *entry)
157 t.Logf("got %#v", entry)
158 }
159 }()
160 if len(entries) != len(e) {
161 t.Errorf("expected %d entries, got %d", len(e), len(entries))
162 }
163 }
164
165 func BenchmarkGetPut(b *testing.B) {
166 e := []Entry{
167 {
168 Type: SegmentType,
169 Payload: []byte("how"),
170 },
171 {
172 Type: SegmentType,
173 Payload: []byte("y'all"),
174 },
175 {
176 Type: FileType,
177 Name: "./hurr.txt",
178 Payload: []byte("deadbeef"),
179 },
180 {
181 Type: SegmentType,
182 Payload: []byte("doin"),
183 },
184 }
185 b.RunParallel(func(pb *testing.PB) {
186 for pb.Next() {
187 func() {
188 fh, err := os.CreateTemp("", "tar-split.")
189 if err != nil {
190 b.Fatal(err)
191 }
192 defer os.Remove(fh.Name())
193 defer fh.Close()
194
195 jp := NewJSONPacker(fh)
196 for i := range e {
197 if _, err := jp.AddEntry(e[i]); err != nil {
198 b.Fatal(err)
199 }
200 }
201 if err := fh.Sync(); err != nil {
202 b.Fatal(err)
203 }
204
205 up := NewJSONUnpacker(fh)
206 for {
207 _, err := up.Next()
208 if err != nil {
209 if err == io.EOF {
210 break
211 }
212 b.Fatal(err)
213 }
214 }
215
216 }()
217 }
218 })
219 }
220
View as plain text