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") } } }