package recordcleaner import ( "os" "path/filepath" "regexp" "testing" "time" "github.com/bluenviron/mediamtx/internal/conf" "github.com/bluenviron/mediamtx/internal/test" "github.com/stretchr/testify/require" ) func TestCleaner(t *testing.T) { timeNow = func() time.Time { return time.Date(2009, 5, 20, 22, 15, 25, 427000, time.Local) } dir, err := os.MkdirTemp("", "mediamtx-cleaner") require.NoError(t, err) defer os.RemoveAll(dir) const specialChars = "_-+*?^$()[]{}|" err = os.Mkdir(filepath.Join(dir, specialChars+"_mypath"), 0o755) require.NoError(t, err) err = os.WriteFile(filepath.Join(dir, specialChars+"_mypath", "2008-05-20_22-15-25-000125.mp4"), []byte{1}, 0o644) require.NoError(t, err) err = os.WriteFile(filepath.Join(dir, specialChars+"_mypath", "2009-05-20_22-15-25-000427.mp4"), []byte{1}, 0o644) require.NoError(t, err) c := &Cleaner{ PathConfs: map[string]*conf.Path{ "~^.*$": { Name: "~^.*$", Regexp: regexp.MustCompile("^.*$"), RecordPath: filepath.Join(dir, specialChars+"_%path/%Y-%m-%d_%H-%M-%S-%f"), RecordFormat: conf.RecordFormatFMP4, RecordDeleteAfter: conf.StringDuration(10 * time.Second), }, }, Parent: test.NilLogger, } c.Initialize() defer c.Close() time.Sleep(500 * time.Millisecond) _, err = os.Stat(filepath.Join(dir, specialChars+"_mypath", "2008-05-20_22-15-25-000125.mp4")) require.Error(t, err) _, err = os.Stat(filepath.Join(dir, specialChars+"_mypath", "2009-05-20_22-15-25-000427.mp4")) require.NoError(t, err) } func TestCleanerMultipleEntriesSamePath(t *testing.T) { timeNow = func() time.Time { return time.Date(2009, 5, 20, 22, 15, 25, 427000, time.Local) } dir, err := os.MkdirTemp("", "mediamtx-cleaner") require.NoError(t, err) defer os.RemoveAll(dir) err = os.Mkdir(filepath.Join(dir, "path1"), 0o755) require.NoError(t, err) err = os.Mkdir(filepath.Join(dir, "path2"), 0o755) require.NoError(t, err) err = os.WriteFile(filepath.Join(dir, "path1", "2009-05-19_22-15-25-000427.mp4"), []byte{1}, 0o644) require.NoError(t, err) err = os.WriteFile(filepath.Join(dir, "path2", "2009-05-19_22-15-25-000427.mp4"), []byte{1}, 0o644) require.NoError(t, err) c := &Cleaner{ PathConfs: map[string]*conf.Path{ "path1": { Name: "path1", RecordPath: filepath.Join(dir, "%path/%Y-%m-%d_%H-%M-%S-%f"), RecordFormat: conf.RecordFormatFMP4, RecordDeleteAfter: conf.StringDuration(10 * time.Second), }, "path2": { Name: "path2", RecordPath: filepath.Join(dir, "%path/%Y-%m-%d_%H-%M-%S-%f"), RecordFormat: conf.RecordFormatFMP4, RecordDeleteAfter: conf.StringDuration(10 * 24 * time.Hour), }, }, Parent: test.NilLogger, } c.Initialize() defer c.Close() time.Sleep(500 * time.Millisecond) _, err = os.Stat(filepath.Join(dir, "path1", "2009-05-19_22-15-25-000427.mp4")) require.Error(t, err) _, err = os.Stat(filepath.Join(dir, "path2", "2009-05-19_22-15-25-000427.mp4")) require.NoError(t, err) }