From caa86b5e79c24a7254524317c2cf4a75d7a1ab13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=B9=BF?= Date: Thu, 5 Jun 2025 09:24:16 +0800 Subject: [PATCH] add test --- cmd_daemon_test.go | 140 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) diff --git a/cmd_daemon_test.go b/cmd_daemon_test.go index ea25e59..9c4f9ea 100644 --- a/cmd_daemon_test.go +++ b/cmd_daemon_test.go @@ -203,3 +203,143 @@ func (h *SimpleCmdHandler) Description() string { func (h *SimpleCmdHandler) Usage() string { return "Usage: test [args]" } + +// EmptyCmdHandler 是一个简单的CmdHandler实现用于测试空输入 +type EmptyCmdHandler struct{} + +func (h *EmptyCmdHandler) Handle(conn *CmdConn, req *CmdRequest) error { + // 返回一个空响应 + err := conn.End("") + return err +} + +func (h *EmptyCmdHandler) Description() string { + return "Simple command handler for testing empty input" +} + +func (h *EmptyCmdHandler) Usage() string { + return "Usage: empty" +} + +// UnknownCmdHandler 是一个简单的CmdHandler实现用于测试未知命令 +// 它会返回一个错误响应 +type UnknownCmdHandler struct{} + +func (h *UnknownCmdHandler) Handle(conn *CmdConn, req *CmdRequest) error { + // 返回一个错误响应 + err := conn.WriteError(fmt.Errorf("unknown command"), false) + return err +} + +func (h *UnknownCmdHandler) Description() string { + return "Simple command handler for testing unknown commands" +} + +func (h *UnknownCmdHandler) Usage() string { + return "Usage: unknown" +} + +func TestEmptyCommand(t *testing.T) { + socketPath := "/tmp/test_empty.sock" + daemon := &CmdDaemon{ + SocketPath: socketPath, + cmds: make(map[string]CmdHandler), + } + + // 注册一个简单的命令处理程序 + daemon.RegisterCmd("empty", &EmptyCmdHandler{}) + + // 创建一个同步通道来等待守护进程开始监听 + listening := make(chan struct{}) + + // 启动守护进程 + go startTestDaemon(daemon, listening) + + // 等待直到监听开始 + // for循环中检查socket文件是否存在,如果存在退出循环,否则sleepeep 1秒 + // 使用一个错误channel来传递错误 + errChan := make(chan error) + + go func() { + listened := false + for { + + if listened { + break + } + if _, err := os.Stat(socketPath); err == nil { + listened = true + } + time.Sleep(1 * time.Second) + } + + // 设置命令行参数 + os.Args = []string{"cmd", "empty"} + ndaemon := &CmdDaemon{ + SocketPath: socketPath, + } + // 执行Run方法 + err := ndaemon.Run() + if err != nil { + errChan <- err + } else { + t.Log("Run completed successfully") + close(errChan) + } + }() + err := <-errChan + if err != nil { + t.Fatal(err) + } + +} + +func TestUnknownCommand(t *testing.T) { + socketPath := "/tmp/test_unknown.sock" + daemon := &CmdDaemon{ + SocketPath: socketPath, + cmds: make(map[string]CmdHandler), + } + + // 注册一个简单的命令处理程序 + daemon.RegisterCmd("unknown", &UnknownCmdHandler{}) + + // 启动守护进程 + go func() { + err := daemon.Listen() + if err != nil { + panic(fmt.Sprintf("Listen failed: %v", err)) + } + }() + + // 等待 socket 文件创建 + waitForSocket(t, socketPath) + + // 设置命令行参数 + os.Args = []string{"cmd", "unknown"} + ndaemon := &CmdDaemon{ + SocketPath: socketPath, + } + // 执行Run方法 + err := ndaemon.Run() + if err != nil { + t.Fatalf("Run failed: %v", err) + } +} + +// waitForSocket 等待直到指定路径的 socket 文件被创建 +func waitForSocket(t *testing.T, path string) { + timeout := time.After(5 * time.Second) + ticker := time.Tick(500 * time.Millisecond) + + for { + select { + case <-timeout: + t.Fatal("Timed out waiting for socket") + case <-ticker: + if _, err := os.Stat(path); err == nil { + return + } + } + } +}