Files
MAcode/tcs-iptv/internal/chain/persistent_conformance_test.go
T
selfrelease 166f460d57 feat(chain): ChainMaker 真实链接入脚手架(build tag 隔离)+ 契约测试
- 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 契约套件均通过,行为一致
2026-06-14 20:47:21 +08:00

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