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