package nsfw import ( "encoding/base64" "os" "path/filepath" "testing" "time" ) // 1x1 透明 PNG,当测试图片用(NudeNet 会自己缩放)。 const testPNG = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==" // TestDetectRestart 验证:python 检测服务中途崩溃后,Detect 会自动重启并恢复正常。 func TestDetectRestart(t *testing.T) { py := resolvePython("") if py == "" { t.Skip("无 python") } img := filepath.Join(t.TempDir(), "test.png") if data, err := base64.StdEncoding.DecodeString(testPNG); err != nil { t.Fatalf("解码测试图片失败: %v", err) } else if err := os.WriteFile(img, data, 0644); err != nil { t.Fatalf("写测试图片失败: %v", err) } d, err := Start(py, 0.5) if err != nil { t.Fatalf("Start: %v", err) } defer d.Stop() if _, _, err := d.Detect(img); err != nil { t.Fatalf("崩溃前检测失败: %v", err) } // 直接杀掉 python 进程,模拟处理某张图时崩溃 if d.cmd != nil && d.cmd.Process != nil { _ = d.cmd.Process.Kill() } time.Sleep(2 * time.Second) // 等进程退出、端口释放 if _, _, err := d.Detect(img); err != nil { t.Fatalf("崩溃后检测失败(应自动重启): %v", err) } t.Log("重启后检测成功") }