github.com/ActiveState/cli@v0.0.0-20240508170324-6801f60cd051/test/integration/artifactcache_int_test.go (about) 1 package integration 2 3 import ( 4 "os" 5 "path/filepath" 6 "testing" 7 "time" 8 9 "github.com/ActiveState/cli/internal/fileutils" 10 "github.com/ActiveState/cli/internal/testhelpers/osutil" 11 "github.com/ActiveState/cli/pkg/platform/runtime/artifactcache" 12 "github.com/go-openapi/strfmt" 13 "github.com/stretchr/testify/assert" 14 "github.com/stretchr/testify/require" 15 ) 16 17 func TestArtifactCache(t *testing.T) { 18 // Note: the length in bytes of each artifact is its index. 19 testArtifacts := []strfmt.UUID{ 20 "000000000-0000-0000-0000-000000000000", 21 "74D554B3-6B0F-434B-AFE2-9F2F0B5F32BA", 22 "87ADD1B0-169D-4C01-8179-191BB9910799", 23 "5D8D933F-09FA-45A3-81FF-E6F33E91C9ED", 24 "992B8488-C61D-433C-ADF2-D76EBD8DAE59", 25 "2C36A315-59ED-471B-8629-2663ECC95476", 26 "57E8EAF4-F7EE-4BEF-B437-D9F0A967BA52", 27 "E299F10C-7B5D-4B25-B821-90E30193A916", 28 "F95C0ECE-9F69-4998-B83F-CE530BACD468", 29 "CAC9708D-FAA6-4295-B640-B8AA41A8AABC", 30 "009D20C9-0E38-44E8-A095-7B6FEF01D7DA", 31 } 32 33 dir, err := os.MkdirTemp("", "") 34 require.NoError(t, err) 35 defer os.RemoveAll(dir) 36 37 // Test cache creation. 38 cache, err := artifactcache.NewTestArtifactCache(dir, 10) // bytes 39 require.NoError(t, err) 40 assert.Equal(t, cache.Dir(), dir) 41 assert.False(t, fileutils.FileExists(cache.InfoJson())) // not yet 42 assert.Equal(t, cache.MaxSize(), int64(10)) 43 assert.Equal(t, cache.CurrentSize(), int64(0)) 44 assert.Empty(t, cache.Artifacts()) 45 46 // Test cache.Get() with empty cache. 47 path, found := cache.Get(testArtifacts[1]) 48 assert.Empty(t, path) 49 assert.False(t, found) 50 51 // Test cache.Store(). 52 testArtifactFile := osutil.GetTestFile("artifact-cache", string(testArtifacts[1])) 53 err = cache.Store(testArtifacts[1], testArtifactFile) 54 require.NoError(t, err) 55 assert.Equal(t, len(cache.Artifacts()), 1) 56 assert.Equal(t, cache.CurrentSize(), int64(1)) 57 // Verify artifacts can be overwritten. 58 err = cache.Store(testArtifacts[1], testArtifactFile) 59 require.NoError(t, err) 60 assert.Equal(t, len(cache.Artifacts()), 1) 61 assert.Equal(t, cache.CurrentSize(), int64(1)) 62 63 cached := cache.Artifacts()[testArtifacts[1]] // will test cache.Get() later; avoid last access time update 64 assert.Equal(t, cached.Id, testArtifacts[1]) 65 assert.Equal(t, cached.ArchivePath, filepath.Join(cache.Dir(), string(testArtifacts[1]))) 66 assert.Equal(t, cached.Size, int64(1)) 67 assert.True(t, cached.LastAccessTime > 0) 68 69 cachedFile := cached.ArchivePath 70 assert.True(t, fileutils.FileExists(cachedFile)) 71 assert.Equal(t, fileutils.ReadFileUnsafe(testArtifactFile), fileutils.ReadFileUnsafe(cachedFile)) 72 73 // Test cache.Get() and last access time updating. 74 lastAccessTime := cached.LastAccessTime 75 time.Sleep(1 * time.Second) 76 path, found = cache.Get(testArtifacts[1]) 77 assert.Equal(t, path, cachedFile) 78 assert.True(t, found) 79 assert.True(t, cached.LastAccessTime > lastAccessTime) 80 81 // Test cache.Store() and removing least-recently accessed artifacts. 82 time.Sleep(1 * time.Second) 83 cache.Store(testArtifacts[3], osutil.GetTestFile("artifact-cache", string(testArtifacts[3]))) 84 cache.Store(testArtifacts[5], osutil.GetTestFile("artifact-cache", string(testArtifacts[5]))) 85 assert.Equal(t, cache.CurrentSize(), int64(9)) 86 assert.Equal(t, len(cache.Artifacts()), 3) 87 88 cache.Store(testArtifacts[2], osutil.GetTestFile("artifact-cache", string(testArtifacts[2]))) 89 assert.Equal(t, cache.CurrentSize(), int64(10)) 90 assert.Equal(t, len(cache.Artifacts()), 3) 91 assert.Nil(t, cache.Artifacts()[testArtifacts[1]]) 92 assert.NotNil(t, cache.Artifacts()[testArtifacts[2]]) 93 assert.NotNil(t, cache.Artifacts()[testArtifacts[3]]) 94 assert.NotNil(t, cache.Artifacts()[testArtifacts[5]]) 95 96 // Test cache.Save(). 97 err = cache.Save() 98 require.NoError(t, err) 99 assert.True(t, fileutils.FileExists(cache.InfoJson())) 100 101 reloaded, err := artifactcache.NewTestArtifactCache(cache.Dir(), 10) 102 require.NoError(t, err) 103 assert.Equal(t, reloaded.CurrentSize(), int64(10)) 104 assert.Equal(t, len(reloaded.Artifacts()), 3) 105 assert.NotNil(t, reloaded.Artifacts()[testArtifacts[2]]) 106 assert.NotNil(t, reloaded.Artifacts()[testArtifacts[3]]) 107 assert.NotNil(t, reloaded.Artifacts()[testArtifacts[5]]) 108 109 // Test too small of a cache max size. 110 dir, err = os.MkdirTemp("", "") 111 require.NoError(t, err) 112 defer os.RemoveAll(dir) 113 114 cache, err = artifactcache.NewTestArtifactCache(dir, 1) // bytes 115 require.NoError(t, err) 116 cache.Store(testArtifacts[1], osutil.GetTestFile("artifact-cache", string(testArtifacts[1]))) 117 cache.Store(testArtifacts[2], osutil.GetTestFile("artifact-cache", string(testArtifacts[2]))) // should not store nor erase existing artifacts 118 assert.Equal(t, cache.CurrentSize(), int64(1)) 119 assert.Equal(t, len(cache.Artifacts()), 1) 120 assert.NotNil(t, cache.Artifacts()[testArtifacts[1]]) 121 }