notify/pending_wait_signal_ack_test.go
starainrt 09d972c7b7
feat(notify): 重构通信内核并补齐 stream/bulk/record/transfer 能力
- 引入 LogicalConn/TransportConn 分层,ClientConn 保留兼容适配层
  - 新增 Stream、Bulk、RecordStream 三条数据面能力及对应控制路径
  - 完成 transfer/file 传输内核与状态快照、诊断能力
  - 补齐 reconnect、inbound dispatcher、modern psk 等基础模块
  - 增加大规模回归、并发与基准测试覆盖
  - 更新依赖库
2026-04-15 15:24:36 +08:00

68 lines
2.1 KiB
Go

package notify
import (
"testing"
"time"
)
func TestPendingWaitPoolDeliverWithScope(t *testing.T) {
pool := newPendingWaitPool()
wait := pool.createAndStoreWithScope(TransferMsg{ID: 11, Key: "k", Type: MSG_SYNC_ASK}, "scope-a")
if delivered := pool.deliverWithScopes(11, []string{"scope-b"}, Message{}); delivered {
t.Fatal("deliverWithScopes should reject mismatched scope")
}
msg := Message{TransferMsg: TransferMsg{ID: 11, Key: "k", Type: MSG_SYNC_REPLY}}
if delivered := pool.deliverWithScopes(11, []string{"scope-a"}, msg); !delivered {
t.Fatal("deliverWithScopes should accept matching scope")
}
select {
case got := <-wait.Reply:
if got.ID != msg.ID || got.Type != msg.Type {
t.Fatalf("delivered message mismatch: got=%+v want=%+v", got.TransferMsg, msg.TransferMsg)
}
default:
t.Fatal("wait reply should receive delivered message")
}
}
func TestPendingWaitPoolCloseScopeClosesReplies(t *testing.T) {
pool := newPendingWaitPool()
wait := pool.createAndStoreWithScope(TransferMsg{ID: 12, Key: "k", Type: MSG_SYNC_ASK}, "scope-close")
pool.closeScope("scope-close")
select {
case _, ok := <-wait.Reply:
if ok {
t.Fatal("wait reply channel should be closed")
}
case <-time.After(time.Second):
t.Fatal("timed out waiting for closed wait reply")
}
}
func TestSignalAckPoolDeliverAny(t *testing.T) {
pool := newSignalAckPool()
wait := pool.prepare("scope-a", 21)
if delivered := pool.deliverAny([]string{"scope-b"}, 21); delivered {
t.Fatal("deliverAny should reject mismatched scope")
}
go func() {
time.Sleep(10 * time.Millisecond)
_ = pool.deliverAny([]string{"scope-a"}, 21)
}()
if err := pool.waitPrepared(wait, time.Second); err != nil {
t.Fatalf("waitPrepared failed: %v", err)
}
}
func TestSignalAckPoolCloseScopeCancelsWait(t *testing.T) {
pool := newSignalAckPool()
wait := pool.prepare("scope-close", 22)
go func() {
time.Sleep(10 * time.Millisecond)
pool.closeScope("scope-close")
}()
if err := pool.waitPrepared(wait, time.Second); err != errSignalAckCanceled {
t.Fatalf("waitPrepared error = %v, want %v", err, errSignalAckCanceled)
}
}