Files
wazero/internal/filecache/file_cache_test.go
Takeshi Yoneda 35500f9b85 Introduces Cache API (#1016)
This introduces the new API wazero.Cache interface which can be passed to wazero.RuntimeConfig. 
Users can configure this to share the underlying compilation cache across multiple wazero.Runtime. 
And along the way, this deletes the experimental file cache API as it's replaced by this new API.

Signed-off-by: Takeshi Yoneda <takeshi@tetrate.io>
Co-authored-by: Crypt Keeper <64215+codefromthecrypt@users.noreply.github.com>
2023-01-10 09:32:42 +09:00

144 lines
3.3 KiB
Go

//go:build go1.18
package filecache
import (
"bytes"
"io"
"os"
"testing"
"github.com/tetratelabs/wazero/internal/testing/require"
)
func TestFileReadCloser_Close(t *testing.T) {
fc := newFileCache(t.TempDir())
key := Key{1, 2, 3}
err := fc.Add(key, bytes.NewReader([]byte{1, 2, 3, 4}))
require.NoError(t, err)
c, ok, err := fc.Get(key)
require.NoError(t, err)
require.True(t, ok)
// At this point, file is not closed, therefore TryLock should fail.
require.False(t, fc.mux.TryLock())
// Close, and then TryLock should succeed this time.
require.NoError(t, c.Close())
require.True(t, fc.mux.TryLock())
}
func TestFileCache_Add(t *testing.T) {
fc := newFileCache(t.TempDir())
t.Run("not exist", func(t *testing.T) {
content := []byte{1, 2, 3, 4, 5}
id := Key{1, 2, 3, 4, 5, 6, 7}
err := fc.Add(id, bytes.NewReader(content))
require.NoError(t, err)
// Ensures that file exists.
cached, err := os.ReadFile(fc.path(id))
require.NoError(t, err)
// Check if the saved content is the same as the given one.
require.Equal(t, content, cached)
})
t.Run("already exists", func(t *testing.T) {
content := []byte{1, 2, 3, 4, 5}
id := Key{1, 2, 3}
// Writes the pre-existing file for the same ID.
p := fc.path(id)
f, err := os.Create(p)
require.NoError(t, err)
_, err = f.Write(content)
require.NoError(t, err)
require.NoError(t, f.Close())
err = fc.Add(id, bytes.NewReader(content))
require.NoError(t, err)
// Ensures that file exists.
cached, err := os.ReadFile(fc.path(id))
require.NoError(t, err)
// Check if the saved content is the same as the given one.
require.Equal(t, content, cached)
})
}
func TestFileCache_Delete(t *testing.T) {
fc := newFileCache(t.TempDir())
t.Run("non-exist", func(t *testing.T) {
id := Key{0}
err := fc.Delete(id)
require.NoError(t, err)
})
t.Run("exist", func(t *testing.T) {
id := Key{1, 2, 3}
p := fc.path(id)
f, err := os.Create(p)
require.NoError(t, err)
require.NoError(t, f.Close())
// Ensures that file exists now.
f, err = os.Open(p)
require.NoError(t, err)
require.NoError(t, f.Close())
// Delete the cache.
err = fc.Delete(id)
require.NoError(t, err)
// Ensures that file no longer exists.
_, err = os.Open(p)
require.ErrorIs(t, err, os.ErrNotExist)
})
}
func TestFileCache_Get(t *testing.T) {
fc := newFileCache(t.TempDir())
t.Run("exist", func(t *testing.T) {
content := []byte{1, 2, 3, 4, 5}
id := Key{1, 2, 3}
// Writes the pre-existing file for the ID.
p := fc.path(id)
f, err := os.Create(p)
require.NoError(t, err)
_, err = f.Write(content)
require.NoError(t, err)
require.NoError(t, f.Close())
result, ok, err := fc.Get(id)
require.NoError(t, err)
require.True(t, ok)
defer func() {
require.NoError(t, result.Close())
}()
actual, err := io.ReadAll(result)
require.NoError(t, err)
require.Equal(t, content, actual)
})
t.Run("not exist", func(t *testing.T) {
_, ok, err := fc.Get(Key{0xf})
// Non-exist should not be error.
require.NoError(t, err)
require.False(t, ok)
})
}
func TestFileCache_path(t *testing.T) {
fc := &fileCache{dirPath: "/tmp/.wazero"}
actual := fc.path(Key{1, 2, 3, 4, 5})
require.Equal(t, "/tmp/.wazero/0102030405000000000000000000000000000000000000000000000000000000", actual)
}