github.com/GuanceCloud/cliutils@v1.1.21/pipeline/ptinput/funcs/fn_url_parse_test.go (about) 1 // Unless explicitly stated otherwise all files in this repository are licensed 2 // under the MIT License. 3 // This product includes software developed at Guance Cloud (https://www.guance.com/). 4 // Copyright 2021-present Guance, Inc. 5 6 package funcs 7 8 import ( 9 "testing" 10 "time" 11 12 "github.com/GuanceCloud/cliutils/pipeline/ptinput" 13 "github.com/GuanceCloud/cliutils/point" 14 tu "github.com/GuanceCloud/cliutils/testutil" 15 "github.com/GuanceCloud/platypus/pkg/ast" 16 ) 17 18 func TestURLParse(t *testing.T) { 19 cases := []struct { 20 name string 21 pl, in string 22 outKey string 23 expected interface{} 24 fail bool 25 }{ 26 { 27 name: "port", 28 pl: ` 29 json(_, url) 30 m = url_parse(url) 31 add_key(scheme, m["scheme"]) 32 `, 33 in: `{"url": "https://www.baidu.com"}`, 34 outKey: "scheme", 35 expected: "https", 36 fail: false, 37 }, 38 { 39 name: "host", 40 pl: ` 41 json(_, url) 42 m = url_parse(url) 43 add_key(host, m["host"]) 44 `, 45 in: `{"url": "http://127.0.0.1:9529"}`, 46 outKey: "host", 47 expected: "127.0.0.1:9529", 48 fail: false, 49 }, 50 { 51 name: "port", 52 pl: ` 53 json(_, url) 54 m = url_parse(url) 55 add_key(port, m["port"]) 56 `, 57 in: `{"url": "http://127.0.0.1:9529"}`, 58 outKey: "port", 59 expected: "9529", 60 fail: false, 61 }, 62 { 63 name: "path", 64 pl: ` 65 json(_, url) 66 m = url_parse(url) 67 add_key(path, m["path"]) 68 `, 69 in: `{"url": "http://127.0.0.1:9529/v1/metrics"}`, 70 outKey: "path", 71 expected: "/v1/metrics", 72 fail: false, 73 }, 74 { 75 name: "arg1", 76 pl: ` 77 json(_, url) 78 m = url_parse(url) 79 add_key(a, m["params"]["arg1"]) 80 `, 81 in: `{"url": "http://127.0.0.1:9529/v1/metrics?arg1=v1&arg2=v2"}`, 82 outKey: "a", 83 expected: "v1", 84 fail: false, 85 }, 86 { 87 name: "arg2", 88 pl: ` 89 json(_, url) 90 m = url_parse(url) 91 add_key(a, m["params"]["arg2"]) 92 `, 93 in: `{"url": "http://127.0.0.1:9529/v1/metrics?arg1=v1&arg2=v2&arg2=v3"}`, 94 outKey: "a", 95 expected: "v2,v3", 96 fail: false, 97 }, 98 { 99 name: "invalid url", 100 pl: ` 101 json(_, url) 102 m = url_parse(url) 103 add_key(p, m["path"]) 104 `, 105 in: `{"url": "/var/log/datakit/log"}`, 106 fail: true, 107 }, 108 { 109 name: "two many args", 110 pl: ` 111 json(_, url) 112 m = url_parse(url, 2) 113 `, 114 in: `{"url": "http://127.0.0.1:9529/v1/metrics?arg1=v1&arg2=v2"}`, 115 fail: true, 116 }, 117 } 118 119 for idx, tc := range cases { 120 t.Run(tc.name, func(t *testing.T) { 121 runner, err := NewTestingRunner(tc.pl) 122 if err != nil { 123 if tc.fail { 124 t.Logf("[%d]expect error: %s", idx, err) 125 } else { 126 t.Errorf("[%d] failed: %s", idx, err) 127 } 128 return 129 } 130 131 pt := ptinput.NewPlPoint(point.Logging, "test", nil, map[string]any{"message": tc.in}, time.Now()) 132 errR := runScript(runner, pt) 133 if errR != nil { 134 t.Fatal(errR) 135 } 136 137 if v, istag, err := pt.Get(tc.outKey); err != nil { 138 if !tc.fail { 139 t.Errorf("[%d]key %s, error: %s", idx, tc.outKey, err) 140 } 141 } else { 142 if istag != ast.String { 143 t.Errorf("key %s should be a field", tc.outKey) 144 } else { 145 tu.Equals(t, tc.expected, v) 146 t.Logf("[%d] PASS", idx) 147 } 148 } 149 }) 150 } 151 }