67 lines
1.7 KiB
Go
67 lines
1.7 KiB
Go
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("短位图数据应返回错误")
|
|
}
|
|
}
|