From fb7643fcc28ca671d41e561de0b5f5bfdabc2754 Mon Sep 17 00:00:00 2001 From: canhlinh Date: Thu, 16 Mar 2023 16:35:44 +0700 Subject: [PATCH] Update mod time whenever reading a file --- filecache.go | 6 +++++- filecache_test.go | 41 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/filecache.go b/filecache.go index 5c8bdaa..dbdf382 100644 --- a/filecache.go +++ b/filecache.go @@ -135,6 +135,10 @@ func (f *FileCache) Read(key string) (io.ReadCloser, error) { return nil, err } + if err := f.touch(key, time.Now()); err != nil { + return nil, err + } + file, err := os.Open(absFilePath) if err != nil { return nil, err @@ -215,7 +219,7 @@ func (f *FileCache) Empty() error { return nil } -func (fc FileCache) Touch(key string, ts time.Time) error { +func (fc FileCache) touch(key string, ts time.Time) error { if ts.IsZero() { ts = time.Now() } diff --git a/filecache_test.go b/filecache_test.go index 95e0b8c..d9ceda1 100644 --- a/filecache_test.go +++ b/filecache_test.go @@ -65,6 +65,43 @@ func TestWrite(t *testing.T) { } } +func getModTime(path string) (time.Time, error) { + fs, err := os.Stat(path) + if err != nil { + return time.Time{}, err + } + return fs.ModTime(), nil +} + +func TestRead(t *testing.T) { + fc := New(Config{TempDir: "tmp"}, nil) + defer fc.Empty() + + if err := fc.Write("key", sampleReader("ABC")); err != nil { + t.Fatal(err) + } + + if r, err := fc.Read("key"); err != nil { + t.Fatal(err) + } else { + var buf bytes.Buffer + io.Copy(&buf, r) + if buf.String() != "ABC" { + t.Fatal("file not matched") + } + } + mt1, err := getModTime(fc.absFilePath("key")) + if err != nil { + t.Fatal(err) + } + time.Sleep(time.Second) + fc.Read("key") + mt2, _ := getModTime(fc.absFilePath("key")) + if mt2.Unix() <= mt1.Unix() { + t.Fatal("mod time must be changed") + } +} + func TestFiles(t *testing.T) { fc := New(Config{TempDir: "tmp"}, nil) defer fc.Empty() @@ -205,8 +242,8 @@ func TestCleanCachedFileByLRU(t *testing.T) { if err := fc.Write("key3", sampleReader(data)); err != nil { t.Fatal(err) } - fc.Touch("key1", time.Now().Add(-time.Minute)) - fc.Touch("key3", time.Now().Add(-time.Minute)) + fc.touch("key1", time.Now().Add(-time.Minute)) + fc.touch("key3", time.Now().Add(-time.Minute)) if err := fc.cleanCachedFileByLRU(); err != nil { t.Fatal(err)