func TestFlowTable_jsonFlowConversationEthernetPath(t *testing.T) { ft := flow.NewTestFlowTableComplex(t, nil, nil) fa := &FlowApi{ FlowTable: ft, } statStr := fa.jsonFlowConversationEthernetPath(flow.FlowProtocol_ETHERNET) if statStr == `{"nodes":[],"links":[]}` { t.Error("stat should not be empty") } var decoded interface{} if err := json.Unmarshal([]byte(statStr), &decoded); err != nil { t.Error("JSON parsing failed:", err) } schema := v.Object( v.ObjKV("nodes", v.Array(v.ArrEach(v.Object( v.ObjKV("name", v.String(v.StrMin(1))), v.ObjKV("group", v.Number(v.NumMin(0), v.NumMax(20))), )))), v.ObjKV("links", v.Array(v.ArrEach(v.Object( v.ObjKV("source", v.Number(v.NumMin(0), v.NumMax(20))), v.ObjKV("target", v.Number(v.NumMin(0), v.NumMax(20))), v.ObjKV("value", v.Number(v.NumMin(0), v.NumMax(9999))), )))), ) if path, err := schema.Validate(decoded); err != nil { t.Errorf("Failed (%s). Path: %s", err, path) } }
func TestString(t *testing.T) { var np *string var nnp string = "a" test(t, "non-string", false, v.String(), 3) test(t, "basic string", true, v.String(), "") test(t, "nil", false, v.String(), nil) test(t, "nil string pointer", false, v.String(), np) test(t, "string pointer", true, v.String(), &nnp) test(t, "equals", true, v.String(v.StrIs("abc")), "abc") test(t, "!equals", false, v.String(v.StrIs("abc")), "abd") test(t, "minlen1", false, v.String(v.StrMin(3)), "aa") test(t, "minlen2", true, v.String(v.StrMin(3)), "aaa") test(t, "minlen3", true, v.String(v.StrMin(3)), "aaaa") test(t, "maxlen1", true, v.String(v.StrMax(4)), "aaa") test(t, "maxlen2", true, v.String(v.StrMax(4)), "aaaa") test(t, "maxlen3", false, v.String(v.StrMax(4)), "aaaaa") test(t, "regexp1", true, v.String(v.StrRegExp("^.{3}$")), "bbb") test(t, "regexp2", false, v.String(v.StrRegExp("^.{3}$")), "bbbb") test(t, "regexp3", false, v.String(v.StrRegExp("[")), "c") test(t, "combination1", false, v.String(v.StrMin(3), v.StrMax(3)), "cc") test(t, "combination2", true, v.String(v.StrMin(3), v.StrMax(3)), "ccc") test(t, "combination1", false, v.String(v.StrMin(3), v.StrMax(3)), "cccc") }
func TestAnd(t *testing.T) { test(t, "combination1", true, v.And(), nil) test(t, "combination2", false, v.And(v.String(v.StrMin(3)), v.String(v.StrMax(3))), "aa") test(t, "combination3", true, v.And(v.String(v.StrMin(3)), v.String(v.StrMax(3))), "aaa") test(t, "combination4", false, v.And(v.String(v.StrMin(3)), v.String(v.StrMax(3))), "aaaa") test(t, "combination5", false, v.And(v.String(v.StrMin(3)), v.String(v.StrMax(4))), "bb") test(t, "combination6", true, v.And(v.String(v.StrMin(3)), v.String(v.StrMax(4))), "bbb") test(t, "combination7", true, v.And(v.String(v.StrMin(3)), v.String(v.StrMax(4))), "bbbb") test(t, "combination8", false, v.And(v.String(v.StrMin(3)), v.String(v.StrMax(4))), "bbbbb") }
func test_jsonFlowDiscovery(t *testing.T, DiscoType discoType) { ft := flow.NewTestFlowTableComplex(t, nil, nil) fa := &FlowApi{ FlowTable: ft, } disco := fa.jsonFlowDiscovery(DiscoType) if disco == `{"name":"root","children":[]}` { t.Error("disco should not be empty") } var decoded interface{} if err := json.Unmarshal([]byte(disco), &decoded); err != nil { t.Error("JSON parsing failed:", err) } schema := v.Object( v.ObjKV("name", v.String(v.StrMin(1))), // root v.ObjKV("children", v.Array(v.ArrEach(v.Object( v.ObjKV("name", v.String(v.StrMin(1))), // Ethernet v.ObjKV("children", v.Array(v.ArrEach(v.Object( v.ObjKV("name", v.String(v.StrMin(1))), // IPv4 v.ObjKV("children", v.Array(v.ArrEach(v.Object( v.ObjKV("name", v.String(v.StrMin(1))), // TCP or UDP v.ObjKV("children", v.Array(v.ArrEach(v.Object( v.ObjKV("name", v.String(v.StrMin(1))), // Payload v.ObjKV("size", v.Number(v.NumMin(0), v.NumMax(9999))), )))), )))), )))), )))), ) if path, err := schema.Validate(decoded); err != nil { t.Errorf("Failed (%s). Path: %s", err, path) } }
func init() { // set up raw json data rawJson := []byte(` { "status": true, "data": { "token": "CAFED00D", "debug": 69306, "items": [ { "url": "https://news.ycombinator.com/", "comment": "clickbaits" }, { "url": "http://golang.org/", "comment": "some darn gophers" }, { "url": "http://www.kickstarter.com/", "comment": "opensource projects. yeah.." } ], "ghost2": null, "meta": { "g": 1, "xyzzy": 0.25, "blöö": 0.5 } } }`) // decode json if err := json.Unmarshal(rawJson, &decoded); err != nil { log.Panic("JSON parsing failed. Err =", err) } // set up a custom validator function myValidatorFunc := func(data interface{}) (path string, err error) { path = "myValidatorFunc" validate, ok := data.(string) if !ok { return path, fmt.Errorf("expected string, got %v", reflect.TypeOf(data)) } if validate != "CAFED00D" { return path, fmt.Errorf("expected CAFED00D, got %s", validate) } return "", nil } // construct the schema which is used to validate data schema = v.Object( v.ObjKV("status", v.Boolean()), v.ObjKV("data", v.Object( v.ObjKV("token", v.Function(myValidatorFunc)), v.ObjKV("debug", v.Number(v.NumMin(1), v.NumMax(99999))), v.ObjKV("items", v.Array(v.ArrEach(v.Object( v.ObjKV("url", v.String(v.StrMin(1))), v.ObjKV("comment", v.Optional(v.String())), )))), v.ObjKV("ghost", v.Optional(v.String())), v.ObjKV("ghost2", v.Optional(v.String())), v.ObjKV("meta", v.Object( v.ObjKeys(v.String()), v.ObjValues(v.Or(v.Number(v.NumMin(.01), v.NumMax(1.1)), v.String())), )), )), ) }