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 }