5849898283
Unit tests functional and coverage back to 100% Add more routes to dictionary, add more credentials, add default port 5554, rename cameradar logs ENV variable, improve unit test readability, remove tmp file
1211 lines
20 KiB
Go
1211 lines
20 KiB
Go
package validator
|
|
|
|
import (
|
|
"bytes"
|
|
sql "database/sql/driver"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func BenchmarkFieldSuccess(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
s := "1"
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
validate.Var(&s, "len=1")
|
|
}
|
|
}
|
|
|
|
func BenchmarkFieldSuccessParallel(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
s := "1"
|
|
|
|
b.ResetTimer()
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
validate.Var(&s, "len=1")
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkFieldFailure(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
s := "12"
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
validate.Var(&s, "len=1")
|
|
}
|
|
}
|
|
|
|
func BenchmarkFieldFailureParallel(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
s := "12"
|
|
|
|
b.ResetTimer()
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
validate.Var(&s, "len=1")
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkFieldArrayDiveSuccess(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
m := []string{"val1", "val2", "val3"}
|
|
|
|
b.ResetTimer()
|
|
|
|
for n := 0; n < b.N; n++ {
|
|
validate.Var(m, "required,dive,required")
|
|
}
|
|
}
|
|
|
|
func BenchmarkFieldArrayDiveSuccessParallel(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
m := []string{"val1", "val2", "val3"}
|
|
|
|
b.ResetTimer()
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
validate.Var(m, "required,dive,required")
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkFieldArrayDiveFailure(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
m := []string{"val1", "", "val3"}
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
validate.Var(m, "required,dive,required")
|
|
}
|
|
}
|
|
|
|
func BenchmarkFieldArrayDiveFailureParallel(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
m := []string{"val1", "", "val3"}
|
|
|
|
b.ResetTimer()
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
validate.Var(m, "required,dive,required")
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkFieldMapDiveSuccess(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
m := map[string]string{"val1": "val1", "val2": "val2", "val3": "val3"}
|
|
|
|
b.ResetTimer()
|
|
|
|
for n := 0; n < b.N; n++ {
|
|
validate.Var(m, "required,dive,required")
|
|
}
|
|
}
|
|
|
|
func BenchmarkFieldMapDiveSuccessParallel(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
m := map[string]string{"val1": "val1", "val2": "val2", "val3": "val3"}
|
|
|
|
b.ResetTimer()
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
validate.Var(m, "required,dive,required")
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkFieldMapDiveFailure(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
m := map[string]string{"": "", "val3": "val3"}
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
validate.Var(m, "required,dive,required")
|
|
}
|
|
}
|
|
|
|
func BenchmarkFieldMapDiveFailureParallel(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
m := map[string]string{"": "", "val3": "val3"}
|
|
|
|
b.ResetTimer()
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
validate.Var(m, "required,dive,required")
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkFieldMapDiveWithKeysSuccess(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
m := map[string]string{"val1": "val1", "val2": "val2", "val3": "val3"}
|
|
|
|
b.ResetTimer()
|
|
|
|
for n := 0; n < b.N; n++ {
|
|
validate.Var(m, "required,dive,keys,required,endkeys,required")
|
|
}
|
|
}
|
|
|
|
func BenchmarkFieldMapDiveWithKeysSuccessParallel(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
m := map[string]string{"val1": "val1", "val2": "val2", "val3": "val3"}
|
|
|
|
b.ResetTimer()
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
validate.Var(m, "required,dive,keys,required,endkeys,required")
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkFieldMapDiveWithKeysFailure(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
m := map[string]string{"": "", "val3": "val3"}
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
validate.Var(m, "required,dive,keys,required,endkeys,required")
|
|
}
|
|
}
|
|
|
|
func BenchmarkFieldMapDiveWithKeysFailureParallel(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
m := map[string]string{"": "", "val3": "val3"}
|
|
|
|
b.ResetTimer()
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
validate.Var(m, "required,dive,keys,required,endkeys,required")
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkFieldCustomTypeSuccess(b *testing.B) {
|
|
|
|
validate := New()
|
|
validate.RegisterCustomTypeFunc(ValidateValuerType, (*sql.Valuer)(nil), valuer{})
|
|
|
|
val := valuer{
|
|
Name: "1",
|
|
}
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
validate.Var(val, "len=1")
|
|
}
|
|
}
|
|
|
|
func BenchmarkFieldCustomTypeSuccessParallel(b *testing.B) {
|
|
|
|
validate := New()
|
|
validate.RegisterCustomTypeFunc(ValidateValuerType, (*sql.Valuer)(nil), valuer{})
|
|
|
|
val := valuer{
|
|
Name: "1",
|
|
}
|
|
|
|
b.ResetTimer()
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
validate.Var(val, "len=1")
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkFieldCustomTypeFailure(b *testing.B) {
|
|
|
|
validate := New()
|
|
validate.RegisterCustomTypeFunc(ValidateValuerType, (*sql.Valuer)(nil), valuer{})
|
|
|
|
val := valuer{}
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
validate.Var(val, "len=1")
|
|
}
|
|
}
|
|
|
|
func BenchmarkFieldCustomTypeFailureParallel(b *testing.B) {
|
|
|
|
validate := New()
|
|
validate.RegisterCustomTypeFunc(ValidateValuerType, (*sql.Valuer)(nil), valuer{})
|
|
|
|
val := valuer{}
|
|
|
|
b.ResetTimer()
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
validate.Var(val, "len=1")
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkFieldOrTagSuccess(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
s := "rgba(0,0,0,1)"
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
validate.Var(s, "rgb|rgba")
|
|
}
|
|
}
|
|
|
|
func BenchmarkFieldOrTagSuccessParallel(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
s := "rgba(0,0,0,1)"
|
|
|
|
b.ResetTimer()
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
validate.Var(s, "rgb|rgba")
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkFieldOrTagFailure(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
s := "#000"
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
validate.Var(s, "rgb|rgba")
|
|
}
|
|
}
|
|
|
|
func BenchmarkFieldOrTagFailureParallel(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
s := "#000"
|
|
|
|
b.ResetTimer()
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
validate.Var(s, "rgb|rgba")
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkStructLevelValidationSuccess(b *testing.B) {
|
|
|
|
validate := New()
|
|
validate.RegisterStructValidation(StructValidationTestStructSuccess, TestStruct{})
|
|
|
|
tst := TestStruct{
|
|
String: "good value",
|
|
}
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
validate.Struct(tst)
|
|
}
|
|
}
|
|
|
|
func BenchmarkStructLevelValidationSuccessParallel(b *testing.B) {
|
|
|
|
validate := New()
|
|
validate.RegisterStructValidation(StructValidationTestStructSuccess, TestStruct{})
|
|
|
|
tst := TestStruct{
|
|
String: "good value",
|
|
}
|
|
|
|
b.ResetTimer()
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
validate.Struct(tst)
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkStructLevelValidationFailure(b *testing.B) {
|
|
|
|
validate := New()
|
|
validate.RegisterStructValidation(StructValidationTestStruct, TestStruct{})
|
|
|
|
tst := TestStruct{
|
|
String: "good value",
|
|
}
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
validate.Struct(tst)
|
|
}
|
|
}
|
|
|
|
func BenchmarkStructLevelValidationFailureParallel(b *testing.B) {
|
|
|
|
validate := New()
|
|
validate.RegisterStructValidation(StructValidationTestStruct, TestStruct{})
|
|
|
|
tst := TestStruct{
|
|
String: "good value",
|
|
}
|
|
|
|
b.ResetTimer()
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
validate.Struct(tst)
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkStructSimpleCustomTypeSuccess(b *testing.B) {
|
|
|
|
validate := New()
|
|
validate.RegisterCustomTypeFunc(ValidateValuerType, (*sql.Valuer)(nil), valuer{})
|
|
|
|
val := valuer{
|
|
Name: "1",
|
|
}
|
|
|
|
type Foo struct {
|
|
Valuer valuer `validate:"len=1"`
|
|
IntValue int `validate:"min=5,max=10"`
|
|
}
|
|
|
|
validFoo := &Foo{Valuer: val, IntValue: 7}
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
validate.Struct(validFoo)
|
|
}
|
|
}
|
|
|
|
func BenchmarkStructSimpleCustomTypeSuccessParallel(b *testing.B) {
|
|
|
|
validate := New()
|
|
validate.RegisterCustomTypeFunc(ValidateValuerType, (*sql.Valuer)(nil), valuer{})
|
|
|
|
val := valuer{
|
|
Name: "1",
|
|
}
|
|
|
|
type Foo struct {
|
|
Valuer valuer `validate:"len=1"`
|
|
IntValue int `validate:"min=5,max=10"`
|
|
}
|
|
|
|
validFoo := &Foo{Valuer: val, IntValue: 7}
|
|
|
|
b.ResetTimer()
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
validate.Struct(validFoo)
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkStructSimpleCustomTypeFailure(b *testing.B) {
|
|
|
|
validate := New()
|
|
validate.RegisterCustomTypeFunc(ValidateValuerType, (*sql.Valuer)(nil), valuer{})
|
|
|
|
val := valuer{}
|
|
|
|
type Foo struct {
|
|
Valuer valuer `validate:"len=1"`
|
|
IntValue int `validate:"min=5,max=10"`
|
|
}
|
|
|
|
validFoo := &Foo{Valuer: val, IntValue: 3}
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
validate.Struct(validFoo)
|
|
}
|
|
}
|
|
|
|
func BenchmarkStructSimpleCustomTypeFailureParallel(b *testing.B) {
|
|
|
|
validate := New()
|
|
validate.RegisterCustomTypeFunc(ValidateValuerType, (*sql.Valuer)(nil), valuer{})
|
|
|
|
val := valuer{}
|
|
|
|
type Foo struct {
|
|
Valuer valuer `validate:"len=1"`
|
|
IntValue int `validate:"min=5,max=10"`
|
|
}
|
|
|
|
validFoo := &Foo{Valuer: val, IntValue: 3}
|
|
|
|
b.ResetTimer()
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
validate.Struct(validate.Struct(validFoo))
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkStructFilteredSuccess(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
type Test struct {
|
|
Name string `validate:"required"`
|
|
NickName string `validate:"required"`
|
|
}
|
|
|
|
test := &Test{
|
|
Name: "Joey Bloggs",
|
|
}
|
|
|
|
byts := []byte("Name")
|
|
|
|
fn := func(ns []byte) bool {
|
|
return !bytes.HasSuffix(ns, byts)
|
|
}
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
validate.StructFiltered(test, fn)
|
|
}
|
|
}
|
|
|
|
func BenchmarkStructFilteredSuccessParallel(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
type Test struct {
|
|
Name string `validate:"required"`
|
|
NickName string `validate:"required"`
|
|
}
|
|
|
|
test := &Test{
|
|
Name: "Joey Bloggs",
|
|
}
|
|
|
|
byts := []byte("Name")
|
|
|
|
fn := func(ns []byte) bool {
|
|
return !bytes.HasSuffix(ns, byts)
|
|
}
|
|
|
|
b.ResetTimer()
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
validate.StructFiltered(test, fn)
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkStructFilteredFailure(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
type Test struct {
|
|
Name string `validate:"required"`
|
|
NickName string `validate:"required"`
|
|
}
|
|
|
|
test := &Test{
|
|
Name: "Joey Bloggs",
|
|
}
|
|
|
|
byts := []byte("NickName")
|
|
|
|
fn := func(ns []byte) bool {
|
|
return !bytes.HasSuffix(ns, byts)
|
|
}
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
validate.StructFiltered(test, fn)
|
|
}
|
|
}
|
|
|
|
func BenchmarkStructFilteredFailureParallel(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
type Test struct {
|
|
Name string `validate:"required"`
|
|
NickName string `validate:"required"`
|
|
}
|
|
|
|
test := &Test{
|
|
Name: "Joey Bloggs",
|
|
}
|
|
|
|
byts := []byte("NickName")
|
|
|
|
fn := func(ns []byte) bool {
|
|
return !bytes.HasSuffix(ns, byts)
|
|
}
|
|
|
|
b.ResetTimer()
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
validate.StructFiltered(test, fn)
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkStructPartialSuccess(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
type Test struct {
|
|
Name string `validate:"required"`
|
|
NickName string `validate:"required"`
|
|
}
|
|
|
|
test := &Test{
|
|
Name: "Joey Bloggs",
|
|
}
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
validate.StructPartial(test, "Name")
|
|
}
|
|
}
|
|
|
|
func BenchmarkStructPartialSuccessParallel(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
type Test struct {
|
|
Name string `validate:"required"`
|
|
NickName string `validate:"required"`
|
|
}
|
|
|
|
test := &Test{
|
|
Name: "Joey Bloggs",
|
|
}
|
|
|
|
b.ResetTimer()
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
validate.StructPartial(test, "Name")
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkStructPartialFailure(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
type Test struct {
|
|
Name string `validate:"required"`
|
|
NickName string `validate:"required"`
|
|
}
|
|
|
|
test := &Test{
|
|
Name: "Joey Bloggs",
|
|
}
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
validate.StructPartial(test, "NickName")
|
|
}
|
|
}
|
|
|
|
func BenchmarkStructPartialFailureParallel(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
type Test struct {
|
|
Name string `validate:"required"`
|
|
NickName string `validate:"required"`
|
|
}
|
|
|
|
test := &Test{
|
|
Name: "Joey Bloggs",
|
|
}
|
|
|
|
b.ResetTimer()
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
validate.StructPartial(test, "NickName")
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkStructExceptSuccess(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
type Test struct {
|
|
Name string `validate:"required"`
|
|
NickName string `validate:"required"`
|
|
}
|
|
|
|
test := &Test{
|
|
Name: "Joey Bloggs",
|
|
}
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
validate.StructExcept(test, "Nickname")
|
|
}
|
|
}
|
|
|
|
func BenchmarkStructExceptSuccessParallel(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
type Test struct {
|
|
Name string `validate:"required"`
|
|
NickName string `validate:"required"`
|
|
}
|
|
|
|
test := &Test{
|
|
Name: "Joey Bloggs",
|
|
}
|
|
|
|
b.ResetTimer()
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
validate.StructExcept(test, "NickName")
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkStructExceptFailure(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
type Test struct {
|
|
Name string `validate:"required"`
|
|
NickName string `validate:"required"`
|
|
}
|
|
|
|
test := &Test{
|
|
Name: "Joey Bloggs",
|
|
}
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
validate.StructExcept(test, "Name")
|
|
}
|
|
}
|
|
|
|
func BenchmarkStructExceptFailureParallel(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
type Test struct {
|
|
Name string `validate:"required"`
|
|
NickName string `validate:"required"`
|
|
}
|
|
|
|
test := &Test{
|
|
Name: "Joey Bloggs",
|
|
}
|
|
|
|
b.ResetTimer()
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
validate.StructExcept(test, "Name")
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkStructSimpleCrossFieldSuccess(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
type Test struct {
|
|
Start time.Time
|
|
End time.Time `validate:"gtfield=Start"`
|
|
}
|
|
|
|
now := time.Now().UTC()
|
|
then := now.Add(time.Hour * 5)
|
|
|
|
test := &Test{
|
|
Start: now,
|
|
End: then,
|
|
}
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
validate.Struct(test)
|
|
}
|
|
}
|
|
|
|
func BenchmarkStructSimpleCrossFieldSuccessParallel(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
type Test struct {
|
|
Start time.Time
|
|
End time.Time `validate:"gtfield=Start"`
|
|
}
|
|
|
|
now := time.Now().UTC()
|
|
then := now.Add(time.Hour * 5)
|
|
|
|
test := &Test{
|
|
Start: now,
|
|
End: then,
|
|
}
|
|
|
|
b.ResetTimer()
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
validate.Struct(test)
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkStructSimpleCrossFieldFailure(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
type Test struct {
|
|
Start time.Time
|
|
End time.Time `validate:"gtfield=Start"`
|
|
}
|
|
|
|
now := time.Now().UTC()
|
|
then := now.Add(time.Hour * -5)
|
|
|
|
test := &Test{
|
|
Start: now,
|
|
End: then,
|
|
}
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
validate.Struct(test)
|
|
}
|
|
}
|
|
|
|
func BenchmarkStructSimpleCrossFieldFailureParallel(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
type Test struct {
|
|
Start time.Time
|
|
End time.Time `validate:"gtfield=Start"`
|
|
}
|
|
|
|
now := time.Now().UTC()
|
|
then := now.Add(time.Hour * -5)
|
|
|
|
test := &Test{
|
|
Start: now,
|
|
End: then,
|
|
}
|
|
b.ResetTimer()
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
validate.Struct(test)
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkStructSimpleCrossStructCrossFieldSuccess(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
type Inner struct {
|
|
Start time.Time
|
|
}
|
|
|
|
type Outer struct {
|
|
Inner *Inner
|
|
CreatedAt time.Time `validate:"eqcsfield=Inner.Start"`
|
|
}
|
|
|
|
now := time.Now().UTC()
|
|
|
|
inner := &Inner{
|
|
Start: now,
|
|
}
|
|
|
|
outer := &Outer{
|
|
Inner: inner,
|
|
CreatedAt: now,
|
|
}
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
validate.Struct(outer)
|
|
}
|
|
}
|
|
|
|
func BenchmarkStructSimpleCrossStructCrossFieldSuccessParallel(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
type Inner struct {
|
|
Start time.Time
|
|
}
|
|
|
|
type Outer struct {
|
|
Inner *Inner
|
|
CreatedAt time.Time `validate:"eqcsfield=Inner.Start"`
|
|
}
|
|
|
|
now := time.Now().UTC()
|
|
|
|
inner := &Inner{
|
|
Start: now,
|
|
}
|
|
|
|
outer := &Outer{
|
|
Inner: inner,
|
|
CreatedAt: now,
|
|
}
|
|
|
|
b.ResetTimer()
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
validate.Struct(outer)
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkStructSimpleCrossStructCrossFieldFailure(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
type Inner struct {
|
|
Start time.Time
|
|
}
|
|
|
|
type Outer struct {
|
|
Inner *Inner
|
|
CreatedAt time.Time `validate:"eqcsfield=Inner.Start"`
|
|
}
|
|
|
|
now := time.Now().UTC()
|
|
then := now.Add(time.Hour * 5)
|
|
|
|
inner := &Inner{
|
|
Start: then,
|
|
}
|
|
|
|
outer := &Outer{
|
|
Inner: inner,
|
|
CreatedAt: now,
|
|
}
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
validate.Struct(outer)
|
|
}
|
|
}
|
|
|
|
func BenchmarkStructSimpleCrossStructCrossFieldFailureParallel(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
type Inner struct {
|
|
Start time.Time
|
|
}
|
|
|
|
type Outer struct {
|
|
Inner *Inner
|
|
CreatedAt time.Time `validate:"eqcsfield=Inner.Start"`
|
|
}
|
|
|
|
now := time.Now().UTC()
|
|
then := now.Add(time.Hour * 5)
|
|
|
|
inner := &Inner{
|
|
Start: then,
|
|
}
|
|
|
|
outer := &Outer{
|
|
Inner: inner,
|
|
CreatedAt: now,
|
|
}
|
|
|
|
b.ResetTimer()
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
validate.Struct(outer)
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkStructSimpleSuccess(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
type Foo struct {
|
|
StringValue string `validate:"min=5,max=10"`
|
|
IntValue int `validate:"min=5,max=10"`
|
|
}
|
|
|
|
validFoo := &Foo{StringValue: "Foobar", IntValue: 7}
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
validate.Struct(validFoo)
|
|
}
|
|
}
|
|
|
|
func BenchmarkStructSimpleSuccessParallel(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
type Foo struct {
|
|
StringValue string `validate:"min=5,max=10"`
|
|
IntValue int `validate:"min=5,max=10"`
|
|
}
|
|
|
|
validFoo := &Foo{StringValue: "Foobar", IntValue: 7}
|
|
|
|
b.ResetTimer()
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
validate.Struct(validFoo)
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkStructSimpleFailure(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
type Foo struct {
|
|
StringValue string `validate:"min=5,max=10"`
|
|
IntValue int `validate:"min=5,max=10"`
|
|
}
|
|
|
|
invalidFoo := &Foo{StringValue: "Fo", IntValue: 3}
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
validate.Struct(invalidFoo)
|
|
}
|
|
}
|
|
|
|
func BenchmarkStructSimpleFailureParallel(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
type Foo struct {
|
|
StringValue string `validate:"min=5,max=10"`
|
|
IntValue int `validate:"min=5,max=10"`
|
|
}
|
|
|
|
invalidFoo := &Foo{StringValue: "Fo", IntValue: 3}
|
|
|
|
b.ResetTimer()
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
validate.Struct(invalidFoo)
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkStructComplexSuccess(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
tSuccess := &TestString{
|
|
Required: "Required",
|
|
Len: "length==10",
|
|
Min: "min=1",
|
|
Max: "1234567890",
|
|
MinMax: "12345",
|
|
Lt: "012345678",
|
|
Lte: "0123456789",
|
|
Gt: "01234567890",
|
|
Gte: "0123456789",
|
|
OmitEmpty: "",
|
|
Sub: &SubTest{
|
|
Test: "1",
|
|
},
|
|
SubIgnore: &SubTest{
|
|
Test: "",
|
|
},
|
|
Anonymous: struct {
|
|
A string `validate:"required"`
|
|
}{
|
|
A: "1",
|
|
},
|
|
Iface: &Impl{
|
|
F: "123",
|
|
},
|
|
}
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
validate.Struct(tSuccess)
|
|
}
|
|
}
|
|
|
|
func BenchmarkStructComplexSuccessParallel(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
tSuccess := &TestString{
|
|
Required: "Required",
|
|
Len: "length==10",
|
|
Min: "min=1",
|
|
Max: "1234567890",
|
|
MinMax: "12345",
|
|
Lt: "012345678",
|
|
Lte: "0123456789",
|
|
Gt: "01234567890",
|
|
Gte: "0123456789",
|
|
OmitEmpty: "",
|
|
Sub: &SubTest{
|
|
Test: "1",
|
|
},
|
|
SubIgnore: &SubTest{
|
|
Test: "",
|
|
},
|
|
Anonymous: struct {
|
|
A string `validate:"required"`
|
|
}{
|
|
A: "1",
|
|
},
|
|
Iface: &Impl{
|
|
F: "123",
|
|
},
|
|
}
|
|
|
|
b.ResetTimer()
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
validate.Struct(tSuccess)
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkStructComplexFailure(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
tFail := &TestString{
|
|
Required: "",
|
|
Len: "",
|
|
Min: "",
|
|
Max: "12345678901",
|
|
MinMax: "",
|
|
Lt: "0123456789",
|
|
Lte: "01234567890",
|
|
Gt: "1",
|
|
Gte: "1",
|
|
OmitEmpty: "12345678901",
|
|
Sub: &SubTest{
|
|
Test: "",
|
|
},
|
|
Anonymous: struct {
|
|
A string `validate:"required"`
|
|
}{
|
|
A: "",
|
|
},
|
|
Iface: &Impl{
|
|
F: "12",
|
|
},
|
|
}
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
validate.Struct(tFail)
|
|
}
|
|
}
|
|
|
|
func BenchmarkStructComplexFailureParallel(b *testing.B) {
|
|
|
|
validate := New()
|
|
|
|
tFail := &TestString{
|
|
Required: "",
|
|
Len: "",
|
|
Min: "",
|
|
Max: "12345678901",
|
|
MinMax: "",
|
|
Lt: "0123456789",
|
|
Lte: "01234567890",
|
|
Gt: "1",
|
|
Gte: "1",
|
|
OmitEmpty: "12345678901",
|
|
Sub: &SubTest{
|
|
Test: "",
|
|
},
|
|
Anonymous: struct {
|
|
A string `validate:"required"`
|
|
}{
|
|
A: "",
|
|
},
|
|
Iface: &Impl{
|
|
F: "12",
|
|
},
|
|
}
|
|
|
|
b.ResetTimer()
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
validate.Struct(tFail)
|
|
}
|
|
})
|
|
}
|
|
|
|
type TestOneof struct {
|
|
Color string `validate:"oneof=red green"`
|
|
}
|
|
|
|
func BenchmarkOneof(b *testing.B) {
|
|
w := &TestOneof{Color: "green"}
|
|
val := New()
|
|
for i := 0; i < b.N; i++ {
|
|
val.Struct(w)
|
|
}
|
|
}
|
|
|
|
func BenchmarkOneofParallel(b *testing.B) {
|
|
w := &TestOneof{Color: "green"}
|
|
val := New()
|
|
|
|
b.ResetTimer()
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
val.Struct(w)
|
|
}
|
|
})
|
|
}
|