Failed conditions now explain skips in plain language (e.g. UpdateCount was 0) and truncate long captures so misconfigured apt listings cannot flood the UI.
117 lines
3.5 KiB
Go
117 lines
3.5 KiB
Go
package runner
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestValidateCondition(t *testing.T) {
|
|
if err := ValidateCondition(""); err != nil {
|
|
t.Fatalf("empty: %v", err)
|
|
}
|
|
if err := ValidateCondition("if $UpdateCount >= 1"); err != nil {
|
|
t.Fatalf("valid: %v", err)
|
|
}
|
|
if err := ValidateCondition("$X == \"ok\""); err != nil {
|
|
t.Fatalf("string: %v", err)
|
|
}
|
|
if err := ValidateCondition("not a condition"); err == nil {
|
|
t.Fatal("expected invalid condition error")
|
|
}
|
|
}
|
|
|
|
func TestEvaluateCondition(t *testing.T) {
|
|
vars := map[string]string{"UpdateCount": "3", "Status": "ready"}
|
|
|
|
ok, detail, err := EvaluateCondition("if $UpdateCount >= 1", vars)
|
|
if err != nil || !ok {
|
|
t.Fatalf("expected true, got %v %v", ok, err)
|
|
}
|
|
if detail != "$UpdateCount=3 >= 1" {
|
|
t.Fatalf("detail = %q", detail)
|
|
}
|
|
|
|
ok, detail, err = EvaluateCondition("$UpdateCount >= 10", vars)
|
|
if err != nil || ok {
|
|
t.Fatalf("expected false, got %v %v", ok, err)
|
|
}
|
|
wantFail := "$UpdateCount was 3, which does not meet run condition (>= 10)"
|
|
if detail != wantFail {
|
|
t.Fatalf("detail = %q, want %q", detail, wantFail)
|
|
}
|
|
|
|
ok, detail, err = EvaluateCondition("$Missing >= 1", vars)
|
|
if err != nil || ok {
|
|
t.Fatalf("unset numeric compare should be false, got %v %v", ok, err)
|
|
}
|
|
wantUnset := "$Missing was unset, which does not meet run condition (>= 1)"
|
|
if detail != wantUnset {
|
|
t.Fatalf("detail = %q, want %q", detail, wantUnset)
|
|
}
|
|
|
|
ok, detail, err = EvaluateCondition("$Status == ready", vars)
|
|
if err != nil || !ok {
|
|
t.Fatalf("string eq expected true, got %v %v", ok, err)
|
|
}
|
|
if detail != "$Status=ready == ready" {
|
|
t.Fatalf("detail = %q", detail)
|
|
}
|
|
|
|
ok, detail, err = EvaluateCondition("", vars)
|
|
if err != nil || !ok {
|
|
t.Fatalf("empty should be true, got %v %v", ok, err)
|
|
}
|
|
if detail != "" {
|
|
t.Fatalf("empty detail = %q", detail)
|
|
}
|
|
|
|
ok, detail, err = EvaluateCondition("$Status != 'busy'", vars)
|
|
if err != nil || !ok {
|
|
t.Fatalf("quoted ne expected true, got %v %v", ok, err)
|
|
}
|
|
if detail != "$Status=ready != busy" {
|
|
t.Fatalf("detail = %q", detail)
|
|
}
|
|
}
|
|
|
|
func TestEvaluateConditionDetailUnset(t *testing.T) {
|
|
ok, detail, err := EvaluateCondition("if $UpdateCount >= 10", map[string]string{})
|
|
if err != nil || ok {
|
|
t.Fatalf("expected false, got %v %v", ok, err)
|
|
}
|
|
want := "$UpdateCount was unset, which does not meet run condition (>= 10)"
|
|
if detail != want {
|
|
t.Fatalf("detail = %q, want %q", detail, want)
|
|
}
|
|
}
|
|
|
|
func TestEvaluateConditionSkipDetailZero(t *testing.T) {
|
|
ok, detail, err := EvaluateCondition("if $UpdateCount >= 1", map[string]string{"UpdateCount": "0"})
|
|
if err != nil || ok {
|
|
t.Fatalf("expected false, got %v %v", ok, err)
|
|
}
|
|
want := "$UpdateCount was 0, which does not meet run condition (>= 1)"
|
|
if detail != want {
|
|
t.Fatalf("detail = %q, want %q", detail, want)
|
|
}
|
|
}
|
|
|
|
func TestEvaluateConditionSkipDetailTruncatesLongValue(t *testing.T) {
|
|
longValue := strings.Repeat("x", skipDetailMaxValueLen+20)
|
|
ok, detail, err := EvaluateCondition("if $UpdateCount >= 1", map[string]string{"UpdateCount": longValue})
|
|
if err != nil || ok {
|
|
t.Fatalf("expected false, got %v %v", ok, err)
|
|
}
|
|
truncated := truncateForSkipDetail(longValue)
|
|
want := "$UpdateCount was " + truncated + ", which does not meet run condition (>= 1)"
|
|
if detail != want {
|
|
t.Fatalf("detail = %q, want %q", detail, want)
|
|
}
|
|
if !strings.HasSuffix(truncated, "…") {
|
|
t.Fatalf("expected truncation ellipsis in %q", truncated)
|
|
}
|
|
if len([]rune(truncated)) != skipDetailMaxValueLen+1 {
|
|
t.Fatalf("truncated length = %d", len([]rune(truncated)))
|
|
}
|
|
}
|