feat: validate Worker protocol and verify process crash recovery

This commit is contained in:
2026-09-17 15:17:09 +08:00
parent 4d4b2e9f7d
commit 9e3d4be5cc
23 changed files with 1878 additions and 28 deletions

View File

@@ -0,0 +1,61 @@
// Package testcontract 在回归中校验实际报文与公开 Schema,服务二进制不依赖此包。
package testcontract
import (
"strings"
"sync"
"testing"
"git.yuntuo.hk/k2safe/orbit/protocol/workerv1"
"github.com/santhosh-tekuri/jsonschema/v6"
)
var workerOnce sync.Once
var workerSchemas map[string]*jsonschema.Schema
var workerError error
// WorkerSchema 编译并缓存两个方向的 Schema;开启 date-time 等格式断言。
func WorkerSchema(t testing.TB, direction string) *jsonschema.Schema {
t.Helper()
workerOnce.Do(func() {
compiler := jsonschema.NewCompiler()
compiler.AssertFormat()
doc, err := jsonschema.UnmarshalJSON(strings.NewReader(workerv1.Schema))
if err != nil {
workerError = err
return
}
const resource = "https://git.yuntuo.hk/k2safe/orbit/schema/worker.v1.json"
if err := compiler.AddResource(resource, doc); err != nil {
workerError = err
return
}
workerSchemas = make(map[string]*jsonschema.Schema)
for _, side := range []string{"client", "server"} {
workerSchemas[side], workerError = compiler.Compile(resource + "#/$defs/" + side + "Frame")
if workerError != nil {
return
}
}
})
if workerError != nil {
t.Fatal(workerError)
}
schema := workerSchemas[direction]
if schema == nil {
t.Fatal("unknown Worker protocol direction")
}
return schema
}
// WorkerFrame 验证真实传输的 JSON,不在错误中输出可能包含秘密的报文正文。
func WorkerFrame(t testing.TB, direction string, raw []byte) {
t.Helper()
value, err := jsonschema.UnmarshalJSON(strings.NewReader(string(raw)))
if err != nil {
t.Fatal("Worker frame is not valid JSON")
}
if WorkerSchema(t, direction).Validate(value) != nil {
t.Fatalf("%s Worker frame violates published Schema", direction)
}
}