github.com/cozy/cozy-stack@v0.0.0-20240603063001-31110fa4cae1/model/vfs/store_test.go (about)

     1  package vfs
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  
     7  	"github.com/cozy/cozy-stack/pkg/config/config"
     8  	"github.com/cozy/cozy-stack/pkg/prefixer"
     9  	"github.com/redis/go-redis/v9"
    10  	"github.com/stretchr/testify/assert"
    11  )
    12  
    13  func TestStore(t *testing.T) {
    14  	config.UseTestFile(t)
    15  
    16  	t.Run("StoreInMemory", func(t *testing.T) {
    17  		wasStoreTTL := storeTTL
    18  		storeTTL = 100 * time.Millisecond
    19  		defer func() { storeTTL = wasStoreTTL }()
    20  
    21  		dbA := prefixer.NewPrefixer(0, "alice.cozycloud.local", "alice.cozycloud.local")
    22  		dbB := prefixer.NewPrefixer(0, "bob.cozycloud.local", "bob.cozycloud.local")
    23  		store := newMemStore()
    24  
    25  		path := "/test/random/path.txt"
    26  		key1, err := store.AddFile(dbA, path)
    27  		assert.NoError(t, err)
    28  
    29  		path2, err := store.GetFile(dbB, key1)
    30  		assert.Equal(t, ErrWrongToken, err)
    31  		assert.Zero(t, path2, "Inter-instances store leaking")
    32  
    33  		path3, err := store.GetFile(dbA, key1)
    34  		assert.NoError(t, err)
    35  		assert.Equal(t, path, path3)
    36  
    37  		time.Sleep(2 * storeTTL)
    38  
    39  		path4, err := store.GetFile(dbA, key1)
    40  		assert.Equal(t, ErrWrongToken, err)
    41  		assert.Zero(t, path4, "no expiration")
    42  
    43  		a := &Archive{
    44  			Name: "test",
    45  			Files: []string{
    46  				"/archive/foo.jpg",
    47  				"/archive/bar",
    48  			},
    49  		}
    50  		key2, err := store.AddArchive(dbA, a)
    51  		assert.NoError(t, err)
    52  
    53  		a2, err := store.GetArchive(dbA, key2)
    54  		assert.NoError(t, err)
    55  		assert.Equal(t, a, a2)
    56  
    57  		time.Sleep(2 * storeTTL)
    58  
    59  		a3, err := store.GetArchive(dbA, key2)
    60  		assert.Equal(t, ErrWrongToken, err)
    61  		assert.Nil(t, a3, "no expiration")
    62  
    63  		m := &Metadata{"foo": "bar"}
    64  		key3, err := store.AddMetadata(dbA, m)
    65  		assert.NoError(t, err)
    66  
    67  		m2, err := store.GetMetadata(dbA, key3)
    68  		assert.NoError(t, err)
    69  		assert.Equal(t, m, m2)
    70  
    71  		time.Sleep(2 * storeTTL)
    72  
    73  		m3, err := store.GetArchive(dbA, key3)
    74  		assert.Equal(t, ErrWrongToken, err)
    75  		assert.Nil(t, m3, "no expiration")
    76  	})
    77  
    78  	t.Run("StoreInRedis", func(t *testing.T) {
    79  		if testing.Short() {
    80  			t.Skip("a redis is required for this test: test skipped due to the use of --short flag")
    81  		}
    82  
    83  		wasStoreTTL := storeTTL
    84  		storeTTL = 100 * time.Millisecond
    85  		defer func() { storeTTL = wasStoreTTL }()
    86  
    87  		dbA := prefixer.NewPrefixer(0, "alice.cozycloud.local", "alice.cozycloud.local")
    88  		dbB := prefixer.NewPrefixer(0, "bob.cozycloud.local", "bob.cozycloud.local")
    89  		opt, err := redis.ParseURL("redis://localhost:6379/15")
    90  		assert.NoError(t, err)
    91  		cli := redis.NewClient(opt)
    92  		store := newRedisStore(cli)
    93  
    94  		path := "/test/random/path.txt"
    95  		key1, err := store.AddFile(dbA, path)
    96  		assert.NoError(t, err)
    97  
    98  		path2, err := store.GetFile(dbB, key1)
    99  		assert.Equal(t, ErrWrongToken, err)
   100  		assert.Zero(t, path2, "Inter-instances store leaking")
   101  
   102  		path3, err := store.GetFile(dbA, key1)
   103  		assert.NoError(t, err)
   104  		assert.Equal(t, path, path3)
   105  
   106  		time.Sleep(2 * storeTTL)
   107  
   108  		path4, err := store.GetFile(dbA, key1)
   109  		assert.Equal(t, ErrWrongToken, err)
   110  		assert.Zero(t, path4, "no expiration")
   111  
   112  		a := &Archive{
   113  			Name: "test",
   114  			Files: []string{
   115  				"/archive/foo.jpg",
   116  				"/archive/bar",
   117  			},
   118  		}
   119  		key2, err := store.AddArchive(dbA, a)
   120  		assert.NoError(t, err)
   121  
   122  		a2, err := store.GetArchive(dbA, key2)
   123  		assert.NoError(t, err)
   124  		assert.Equal(t, a, a2)
   125  
   126  		time.Sleep(2 * storeTTL)
   127  
   128  		a3, err := store.GetArchive(dbA, key2)
   129  		assert.Equal(t, ErrWrongToken, err)
   130  		assert.Nil(t, a3, "no expiration")
   131  
   132  		m := &Metadata{"foo": "bar"}
   133  		key3, err := store.AddMetadata(dbA, m)
   134  		assert.NoError(t, err)
   135  
   136  		m2, err := store.GetMetadata(dbA, key3)
   137  		assert.NoError(t, err)
   138  		assert.Equal(t, m, m2)
   139  
   140  		time.Sleep(2 * storeTTL)
   141  
   142  		m3, err := store.GetArchive(dbA, key3)
   143  		assert.Equal(t, ErrWrongToken, err)
   144  		assert.Nil(t, m3, "no expiration")
   145  	})
   146  }