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×tamp=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×tamp=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×tamp=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×tamp=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×tamp=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×tamp=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×tamp=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×tamp=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×tamp=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 }