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  }