github.com/GuanceCloud/cliutils@v1.1.21/pipeline/ptinput/funcs/fn_cast_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  )
    16  
    17  func TestCast(t *testing.T) {
    18  	cases := []struct {
    19  		name, pl, in string
    20  		outkey       string
    21  		expect       interface{}
    22  		fail         bool
    23  	}{
    24  		{
    25  			name: "cast int",
    26  			in:   `162.62.81.1 - - [29/Nov/2021:07:30:50 +0000] "123 /?signature=b8d8ea&timestamp=1638171049 HTTP/1.1" 200 413 "-" "Mozilla/4.0"`,
    27  			pl: `
    28  	grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA:data} %{GREEDYDATA} HTTP/%{NUMBER}\" %{INT:status_code} %{INT:bytes}")
    29  	cast(data, "int")
    30  	`,
    31  			outkey: "data",
    32  			expect: int64(123),
    33  			fail:   false,
    34  		},
    35  		{
    36  			name: "cast string",
    37  			in:   `162.62.81.1 - - [29/Nov/2021:07:30:50 +0000] "123 /?signature=b8d8ea&timestamp=1638171049 HTTP/1.1" 200 413 "-" "Mozilla/4.0"`,
    38  			pl: `
    39  	grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA:data} %{GREEDYDATA} HTTP/%{NUMBER}\" %{INT:status_code} %{INT:bytes}")
    40  	cast(data, "str")
    41  	`,
    42  			outkey: "data",
    43  			expect: "123",
    44  			fail:   false,
    45  		},
    46  		{
    47  			name: "cast bool",
    48  			in:   `162.62.81.1 - - [29/Nov/2021:07:30:50 +0000] "true /?signature=b8d8ea&timestamp=1638171049 HTTP/1.1" 200 413 "-" "Mozilla/4.0"`,
    49  			pl: `
    50  	grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA:data} %{GREEDYDATA} HTTP/%{NUMBER}\" %{INT:status_code} %{INT:bytes}")
    51  	cast(data, "bool")
    52  	`,
    53  			outkey: "data",
    54  			expect: true,
    55  			fail:   false,
    56  		},
    57  		{
    58  			name: "cast float",
    59  			in:   `162.62.81.1 - - [29/Nov/2021:07:30:50 +0000] "123 /?signature=b8d8ea&timestamp=1638171049 HTTP/1.1" 200 413 "-" "Mozilla/4.0"`,
    60  			pl: `
    61  	grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA:data} %{GREEDYDATA} HTTP/%{NUMBER}\" %{INT:status_code} %{INT:bytes}")
    62  	cast(data, "float")
    63  	`,
    64  			outkey: "data",
    65  			expect: float64(123),
    66  			fail:   false,
    67  		},
    68  		{
    69  			name: "cast float",
    70  			in:   `162.62.81.1 - - [29/Nov/2021:07:30:50 +0000] "12.3 /?signature=b8d8ea&timestamp=1638171049 HTTP/1.1" 200 413 "-" "Mozilla/4.0"`,
    71  			pl: `
    72  	grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA:data} %{GREEDYDATA} HTTP/%{NUMBER}\" %{INT:status_code} %{INT:bytes}")
    73  	cast(data, "float")
    74  	`,
    75  			outkey: "data",
    76  			expect: float64(12.3),
    77  			fail:   false,
    78  		},
    79  		{
    80  			name: "cast float ",
    81  			in:   `162.62.81.1 - - [29/Nov/2021:07:30:50 +0000] "-123. /?signature=b8d8ea&timestamp=1638171049 HTTP/1.1" 200 413 "-" "Mozilla/4.0"`,
    82  			pl: `
    83  	grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA:data} %{GREEDYDATA} HTTP/%{NUMBER}\" %{INT:status_code} %{INT:bytes}")
    84  	cast(data, "float")
    85  	`,
    86  			outkey: "data",
    87  			expect: float64(-123),
    88  			fail:   false,
    89  		},
    90  		{
    91  			name: "cast float ",
    92  			in:   `162.62.81.1 - - [29/Nov/2021:07:30:50 +0000] "-.12 /?signature=b8d8ea&timestamp=1638171049 HTTP/1.1" 200 413 "-" "Mozilla/4.0"`,
    93  			pl: `
    94  	grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA:data} %{GREEDYDATA} HTTP/%{NUMBER}\" %{INT:status_code} %{INT:bytes}")
    95  	cast(data, "float")
    96  	`,
    97  			outkey: "data",
    98  			expect: float64(-.12),
    99  			fail:   false,
   100  		},
   101  		{
   102  			name: "cast int ",
   103  			in:   `162.62.81.1 - - [29/Nov/2021:07:30:50 +0000] "+12.6 /?signature=b8d8ea&timestamp=1638171049 HTTP/1.1" 200 413 "-" "Mozilla/4.0"`,
   104  			pl: `
   105  	grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA:data} %{GREEDYDATA} HTTP/%{NUMBER}\" %{INT:status_code} %{INT:bytes}")
   106  	cast(data, "int")
   107  	`,
   108  			outkey: "data",
   109  			expect: int64(+12),
   110  			fail:   false,
   111  		},
   112  		{
   113  			name: "cast intx ",
   114  			in:   `162.62.81.1 - - [29/Nov/2021:07:30:50 +0000] "+12.6 /?signature=b8d8ea&timestamp=1638171049 HTTP/1.1" 200 413 "-" "Mozilla/4.0"`,
   115  			pl: `
   116  	grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA:data} %{GREEDYDATA} HTTP/%{NUMBER}\" %{INT:status_code} %{INT:bytes}")
   117  	cast(data, "intx")
   118  	`,
   119  			outkey: "data",
   120  			expect: "+12.6",
   121  			fail:   true,
   122  		},
   123  	}
   124  
   125  	for idx, tc := range cases {
   126  		t.Run(tc.name, func(t *testing.T) {
   127  			runner, err := NewTestingRunner(tc.pl)
   128  			if err != nil {
   129  				if tc.fail {
   130  					t.Logf("[%d]expect error: %s", idx, err)
   131  				} else {
   132  					t.Errorf("[%d] failed: %s", idx, err)
   133  				}
   134  				return
   135  			}
   136  
   137  			pt := ptinput.NewPlPoint(
   138  				point.Logging, "test", nil, map[string]any{"message": tc.in}, time.Now())
   139  			errR := runScript(runner, pt)
   140  
   141  			if errR != nil {
   142  				t.Fatal(errR)
   143  			} else {
   144  				v, _, _ := pt.Get(tc.outkey)
   145  				tu.Equals(t, tc.expect, v)
   146  				t.Logf("[%d] PASS", idx)
   147  			}
   148  		})
   149  	}
   150  }