Add unix expr helper (#1952)

* Add unix expr helper

* Add original value not parsed error

* return early if cannot parse

* Add tests

* Fix negative value
This commit is contained in:
Laurence Jones 2022-12-29 14:53:06 +00:00 committed by GitHub
parent e4463c412b
commit 401739b036
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 73 additions and 2 deletions

View file

@ -68,6 +68,7 @@ func GetExprEnv(ctx map[string]interface{}) map[string]interface{} {
"GetDecisionsCount": GetDecisionsCount,
"GetDecisionsSinceCount": GetDecisionsSinceCount,
"Sprintf": fmt.Sprintf,
"ParseUnix": ParseUnix,
}
for k, v := range ctx {
ExprLib[k] = v
@ -283,10 +284,20 @@ func GetDecisionsSinceCount(value string, since string) int {
}
func LookupHost(value string) []string {
addresses , err := net.LookupHost(value)
addresses, err := net.LookupHost(value)
if err != nil {
log.Errorf("Failed to lookup host '%s' : %s", value, err)
return []string{}
return []string{}
}
return addresses
}
func ParseUnix(value string) string {
//Splitting string here as some unix timestamp may have milliseconds and break ParseInt
i, err := strconv.ParseInt(strings.Split(value, ".")[0], 10, 64)
if err != nil || i <= 0 {
log.Errorf("Unable to parse %s as unix timestamp.", value)
return ""
}
return time.Unix(i, 0).Format(time.RFC3339)
}

View file

@ -971,3 +971,63 @@ func TestGetDecisionsSinceCount(t *testing.T) {
log.Printf("test '%s' : OK", test.name)
}
}
func TestParseUnix(t *testing.T) {
tests := []struct {
name string
env map[string]interface{}
code string
result string
err string
}{
{
name: "ParseUnix() test: valid value with milli",
env: map[string]interface{}{
"unix": "1672239773.3590894",
"ParseUnix": ParseUnix,
},
code: "ParseUnix(unix)",
result: "2022-12-28T15:02:53Z",
err: "",
},
{
name: "ParseUnix() test: valid value without milli",
env: map[string]interface{}{
"unix": "1672239773",
"ParseUnix": ParseUnix,
},
code: "ParseUnix(unix)",
result: "2022-12-28T15:02:53Z",
err: "",
},
{
name: "ParseUnix() test: invalid input",
env: map[string]interface{}{
"unix": "AbcDefG!#",
"ParseUnix": ParseUnix,
},
code: "ParseUnix(unix)",
result: "",
err: "",
},
{
name: "ParseUnix() test: negative value",
env: map[string]interface{}{
"unix": "-1000",
"ParseUnix": ParseUnix,
},
code: "ParseUnix(unix)",
result: "",
err: "",
},
}
for _, test := range tests {
program, err := expr.Compile(test.code, expr.Env(test.env))
require.NoError(t, err)
output, err := expr.Run(program, test.env)
require.NoError(t, err)
require.Equal(t, test.result, output)
log.Printf("test '%s' : OK", test.name)
}
}