package main import ( "encoding/json" "os" "path/filepath" "testing" ) // 改设置会重新读取配置(web UI 保存、或直接改 config.json), // 这一步绝不能删掉正在进行的合并的临时文件 —— 否则合并会当场失败。 func TestReloadConfigKeepsMergeTempFiles(t *testing.T) { dir := t.TempDir() savedConfig := config savedLocation := configFileLocation oldDir := configDir if configDir == nil { configDir = new(string) } defer func() { config = savedConfig configFileLocation = savedLocation configDir = oldDir }() *configDir = dir configFileLocation = filepath.Join(dir, configFile) recDir := filepath.Join(dir, defaultRecordSubdir) if err := os.MkdirAll(recDir, 0755); err != nil { t.Fatal(err) } // 假装一个合并正在跑:录播目录里有分块字幕和先本地合成的成片 inUse := []string{ filepath.Join(recDir, chunkTempPrefix+"single.ass"), filepath.Join(recDir, chunkTempPrefix+"merging_x.mp4"), } for _, p := range inUse { if err := os.WriteFile(p, []byte("x"), 0644); err != nil { t.Fatal(err) } } content, _ := json.Marshal(map[string]string{"directory": filepath.ToSlash(dir)}) if err := os.WriteFile(configFileLocation, content, 0644); err != nil { t.Fatal(err) } // 重新读取配置的真实路径:loadNewConfig() 就是 loadConfig() + checkConfig() loadConfig() checkConfig() for _, p := range inUse { if _, err := os.Stat(p); err != nil { t.Errorf("重新读取配置把正在用的临时文件删了:%s", filepath.Base(p)) } } // 启动时的兜底清理还得照旧能清掉上次残留 cleanLeftoverTempFiles() for _, p := range inUse { if _, err := os.Stat(p); err == nil { t.Errorf("启动时的清理没清掉残留:%s", filepath.Base(p)) } } }