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