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 (this SimulationView) GetValidationSchema() valid.Validator { return valid.Object( valid.ObjKV("data", valid.Object( valid.ObjKV("pairs", valid.Array(valid.ArrEach(valid.Optional(valid.Object( valid.ObjKV("request", valid.Object( valid.ObjKV("requestType", valid.Optional(valid.String())), valid.ObjKV("path", valid.Optional(valid.String())), valid.ObjKV("method", valid.Optional(valid.String())), valid.ObjKV("scheme", valid.Optional(valid.String())), valid.ObjKV("query", valid.Optional(valid.String())), valid.ObjKV("body", valid.Optional(valid.String())), valid.ObjKV("headers", valid.Optional(valid.Object())), )), valid.ObjKV("response", valid.Object( valid.ObjKV("status", valid.Optional(valid.Number())), valid.ObjKV("body", valid.Optional(valid.String())), valid.ObjKV("encodedBody", valid.Optional(valid.Boolean())), valid.ObjKV("headers", valid.Optional(valid.Object())), )), ))))), valid.ObjKV("globalActions", valid.Optional(valid.Object( valid.ObjKV("delays", valid.Array(valid.ArrEach(valid.Optional(valid.Object( valid.ObjKV("urlPattern", valid.Optional(valid.String())), valid.ObjKV("httpMethod", valid.Optional(valid.String())), valid.ObjKV("delay", valid.Optional(valid.Number())), ))))), ))), )), valid.ObjKV("meta", valid.Object( valid.ObjKV("schemaVersion", valid.String()), )), ) }
func TestArray(t *testing.T) { var np *[]interface{} var nnsp = []interface{}{1, 2, 3} var nnap = [3]interface{}{1, 2, 3} test(t, "basic slice", true, v.Array(), []interface{}{1, 2, 3}) test(t, "nil", false, v.Array(), nil) test(t, "nil slice pointer", false, v.Array(), np) test(t, "slice pointer", true, v.Array(), &nnsp) test(t, "non-array/slice", false, v.Array(), 3) test(t, "basic array ", true, v.Array(), [3]interface{}{1, 2, 3}) test(t, "nil array pointer", true, v.Array(), [3]interface{}{1, 2, 3}) test(t, "array pointer", true, v.Array(), &nnap) test(t, "int slice", true, v.Array(), []int{1, 2, 3}) test(t, "minlen1", false, v.Array(v.ArrMin(3)), []interface{}{1, 2}) test(t, "minlen2", true, v.Array(v.ArrMin(3)), []interface{}{1, 2, 3}) test(t, "minlen3", true, v.Array(v.ArrMin(3)), []interface{}{1, 2, 3, 4}) test(t, "maxlen", true, v.Array(v.ArrMax(3)), []interface{}{1, 2}) test(t, "maxlen2", true, v.Array(v.ArrMax(3)), []interface{}{1, 2, 3}) test(t, "maxlen3", false, v.Array(v.ArrMax(3)), []interface{}{1, 2, 3, 4}) test(t, "combination1", false, v.Array(v.ArrMin(3), v.ArrMax(3)), []interface{}{1, 2}) test(t, "combination2", true, v.Array(v.ArrMin(3), v.ArrMax(3)), []interface{}{1, 2, 3}) test(t, "combination3", false, v.Array(v.ArrMin(3), v.ArrMax(3)), []interface{}{1, 2, 3, 4}) test(t, "each1", true, v.Array(v.ArrEach(v.Number(v.NumMin(3)))), []interface{}{}) test(t, "each2", false, v.Array(v.ArrEach(v.Number(v.NumMin(3)))), []interface{}{2, 3}) test(t, "each3", true, v.Array(v.ArrEach(v.Number(v.NumMin(3)))), []interface{}{3, 4, 5}) }
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) } }
// Validates config structure func validateConfig(configMap map[string]interface{}) error { schema := v.Object(v.ObjKeys(v.String()), v.ObjValues(v.Array(v.ArrEach(v.Object( v.ObjKV("docker", v.Object( v.ObjKV("image", v.String()), v.ObjKV("command", v.String()), v.ObjKV("permissions", v.Optional(v.Object( v.ObjKV("cwd", v.Boolean()), ))), )), )))), ) if path, err := schema.Validate(configMap); err != nil { return fmt.Errorf("Invalid hop definition at %s. Error (%s)", path, err) } return nil }
func TestFlowJSON(t *testing.T) { f := Flow{ UUID: "uuid-1", LayersPath: "layerpath-1", Statistics: &FlowStatistics{ Start: 1111, Last: 222, Endpoints: []*FlowEndpointsStatistics{ { Type: FlowEndpointType_ETHERNET, AB: &FlowEndpointStatistics{ Value: "value-1", Bytes: 33, Packets: 34, }, BA: &FlowEndpointStatistics{ Value: "value-2", Bytes: 44, Packets: 55, }, }, }, }, ProbeGraphPath: "probepath-1", IfSrcGraphPath: "srcgraphpath-1", IfDstGraphPath: "dstgraphpath-1", } j, err := json.Marshal(f) if err != nil { t.Error(err.Error()) } schema := v.Object( v.ObjKV("UUID", v.String()), v.ObjKV("LayersPath", v.String()), v.ObjKV("ProbeGraphPath", v.String()), v.ObjKV("IfSrcGraphPath", v.String()), v.ObjKV("IfDstGraphPath", v.String()), v.ObjKV("Statistics", v.Object( v.ObjKV("Start", v.Number()), v.ObjKV("Last", v.Number()), v.ObjKV("Endpoints", v.Array(v.ArrEach(v.Object( v.ObjKV("Type", v.String()), v.ObjKV("AB", v.Object( v.ObjKV("Value", v.String()), v.ObjKV("Packets", v.Number()), v.ObjKV("Bytes", v.Number()), )), v.ObjKV("AB", v.Object( v.ObjKV("Value", v.String()), v.ObjKV("Packets", v.Number()), v.ObjKV("Bytes", v.Number()), )), )))), )), ) var data interface{} if err := json.Unmarshal(j, &data); err != nil { t.Fatal("JSON parsing failed. Err =", err) } if path, err := schema.Validate(data); err != nil { t.Fatalf("Validation failed at %s. Error (%s)", path, err) } var e Flow if err := json.Unmarshal(j, &e); err != nil { t.Fatal("JSON parsing failed. Err =", err) } if !reflect.DeepEqual(f, e) { t.Fatal("Unmarshalled flow not equal to the original") } }
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())), )), )), ) }