package main import ( "os" "path/filepath" "strings" "testing" ) // 录制过程中 ffmpeg 是按 transFilename 给的路径写文件的。 // 以前这条路径走的是 -record 参数而不是 directory 设置,配了保存目录的人会看到 // 文件先落在程序目录里、录完才搬一次;这里把「必须等于最终保存目录」钉死。 func TestTransFilenameSavesIntoConfiguredDir(t *testing.T) { savedConfig, savedRecordDir := config, recordDir defer func() { config, recordDir = savedConfig, savedRecordDir }() root, dashDir := t.TempDir(), t.TempDir() recordDir = &dashDir config.RecordSubdir = "record" // 配了 directory:不管 -record 参数是什么,都得以它为准 config.Directory = root got := filepath.Clean(transFilename("2026-09-27 22-40-42 甲 标题.mp4")) want := filepath.Join(root, "record", "2026-09-27 22-40-42 甲 标题.mp4") if got != filepath.Clean(want) { t.Errorf("配了 directory 后录制路径不对:\n got %s\n want %s", got, want) } if !strings.HasPrefix(got, filepath.Clean(root)) { t.Errorf("录制路径落在了保存目录之外:%s", got) } // 没配 directory:回落到 -record 指定的文件夹 config.Directory = "" got = filepath.Clean(transFilename("x.mp4")) if filepath.Dir(got) != filepath.Clean(filepath.Join(dashDir, "record")) { t.Errorf("directory 为空时应回落到 -record 目录:%s", got) } // 连 -record 都还没解析时也不能拼出相对路径,否则 ffmpeg 会写到进程的工作目录去 blank := "" recordDir = &blank if root := saveRootDir(); !filepath.IsAbs(root) { t.Errorf("传入的参数都没解析时 saveRootDir 仍应是绝对路径,实际 %q", root) } if got := filepath.Clean(transFilename("x.mp4")); !filepath.IsAbs(got) { t.Errorf("录制路径不能是相对路径:%q", got) } } // 保存目录和录制目录现在是一个,moveFile 再挪一遍等于白复制一份(跨盘时尤其慢) func TestMoveFileKeepsFileInSaveDir(t *testing.T) { savedConfig, savedRecordDir := config, recordDir defer func() { config, recordDir = savedConfig, savedRecordDir }() root := t.TempDir() recordDir = &root config.Directory = root config.RecordSubdir = "record" if err := os.MkdirAll(recordSaveDir(), 0755); err != nil { t.Fatal(err) } p := filepath.Join(recordSaveDir(), "2026-09-27 22-40-42 甲 标题.mp4") if err := os.WriteFile(p, []byte("fake"), 0644); err != nil { t.Fatal(err) } s := &streamer{UID: 1} s.moveFile(p) if _, err := os.Stat(p); err != nil { t.Errorf("文件已经在保存目录里了,moveFile 不该动它:%v", err) } // 别处给进来的路径(比如手填的绝对路径)仍要收拢到保存目录 outside := filepath.Join(t.TempDir(), "outside.mp4") if err := os.WriteFile(outside, []byte("fake"), 0644); err != nil { t.Fatal(err) } s.moveFile(outside) if _, err := os.Stat(outside); !os.IsNotExist(err) { t.Errorf("保存目录之外的文件应当被移动,原位置却还在") } if _, err := os.Stat(filepath.Join(recordSaveDir(), "outside.mp4")); err != nil { t.Errorf("文件没有出现在保存目录里:%v", err) } }