1
package encode
2
3
import (
4
+ "net/http"
5
+ "sync"
6
"testing"
7
)
8
12
enc.openResponseWriter("test", nil)
13
}
14
}
15
+
16
+func TestPreferOrder(t *testing.T) {
17
+ testCases := []struct {
18
+ name string
19
+ accept string
20
+ prefer []string
21
+ expected []string
22
+ }{
23
+ {
24
+ name: "PreferOrder(): 4 accept, 3 prefer",
25
+ accept: "deflate, gzip, br, zstd",
26
+ prefer: []string{"zstd", "br", "gzip"},
27
+ expected: []string{"zstd", "br", "gzip", "deflate"},
28
+ },
29
+ {
30
+ name: "PreferOrder(): 2 accept, 3 prefer",
31
+ accept: "deflate, zstd",
32
+ prefer: []string{"zstd", "br", "gzip"},
33
+ expected: []string{"zstd", "deflate"},
34
+ },
35
+ {
36
+ name: "PreferOrder(): 2 accept (1 empty), 3 prefer",
37
+ accept: "gzip,,zstd",
38
+ prefer: []string{"zstd", "br", "gzip"},
39
+ expected: []string{"zstd", "gzip", ""},
40
+ },
41
+ {
42
+ name: "PreferOrder(): 1 accept, 2 prefer",
43
+ accept: "gzip",
44
+ prefer: []string{"zstd", "gzip"},
45
+ expected: []string{"gzip"},
46
+ },
47
+ {
48
+ name: "PreferOrder(): 4 accept (1 duplicate), 1 prefer",
49
+ accept: "deflate, gzip, br, br",
50
+ prefer: []string{"br"},
51
+ expected: []string{"br", "br", "deflate", "gzip"},
52
+ },
53
+ {
54
+ name: "PreferOrder(): empty accept, 0 prefer",
55
+ accept: "",
56
+ prefer: []string{},
57
+ expected: []string{},
58
+ },
59
+ {
60
+ name: "PreferOrder(): empty accept, 1 prefer",
61
+ accept: "",
62
+ prefer: []string{"gzip"},
63
+ expected: []string{},
64
+ },
65
+ {
66
+ name: "PreferOrder(): with q-factor",
67
+ accept: "deflate;q=0.8, gzip;q=0.4, br;q=0.2, zstd",
68
+ prefer: []string{"gzip"},
69
+ expected: []string{"zstd", "deflate", "gzip", "br"},
70
+ },
71
+ {
72
+ name: "PreferOrder(): with q-factor, no prefer",
73
+ accept: "deflate;q=0.8, gzip;q=0.4, br;q=0.2, zstd",
74
+ prefer: []string{},
75
+ expected: []string{"zstd", "deflate", "gzip", "br"},
76
+ },
77
+ {
78
+ name: "PreferOrder(): q-factor=0 filtered out",
79
+ accept: "deflate;q=0.1, gzip;q=0.4, br;q=0.5, zstd;q=0",
80
+ prefer: []string{"gzip"},
81
+ expected: []string{"br", "gzip", "deflate"},
82
+ },
83
+ {
84
+ name: "PreferOrder(): q-factor=0 filtered out, no prefer",
85
+ accept: "deflate;q=0.1, gzip;q=0.4, br;q=0.5, zstd;q=0",
86
+ prefer: []string{},
87
+ expected: []string{"br", "gzip", "deflate"},
88
+ },
89
+ {
90
+ name: "PreferOrder(): with invalid q-factor",
91
+ accept: "br, deflate, gzip;q=2, zstd;q=0.1",
92
+ prefer: []string{"zstd", "gzip"},
93
+ expected: []string{"gzip", "br", "deflate", "zstd"},
94
+ },
95
+ {
96
+ name: "PreferOrder(): with invalid q-factor, no prefer",
97
+ accept: "br, deflate, gzip;q=2, zstd;q=0.1",
98
+ prefer: []string{},
99
+ expected: []string{"br", "deflate", "gzip", "zstd"},
100
+ },
101
+ }
102
+
103
+ enc := new(Encode)
104
+ r, _ := http.NewRequest("", "", nil)
105
+
106
+ for _, test := range testCases {
107
+ t.Run(test.name, func(t *testing.T) {
108
+
109
+ if test.accept == "" {
110
+ r.Header.Del("Accept-Encoding")
111
+ } else {
112
+ r.Header.Set("Accept-Encoding", test.accept)
113
+ }
114
+ enc.Prefer = test.prefer
115
+ result := AcceptedEncodings(r, enc.Prefer)
116
+ if !sliceEqual(result, test.expected) {
117
+ t.Errorf("AcceptedEncodings() actual: %s expected: %s",
118
+ result,
119
+ test.expected)
120
+ }
121
+ })
122
+ }
123
+}
124
+
125
+func sliceEqual(a, b []string) bool {
126
+ if len(a) != len(b) {
127
+ return false
128
+ }
129
+ for i := range a {
130
+ if a[i] != b[i] {
131
+ return false
132
+ }
133
+ }
134
+ return true
135
+}
136
+
137
+func TestValidate(t *testing.T) {
138
+ type testCase struct {
139
+ name string
140
+ prefer []string
141
+ wantErr bool
142
+ }
143
+
144
+ var err error
145
+ var testCases []testCase
146
+ enc := new(Encode)
147
+
148
+ enc.writerPools = map[string]*sync.Pool{
149
+ "zstd": nil,
150
+ "gzip": nil,
151
+ "br": nil,
152
+ }
153
+ testCases = []testCase{
154
+ {
155
+ name: "ValidatePrefer (zstd, gzip & br enabled): valid order with all encoder",
156
+ prefer: []string{"zstd", "br", "gzip"},
157
+ wantErr: false,
158
+ },
159
+ {
160
+ name: "ValidatePrefer (zstd, gzip & br enabled): valid order with 2 out of 3 encoders",
161
+ prefer: []string{"br", "gzip"},
162
+ wantErr: false,
163
+ },
164
+ {
165
+ name: "ValidatePrefer (zstd, gzip & br enabled): valid order with 1 out of 3 encoders",
166
+ prefer: []string{"gzip"},
167
+ wantErr: false,
168
+ },
169
+ {
170
+ name: "ValidatePrefer (zstd, gzip & br enabled): 1 duplicated (once) encoder",
171
+ prefer: []string{"gzip", "zstd", "gzip"},
172
+ wantErr: true,
173
+ },
174
+ {
175
+ name: "ValidatePrefer (zstd, gzip & br enabled): 1 not enabled encoder in prefer list",
176
+ prefer: []string{"br", "zstd", "gzip", "deflate"},
177
+ wantErr: true,
178
+ },
179
+ {
180
+ name: "ValidatePrefer (zstd, gzip & br enabled): no prefer list",
181
+ prefer: []string{},
182
+ wantErr: false,
183
+ },
184
+ }
185
+
186
+ for _, test := range testCases {
187
+ t.Run(test.name, func(t *testing.T) {
188
+ enc.Prefer = test.prefer
189
+ err = enc.Validate()
190
+ if (err != nil) != test.wantErr {
191
+ t.Errorf("Validate() error = %v, wantErr = %v", err, test.wantErr)
192
+ }
193
+ })
194
+ }
195
+
196
+ enc.writerPools = map[string]*sync.Pool{
197
+ "zstd": nil,
198
+ "gzip": nil,
199
+ }
200
+ testCases = []testCase{
201
+ {
202
+ name: "ValidatePrefer (zstd & gzip enabled): 1 not enabled encoder in prefer list",
203
+ prefer: []string{"zstd", "br", "gzip"},
204
+ wantErr: true,
205
+ },
206
+ {
207
+ name: "ValidatePrefer (zstd & gzip enabled): 2 not enabled encoder in prefer list",
208
+ prefer: []string{"br", "zstd", "gzip", "deflate"},
209
+ wantErr: true,
210
+ },
211
+ {
212
+ name: "ValidatePrefer (zstd & gzip enabled): only not enabled encoder in prefer list",
213
+ prefer: []string{"deflate", "br", "gzip"},
214
+ wantErr: true,
215
+ },
216
+ {
217
+ name: "ValidatePrefer (zstd & gzip enabled): 1 duplicated (once) encoder in prefer list",
218
+ prefer: []string{"gzip", "zstd", "gzip"},
219
+ wantErr: true,
220
+ },
221
+ {
222
+ name: "ValidatePrefer (zstd & gzip enabled): 1 duplicated (twice) encoder in prefer list",
223
+ prefer: []string{"gzip", "zstd", "gzip", "gzip"},
224
+ wantErr: true,
225
+ },
226
+ {
227
+ name: "ValidatePrefer (zstd & gzip enabled): 1 duplicated encoder in prefer list",
228
+ prefer: []string{"zstd", "zstd", "gzip", "gzip"},
229
+ wantErr: true,
230
+ },
231
+ {
232
+ name: "ValidatePrefer (zstd & gzip enabled): 1 duplicated not enabled encoder in prefer list",
233
+ prefer: []string{"br", "br", "gzip"},
234
+ wantErr: true,
235
+ },
236
+ {
237
+ name: "ValidatePrefer (zstd & gzip enabled): 2 duplicated not enabled encoder in prefer list",
238
+ prefer: []string{"br", "deflate", "br", "deflate"},
239
+ wantErr: true,
240
+ },
241
+ {
242
+ name: "ValidatePrefer (zstd & gzip enabled): valid order zstd first",
243
+ prefer: []string{"zstd", "gzip"},
244
+ wantErr: false,
245
+ },
246
+ {
247
+ name: "ValidatePrefer (zstd & gzip enabled): valid order gzip first",
248
+ prefer: []string{"gzip", "zstd"},
249
+ wantErr: false,
250
+ },
251
+ }
252
+
253
+ for _, test := range testCases {
254
+ t.Run(test.name, func(t *testing.T) {
255
+ enc.Prefer = test.prefer
256
+ err = enc.Validate()
257
+ if (err != nil) != test.wantErr {
258
+ t.Errorf("Validate() error = %v, wantErr = %v", err, test.wantErr)
259
+ }
260
+ })
261
+
262
+ }
263
+}