init: 自 zomaintain/backend/rdplib 平移独立成库; module path 从上游 github.com/nakagami/grdp 改为 git.zeroonesoft.cn/golib/rdplib
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
package grdp
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"git.zeroonesoft.cn/golib/rdplib/plugin/rdpgfx"
|
||||
"git.zeroonesoft.cn/golib/rdplib/protocol/pdu"
|
||||
)
|
||||
|
||||
// fakeBmpStore 记录 Persist 调用并提供 Get/Keys,用于验证
|
||||
// CacheBitmapV2 持久键的跨会话存取(6.4b M2)。
|
||||
type fakeBmpStore struct {
|
||||
persisted map[uint64]rdpgfx.GfxCacheEntry
|
||||
}
|
||||
|
||||
func newFakeBmpStore() *fakeBmpStore {
|
||||
return &fakeBmpStore{persisted: map[uint64]rdpgfx.GfxCacheEntry{}}
|
||||
}
|
||||
|
||||
func (f *fakeBmpStore) Persist(key uint64, w, h int, bpp uint16, data []byte) {
|
||||
f.persisted[key] = rdpgfx.GfxCacheEntry{Key: key, Width: w, Height: h, Bpp: bpp, Data: data}
|
||||
}
|
||||
func (f *fakeBmpStore) Export() []rdpgfx.GfxCacheEntry {
|
||||
out := make([]rdpgfx.GfxCacheEntry, 0, len(f.persisted))
|
||||
for _, e := range f.persisted {
|
||||
out = append(out, e)
|
||||
}
|
||||
return out
|
||||
}
|
||||
func (f *fakeBmpStore) Get(key uint64) (rdpgfx.GfxCacheEntry, bool) {
|
||||
e, ok := f.persisted[key]
|
||||
return e, ok
|
||||
}
|
||||
func (f *fakeBmpStore) Keys() []uint64 {
|
||||
out := make([]uint64, 0, len(f.persisted))
|
||||
for k := range f.persisted {
|
||||
out = append(out, k)
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// TestStoreBitmapCacheV2PersistentKey:带持久键的 CacheBitmapV2 应把
|
||||
// 位图以 key2<<32|key1 持久化;零数据+持久键应从持久库回填会话内单元。
|
||||
func TestStoreBitmapCacheV2PersistentKey(t *testing.T) {
|
||||
store := newFakeBmpStore()
|
||||
g := &RdpClient{
|
||||
bitmapCache: make(map[uint32]*Bitmap),
|
||||
bitmapCacheFIFO: []uint32{},
|
||||
gfxCacheStore: store,
|
||||
}
|
||||
|
||||
// 1) 带键+数据:进会话缓存并持久化
|
||||
cb := &pdu.CacheBitmapV2Order{
|
||||
CacheId: 1,
|
||||
Flags: pdu.CBR2_PERSISTENT_KEY_PRESENT,
|
||||
Key1: 0xDEAD,
|
||||
Key2: 0xBEEF,
|
||||
BitmapBpp: 32,
|
||||
BitmapWidth: 4,
|
||||
BitmapHeight: 4,
|
||||
BitmapLength: 64,
|
||||
CacheIndex: 7,
|
||||
BitmapDataStream: make([]byte, 4*4*4),
|
||||
}
|
||||
g.storeBitmapCacheV2(cb)
|
||||
pk := uint64(0xBEEF)<<32 | 0xDEAD
|
||||
if _, ok := store.persisted[pk]; !ok {
|
||||
t.Fatalf("entry not persisted under %x; got %v", pk, store.persisted)
|
||||
}
|
||||
if _, ok := g.bitmapCache[1<<16|7]; !ok {
|
||||
t.Fatal("entry missing from in-session cache")
|
||||
}
|
||||
|
||||
// 2) 零数据+同键(另一单元):从持久库回填
|
||||
cb2 := &pdu.CacheBitmapV2Order{
|
||||
CacheId: 2,
|
||||
Flags: pdu.CBR2_PERSISTENT_KEY_PRESENT,
|
||||
Key1: 0xDEAD,
|
||||
Key2: 0xBEEF,
|
||||
BitmapBpp: 32,
|
||||
BitmapWidth: 4,
|
||||
BitmapHeight: 4,
|
||||
CacheIndex: 9,
|
||||
}
|
||||
g.storeBitmapCacheV2(cb2)
|
||||
b, ok := g.bitmapCache[2<<16|9]
|
||||
if !ok || b == nil || len(b.Data) != 4*4*4 {
|
||||
t.Fatalf("persistent backfill failed: ok=%v len=%v", ok, b)
|
||||
}
|
||||
|
||||
// 3) 零数据但持久库未命中:不放入缓存
|
||||
cb3 := &pdu.CacheBitmapV2Order{
|
||||
CacheId: 3,
|
||||
Flags: pdu.CBR2_PERSISTENT_KEY_PRESENT,
|
||||
Key1: 0x1111,
|
||||
Key2: 0x2222,
|
||||
BitmapBpp: 32,
|
||||
BitmapWidth: 4, BitmapHeight: 4,
|
||||
CacheIndex: 5,
|
||||
}
|
||||
g.storeBitmapCacheV2(cb3)
|
||||
if _, ok := g.bitmapCache[3<<16|5]; ok {
|
||||
t.Fatal("missed backfill must not populate cache")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user