77 lines
2 KiB
Go
77 lines
2 KiB
Go
package rpc
|
||
|
||
import (
|
||
"testing"
|
||
|
||
"telesrv/internal/domain"
|
||
)
|
||
|
||
func TestCallbackRegistryResolveDelivers(t *testing.T) {
|
||
reg := newCallbackRegistry()
|
||
queryID, p := reg.register(100, 200)
|
||
if queryID == 0 {
|
||
t.Fatal("query id must be non-zero")
|
||
}
|
||
want := domain.BotCallbackAnswer{Alert: true, Message: "hi"}
|
||
if !reg.resolve(100, queryID, want) {
|
||
t.Fatal("resolve by owner bot must succeed")
|
||
}
|
||
select {
|
||
case got := <-p.ch:
|
||
if got != want {
|
||
t.Fatalf("delivered %+v, want %+v", got, want)
|
||
}
|
||
default:
|
||
t.Fatal("answer not delivered to channel")
|
||
}
|
||
// 解挂后条目已删除:再次 resolve 失败、registry 计数归零。
|
||
if reg.resolve(100, queryID, want) {
|
||
t.Fatal("second resolve must fail (already deregistered)")
|
||
}
|
||
if n := reg.size(); n != 0 {
|
||
t.Fatalf("registry size = %d, want 0 after resolve", n)
|
||
}
|
||
}
|
||
|
||
func TestCallbackRegistryNonOwnerRejected(t *testing.T) {
|
||
reg := newCallbackRegistry()
|
||
queryID, p := reg.register(100, 200)
|
||
// 非属主 bot(999)不得解挂(I6)。
|
||
if reg.resolve(999, queryID, domain.BotCallbackAnswer{Message: "evil"}) {
|
||
t.Fatal("non-owner resolve must be rejected")
|
||
}
|
||
select {
|
||
case <-p.ch:
|
||
t.Fatal("non-owner answer must not be delivered")
|
||
default:
|
||
}
|
||
if n := reg.size(); n != 1 {
|
||
t.Fatalf("registry size = %d, want 1 (entry retained after rejected resolve)", n)
|
||
}
|
||
reg.deregister(queryID)
|
||
if n := reg.size(); n != 0 {
|
||
t.Fatalf("registry size = %d, want 0 after deregister", n)
|
||
}
|
||
}
|
||
|
||
func TestCallbackRegistryUnknownQuery(t *testing.T) {
|
||
reg := newCallbackRegistry()
|
||
if reg.resolve(100, 12345, domain.BotCallbackAnswer{}) {
|
||
t.Fatal("resolve of unregistered query must fail")
|
||
}
|
||
}
|
||
|
||
func TestCallbackRegistryUniqueQueryIDs(t *testing.T) {
|
||
reg := newCallbackRegistry()
|
||
seen := make(map[int64]struct{})
|
||
for i := 0; i < 1000; i++ {
|
||
q, _ := reg.register(1, 2)
|
||
if _, dup := seen[q]; dup {
|
||
t.Fatalf("duplicate query id %d", q)
|
||
}
|
||
seen[q] = struct{}{}
|
||
}
|
||
if n := reg.size(); n != 1000 {
|
||
t.Fatalf("registry size = %d, want 1000", n)
|
||
}
|
||
}
|