blob: 957a8df03c7bbc4588dc5b76bd3268569ec24ddf [file] [log] [blame]
Simon Wangd5927a92021-09-13 19:50:45 +08001/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19
20package tests
21
22import (
23 "encoding/json"
24 "errors"
25 "strconv"
26 "testing"
27
28 "github.com/apache/thrift/lib/go/test/gopath/src/validatetest"
29 thrift "github.com/apache/thrift/lib/go/thrift"
30)
31
32func TestBasicValidator(t *testing.T) {
33 bt := validatetest.NewBasicTest()
34 if err := bt.Validate(); err != nil {
35 t.Error(err)
36 }
37 var ve *thrift.ValidationError
38 bt = validatetest.NewBasicTest()
39 bt.Bool1 = thrift.BoolPtr(false)
40 if err := bt.Validate(); err == nil {
41 t.Error("Expected vt.const error for Bool1")
42 } else if errors.As(err, &ve) {
43 if ve.Check() != "vt.const" {
44 t.Errorf("Expected vt.const check error, but got %v", ve.Check())
45 }
46 if ve.Field() != "Bool1" {
47 t.Errorf("Expected error for Bool1, but got %v", ve.Field())
48 }
49 } else {
50 t.Errorf("Error cannot be unwrapped into *ValidationError: %v", err)
51 }
52 bt = validatetest.NewBasicTest()
53 bt.Byte1 = thrift.Int8Ptr(3)
54 if err := bt.Validate(); err == nil {
55 t.Errorf("Expected vt.lt error for Byte1")
56 } else if errors.As(err, &ve) {
57 if ve.Check() != "vt.lt" {
58 t.Errorf("Expected vt.lt check error, but got %v", ve.Check())
59 }
60 if ve.Field() != "Byte1" {
61 t.Errorf("Expected error for Byte1, but got %v", ve.Field())
62 }
63 } else {
64 t.Errorf("Error cannot be unwrapped into *ValidationError: %v", err)
65 }
66 bt = validatetest.NewBasicTest()
67 bt.Double1 = thrift.Float64Ptr(3.0)
68 if err := bt.Validate(); err == nil {
69 t.Errorf("Expected vt.lt error for Double1")
70 } else if errors.As(err, &ve) {
71 if ve.Check() != "vt.lt" {
72 t.Errorf("Expected vt.lt check error, but got %v", ve.Check())
73 }
74 if ve.Field() != "Double1" {
75 t.Errorf("Expected error for Double1, but got %v", ve.Field())
76 }
77 } else {
78 t.Errorf("Error cannot be unwrapped into *ValidationError: %v", err)
79 }
80 bt = validatetest.NewBasicTest()
81 bt.String1 = thrift.StringPtr("other string")
82 if err := bt.Validate(); err == nil {
83 t.Errorf("Expected vt.const error for String1")
84 } else if errors.As(err, &ve) {
85 if ve.Check() != "vt.const" {
86 t.Errorf("Expected vt.const check error, but got %v", ve.Check())
87 }
88 if ve.Field() != "String1" {
89 t.Errorf("Expected error for String1, but got %v", ve.Field())
90 }
91 } else {
92 t.Errorf("Error cannot be unwrapped into *ValidationError: %v", err)
93 }
94 bt = validatetest.NewBasicTest()
95 bt.Binary1 = []byte("other binary")
96 if err := bt.Validate(); err == nil {
97 t.Errorf("Expected vt.const error for Binary1")
98 } else if errors.As(err, &ve) {
99 if ve.Check() != "vt.const" {
100 t.Errorf("Expected vt.const check error, but got %v", ve.Check())
101 }
102 if ve.Field() != "Binary1" {
103 t.Errorf("Expected error for Binary1, but got %v", ve.Field())
104 }
105 } else {
106 t.Errorf("Error cannot be unwrapped into *ValidationError: %v", err)
107 }
108 bt = validatetest.NewBasicTest()
109 bt.Map1 = make(map[string]string)
110 for i := 0; i < 11; i++ {
111 bt.Map1[strconv.Itoa(i)] = strconv.Itoa(i)
112 }
113 if err := bt.Validate(); err == nil {
114 t.Errorf("Expected vt.max_size error for Map1")
115 } else if errors.As(err, &ve) {
116 if ve.Check() != "vt.max_size" {
117 t.Errorf("Expected vt.max_size check error, but got %v", ve.Check())
118 }
119 if ve.Field() != "Map1" {
120 t.Errorf("Expected error for Map1, but got %v", ve.Field())
121 }
122 } else {
123 t.Errorf("Error cannot be unwrapped into *ValidationError: %v", err)
124 }
125 bt.Map1 = map[string]string{"012345678910": "0"}
126 if err := bt.Validate(); err == nil {
127 t.Errorf("Expected vt.max_size error for Map1")
128 } else if errors.As(err, &ve) {
129 if ve.Check() != "vt.max_size" {
130 t.Errorf("Expected vt.max_size check error, but got %v", ve.Check())
131 }
132 if ve.Field() != "Map1" {
133 t.Errorf("Expected error for Map1, but got %v", ve.Field())
134 }
135 } else {
136 t.Errorf("Error cannot be unwrapped into *ValidationError: %v", err)
137 }
138 bt.Map1 = map[string]string{"0": "012345678910"}
139 if err := bt.Validate(); err == nil {
140 t.Errorf("Expected vt.max_size error for Map1")
141 } else if errors.As(err, &ve) {
142 if ve.Check() != "vt.max_size" {
143 t.Errorf("Expected vt.max_size check error, but got %v", ve.Check())
144 }
145 if ve.Field() != "Map1" {
146 t.Errorf("Expected error for Map1, but got %v", ve.Field())
147 }
148 } else {
149 t.Errorf("Error cannot be unwrapped into *ValidationError: %v", err)
150 }
151 bt = validatetest.NewBasicTest()
152 for i := 0; i < 11; i++ {
153 bt.Set1 = append(bt.Set1, "0")
154 }
155 if err := bt.Validate(); err == nil {
156 t.Errorf("Expected vt.max_size error for Set1")
157 } else if errors.As(err, &ve) {
158 if ve.Check() != "vt.max_size" {
159 t.Errorf("Expected vt.max_size check error, but got %v", ve.Check())
160 }
161 if ve.Field() != "Set1" {
162 t.Errorf("Expected error for Set1, but got %v", ve.Field())
163 }
164 } else {
165 t.Errorf("Error cannot be unwrapped into *ValidationError: %v", err)
166 }
167 bt.Set1 = []string{"0"}
168 if err := bt.Validate(); err == nil {
169 t.Errorf("Expected vt.min_size error for Set1")
170 } else if errors.As(err, &ve) {
171 if ve.Check() != "vt.min_size" {
172 t.Errorf("Expected vt.min_size check error, but got %v", ve.Check())
173 }
174 if ve.Field() != "Set1" {
175 t.Errorf("Expected error for Set1, but got %v", ve.Field())
176 }
177 } else {
178 t.Errorf("Error cannot be unwrapped into *ValidationError: %v", err)
179 }
180 bt = validatetest.NewBasicTest()
181 bt.Enum1 = (*validatetest.EnumFoo)(thrift.Int64Ptr(int64(validatetest.EnumFoo_e2)))
182 if err := bt.Validate(); err == nil {
183 t.Errorf("Expected vt.in error for Enum1")
184 } else if errors.As(err, &ve) {
185 if ve.Check() != "vt.in" {
186 t.Errorf("Expected vt.in check error, but got %v", ve.Check())
187 }
188 if ve.Field() != "Enum1" {
189 t.Errorf("Expected error for Enum1, but got %v", ve.Field())
190 }
191 } else {
192 t.Errorf("Error cannot be unwrapped into *ValidationError: %v", err)
193 }
194}
195
196func TestFieldReference(t *testing.T) {
197 frt := validatetest.NewFieldReferenceTest()
198 if err := frt.Validate(); err != nil {
199 t.Error(err)
200 }
201 var ve *thrift.ValidationError
202 frt = validatetest.NewFieldReferenceTest()
203 frt.Bool2 = true
204 if err := frt.Validate(); err == nil {
205 t.Errorf("Expected vt.const error for Bool0")
206 } else if errors.As(err, &ve) {
207 if ve.Check() != "vt.const" {
208 t.Errorf("Expected vt.const check error, but got %v", ve.Check())
209 }
210 if ve.Field() != "Bool0" {
211 t.Errorf("Expected error for Bool0, but got %v", ve.Field())
212 }
213 } else {
214 t.Errorf("Error cannot be unwrapped into *ValidationError: %v", err)
215 }
216 frt = validatetest.NewFieldReferenceTest()
217 frt.Byte4 = 9
218 if err := frt.Validate(); err == nil {
219 t.Errorf("Expected vt.lt error for Byte0")
220 } else if errors.As(err, &ve) {
221 if ve.Check() != "vt.lt" {
222 t.Errorf("Expected vt.lt check error, but got %v", ve.Check())
223 }
224 if ve.Field() != "Byte0" {
225 t.Errorf("Expected error for Byte0, but got %v", ve.Field())
226 }
227 } else {
228 t.Errorf("Error cannot be unwrapped into *ValidationError: %v", err)
229 }
230 frt = validatetest.NewFieldReferenceTest()
231 frt.Double4 = 9
232 if err := frt.Validate(); err == nil {
233 t.Errorf("Expected vt.lt error for Double0")
234 } else if errors.As(err, &ve) {
235 if ve.Check() != "vt.lt" {
236 t.Errorf("Expected vt.lt check error, but got %v", ve.Check())
237 }
238 if ve.Field() != "Double0" {
239 t.Errorf("Expected error for Double0, but got %v", ve.Field())
240 }
241 } else {
242 t.Errorf("Error cannot be unwrapped into *ValidationError: %v", err)
243 }
244 frt = validatetest.NewFieldReferenceTest()
245 frt.String2 = "other string"
246 if err := frt.Validate(); err == nil {
247 t.Errorf("Expected vt.const error for String0")
248 } else if errors.As(err, &ve) {
249 if ve.Check() != "vt.const" {
250 t.Errorf("Expected vt.const check error, but got %v", ve.Check())
251 }
252 if ve.Field() != "String0" {
253 t.Errorf("Expected error for String0, but got %v", ve.Field())
254 }
255 } else {
256 t.Errorf("Error cannot be unwrapped into *ValidationError: %v", err)
257 }
258 frt = validatetest.NewFieldReferenceTest()
259 frt.Binary2 = []byte("other string")
260 if err := frt.Validate(); err == nil {
261 t.Errorf("Expected vt.const error for Binary0")
262 } else if errors.As(err, &ve) {
263 if ve.Check() != "vt.const" {
264 t.Errorf("Expected vt.const check error, but got %v", ve.Check())
265 }
266 if ve.Field() != "Binary0" {
267 t.Errorf("Expected error for Binary0, but got %v", ve.Field())
268 }
269 } else {
270 t.Errorf("Error cannot be unwrapped into *ValidationError: %v", err)
271 }
272 frt = validatetest.NewFieldReferenceTest()
273 frt.MaxSize = 8
274 frt.Map0 = make(map[string]string)
275 for i := 0; i < 9; i++ {
276 frt.Map0[strconv.Itoa(i)] = strconv.Itoa(i)
277 }
278 if err := frt.Validate(); err == nil {
279 t.Errorf("Expected vt.max_size error for Map0")
280 } else if errors.As(err, &ve) {
281 if ve.Check() != "vt.max_size" {
282 t.Errorf("Expected vt.max_size check error, but got %v", ve.Check())
283 }
284 if ve.Field() != "Map0" {
285 t.Errorf("Expected error for Map0, but got %v", ve.Field())
286 }
287 } else {
288 t.Errorf("Error cannot be unwrapped into *ValidationError: %v", err)
289 }
290 frt = validatetest.NewFieldReferenceTest()
291 frt.MaxSize = 8
292 for i := 0; i < 9; i++ {
293 frt.List0 = append(frt.List0, "0")
294 }
295 if err := frt.Validate(); err == nil {
296 t.Errorf("Expected vt.max_size error for List0")
297 } else if errors.As(err, &ve) {
298 if ve.Check() != "vt.max_size" {
299 t.Errorf("Expected vt.max_size check error, but got %v", ve.Check())
300 }
301 if ve.Field() != "List0" {
302 t.Errorf("Expected error for List0, but got %v", ve.Field())
303 }
304 } else {
305 t.Errorf("Error cannot be unwrapped into *ValidationError: %v", err)
306 }
307 frt = validatetest.NewFieldReferenceTest()
308 frt.MaxSize = 8
309 for i := 0; i < 9; i++ {
310 frt.Set0 = append(frt.Set0, "0")
311 }
312 if err := frt.Validate(); err == nil {
313 t.Errorf("Expected vt.max_size error for Set0")
314 } else if errors.As(err, &ve) {
315 if ve.Check() != "vt.max_size" {
316 t.Errorf("Expected vt.max_size check error, but got %v", ve.Check())
317 }
318 if ve.Field() != "Set0" {
319 t.Errorf("Expected error for Set0, but got %v", ve.Field())
320 }
321 } else {
322 t.Errorf("Error cannot be unwrapped into *ValidationError: %v", err)
323 }
324}
325
326func TestValidationFunction(t *testing.T) {
327 vft := validatetest.NewValidationFunctionTest()
328 if err := vft.Validate(); err != nil {
329 t.Error(err)
330 }
331 var ve *thrift.ValidationError
332 vft = validatetest.NewValidationFunctionTest()
333 vft.StringFoo = "some string"
334 if err := vft.Validate(); err == nil {
335 t.Errorf("Expected vt.in error for StringLength")
336 } else if errors.As(err, &ve) {
337 if ve.Check() != "vt.in" {
338 t.Errorf("Expected vt.in check error, but got %v", ve.Check())
339 }
340 if ve.Field() != "StringLength" {
341 t.Errorf("Expected error for StringLength, but got %v", ve.Field())
342 }
343 } else {
344 t.Errorf("Error cannot be unwrapped into *ValidationError: %v", err)
345 }
346}
347
348func TestAnnotationCompatibleTest(t *testing.T) {
349 act := validatetest.NewAnnotationCompatibleTest()
350 if err := act.Validate(); err != nil {
351 t.Error(err)
352 }
353 var ve *thrift.ValidationError
354 act = validatetest.NewAnnotationCompatibleTest()
355 act.Bool0 = false
356 if err := act.Validate(); err == nil {
357 t.Errorf("Expected vt.const error for Bool0")
358 } else if errors.As(err, &ve) {
359 if ve.Check() != "vt.const" {
360 t.Errorf("Expected vt.const check error, but got %v", ve.Check())
361 }
362 if ve.Field() != "Bool0" {
363 t.Errorf("Expected error for Bool0, but got %v", ve.Field())
364 }
365 } else {
366 t.Errorf("Error cannot be unwrapped into *ValidationError: %v", err)
367 }
368 act = validatetest.NewAnnotationCompatibleTest()
369 act.Byte0 = 3
370 if err := act.Validate(); err == nil {
371 t.Errorf("Expected vt.lt error for Byte0")
372 } else if errors.As(err, &ve) {
373 if ve.Check() != "vt.lt" {
374 t.Errorf("Expected vt.lt check error, but got %v", ve.Check())
375 }
376 if ve.Field() != "Byte0" {
377 t.Errorf("Expected error for Byte0, but got %v", ve.Field())
378 }
379 } else {
380 t.Errorf("Error cannot be unwrapped into *ValidationError: %v", err)
381 }
382 act = validatetest.NewAnnotationCompatibleTest()
383 act.Double0 = 3
384 if err := act.Validate(); err == nil {
385 t.Errorf("Expected vt.lt error for Double0")
386 } else if errors.As(err, &ve) {
387 if ve.Check() != "vt.lt" {
388 t.Errorf("Expected vt.lt check error, but got %v", ve.Check())
389 }
390 if ve.Field() != "Double0" {
391 t.Errorf("Expected error for Double0, but got %v", ve.Field())
392 }
393 } else {
394 t.Errorf("Error cannot be unwrapped into *ValidationError: %v", err)
395 }
396 act = validatetest.NewAnnotationCompatibleTest()
397 act.String0 = "other string"
398 if err := act.Validate(); err == nil {
399 t.Errorf("Expected vt.const error for String0")
400 } else if errors.As(err, &ve) {
401 if ve.Check() != "vt.const" {
402 t.Errorf("Expected vt.const check error, but got %v", ve.Check())
403 }
404 if ve.Field() != "String0" {
405 t.Errorf("Expected error for String0, but got %v", ve.Field())
406 }
407 } else {
408 t.Errorf("Error cannot be unwrapped into *ValidationError: %v", err)
409 }
410 act = validatetest.NewAnnotationCompatibleTest()
411 act.Binary0 = []byte("other string")
412 if err := act.Validate(); err == nil {
413 t.Errorf("Expected vt.const error for Binary0")
414 } else if errors.As(err, &ve) {
415 if ve.Check() != "vt.const" {
416 t.Errorf("Expected vt.const check error, but got %v", ve.Check())
417 }
418 if ve.Field() != "Binary0" {
419 t.Errorf("Expected error for Binary0, but got %v", ve.Field())
420 }
421 } else {
422 t.Errorf("Error cannot be unwrapped into *ValidationError: %v", err)
423 }
424 act = validatetest.NewAnnotationCompatibleTest()
425 act.Map0 = map[string]string{"0": "0", "1": "1", "2": "2"}
426 if err := act.Validate(); err == nil {
427 t.Errorf("Expected vt.max_size error for Map0")
428 } else if errors.As(err, &ve) {
429 if ve.Check() != "vt.max_size" {
430 t.Errorf("Expected vt.max_size check error, but got %v", ve.Check())
431 }
432 if ve.Field() != "Map0" {
433 t.Errorf("Expected error for Map0, but got %v", ve.Field())
434 }
435 } else {
436 t.Errorf("Error cannot be unwrapped into *ValidationError: %v", err)
437 }
438 act = validatetest.NewAnnotationCompatibleTest()
439 act.Set0 = []string{"0", "1", "2"}
440 if err := act.Validate(); err == nil {
441 t.Errorf("Expected vt.max_size error for Set0")
442 } else if errors.As(err, &ve) {
443 if ve.Check() != "vt.max_size" {
444 t.Errorf("Expected vt.max_size check error, but got %v", ve.Check())
445 }
446 if ve.Field() != "Set0" {
447 t.Errorf("Expected error for Set0, but got %v", ve.Field())
448 }
449 } else {
450 t.Errorf("Error cannot be unwrapped into *ValidationError: %v", err)
451 }
452 act = validatetest.NewAnnotationCompatibleTest()
453 act.List0 = []string{"0", "1", "2"}
454 if err := act.Validate(); err == nil {
455 t.Errorf("Expected vt.max_size error for List0")
456 } else if errors.As(err, &ve) {
457 if ve.Check() != "vt.max_size" {
458 t.Errorf("Expected vt.max_size check error, but got %v", ve.Check())
459 }
460 if ve.Field() != "List0" {
461 t.Errorf("Expected error for List0, but got %v", ve.Field())
462 }
463 } else {
464 t.Errorf("Error cannot be unwrapped into *ValidationError: %v", err)
465 }
466 act = validatetest.NewAnnotationCompatibleTest()
467 act.Enum0 = validatetest.EnumFoo_e1
468 if err := act.Validate(); err == nil {
469 t.Errorf("Expected vt.in error for Enum0")
470 } else if errors.As(err, &ve) {
471 if ve.Check() != "vt.in" {
472 t.Errorf("Expected vt.in check error, but got %v", ve.Check())
473 }
474 if ve.Field() != "Enum0" {
475 t.Errorf("Expected error for Enum0, but got %v", ve.Field())
476 }
477 } else {
478 t.Errorf("Error cannot be unwrapped into *ValidationError: %v", err)
479 }
480 fields := []string{"bool1", "byte1", "double1", "string1", "binary1", "enum1", "struct1", "list1", "set1", "map1"}
481 b, err := json.Marshal(act)
482 if err != nil {
483 t.Error(err)
484 }
485 jsonMap := make(map[string]interface{})
486 if err = json.Unmarshal(b, &jsonMap); err != nil {
487 t.Error(err)
488 }
489 for _, field := range fields {
490 if _, ok := jsonMap[field]; !ok {
491 t.Errorf("Expected field %s in JSON, but not found", field)
492 }
493 }
494}