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  }