- 新增 desktop 应用入口,将后端与前端打包为单一可执行文件 - 集成系统托盘功能(getlantern/systray) - 支持单实例锁和端口冲突检测 - 启动时自动打开浏览器显示管理界面 - 新增 embedfs 模块嵌入静态资源 - 新增跨平台构建脚本(macOS/Windows/Linux) - 新增 macOS .app 打包脚本 - 统一 Makefile,移除 backend/Makefile - 更新 README 添加桌面应用使用说明
70 lines
1.2 KiB
Go
70 lines
1.2 KiB
Go
package main
|
|
|
|
import (
|
|
"net"
|
|
"net/http"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestCheckPortAvailable(t *testing.T) {
|
|
port := 19826
|
|
|
|
err := checkPortAvailable(port)
|
|
if err != nil {
|
|
t.Fatalf("端口 %d 应该可用: %v", port, err)
|
|
}
|
|
|
|
t.Log("端口可用测试通过")
|
|
}
|
|
|
|
func TestCheckPortOccupied(t *testing.T) {
|
|
port := 19827
|
|
|
|
listener, err := net.Listen("tcp", ":19827")
|
|
if err != nil {
|
|
t.Fatalf("无法启动测试服务器: %v", err)
|
|
}
|
|
defer listener.Close()
|
|
|
|
go func() {
|
|
conn, err := listener.Accept()
|
|
if err == nil {
|
|
conn.Close()
|
|
}
|
|
}()
|
|
|
|
time.Sleep(100 * time.Millisecond)
|
|
|
|
err = checkPortAvailable(port)
|
|
if err == nil {
|
|
t.Fatal("端口被占用时应该返回错误")
|
|
}
|
|
|
|
t.Log("端口占用检测测试通过")
|
|
}
|
|
|
|
func TestCheckPortAvailableAfterClose(t *testing.T) {
|
|
port := 19828
|
|
|
|
listener, err := net.Listen("tcp", ":19828")
|
|
if err != nil {
|
|
t.Fatalf("无法启动测试服务器: %v", err)
|
|
}
|
|
|
|
server := &http.Server{}
|
|
go server.Serve(listener)
|
|
|
|
time.Sleep(100 * time.Millisecond)
|
|
|
|
listener.Close()
|
|
time.Sleep(100 * time.Millisecond)
|
|
|
|
err = checkPortAvailable(port)
|
|
if err != nil {
|
|
t.Fatalf("端口关闭后应该可用: %v", err)
|
|
}
|
|
|
|
t.Log("端口关闭后可用测试通过")
|
|
}
|