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  }