github.com/GuanceCloud/cliutils@v1.1.21/pipeline/ptinput/funcs/fn_datetime_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 TestDateTime(t *testing.T) {
    18  	// local timezone: utc+0800
    19  	cst := time.FixedZone("CST", 8*3600)
    20  	time.Local = cst
    21  
    22  	cases := []struct {
    23  		name, pl, in string
    24  		outkey       string
    25  		expect       interface{}
    26  		fail         bool
    27  	}{
    28  		{
    29  			name: "ANSIC s",
    30  			in:   `{"a":{"timestamp": "1638253518", "second":2},"age":47}`,
    31  			pl: `
    32  	json(_, a.timestamp)
    33  	datetime(a.timestamp, 's', 'ANSIC')
    34  	`,
    35  			outkey: "a.timestamp",
    36  			expect: "Tue Nov 30 14:25:18 2021",
    37  		},
    38  		{
    39  			name: "ANSIC ms",
    40  			in:   `{"a":{"timestamp": "1638253518000", "second":2},"age":47}`,
    41  			pl: `
    42  	json(_, a.timestamp)
    43  	datetime(a.timestamp, 'ms', 'ANSIC')
    44  	`,
    45  			outkey: "a.timestamp",
    46  			expect: "Tue Nov 30 14:25:18 2021",
    47  		},
    48  		{
    49  			name: "UnixDate s",
    50  			in:   `{"a":{"timestamp": "1638253518", "second":2},"age":47}`,
    51  			pl: `
    52  	json(_, a.timestamp)
    53  	datetime(a.timestamp, 's', 'UnixDate')
    54  	`,
    55  			outkey: "a.timestamp",
    56  			expect: "Tue Nov 30 14:25:18 CST 2021",
    57  		},
    58  		{
    59  			name: "UnixDate ms",
    60  			in:   `{"a":{"timestamp": "1638253518999", "second":2},"age":47}`,
    61  			pl: `
    62  	json(_, a.timestamp)
    63  	datetime(a.timestamp, 'ms', 'UnixDate')
    64  	`,
    65  			outkey: "a.timestamp",
    66  			expect: "Tue Nov 30 14:25:18 CST 2021",
    67  		},
    68  		{
    69  			name: "RubyDate ms",
    70  			in:   `{"a":{"timestamp": "1638253518999", "second":2},"age":47}`,
    71  			pl: `
    72  	json(_, a.timestamp)
    73  	datetime(a.timestamp, 'ms', 'RubyDate')
    74  	`,
    75  			outkey: "a.timestamp",
    76  			expect: "Tue Nov 30 14:25:18 +0800 2021",
    77  		},
    78  		{
    79  			name: "RubyDate s",
    80  			in:   `{"a":{"timestamp": "1638253518", "second":2},"age":47}`,
    81  			pl: `
    82  	json(_, a.timestamp)
    83  	datetime(a.timestamp, 's', 'RubyDate')
    84  	`,
    85  			outkey: "a.timestamp",
    86  			expect: "Tue Nov 30 14:25:18 +0800 2021",
    87  		},
    88  		{
    89  			name: "RFC822 ms",
    90  			in:   `{"a":{"timestamp": "1638253518999", "second":2},"age":47}`,
    91  			pl: `
    92  	json(_, a.timestamp)
    93  	datetime(a.timestamp, 'ms', 'RFC822')
    94  	`,
    95  			outkey: "a.timestamp",
    96  			expect: "30 Nov 21 14:25 CST",
    97  		},
    98  		{
    99  			name: "RFC822 s",
   100  			in:   `{"a":{"timestamp": "1638253518", "second":2},"age":47}`,
   101  			pl: `
   102  	json(_, a.timestamp)
   103  	datetime(a.timestamp, 's', 'RFC822')
   104  	`,
   105  			outkey: "a.timestamp",
   106  			expect: "30 Nov 21 14:25 CST",
   107  		},
   108  		{
   109  			name: "RFC822Z ms",
   110  			in:   `{"a":{"timestamp": "1638253518999", "second":2},"age":47}`,
   111  			pl: `
   112  	json(_, a.timestamp)
   113  	datetime(a.timestamp, 'ms', 'RFC822Z')
   114  	`,
   115  			outkey: "a.timestamp",
   116  			expect: "30 Nov 21 14:25 +0800",
   117  		},
   118  		{
   119  			name: "RFC822Z s",
   120  			in:   `{"a":{"timestamp": "1638253518", "second":2},"age":47}`,
   121  			pl: `
   122  	json(_, a.timestamp)
   123  	datetime(a.timestamp, 's', 'RFC822Z')
   124  	`,
   125  			outkey: "a.timestamp",
   126  			expect: "30 Nov 21 14:25 +0800",
   127  		},
   128  		{
   129  			name: "RFC850 ms",
   130  			in:   `{"a":{"timestamp": "1638253518999", "second":2},"age":47}`,
   131  			pl: `
   132  	json(_, a.timestamp)
   133  	datetime(a.timestamp, 'ms', 'RFC850')
   134  	`,
   135  			outkey: "a.timestamp",
   136  			expect: "Tuesday, 30-Nov-21 14:25:18 CST",
   137  		},
   138  		{
   139  			name: "RFC850 s",
   140  			in:   `{"a":{"timestamp": "1638253518", "second":2},"age":47}`,
   141  			pl: `
   142  	json(_, a.timestamp)
   143  	datetime(a.timestamp, 's', 'RFC850')
   144  	`,
   145  			outkey: "a.timestamp",
   146  			expect: "Tuesday, 30-Nov-21 14:25:18 CST",
   147  		},
   148  		{
   149  			name: "RFC1123 ms",
   150  			in:   `{"a":{"timestamp": "1638253518999", "second":2},"age":47}`,
   151  			pl: `
   152  	json(_, a.timestamp)
   153  	datetime(a.timestamp, 'ms', 'RFC1123')
   154  	`,
   155  			outkey: "a.timestamp",
   156  			expect: "Tue, 30 Nov 2021 14:25:18 CST",
   157  		},
   158  		{
   159  			name: "RFC1123 s",
   160  			in:   `{"a":{"timestamp": "1638253518", "second":2},"age":47}`,
   161  			pl: `
   162  	json(_, a.timestamp)
   163  	datetime(a.timestamp, 's', 'RFC1123')
   164  	`,
   165  			outkey: "a.timestamp",
   166  			expect: "Tue, 30 Nov 2021 14:25:18 CST",
   167  		},
   168  		{
   169  			name: "RFC1123Z ms",
   170  			in:   `{"a":{"timestamp": "1638253518999", "second":2},"age":47}`,
   171  			pl: `
   172  	json(_, a.timestamp)
   173  	datetime(a.timestamp, 'ms', 'RFC1123Z')
   174  	`,
   175  			outkey: "a.timestamp",
   176  			expect: "Tue, 30 Nov 2021 14:25:18 +0800",
   177  		},
   178  		{
   179  			name: "RFC1123Z s",
   180  			in:   `{"a":{"timestamp": "1638253518", "second":2},"age":47}`,
   181  			pl: `
   182  	json(_, a.timestamp)
   183  	datetime(a.timestamp, 's', 'RFC1123Z')
   184  	`,
   185  			outkey: "a.timestamp",
   186  			expect: "Tue, 30 Nov 2021 14:25:18 +0800",
   187  		},
   188  		{
   189  			name: "RFC3339 s",
   190  			in:   `{"a":{"timestamp": "1610960605", "second":2},"age":47}`,
   191  			pl: `
   192  	json(_, a.timestamp)
   193  	datetime(a.timestamp, 's', 'RFC3339')
   194  	`,
   195  			outkey: "a.timestamp",
   196  			expect: "2021-01-18T17:03:25+08:00",
   197  		},
   198  		{
   199  			name: "RFC3339 ms",
   200  			in:   `{"a":{"timestamp": "1610960605000", "second":2},"age":47}`,
   201  			pl: `
   202  	json(_, a.timestamp)
   203  	datetime(a.timestamp, 'ms', 'RFC3339')
   204  	`,
   205  			outkey: "a.timestamp",
   206  			expect: "2021-01-18T17:03:25+08:00",
   207  		},
   208  		{
   209  			name: "RFC3339Nano s",
   210  			in:   `{"a":{"timestamp": "1610960605", "second":2},"age":47}`,
   211  			pl: `
   212  	json(_, a.timestamp)
   213  	datetime(a.timestamp, 's', 'RFC3339Nano')
   214  	`,
   215  			outkey: "a.timestamp",
   216  			expect: "2021-01-18T17:03:25+08:00",
   217  		},
   218  		{
   219  			name: "RFC3339Nano ms",
   220  			in:   `{"a":{"timestamp": "1610960605001", "second":2},"age":47}`,
   221  			pl: `
   222  	json(_, a.timestamp)
   223  	datetime(a.timestamp, 'ms', 'RFC3339Nano')
   224  	`,
   225  			outkey: "a.timestamp",
   226  			expect: "2021-01-18T17:03:25.001+08:00",
   227  		},
   228  		{
   229  			name: "Kitchen ms",
   230  			in:   `{"a":{"timestamp": "1610960605001", "second":2},"age":47}`,
   231  			pl: `
   232  	json(_, a.timestamp)
   233  	datetime(a.timestamp, 'ms', 'Kitchen')
   234  	`,
   235  			outkey: "a.timestamp",
   236  			expect: "5:03PM",
   237  		},
   238  		{
   239  			name: "Kitchen s",
   240  			in:   `{"a":{"timestamp": "1610960605", "second":2},"age":47}`,
   241  			pl: `
   242  	json(_, a.timestamp)
   243  	datetime(a.timestamp, 's', 'Kitchen')
   244  	`,
   245  			outkey: "a.timestamp",
   246  			expect: "5:03PM",
   247  		},
   248  		{
   249  			name: "udef_ms",
   250  			in:   `{"a":{"timestamp": "1610960605000", "second":2},"age":47}`,
   251  			pl: `
   252  	json(_, a.timestamp)
   253  	datetime(a.timestamp, 'ms', '%Y-%m-%d')
   254  	`,
   255  			outkey: "a.timestamp",
   256  			expect: "2021-01-18",
   257  		},
   258  		{
   259  			name: "udef_us",
   260  			in:   `{"a":{"timestamp": "1610960605000000", "second":2},"age":47}`,
   261  			pl: `
   262  	json(_, a.timestamp)
   263  	datetime(a.timestamp, 'us', '%Y-%m-%d %H:%M:%S')
   264  	`,
   265  			outkey: "a.timestamp",
   266  			expect: "2021-01-18 17:03:25",
   267  		},
   268  		{
   269  			name: "udef_ns",
   270  			in:   `{"a":{"timestamp": "1610960605000000000", "second":2},"age":47}`,
   271  			pl: `
   272  	json(_, a.timestamp)
   273  	datetime(a.timestamp, 'ns', '%Y-%m-%d %H:%M:%S')
   274  	`,
   275  			outkey: "a.timestamp",
   276  			expect: "2021-01-18 17:03:25",
   277  		},
   278  		{
   279  			name: "udef_ns_tz_1",
   280  			in:   `{"a":{"timestamp": "1610960605000000000", "second":2},"age":47}`,
   281  			pl: `
   282  	json(_, a.timestamp)
   283  	datetime(a.timestamp, 'ns', '%Y-%m-%d %H:%M:%S', tz="Asia/Tokyo")
   284  	`,
   285  			outkey: "a.timestamp",
   286  			expect: "2021-01-18 18:03:25",
   287  		},
   288  		{
   289  			name: "udef_ns_tz_2",
   290  			in:   `{"a":{"timestamp": 1610960605000000000, "second":2},"age":47}`,
   291  			pl: `
   292  	json(_, a.timestamp)
   293  	datetime(a.timestamp, 'ns', fmt='%Y-%m-%d %H:%M:%S', tz="UTC")
   294  	`,
   295  			outkey: "a.timestamp",
   296  			expect: "2021-01-18 09:03:25",
   297  		},
   298  	}
   299  
   300  	for idx, tc := range cases {
   301  		t.Run(tc.name, func(t *testing.T) {
   302  			runner, err := NewTestingRunner(tc.pl)
   303  			if tc.fail && err == nil {
   304  				t.Error("unknown error")
   305  			}
   306  			if err != nil {
   307  				if tc.fail {
   308  					t.Logf("[%d]expect error: %s", idx, err)
   309  				} else {
   310  					t.Errorf("[%d] failed: %s", idx, err)
   311  				}
   312  				return
   313  			}
   314  			pt := ptinput.NewPlPoint(
   315  				point.Logging, "test", nil, map[string]any{"message": tc.in}, time.Now())
   316  			errR := runScript(runner, pt)
   317  
   318  			if errR != nil {
   319  				t.Fatal(errR)
   320  			}
   321  
   322  			if tc.fail {
   323  				t.Logf("[%d]expect error: %s", idx, err)
   324  			}
   325  			v, _, _ := pt.Get(tc.outkey)
   326  			tu.Equals(t, tc.expect, v)
   327  			t.Logf("[%d] PASS", idx)
   328  		})
   329  	}
   330  }