Core 单元测试覆盖标准与矩阵
标准(强制):
TC.Tier.Core的每一个组件都必须有完整的单元测试,测试文件与源文件目录一一对应 (src/TC.Tier.Core/Collections/X.cs↔tests/TC.Tier.Core.Tests/Collections/XTests.cs)。为什么:只要留给集成测试,问题就会被隐藏——
LockWord(SpinRWLock 前身)的 OR 置位 bug 单线程两次获取+两次释放即可捕获,却因为原语零单测被推到集成层,表现为"楔死/flaky", 被误读为"压测不稳定"数月。原语 = 最高杠杆的测试投资点:一行实现的错误 × 所有上层依赖 = 系统性灾难。并发 / 队列 / 锁是死锁高发区,特别注意:
- 并发原语必须有契约测试(计数语义、互斥、唤醒协议、无配对操作的绊线行为),不能只有功能测试;
- 核心隐蔽场景必须有 Debug 模式的验证与跟踪(
#if DEBUG常设仪器,Release 零开销)—— SpinRWLock 的值示波器(最近 24 次原子操作环形记录 + 绊线携带历史)即为此范例;- 禁止用 SKIP 跳过并发测试——跳过 = 把问题藏回集成层。并发测试 flaky 要修根因(轮询/事件对齐), 不是禁用。
- 满套假红双保险(三连假红后确立):①宿主层——测试项目各有一个
TestHostThreadPool(ModuleInitializer +ThreadPool.SetMinThreads(64,64)),消除并行 collection 打满池后 Task.Run 起跑延迟秒级的注入节流(固定毫秒 Wait 假红的根因); ②用例层——对并行负载敏感的等待写SpinWait.SpinUntil轮询而非固定Wait(N) (抗完成慢)。 新写并发测试两层的假设都要满足;生产代码禁止模仿①(掩盖真实饥饿是生产 bug)。
覆盖矩阵(审计;补录 IO/ 层与 AsyncPriorityQueueV3)
图例:✅ 完整契约测试 | 🟡 部分覆盖(需加强) | 🔴 无测试(必修) | ⚪ 声明/P-Invoke/枚举,不适用单测(靠探针/使用方覆盖)
Collections/(并发队列/缓存——死锁高发区)
| 源文件 | 测试(1:1 路径) | 状态 |
|---|---|---|
| AsyncPriorityQueue.cs | Collections/AsyncPriorityQueueTests.cs | ✅ 生产基线(Route A marker 协议重写——直接引用+marker 节点+GC 回收;压力契约测试+DEBUG 链校验器+楔死看门狗) |
| AsyncPriorityQueueV2.cs | Collections/AsyncPriorityQueueV2Tests.cs | 🔬(实验线——收敛为非生产,测试默认 Skip(标注含理由);历史:18/19 稳定通过 + 零分配实证) |
| AsyncPriorityQueueV3.cs | Collections/AsyncPriorityQueueV3Tests.cs | 🔬(实验线——原生 32B 槽位版,测试默认 Skip;见 priority-queues.md) |
| AsyncPriorityQueueV4.cs | Collections/AsyncPriorityQueueV4Tests.cs | 🔬(实验线——[Experimental("TCTier001")] internal,验证后默认 Skip;见 priority-queues.md) |
| AsyncQueue.cs | Collections/AsyncQueueTests.cs | ✅ |
| BucketPriorityQueue.cs | Collections/BucketPriorityQueueTests.cs | ✅(多消费者 counting-semaphore 公平唤醒是引擎 worker 基石) |
| ClockCache.cs | Collections/ClockCacheTests.cs | ✅ |
| ClockCacheV2.cs | Collections/ClockCacheV2Tests.cs | ✅(组相联 CLOCK——miss 悬崖消除) |
| OverflowPool.cs | Collections/OverflowPoolTests.cs | ✅ |
| PinnedBufferPool.cs | Collections/PinnedBufferPoolTests.cs | ✅ |
| ShardLockWeakReference.cs | Collections/ShardLockWeakReferenceTests.cs | ✅(补:弱语义/并发/清理) |
| SkipListPriorityQueue.cs | Collections/SkipListPriorityQueueTests.cs | ✅ |
Primitives/(原语——最高杠杆)
| 源文件 | 测试 | 状态 |
|---|---|---|
| Atomic128.cs | Primitives/Atomic128Tests.cs | ✅ |
| SpinRWLock.cs | Primitives/SpinRWLockTests.cs | ✅(自 LockWord 重构承接,v2 扩至 11 契约测试——OR 置位回归族 + 写偏向三契约【后到读者让位序号断言/pending 释放卫生】+ Try 变体两契约【TryExclusive 失败不挂闸】+ 无损伤绊线【触发后锁仍可用】) |
| FairGate.cs | Primitives/FairGateTests.cs | ✅(下沉:4 契约测试——计数配对/唤醒活性/8 线程单槽长持窗口无饿死压测) |
| SpinLockScope.cs | Primitives/SpinLockScopeTests.cs | ✅(补:互斥/异常释放/并发) |
| MicroTimer.cs | Primitives/MicroTimerTests.cs | ✅ |
| SectorAlignment.cs / AlignmentConst.cs | Primitives/SectorAlignmentTests.cs | ✅ |
| KeyComparer.cs / IKeyComparer.cs | Primitives/KeyComparerTests.cs | ✅ |
| UnifiedCrc.cs | Primitives/UnifiedCrcTests.cs | ✅ |
| ThrowHelper.cs | Primitives/ThrowHelperTests.cs | ✅ |
| AlignedMemoryManager.cs | Primitives/AlignedMemoryManagerTests.cs | ✅ |
| NodeArena.cs | Primitives/NodeArenaTests.cs | ✅(自 Runtime/Structures 迁入归位——非托管分配原语本性归 Core;6 契约测试:8 对齐/指针恒稳跨块不搬移/块跨越/超块直通/并发 Alloc 无重叠/Dispose 幂等) |
| AsyncCountDown.cs | Primitives/AsyncCountDownTests.cs | ✅ |
| AsyncManualResetEvent.cs | Primitives/AsyncManualResetEventTests.cs | ✅ |
| AsyncOperation.cs | Primitives/AsyncOperationTests.cs | ✅(新增:状态句柄原语——终态 CAS 单次/幂等、并发 Report 收敛、Wait 有界/超时/取消、WaitAsync 失败重抛、多 waiter 广播、完成先于等待零丢失、观察标记(泄漏绊线契约)24 例;设计见 sync-async-bridge.md) |
| PooledValueTaskSource.cs | Primitives/PooledValueTaskSourceTests.cs | ✅ |
| PooledValueTaskSourceOfT.cs | Primitives/PooledValueTaskSourceOfTTests.cs | ✅(泛型形态——池化 IValueTaskSource<T>) |
| PooledBufferWriter.cs | Primitives/PooledBufferWriterTests.cs | ✅ |
| MonitorScope.cs | —(无 1:1 测试) | 🔴(缺口——Monitor 语义薄封装,现经 SpinRWLock/FairGate 测试间接覆盖;按 1:1 铁律补契约测试) |
| NativeArena.cs | Primitives/NativeArenaTests.cs | ✅ |
| Utility.cs | Primitives/UtilityTests.cs | ✅ |
Lifecycle/(生命周期骨架)+ Execution/(执行模型)+ Resources/(资源治理)
| 源文件 | 测试 | 状态 |
|---|---|---|
| BackgroundWorkerLoop(.cs) | Execution/BackgroundWorkerLoopTests.cs + GenericTests.cs | ✅ |
| IsolatedTaskScheduler.cs | Execution/IsolatedTaskSchedulerTests.cs | ✅(性能基准另见 benchmarks/TC.Tier.Core.Benchmarks/Execution/IsolatedTaskSchedulerBench.cs,使用指南 dedicated-task-scheduler.md) |
| SyncAsyncBridge.cs | Execution/SyncAsyncBridgeTests.cs | ✅(新增:同步-异步桥——Run 三轨(成功/失败/取消/超时现场)、Start 返回即 Running(可见性原则机器验证)、同池再入必抛+分池豁免、continuation 回流桥池私有线程、池饿死回归(打满公共池桥仍完成)、并发压测 14 例;设计见 sync-async-bridge.md) |
| AsyncPump.cs | Execution/AsyncPumpTests.cs | ✅(新增:单线程异步泵——续体回流同线程/多续体顺序/返回值/异常重抛/发起段抛+上下文还原/嵌套自锁快速失败/上下文还原/ConfigureAwait(false) 段安全完成/空转等待唤醒/取消打断/并发实例独立/千续体全排空/Send 就地执行 13 例) |
| TaskSink.cs | Execution/TaskSinkTests.cs | ✅(fire-and-forget 治理——Submit/SubmitFast:生命周期/取消/异常隔离一体;丢弃任意 Task 即泄漏的分析器配套原语) |
| DeadlineRegistry.cs | Execution/DeadlineRegistryTests.cs | ✅ |
| SyncBridgeOptions.cs | —(record,经 SyncAsyncBridgeTests 全路径使用) | ⚪ |
| IsolatedSchedulerOptions.cs | —(配置 record,经 IsolatedTaskSchedulerTests 全路径使用) | ⚪ |
| SchedulerRestartPolicy.cs | —(枚举,经 IsolatedTaskSchedulerTests Restart_* 覆盖) | ⚪ |
| LifecycleBase.cs | Lifecycle/LifecycleBaseWorkerIntegrationTests.cs | 🟡(集成级;模板方法契约:CAS 门控/Dispose 顺序/异常聚合需加强) |
| RecoveryBase.cs | Lifecycle/RecoverySkeletonTests.cs | ✅ |
| ResourceGroup.cs | Resources/ResourceGroupTests.cs | ✅ |
| InstanceTracker.cs | Resources/InstanceTrackerTests.cs | ✅(补:注册/注销/子串过滤/弱跟踪) |
| CpuSampler.cs | Execution/CpuSamplerTests.cs | ✅(数学重构:EMA 首样本标志/构造校验/Hub 折叠 + 可测性缝 ApplyEma/MapThrottleFactor,17 测试锁定契约) |
| ResourceInfo/ResourceOwnership/TrackedInstance/WorkerPriority | — | ⚪(record/枚举,经使用方覆盖) |
Epochs/ ✅(补:LightEpoch 协议绊线 8 测试 + 常设 Debug 示波器)
LightEpoch/FastThreadLocal/EpochProtectedVersionScheme/VersionSchemeStateMachine/VersionSchemeState 均有对应测试。
LightEpochTests 补齐协议违反绊线测试(未 Resume 就 Bump/Suspend、跨线程 Suspend、保护区重入、嵌套 bump、Dispose 持保护、drain action 异常)——Debug 构建断言立即抛异常(消息含协议操作历史),Release 构建断言零开销不抛。
Hazards/ ✅
HazardPointers.cs ↔ Hazards/HazardPointersTests.cs(无锁回收安全协议——pointer 发布/reclaim 栅栏契约)。
Logging / Metrics / Observability / Tracing ✅/🟡
LoggerExtensions、NullLogger、Metrics、ObservabilityHub、Tracing 有测试;各 ObservabilityHub.*.cs 分视图由 ObservabilityHubTests 覆盖(🟡 维度视图逐个加强属后续)。
NativeInterop/ ⚪(P/Invoke 声明层)
Kernel32/LibC 等为声明,不适用进程内单测;行为由探针测试覆盖(FileNativePunchHole/Preallocate/FileMetadataProbe/CompactPrototype)。
IO/(文件 IO 原语层——io.md,补录)
| 源文件 | 测试(1:1 路径) | 状态 |
|---|---|---|
| TierSpec.cs(spec 解析/规范形——P1 协议层;StorageNature/AccessMode 枚举随之覆盖) | IO/TierSpecTests.cs | ✅(表驱动 76 用例:四本性头/二级首段/local 路径域四形态/快捷档/参数封闭集/×文件系统合法性/规范形往返稳定) |
| TierFs.cs(工厂——动词契约/位置落定/两级注册表)+ FileSystemOptions.cs(基类四成员 Access/Label/QuotaBytes/Exclusive)+ VolumeInfo.cs(九成员自描述)+ Shared/AccessGate.cs(G2 包络共享执法) | IO/TierFsTests.cs(spec 全参数四类文件系统真执法:三态+包络构造期/惰性配额写前拒/label 往返/exclusive 挂载持有与释放/VolumeInfo 自描述/动词契约/CWD 固化/fake 协议注册表) | ✅ |
| IFileSystem.cs / IFileHandle.cs(公开契约 + 能力协商) | IO/FileSystemContractTests.cs | ✅ |
| FileOpenOptions.cs(+ 枚举族 FileOpenMode/Access/Sharing/Hints、FileAdvise、MapAccess、FileLockMode) | IO/FileOpenOptionsTests.cs | ✅ |
| FileHandlePool.cs | IO/FileHandlePoolTests.cs | ✅(池归还协议 + MappedSection 间接涉及) |
| Disk/DiskFileHandle.cs | IO/Disk/DiskFileHandleTests.cs | ✅ |
| Disk/DiskFileSystem.cs | IO/Disk/DiskFileSystemTests.cs | ✅ |
| Disk/DiskMappedSection.cs / Mem/MemMappedSection.cs | —(经 FileSystemContractTests/FileHandlePoolTests 间接覆盖) | 🟡(映射生命周期 1:1 测试属后续) |
| Mem/MemFileHandle.cs / MemoryFileSystem.cs | IO/Mem/MemoryFileSystemTests.cs + MemoryFileSystemConcurrencyTests.cs | ✅(双分配模式 + 并发契约专测) |
| Testing/FaultInjectingFileSystem.cs | IO/Testing/FaultInjectingFileSystemTests.cs | ✅ |
| IObjectStore.cs(接口本体 + 流式 List DIM)/ IMultipartUpload.cs(multipart 族伴生:接口 + UploadPartResult + MultipartUploadSession)/ ObjectMetadata.cs / ObjectInfo.cs(含 ObjectEntry)/ CopyMetadata.cs / ObjectKeyValidator.cs / ObjectStoreExtensions.cs / ObjectStoreCapabilities.cs(含条件结构体)——一类型族一文件(B3.0② + 增补拆分) | IO/ObjectStoreContractTypesTests.cs(类型校验:元数据键集/2KB 超限/键长字节口径/能力位冻结——跨契约族类型级测试) | ✅ |
| Testing/MemoryObjectStore.cs(对象层内存替身——B3.1) | IO/ObjectStoreContractTests.cs(参数化契约平权套,public 跨工程)+ IO/MemoryObjectStoreTests.cs(仪器/并发抢建/会话生命周期) | ✅ |
| Remote/RemoteFileSystem.cs / RemoteFileHandle.cs / StagingBuffer.cs / RemoteFileSystemOptions.cs(B3.3/B3.4 + 增补 P1-P5:孤儿扫描/增量 Flush/洞元数据/内存 spill) | IO/Remote/RemoteFileSystemTests.cs(§7.1 全项:staging/H1 回填/H2 池协议/M4 游标/H3 打洞/延迟加载计数/路径穿越/CopyRange 双路径/元数据/L5 差异专项/恢复/spill/孤儿清理/增量 Flush 计数断言/洞读零 GET/SpillToMemory)+ IO/Remote/RemoteFencingTests.cs(互斥/接管/token 防误删/降级) | ✅ |
| FileIOException.cs / IOError.cs / VolumeInfo.cs / FileSystemCapabilities.cs | — | ⚪(异常/枚举/记录,经使用方覆盖) |
| Shared/(internal:HandlePoolAttachment/IOExceptionMapper/PathValidator/PathPattern/AppendCursor/IPoolAttachable) | PathValidator 单测在 IO/FileOpenOptionsTests.cs(ValidateRelative 规则集);PathPattern 1:1 在 IO/Shared/PathPatternTests.cs;其余经 FileHandlePoolTests/Disk 测试间接覆盖 | 🟡→🟢(PathValidator/PathPattern 已专测;HandlePoolAttachment 的 Debug 绊线在源内常设) |
TC.Tier.Core.IO.S3(S3 兼容对象层——B3.2,独立程序集)
| 源文件 | 测试(1:1 路径,tests/TC.Tier.Core.IO.S3.Tests/) | 状态 |
|---|---|---|
| SigV4.cs | SigV4GoldenVectorTests.cs(AWS 官方黄金向量逐字节 + RFC3986 编码器 + canonical query 排序) | ✅ |
| S3ObjectStore.cs / S3Xml.cs | S3ObjectStoreFakeServerTests.cs(进程内假 S3 服务器:服务端重算签名验证 + 真实 XML/分页/条件/multipart/503 注入) | ✅ |
| S3ObjectStore.cs(真协议终验) | S3ObjectStoreMinioContractTests.cs(继承 ObjectStoreContractTests,环境门控 TIER_S3_TEST_ENDPOINT/TIER_S3_TEST_VHOST——scripts/run-minio-tests.sh(MinIO 容器)/ scripts/run-cos-tests.sh(真 COS)) |
✅(MinIO 25/25;真实腾讯 COS 32/32 全功能面(2026-09-12 ap-nanjing tier-1253530278 直连复验——vhost 寻址,含会话治理/流式 List/chunked PUT/LastModified 上报;夹具 PrefixedObjectStore 曾丢 List 条目 LastModified,被本套真端点咬住修复)) |
| ChunkedSignedStream.cs / SigV4 chunked 链(增补 P4) | ChunkedSignedStream_ProducesFramedBytes + PutChunked_*(假服务器链式签名独立重算) | ✅ |
| S3ClientOptions.cs / 凭证源 | 经上述测试构造覆盖(校验器 + Host 头派生在黄金向量/假服务器断言中触达) | 🟡 |
| TierFsS3Binding.cs(s3 协议构建器 + ModuleInitializer 自动注册——P1-3) | TierFsS3BindingTests.cs | ✅(自动注册/组装映射(prefix/spill 二态)/cred env: 解析(缺失/畸形/缺席 fail-fast)/阶段号指针——Create 零网络无需真实端点) |
维护规则
- 新增 Core 源文件 → 同 PR 必须带同路径测试文件,否则不许合入。
- 并发/锁/队列组件的测试必须含:契约语义(计数/互斥/唤醒)+ 无配对操作绊线 + Debug 跟踪设施。
- 本矩阵随覆盖变化更新(审计命令:比对
src/TC.Tier.Core/**与tests/TC.Tier.Core.Tests/**的文件名集合)。