1package gdb 2 3import ( 4 "encoding/json" 5 "reflect" 6 "testing" 7) 8 9func checkParseRecord(t *testing.T, input, expected string) { 10 inputObj := parseRecord(input) 11 expectedObj := map[string]interface{}{} 12 if err := json.Unmarshal([]byte(expected), &expectedObj); err != nil { 13 t.Fatal(err) 14 } 15 if !reflect.DeepEqual(inputObj, expectedObj) { 16 t.Fatal(inputObj, "!=", expectedObj) 17 } 18} 19 20func TestParseRecord(t *testing.T) { 21 // async record 22 checkParseRecord(t, `*foo`, `{"type":"exec","class":"foo"}`) 23 checkParseRecord(t, `+bar`, `{"type":"status","class":"bar"}`) 24 checkParseRecord(t, `=baz`, `{"type":"notify","class":"baz"}`) 25 checkParseRecord(t, `*foo,a="x"`, `{"type":"exec","class":"foo","payload":{"a":"x"}}`) 26 checkParseRecord(t, `*foo,a="x",b="y"`, `{"type":"exec","class":"foo","payload":{"a":"x","b":"y"}}`) 27 checkParseRecord(t, `+bar,a="x"`, `{"type":"status","class":"bar","payload":{"a":"x"}}`) 28 checkParseRecord(t, `+bar,a="x",b="y"`, `{"type":"status","class":"bar","payload":{"a":"x","b":"y"}}`) 29 checkParseRecord(t, `=baz,a="x"`, `{"type":"notify","class":"baz","payload":{"a":"x"}}`) 30 checkParseRecord(t, `=baz,a="x",b="y"`, `{"type":"notify","class":"baz","payload":{"a":"x","b":"y"}}`) 31 32 // stream record 33 checkParseRecord(t, `~"foo"`, `{"type":"console","payload":"foo"}`) 34 checkParseRecord(t, `@"bar"`, `{"type":"target","payload":"bar"}`) 35 checkParseRecord(t, `&"baz"`, `{"type":"log","payload":"baz"}`) 36 37 // result record 38 checkParseRecord(t, `123^foo`, `{"sequence":"123","class":"foo"}`) 39 checkParseRecord(t, `456^bar,a="x"`, `{"sequence":"456","class":"bar","payload":{"a":"x"}}`) 40 checkParseRecord(t, `789^baz,a="x",b="y"`, `{"sequence":"789","class":"baz","payload":{"a":"x","b":"y"}}`) 41 42 // complex record payload 43 checkParseRecord(t, `000^foo,a={"b"="x","c"="y"}`, `{"sequence":"000","class":"foo","payload":{"a":{"b":"x","c":"y"}}}`) 44 checkParseRecord(t, `000^foo,a=["b"="x","c"="y"]`, `{"sequence":"000","class":"foo","payload":{"a":[{"b":"x"},{"c":"y"}]}}`) 45 checkParseRecord(t, `000^foo,a=["x","y"]`, `{"sequence":"000","class":"foo","payload":{"a":["x","y"]}}`) 46 checkParseRecord(t, `000^foo,a=[[["x"]]]`, `{"sequence":"000","class":"foo","payload":{"a":[[["x"]]]}}`) 47 checkParseRecord(t, `000^foo,a={b={c={x="y"}}}`, `{"sequence":"000","class":"foo","payload":{"a":{"b":{"c":{"x":"y"}}}}}`) 48 checkParseRecord(t, `000^foo,a={}`, `{"sequence":"000","class":"foo","payload":{"a":{}}}`) 49 checkParseRecord(t, `000^foo,a=[]`, `{"sequence":"000","class":"foo","payload":{"a":[]}}`) 50 51 // escape sequences and strings in general 52 checkParseRecord(t, `~""`, `{"type":"console","payload":""}`) 53 checkParseRecord(t, `~"\b\f\n\r\t\""`, `{"type":"console","payload":"\b\f\n\r\t\""}`) 54 checkParseRecord(t, `@""`, `{"type":"target","payload":""}`) 55 checkParseRecord(t, `@"\b\f\n\r\t\""`, `{"type":"target","payload":"\b\f\n\r\t\""}`) 56 checkParseRecord(t, `&""`, `{"type":"log","payload":""}`) 57 checkParseRecord(t, `&"\b\f\n\r\t\""`, `{"type":"log","payload":"\b\f\n\r\t\""}`) 58 checkParseRecord(t, `000^foo,a=""`, `{"sequence":"000","class":"foo","payload":{"a":""}}`) 59 checkParseRecord(t, `000^bar,a="\b\f\n\r\t\""`, `{"sequence":"000","class":"bar","payload":{"a":"\b\f\n\r\t\""}}`) 60} 61