feat(cafegame): 自 go-hua 迁入网咖游戏识别与运行记录框架
- 游戏来源常量/按目录特征识别(云更新/网维大师/易乐游)/RunAppRecord 上报框架 - 网吧业务专用包, 附测试、examples/cafegame 例程与包 README
This commit is contained in:
@@ -0,0 +1,104 @@
|
||||
//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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user