github.com/GuanceCloud/cliutils@v1.1.21/pipeline/ptinput/funcs/fn_parse_date_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 TestParseDate(t *testing.T) { 18 now := time.Now() 19 collectTime := now.Add(time.Hour * 12345) 20 cases := []struct { 21 name string 22 pl, in string 23 outKey string 24 expected int64 25 fail bool 26 }{ 27 { 28 name: "normal", 29 pl: ` 30 grok(_, "%{INT:hour}:%{INT:min}:%{INT:sec}\\.%{INT:msec}") 31 parse_date("time", "", "", "", hour, min, sec, msec, "", "", "+8") 32 `, 33 in: "16:40:03.290", 34 outKey: "time", 35 expected: time.Date(now.Year(), now.Month(), now.Day(), 36 16, 40, 0o3, 290*1000*1000, time.FixedZone("UTC+8", 8*60*60)).UnixNano(), 37 fail: false, 38 }, 39 40 { 41 name: "normal", 42 pl: ` 43 grok(_, "%{INT:hour}:%{INT:min}:%{INT:sec}\\.%{INT:msec}") 44 parse_date(key="time", hh=hour, mm=min, ss=sec, ms=msec, zone="+8") 45 `, 46 in: "16:40:03.290", 47 outKey: "time", 48 expected: time.Date(now.Year(), now.Month(), now.Day(), 49 16, 40, 0o3, 290*1000*1000, time.FixedZone("UTC+8", 8*60*60)).UnixNano(), 50 fail: false, 51 }, 52 53 { 54 name: "normal", 55 pl: ` 56 grok(_, "%{INT:year}-%{INT:month}-%{INT:day} %{INT:hour}:%{INT:min}:%{INT:sec}\\.%{INT:msec}") 57 parse_date(key="time", yy=year, MM=month, dd=day, hh=hour, mm=min, ss=sec, ms=msec, zone="+8") 58 `, 59 in: "2020-12-12 16:40:03.290", 60 outKey: "time", 61 expected: time.Date(2020, 12, 12, 62 16, 40, 0o3, 290*1000*1000, time.FixedZone("UTC+8", 8*60*60)).UnixNano(), 63 fail: false, 64 }, 65 66 { 67 name: "normal", 68 pl: ` 69 grok(_, "%{NOTSPACE:wd}\\s+%{NOTSPACE:month}\\s+%{INT:day} %{INT:hour}:%{INT:min}:%{INT:sec}\\s+%{NOTSPACE:tz}\\s+%{INT:year}") 70 parse_date(key="time", yy=year, MM=month, dd=day, hh=hour, mm=min, ss=sec, zone=tz) 71 `, 72 in: "Mon Sep 6 16:40:03 CST 2021", 73 outKey: "time", 74 expected: time.Date(2021, 9, 6, 75 16, 40, 0o3, 0, time.FixedZone("UTC+8", 8*60*60)).UnixNano(), 76 fail: false, 77 }, 78 79 { 80 name: "normal", 81 pl: ` 82 grok(_, "%{NOTSPACE:wd}\\s+%{NOTSPACE:month}\\s+%{INT:day}\\s+%{INT:hour}:%{INT:min}:%{INT:sec}\\s+%{NOTSPACE:tz}\\s+%{INT:year}") 83 parse_date(key="time", yy=year, MM=month, dd=day, hh=hour, mm=min, ss=sec, zone=tz) 84 `, 85 in: "Mon Sep 6 16:40:03 CST 2021", 86 outKey: "time", 87 expected: time.Date(2021, 9, 6, 88 16, 40, 0o3, 0, time.FixedZone("UTC+8", 8*60*60)).UnixNano(), 89 fail: false, 90 }, 91 92 { 93 name: "partial year", 94 pl: ` 95 grok(_, "%{NOTSPACE:wd}\\s+%{NOTSPACE:month}\\s+%{INT:day}\\s+%{INT:hour}:%{INT:min}:%{INT:sec}\\s+%{NOTSPACE:tz}\\s+%{INT:year}") 96 parse_date(key="time", yy=year, MM=month, dd=day, hh=hour, mm=min, ss=sec, zone=tz) 97 `, 98 in: "Mon Sep 6 16:40:03 CST 00", 99 outKey: "time", 100 expected: time.Date(2000, 9, 6, 101 16, 40, 0o3, 0, time.FixedZone("UTC+8", 8*60*60)).UnixNano(), 102 }, 103 104 { 105 name: "partial year", 106 pl: ` 107 grok(_, "%{NOTSPACE:wd}\\s+%{NOTSPACE:month}\\s+%{INT:day}\\s+%{INT:hour}:%{INT:min}:%{INT:sec}\\s+%{NOTSPACE:tz}\\s+%{INT:year}") 108 parse_date(key="time", yy=year, MM=month, dd=day, hh=hour, mm=min, ss=sec, zone=tz) 109 `, 110 in: "Mon Sep 6 16:40:03 CST 09", 111 outKey: "time", 112 expected: time.Date(2009, 9, 6, 113 16, 40, 0o3, 0, time.FixedZone("UTC+8", 8*60*60)).UnixNano(), 114 }, 115 116 { 117 name: "us", 118 pl: ` 119 grok(_, "%{INT:hour}:%{INT:min}:%{INT:sec}\\.%{INT:us}") 120 parse_date("time", "", "", "", hour, min, sec, "", us, "", "+8") 121 `, 122 in: "16:40:03.290290", 123 outKey: "time", 124 expected: time.Date(now.Year(), now.Month(), now.Day(), 125 16, 40, 0o3, 290290*1000, time.FixedZone("UTC+8", 8*60*60)).UnixNano(), 126 }, 127 128 { 129 name: "ns", 130 pl: ` 131 grok(_, "%{INT:hour}:%{INT:min}:%{INT:sec}\\.%{INT:ns}") 132 parse_date("time", "", "", "", hour, min, sec, "", "", ns, "+8") 133 `, 134 in: "16:40:03.290290330", 135 outKey: "time", 136 expected: time.Date(now.Year(), now.Month(), now.Day(), 137 16, 40, 0o3, 290290330, time.FixedZone("UTC+8", 8*60*60)).UnixNano(), 138 }, 139 140 { 141 name: "ns for kwargs", 142 pl: ` 143 grok(_, "%{INT:hour}:%{INT:min}:%{INT:sec}\\.%{INT:ns}") 144 parse_date(key="time", hh=hour, mm=min, ss=sec, ns=ns, zone="CST") 145 `, 146 in: "16:40:03.290290330", 147 outKey: "time", 148 expected: time.Date(now.Year(), now.Month(), now.Day(), 149 16, 40, 0o3, 290290330, time.FixedZone("UTC+8", 8*60*60)).UnixNano(), 150 }, 151 152 { 153 name: "missed second: use 0", 154 pl: ` 155 grok(_, "%{INT:hour}:%{INT:min}") 156 parse_date(key="time", hh=hour, mm=min, zone="CST")`, 157 in: "16:40", 158 outKey: "time", 159 expected: time.Date(now.Year(), now.Month(), now.Day(), 160 16, 40, 0o0, 0, time.FixedZone("UTC+8", 8*60*60)).UnixNano(), 161 }, 162 163 { 164 name: "normal", 165 pl: ` 166 grok(_, "%{INT:hour}:%{INT:min}:%{INT:sec}\\.%{INT:msec}") 167 parse_date("time", "", "", "", hour, min, sec, msec, "", "", "") 168 `, 169 in: "16:40:03.290", 170 outKey: "time", 171 expected: time.Date(now.Year(), now.Month(), now.Day(), 172 16, 40, 0o3, 290*1000*1000, time.FixedZone("UTC", 0)).UnixNano(), 173 fail: false, 174 }, 175 176 { 177 name: "invalid hour", 178 pl: ` 179 grok(_, "%{NOTSPACE:wd}\\s+%{NOTSPACE:month}\\s+%{INT:day}\\s+%{INT:hour}:%{INT:min}:%{INT:sec}\\s+%{NOTSPACE:tz}\\s+%{INT:year}") 180 parse_date(key="time", yy=year, MM=month, dd=day, hh=hour, mm=min, ss=sec, zone=tz) 181 `, 182 in: "Mon Sep 6 25:40:03 CST 2021", 183 expected: collectTime.UnixNano(), 184 fail: true, 185 }, 186 187 { 188 name: "invalid hour", 189 pl: ` 190 grok(_, "%{NOTSPACE:wd}\\s+%{NOTSPACE:month}\\s+%{INT:day}\\s+%{INT:hour}:%{INT:min}:%{INT:sec}\\s+%{NOTSPACE:tz}\\s+%{INT:year}") 191 parse_date(key="time", yy=year, MM=month, dd=day, hh=hour, mm=min, ss=sec, zone=tz) 192 `, 193 in: "Mon Sep 6 -2:40:03 CST 2021", 194 expected: collectTime.UnixNano(), 195 fail: true, 196 }, 197 198 { 199 name: "invalid minute", 200 pl: ` 201 grok(_, "%{NOTSPACE:wd}\\s+%{NOTSPACE:month}\\s+%{INT:day}\\s+%{INT:hour}:%{INT:min}:%{INT:sec}\\s+%{NOTSPACE:tz}\\s+%{INT:year}") 202 parse_date(key="time", yy=year, MM=month, dd=day, hh=hour, mm=min, ss=sec, zone=tz) 203 `, 204 in: "Mon Sep 6 12:61:03 CST 2021", 205 expected: collectTime.UnixNano(), 206 fail: true, 207 }, 208 209 { 210 name: "invalid minute", 211 pl: ` 212 grok(_, "%{NOTSPACE:wd}\\s+%{NOTSPACE:month}\\s+%{INT:day}\\s+%{INT:hour}:%{INT:min}:%{INT:sec}\\s+%{NOTSPACE:tz}\\s+%{INT:year}") 213 parse_date(key="time", yy=year, MM=month, dd=day, hh=hour, mm=min, ss=sec, zone=tz) 214 `, 215 in: "Mon Sep 6 12:60:03 CST 2021", 216 expected: collectTime.UnixNano(), 217 fail: true, 218 }, 219 220 { 221 name: "invalid second", 222 pl: ` 223 grok(_, "%{NOTSPACE:wd}\\s+%{NOTSPACE:month}\\s+%{INT:day}\\s+%{INT:hour}:%{INT:min}:%{INT:sec}\\s+%{NOTSPACE:tz}\\s+%{INT:year}") 224 parse_date(key="time", yy=year, MM=month, dd=day, hh=hour, mm=min, ss=sec, zone=tz) 225 `, 226 in: "Mon Sep 6 12:11:61 CST 2021", 227 expected: collectTime.UnixNano(), 228 fail: true, 229 }, 230 231 { 232 name: "invalid minute", 233 pl: ` 234 grok(_, "%{NOTSPACE:wd}\\s+%{NOTSPACE:month}\\s+%{INT:day}\\s+%{INT:hour}:%{INT:min}:%{INT:sec}\\s+%{NOTSPACE:tz}\\s+%{INT:year}") 235 parse_date(key="time", yy=year, MM=month, dd=day, hh=hour, mm=min, ss=sec, zone=tz) 236 `, 237 in: "Mon Sep 6 12:12:-1 CST 2021", 238 expected: collectTime.UnixNano(), 239 fail: true, 240 }, 241 } 242 243 for idx, tc := range cases { 244 t.Run(tc.name, func(t *testing.T) { 245 runner, err := NewTestingRunner(tc.pl) 246 if err != nil { 247 if tc.fail { 248 t.Logf("[%d]expect error: %s", idx, err) 249 } else { 250 t.Errorf("[%d] failed: %s", idx, err) 251 } 252 return 253 } 254 255 pt := ptinput.NewPlPoint( 256 point.Logging, "test", nil, map[string]any{"message": tc.in}, time.Now()) 257 errR := runScript(runner, pt) 258 259 if errR != nil { 260 if tc.fail { 261 t.Logf("[%d]expect error: %s", idx, errR.Error()) 262 } else { 263 t.Error(errR.Error()) 264 } 265 } else { 266 pt.KeyTime2Time() 267 var v interface{} 268 if tc.outKey != "time" && tc.outKey != "" { 269 v, _, _ = pt.Get(tc.outKey) 270 } else { 271 v = pt.PtTime().UnixNano() 272 } 273 tu.Equals(t, tc.expected, v) 274 t.Logf("[%d] PASS", idx) 275 } 276 }) 277 } 278 }