Files
orbit/pulse/service/service_test.go

54 lines
2.2 KiB
Go

package service
import (
"encoding/json"
"strings"
"testing"
"time"
core "git.yuntuo.hk/k2safe/orbit/model"
pulse "git.yuntuo.hk/k2safe/orbit/pulse/model"
)
func TestSubmitNormalizationAndBounds(t *testing.T) {
base := SubmitInput{QueueID: core.ID(strings.Repeat("1", 32)), Handler: "file.convert", HandlerVersion: "v1", PayloadVersion: "v1", Payload: json.RawMessage(`{"v":9007199254740993}`)}
out, err := NormalizeSubmit(base)
if err != nil || out.RecoverySafety != pulse.RecoveryReconcileOnly || out.Retry.MaxAttempts != 1 || out.TaskTimeoutMS != 86400000 {
t.Fatalf("defaults %+v %v", out, err)
}
for name, change := range map[string]func(*SubmitInput){
"missing queue": func(v *SubmitInput) { v.QueueID = "" },
"missing handler version": func(v *SubmitInput) { v.HandlerVersion = "" },
"null payload": func(v *SubmitInput) { v.Payload = json.RawMessage("null") },
"oversize payload": func(v *SubmitInput) { v.Payload = json.RawMessage(`"` + strings.Repeat("a", 256<<10) + `"`) },
"unbounded attempts": func(v *SubmitInput) { v.Retry.MaxAttempts = 101 },
"unknown recovery policy": func(v *SubmitInput) { v.RecoverySafety = "UNKNOWN" },
"excess timeout": func(v *SubmitInput) { v.TaskTimeoutMS = 30*86400000 + 1 },
"delay equals deadline": func(v *SubmitInput) { v.DelayMS = 86400000 },
"delay overflow": func(v *SubmitInput) { v.DelayMS = ^uint64(0) },
"both timing modes": func(v *SubmitInput) {
now := time.Now().UTC().Truncate(time.Microsecond)
v.AvailableAt = &now
v.DelayMS = 1
},
"sub-microsecond time": func(v *SubmitInput) { now := time.Date(2026, 1, 1, 0, 0, 0, 1, time.UTC); v.AvailableAt = &now },
} {
t.Run(name, func(t *testing.T) {
in := base
change(&in)
if _, err := NormalizeSubmit(in); err == nil {
t.Fatal("accepted invalid input")
}
})
}
base.DelayMS = 86400000 - 1
if out, err := NormalizeSubmit(base); err != nil || out.DelayMS != base.DelayMS || out.AvailableAt != nil {
t.Fatal("relative delay was resolved before database acceptance", err)
}
for _, key := range []string{"", strings.Repeat("a", 129), "with space", "带中文", "line\n"} {
if ValidateKey(key) == nil {
t.Fatal("accepted invalid key")
}
}
}