boardtest

package
v0.34.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 12, 2026 License: MIT Imports: 7 Imported by: 0

Documentation

Overview

Package boardtest @@Board@@ 的**共享契约测试套件**。

生命周期: Experimental(v0.33.0 定级)——本包仍会改、删、拆,不承诺任何 兼容,升级风险自负;定级理由见 api-lifecycle.yaml,分级规则见 docs/api-compat.md。

宿主写完存储实现后跑一遍:违反哪条契约就红在哪一条,免得「各判一套、 漂移到没人发现为止」(与 @sidetest@ 同一范式)。

硬失败不静默跳过

显式接入套件 = 声明要满足契约。跳过等于把「没测过」伪装成「通过了」。 续期(@@taskboard.RenewingBoard@@)与种子(Seed)都是可选接口,但 **接入套件就必须实现**——套件对缺失硬失败,不降级、不跳过。

时钟

「租约过期可被接管」「续期把到期时刻推后」这些契约需要可控时钟,否则只能 靠 sleep(慢且 flaky)。套件提供 FakeClock;实现须通过 ClockedBoard 接口 暴露「用哪个时钟」,且**过期判定必须读这个时钟**(不是 time.Now)—— 否则套件的过期场景测的是真实时间,恒不触发,套件就成了一组空断言。 (与 @sidetest@ 的 ClockedStore 同一范式。)

并发规模(issue #97)

「读-判-写不可分割」这条要求在 4 并发下几乎撞不出来。套件把并发认领的 规模做成可配置(Config.ClaimWorkers),缺省跑 **10 与 100** 两档—— 存储实现过 4 并发不算过套件。宿主按自己的生产量级调那一档。

renew.go —— 过期接管与租约续期的契约场景(issue #87)。

四条判据,两两成对:

  • 过期接管后旧持有者提交被拒(迟到提交有判据可拒)↔ 长任务续期后可继续 持有(续期给出路);
  • 接管代次严格递增(代次是真判据不是装饰)↔ 旧令牌续期被拒 (假续期延长的是别人的闸)。

每条场景的判据核心是返回 error 的 checkXxx——变异验证(见 boardtest_test.go) 直接调核心,摘掉判据必红。

token.go —— 令牌铸造与「只认 token」的契约场景。

令牌由存储铸造(v0.33.0),释放/完成只认 token 不认内容。本文件的场景 钉四条:铸造、非持有者被拒、旧令牌重用被拒(ABA)、**跨任务与并发的 令牌复用被拒**(issue #97 新增的两条——各拿各的令牌的并发认领撞不出 「校验与写入分离」,必须让同一令牌的使用者正面相撞)。

Index

Constants

View Source
const DefaultClaimWorkers = 100

DefaultClaimWorkers 大规模并发认领档位的缺省 agent 数。

Variables

This section is empty.

Functions

func Run

func Run(t *testing.T, factory Factory)

Run 跑整套契约判据(缺省规模档位:10 与 100 个 agent)。

func RunConfig added in v0.34.0

func RunConfig(t *testing.T, factory Factory, cfg Config)

RunConfig 跑整套契约判据,并发规模可配置(issue #97)。

每个子测试独立调用 factory(各条例句互不污染)。

Types

type ClockedBoard added in v0.33.0

type ClockedBoard interface {
	taskboard.Board
	// UseClock 指定存储实现读时钟的方式(通常是注入一个 func() time.Time)。
	UseClock(now func() time.Time)
}

ClockedBoard 实现须提供的能力:把时钟注入到存储实现里。

**为什么单独一个接口**:过期判定是存储实现内部的事(它自己知道 「租约还在不在」)。套件不能替它判,只能要求它**用可注入的时钟**。 没实现这个接口 → 套件硬失败(而不是跳过过期场景——跳过等于假绿)。

type Config added in v0.34.0

type Config struct {
	// ClaimWorkers 大规模并发认领判据的 agent 数(零值 = DefaultClaimWorkers)。
	//
	// 套件固定另跑一档 10;本值是「生产量级」那一档,宿主按自己的并发量调
	// ——存储只要过小规模并发就能过套件的时代结束了(issue #97)。
	// 负值在套件启动时即报错:写错的配置要让人看到,不静默回落缺省。
	ClaimWorkers int
}

Config 套件参数(零值 = 缺省档位)。

type Factory added in v0.33.0

type Factory func(t *testing.T, clock *FakeClock) ClockedBoard

Factory 构造被测存储实现。

factory 每个子测试调用一次,构造一份全新实现,并把套件的假时钟注入它。

type FakeClock added in v0.33.0

type FakeClock struct {
	// contains filtered or unexported fields
}

FakeClock 套件提供的假时钟(并发安全;测试内手动推进)。

func NewFakeClock added in v0.33.0

func NewFakeClock() *FakeClock

NewFakeClock 创建起点为 2026-01-01T00:00:00Z 的假时钟。

func (*FakeClock) Advance added in v0.33.0

func (c *FakeClock) Advance(d time.Duration)

Advance 把假时钟前进 d。

func (*FakeClock) Now added in v0.33.0

func (c *FakeClock) Now() time.Time

Now 返回当前假时刻。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL