package controller import ( "bytes" "encoding/base64" "image/png" "strings" "testing" rdpengine "ezops/pkg/rdp" ) func TestEncodeRDPBitmapPNGCompressesFrame(t *testing.T) { const width = 900 const height = 540 rgba := make([]byte, width*height*4) for i := 0; i < len(rgba); i += 4 { rgba[i+3] = 255 } encoded, err := encodeRDPBitmapPNG(rdpengine.ServerFrame{ Type: "bitmap", X: 12, Y: 34, Width: width, Height: height, RGBA: rgba, }) if err != nil { t.Fatalf("压缩 RDP 位图失败: %v", err) } if len(encoded.RGBA) != 0 { t.Fatalf("压缩后仍携带原始 RGBA: %d", len(encoded.RGBA)) } const prefix = "data:image/png;base64," if !strings.HasPrefix(encoded.Image, prefix) { t.Fatalf("压缩帧格式错误: %q", encoded.Image[:min(len(encoded.Image), len(prefix))]) } pngData, err := base64.StdEncoding.DecodeString(strings.TrimPrefix(encoded.Image, prefix)) if err != nil { t.Fatalf("解码 PNG 数据失败: %v", err) } img, err := png.Decode(bytes.NewReader(pngData)) if err != nil { t.Fatalf("解析 PNG 数据失败: %v", err) } if img.Bounds().Dx() != width || img.Bounds().Dy() != height { t.Fatalf("PNG 尺寸错误: got=%dx%d", img.Bounds().Dx(), img.Bounds().Dy()) } if len(encoded.Image) >= len(rgba)/4 { t.Fatalf("PNG 压缩率不足: encoded=%d raw=%d", len(encoded.Image), len(rgba)) } t.Logf("RDP 帧压缩: raw=%d encoded=%d", len(rgba), len(encoded.Image)) } func TestEncodeRDPBitmapPNGRejectsShortPayload(t *testing.T) { _, err := encodeRDPBitmapPNG(rdpengine.ServerFrame{ Type: "bitmap", Width: 10, Height: 10, RGBA: make([]byte, 8), }) if err == nil { t.Fatal("短位图数据应返回错误") } }