166f460d57
- internal/chain/chainmaker.go [//go:build chainmaker]: ChainMakerClient 适配器骨架, 实现 chain.Client 全部方法到合约 Invoke/Query,按角色证书做链上鉴权,错误映射回标准错误 - internal/chain/chainmaker_stub.go [//go:build !chainmaker]: 占位构造函数, 保证默认构建不依赖 SDK、主工程始终可编译 - contracts/tcs_registry/registry.go: 补齐合约方法 RegisterHashBinding/VerifyEpisodeHash/ListEpisodes/HashExists/RecordVersionChange/ RevokeEpisode/Restore/RestoreEpisode/SetContentStatus/QueryMappings/ListContents 并增加集级哈希/映射/版本计数索引 KV 设计 - config: TCS_CHAIN_BACKEND=memory|pg|chainmaker + TCS_CHAINMAKER_SDK_CONF 开关 - cmd/api-svc: newChain 按 backend 选择,chainmaker 失败逐级降级 pg 到内存 - internal/chain/conformance_test.go: chain.Client 契约测试套件,双实现共用 MemoryChain 默认跑;PersistentChain 经 TCS_TEST_PG_DSN;ChainMaker 经 -tags 与 env - 验证: 默认 build/vet/test 全绿;MemoryChain 与 PersistentChain 契约套件均通过,行为一致
37 lines
1.1 KiB
Go
37 lines
1.1 KiB
Go
package chain
|
|
|
|
import (
|
|
"database/sql"
|
|
"os"
|
|
"testing"
|
|
|
|
_ "github.com/lib/pq"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
// TestPersistentChain_Conformance 让 PG 持久化实现跑同一套契约套件。
|
|
//
|
|
// 需要一个可写的测试库:设置 TCS_TEST_PG_DSN 后运行,例如
|
|
//
|
|
// TCS_TEST_PG_DSN='postgres://postgres@localhost:5432/tcs_iptv_test?sslmode=disable' go test ./internal/chain/
|
|
//
|
|
// 未设置则跳过(不污染开发库)。每个子用例前清空镜像表,保证干净状态。
|
|
func TestPersistentChain_Conformance(t *testing.T) {
|
|
dsn := os.Getenv("TCS_TEST_PG_DSN")
|
|
if dsn == "" {
|
|
t.Skip("未设置 TCS_TEST_PG_DSN,跳过 PG 契约测试")
|
|
}
|
|
db, err := sql.Open("postgres", dsn)
|
|
require.NoError(t, err)
|
|
require.NoError(t, db.Ping())
|
|
t.Cleanup(func() { _ = db.Close() })
|
|
|
|
RunClientConformance(t, func(t *testing.T) Client {
|
|
_, err := db.Exec(`TRUNCATE content_registry, hash_binding, identity_mapping, version_history, chain_tx CASCADE`)
|
|
require.NoError(t, err)
|
|
pc, err := NewPersistentChain(db)
|
|
require.NoError(t, err)
|
|
return pc
|
|
})
|
|
}
|