Files
2026-07-27 19:31:43 +08:00

127 lines
3.7 KiB
Go

package strm
import (
"path/filepath"
"strings"
"testing"
)
func TestOversizedPathFailureUsesUTF8BytesAndDirectoryPrefix(t *testing.T) {
t.Parallel()
longDir := strings.Repeat("界", 86) // 258 字节
relPath := filepath.Join("任务", longDir, "第01集.strm")
gotPath, gotReason, oversized := oversizedPathFailure(relPath, false)
if !oversized {
t.Fatal("超长中文目录应按 UTF-8 字节数识别")
}
wantPath := filepath.Join("任务", longDir)
if gotPath != wantPath {
t.Fatalf("失败路径=%q,期望=%q", gotPath, wantPath)
}
if gotReason != pathTooLongDirReason {
t.Fatalf("失败原因=%q,期望=%q", gotReason, pathTooLongDirReason)
}
}
func TestPathComponentLimitAllowsExactly255Bytes(t *testing.T) {
t.Parallel()
allowed := strings.Repeat("a", 250) + ".strm"
if pathHasOversizedComponent(filepath.Join("任务", allowed)) {
t.Fatal("恰好 255 字节的文件名应允许")
}
tooLong := strings.Repeat("a", 251) + ".strm"
if !pathHasOversizedComponent(filepath.Join("任务", tooLong)) {
t.Fatal("256 字节的文件名应识别为超限")
}
}
func TestFailureCollectorDeduplicatesOversizedDirectory(t *testing.T) {
t.Parallel()
longDir := strings.Repeat("长", 86)
failures := NewFailureCollector()
for _, name := range []string{"第01集.strm", "第02集.strm", "海报.jpg"} {
kind := ScanFailureStrm
if strings.HasSuffix(name, ".jpg") {
kind = ScanFailureMetadata
}
addOversizedPathFailure(failures, kind, filepath.Join("任务", longDir, name), false)
}
items := failures.Items()
if len(items) != 2 {
t.Fatalf("相同超长目录应按类型各汇总一项,实际=%d:%v", len(items), items)
}
if items[0].Path != filepath.ToSlash(filepath.Join("任务", longDir)) {
t.Fatalf("STRM 汇总路径=%q", items[0].Path)
}
if items[1].Kind != ScanFailureMetadata {
t.Fatalf("第二项类型=%q,期望 metadata", items[1].Kind)
}
}
func TestCleanupFunctionsIgnoreOversizedDirectory(t *testing.T) {
t.Parallel()
root := t.TempDir()
longDir := strings.Repeat("超", 86)
failures := NewFailureCollector()
removed, err := cleanupScopedStaleFiles(
root,
"任务",
nil,
[]cleanupScope{{relDirs: []string{longDir}, recursive: true}},
nil,
failures,
)
if err != nil {
t.Fatalf("全量清理不应因超长目录失败:%v", err)
}
if removed != 0 {
t.Fatalf("删除数=%d,期望=0", removed)
}
if failures.Len() != 1 {
t.Fatalf("超长清理目录应记录一次,实际=%d", failures.Len())
}
if _, err := cleanupCurrentDirectoryStrm(root, "任务", []string{longDir}, nil, nil); err != nil {
t.Fatalf("当前目录清理不应因超长目录失败:%v", err)
}
}
func TestMigrateLegacyISOIgnoresOversizedPath(t *testing.T) {
t.Parallel()
longDir := strings.Repeat("长", 86)
migrated, err := MigrateLegacyISOStrmFile(t.TempDir(), "任务", []string{longDir}, "影片.iso", "file-id", true)
if err != nil {
t.Fatalf("ISO 迁移不应访问超长路径:%v", err)
}
if migrated {
t.Fatal("不存在的超长旧文件不应报告已迁移")
}
}
func TestPendingMetadataRecordsOversizedDirectoryOnce(t *testing.T) {
t.Parallel()
longDir := strings.Repeat("长", 86)
items := []metadataItem{
{relPath: filepath.Join("任务", longDir, "poster.jpg")},
{relPath: filepath.Join("任务", longDir, "movie.nfo")},
}
failures := NewFailureCollector()
if got := pendingMetadataItems(t.TempDir(), items, failures); len(got) != 0 {
t.Fatalf("超长元数据不应进入下载队列:%v", got)
}
if failures.Len() != 1 {
t.Fatalf("同一超长元数据目录应汇总一次,实际=%d", failures.Len())
}
if got := failures.Items()[0]; got.Kind != ScanFailureMetadata || got.Reason != pathTooLongDirReason {
t.Fatalf("元数据失败项=%+v", got)
}
}