github.com/GuanceCloud/cliutils@v1.1.21/pipeline/ptinput/funcs/fn_addpattern_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  	"github.com/stretchr/testify/assert"
    15  )
    16  
    17  func TestAddPattern(t *testing.T) {
    18  	cases := []struct {
    19  		name, pl, in string
    20  		outkey       string
    21  		expect       interface{}
    22  		fail         bool
    23  	}{
    24  		{
    25  			name: "pattern: http version (-s)",
    26  			in:   `162.62.81.1 - - [29/Nov/2021:07:30:50 +0000] "POST /?signature=b8d8ea&timestamp=1638171049 HTTP/1.1" 200 413 "-" "Mozilla/4.0"`,
    27  			pl: `
    28  		add_pattern("http_version", "[\\d\\.]+")
    29  		grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA} %{GREEDYDATA} HTTP/%{http_version:http_version}\" %{INT:status_code} %{INT:bytes}")
    30  		cast(http_version, "float")
    31  		`,
    32  			outkey: "http_version",
    33  			expect: 1.1,
    34  			fail:   false,
    35  		},
    36  		{
    37  			name: "pattern: http version (-d)",
    38  			in:   `162.62.81.1 - - [29/Nov/2021:07:30:50 +0000] "POST /?signature=b8d8ea&timestamp=1638171049 HTTP/1.1" 200 413 "-" "Mozilla/4.0"`,
    39  			pl: `
    40  		add_pattern("num", "\\d")
    41  		add_pattern("http_version", "[%{num}\\.]+")
    42  		grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA} %{GREEDYDATA} HTTP/%{http_version:http_version}\" %{INT:status_code} %{INT:bytes}")
    43  		cast(http_version, "float")
    44  		`,
    45  			outkey: "http_version",
    46  			expect: 1.1,
    47  			fail:   false,
    48  		},
    49  		{
    50  			name: "pattern: http version (-o)",
    51  			in:   `162.62.81.1 - - [29/Nov/2021:07:30:50 +0000] "POST /?signature=b8d8ea&timestamp=1638171049 HTTP/1.1" 200 413 "-" "Mozilla/4.0"`,
    52  			pl: `
    53  		add_pattern("num", "\\d")
    54  		add_pattern("http_version", "\\d")
    55  		add_pattern("http_version", "[%{num}\\.]+")
    56  		grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA} %{GREEDYDATA} HTTP/%{http_version:http_version}[\\.\\d]+\" %{INT:status_code} %{INT:bytes}")
    57  		cast(http_version, "float")
    58  		`,
    59  			outkey: "http_version",
    60  			expect: float64(1),
    61  			fail:   false,
    62  		},
    63  		{
    64  			name: "pattern: http version (-fd)",
    65  			in:   `162.62.81.1 - - [29/Nov/2021:07:30:50 +0000] "POST /?signature=b8d8ea&timestamp=1638171049 HTTP/1.1" 200 413 "-" "Mozilla/4.0"`,
    66  			pl: `
    67  		add_pattern("_num", "\\d")
    68  		add_pattern("http_version", "[%{_num}\\.]+")
    69  		grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA} %{GREEDYDATA} HTTP/%{http_version:http_version}\" %{INT:status_code} %{INT:bytes}")
    70  		cast(http_version, "float")
    71  		`,
    72  			outkey: "http_version",
    73  			expect: float64(1.1),
    74  			fail:   false,
    75  		},
    76  		{
    77  			name: "pattern: http version (-fu)",
    78  			in:   `162.62.81.1 - - [29/Nov/2021:07:30:50 +0000] "POST /?signature=b8d8ea&timestamp=1638171049 HTTP/1.1" 200 413 "-" "Mozilla/4.0"`,
    79  			pl: `
    80  		add_pattern("Num", "\\d")
    81  		add_pattern("http_version", "[%{Num}\\.]+")
    82  		grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA} %{GREEDYDATA} HTTP/%{http_version:http_version}\" %{INT:status_code} %{INT:bytes}")
    83  		cast(http_version, "float")
    84  		`,
    85  			outkey: "http_version",
    86  			expect: float64(1.1),
    87  			fail:   false,
    88  		},
    89  		{
    90  			name: "pattern: http version (-fn)",
    91  			in:   `162.62.81.1 - - [29/Nov/2021:07:30:50 +0000] "POST /?signature=b8d8ea&timestamp=1638171049 HTTP/1.1" 200 413 "-" "Mozilla/4.0"`,
    92  			pl: `
    93  		add_pattern("1Num", "\\d")
    94  		add_pattern("http_version", "[%{1Num}\\.]+")
    95  		grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA} %{GREEDYDATA} HTTP/%{http_version:http_version}\" %{INT:status_code} %{INT:bytes}")
    96  		cast(http_version, "float")
    97  		`,
    98  			outkey: "http_version",
    99  			expect: float64(1.1),
   100  			fail:   false,
   101  		},
   102  		{
   103  			name: "pattern: http version (-opm)", // 测试替换部分 global pattern 可被替换
   104  			in:   `162.62.81.1 - - [29/Nov/2021:07:30:50 +0000] "POST /?signature=b8d8ea&timestamp=1638171049 HTTP/1.1" 200 413 "-" "Mozilla/4.0"`,
   105  			pl: `
   106  		add_pattern("NUMBER", "\\d")
   107  		grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA} %{GREEDYDATA} HTTP/%{NUMBER:http_version}.*\" %{INT:status_code} %{INT:bytes}")
   108  		cast(http_version, "float")
   109  		`,
   110  			outkey: "http_version",
   111  			expect: float64(1),
   112  			fail:   false,
   113  		},
   114  		{
   115  			name: "pattern: http version (-opm2)",
   116  			in:   `162.62.81.1 - - [29/Nov/2021:07:30:50 +0000] "POST /?signature=b8d8ea&timestamp=1638171049 HTTP/1.1" 200 413 "-" "Mozilla/4.0"`,
   117  			pl: `
   118  		add_pattern("numb2", "%{NUMBER}")
   119  		grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA} %{GREEDYDATA} HTTP/%{numb2:http_version}.*\" %{INT:status_code} %{INT:bytes}")
   120  		cast(http_version, "float")
   121  		`,
   122  			outkey: "http_version",
   123  			expect: float64(1.1),
   124  			fail:   false,
   125  		},
   126  		{
   127  			name: "pattern: http version (-opm3)",
   128  			in:   `162.62.81.1 - - [29/Nov/2021:07:30:50 +0000] "POST /?signature=b8d8ea&timestamp=1638171049 HTTP/1.1" 200 413 "-" "Mozilla/4.0"`,
   129  			pl: `
   130  		add_pattern("numb2", "%{NUMBER}")
   131  		grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA} %{GREEDYDATA} HTTP/%{numb2:http_version}.*\" %{INT:status_code} %{INT:bytes}")
   132  		add_pattern("numb3", "\\d")
   133  		grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA} %{GREEDYDATA} HTTP/%{numb3:http_version_int}.*\" %{INT:status_code} %{INT:bytes}")
   134  		cast(http_version_int, "float")
   135  		`,
   136  			outkey: "http_version_int",
   137  			expect: float64(1.),
   138  			fail:   false,
   139  		},
   140  		{
   141  			name: "pattern: http version (-opm4)",
   142  			in:   `162.62.81.1 - - [29/Nov/2021:07:30:50 +0000] "POST /?signature=b8d8ea&timestamp=1638171049 HTTP/1.1" 200 413 "-" "Mozilla/4.0"`,
   143  			pl: `
   144  	add_pattern("numb2", "%{NUMBER}")
   145  	grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA} %{GREEDYDATA} HTTP/%{numb2:http_version}.*\" %{INT:status_code} %{INT:bytes}")
   146  	add_pattern("numb2", "\\d")
   147  	grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA} %{GREEDYDATA} HTTP/%{numb2:http_version_int}.*\" %{INT:status_code} %{INT:bytes}")
   148  	cast(http_version_int, "float")
   149  	`,
   150  			outkey: "http_version_int",
   151  			expect: float64(1),
   152  			fail:   false,
   153  		},
   154  	}
   155  
   156  	for idx, tc := range cases {
   157  		t.Run(tc.name, func(t *testing.T) {
   158  			runner, err := NewTestingRunner(tc.pl)
   159  			if err != nil {
   160  				if tc.fail {
   161  					t.Logf("[%d]expect error: %s", idx, err)
   162  				} else {
   163  					t.Errorf("[%d] failed: %s", idx, err)
   164  				}
   165  				return
   166  			}
   167  
   168  			pt := ptinput.NewPlPoint(point.Logging, "test", nil, map[string]any{"message": tc.in}, time.Now())
   169  			errR := runScript(runner, pt)
   170  			if errR != nil {
   171  				t.Fatal(errR)
   172  			}
   173  			v, _, e := pt.Get(tc.outkey)
   174  			assert.NoError(t, e)
   175  			if assert.Equal(t, tc.expect, v) {
   176  				t.Logf("[%d] PASS", idx)
   177  			}
   178  		})
   179  	}
   180  }