package core import ( "encoding/json" "fmt" "os" "testing" "modelrouter/internal/lua" ) // 手工移植的确定性派生必须与参考**逐字节一致**,否则签名的设备身份是错的 // 且不会报错(上游只会返回风控/失败)。所以拿参考实现(Node + node:crypto) // 生成期望值,再让插件的 Lua 实现算同一组输入做差分。 // // 期望值由 tools/trae_derive_expected.json 提供(用参考 seededStream 生成)。 func TestTraeDeriveMatchesReference(t *testing.T) { raw, err := os.ReadFile("trae_derive_expected.json") if err != nil { t.Skipf("缺差分数据(跳过): %v", err) } var cases []struct { U string `json:"u"` Devid string `json:"devid"` Market string `json:"market"` Sess string `json:"sess"` } if err := json.Unmarshal(raw, &cases); err != nil { t.Fatal(err) } c := kernelTestCore(t) ps := c.Plugins() src, err := readBundledChannels(t) if err != nil { t.Fatal(err) } if err := ps.LoadSource("channels", src); err != nil { t.Fatal(err) } for _, tc := range cases { got, err := ps.Call("channels", "__trae_derive_probe", map[string]interface{}{"uid": tc.U}) if err != nil { t.Fatalf("probe %q: %v", tc.U, err) } wrapped, _ := got.(map[string]interface{}) m, _ := wrapped["json"].(map[string]interface{}) if m == nil { t.Fatalf("probe %q 无 json: %#v", tc.U, got) } if fmt.Sprint(m["devid"]) != tc.Devid { t.Errorf("devid(%q) = %v,参考 %s", tc.U, m["devid"], tc.Devid) } if fmt.Sprint(m["market"]) != tc.Market { t.Errorf("market(%q) = %v,参考 %s", tc.U, m["market"], tc.Market) } if fmt.Sprint(m["sess"]) != tc.Sess { t.Errorf("sess(%q) = %v,参考 %s", tc.U, m["sess"], tc.Sess) } } _ = lua.HandlerRequest{} }