Files
4566704 63d0a0caf8 feat(cafegame): 自 go-hua 迁入网咖游戏识别与运行记录框架
- 游戏来源常量/按目录特征识别(云更新/网维大师/易乐游)/RunAppRecord 上报框架
- 网吧业务专用包, 附测试、examples/cafegame 例程与包 README
2026-09-20 12:37:10 +08:00

105 lines
2.8 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//go:build windows
package cafegame
import (
"encoding/binary"
"os"
"path/filepath"
"strconv"
"testing"
)
// newYGXGameDir 构造一个云更新游戏目录(gamepatch/gconfig.ini + 数字 ico)
func newYGXGameDir(t *testing.T, id int) string {
dir := filepath.Join(t.TempDir(), "测试游戏")
if err := os.MkdirAll(filepath.Join(dir, "gamepatch"), 0755); err != nil {
t.Fatal(err)
}
if err := os.WriteFile(filepath.Join(dir, "gamepatch", "gconfig.ini"), nil, 0644); err != nil {
t.Fatal(err)
}
if err := os.WriteFile(filepath.Join(dir, strconv.Itoa(id)+".ico"), nil, 0644); err != nil {
t.Fatal(err)
}
return dir
}
func TestIsGameDirByYGX(t *testing.T) {
dir := newYGXGameDir(t, 40001)
ok, info, err := IsGameDirByYGX(dir)
if err != nil {
t.Fatalf("IsGameDirByYGX: %v", err)
}
if !ok {
t.Fatal("云更新目录应识别成功")
}
if info.AppId != 40001 {
t.Errorf("AppId = %d, want 40001", info.AppId)
}
if info.AppSource != SourceYGX {
t.Errorf("AppSource = %d, want SourceYGX(%d)", info.AppSource, SourceYGX)
}
if info.AppName != "测试游戏" {
t.Errorf("AppName = %q", info.AppName)
}
}
func TestIsGameDirByYGXNegative(t *testing.T) {
// 空目录(无 gamepatch)
if ok, _, _ := IsGameDirByYGX(t.TempDir()); ok {
t.Error("空目录不应识别为云更新")
}
// 有 gamepatch/gconfig.ini 但 ico 编号过小
dir := filepath.Join(t.TempDir(), "small")
_ = os.MkdirAll(filepath.Join(dir, "gamepatch"), 0755)
_ = os.WriteFile(filepath.Join(dir, "gamepatch", "gconfig.ini"), nil, 0644)
_ = os.WriteFile(filepath.Join(dir, "12345.ico"), nil, 0644)
if ok, _, _ := IsGameDirByYGX(dir); ok {
t.Error("ico 编号小于 40000 不应识别为云更新")
}
}
func TestIsGameDirByStory(t *testing.T) {
dir := newYGXGameDir(t, 10001)
ok, info, err := IsGameDirByStory(dir)
if err != nil {
t.Fatalf("IsGameDirByStory: %v", err)
}
if !ok {
t.Fatal("蘑菇目录应识别成功")
}
if info.AppSource != SourceStory {
t.Errorf("AppSource = %d, want SourceStory(%d)", info.AppSource, SourceStory)
}
}
func TestGetGuidByYLY(t *testing.T) {
// 构造易乐游 $ResMetadata$/ResAppData.dat:24 字节头 + GUID 结构
dir := t.TempDir()
data := make([]byte, 40)
binary.LittleEndian.PutUint32(data[24:28], 0x12345678)
binary.LittleEndian.PutUint16(data[28:30], 0xABCD)
binary.LittleEndian.PutUint16(data[30:32], 0xEF01)
copy(data[32:36], []byte{1, 2, 3, 4})
copy(data[36:40], []byte{5, 6, 7, 8})
if err := os.MkdirAll(filepath.Join(dir, "$ResMetadata$"), 0755); err != nil {
t.Fatal(err)
}
if err := os.WriteFile(filepath.Join(dir, "$ResMetadata$", "ResAppData.dat"), data, 0644); err != nil {
t.Fatal(err)
}
guid, err := GetGuidByYLY(dir)
if err != nil {
t.Fatalf("GetGuidByYLY: %v", err)
}
want := "{12345678-ABCD-EF01-0102-030405060708}"
if guid != want {
t.Errorf("GUID = %q, want %q", guid, want)
}
}