feat: validate Worker protocol and verify process crash recovery
This commit is contained in:
61
internal/testcontract/worker.go
Normal file
61
internal/testcontract/worker.go
Normal 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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user