github.com/wrgl/wrgl@v0.14.0/pkg/ref/fs/store_test.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // Copyright © 2022 Wrangle Ltd 3 4 package reffs 5 6 import ( 7 "io" 8 "os" 9 "sort" 10 "testing" 11 12 "github.com/stretchr/testify/assert" 13 "github.com/stretchr/testify/require" 14 "github.com/wrgl/wrgl/pkg/ref" 15 refhelpers "github.com/wrgl/wrgl/pkg/ref/helpers" 16 "github.com/wrgl/wrgl/pkg/testutils" 17 ) 18 19 func TestStore(t *testing.T) { 20 dir, err := testutils.TempDir("", "refstore") 21 require.NoError(t, err) 22 defer os.RemoveAll(dir) 23 s := NewStore(dir) 24 25 // test Set & Get 26 sum := testutils.SecureRandomBytes(16) 27 require.NoError(t, s.Set("tags/abc", sum)) 28 b, err := s.Get("tags/abc") 29 require.NoError(t, err) 30 assert.Equal(t, sum, b) 31 32 // test Delete 33 require.NoError(t, s.Delete("tags/abc")) 34 _, err = s.Get("tags/abc") 35 assert.Equal(t, ref.ErrKeyNotFound, err) 36 37 // test SetWithLog & LogReader 38 sum2 := testutils.SecureRandomBytes(16) 39 l2 := refhelpers.RandomReflog() 40 require.NoError(t, s.SetWithLog("heads/alpha", sum2, l2)) 41 b, err = s.Get("heads/alpha") 42 require.NoError(t, err) 43 assert.Equal(t, sum2, b) 44 sum3 := testutils.SecureRandomBytes(16) 45 l3 := refhelpers.RandomReflog() 46 require.NoError(t, s.SetWithLog("heads/alpha", sum3, l3)) 47 b, err = s.Get("heads/alpha") 48 require.NoError(t, err) 49 assert.Equal(t, sum3, b) 50 r, err := s.LogReader("heads/alpha") 51 require.NoError(t, err) 52 l, err := r.Read() 53 require.NoError(t, err) 54 refhelpers.AssertReflogEqual(t, l3, l) 55 l, err = r.Read() 56 require.NoError(t, err) 57 refhelpers.AssertReflogEqual(t, l2, l) 58 _, err = r.Read() 59 assert.Equal(t, io.EOF, err) 60 61 // test Rename 62 require.NoError(t, s.Rename("heads/alpha", "heads/beta")) 63 _, err = s.Get("heads/alpha") 64 assert.Equal(t, ref.ErrKeyNotFound, err) 65 _, err = s.LogReader("heads/alpha") 66 assert.Equal(t, ref.ErrKeyNotFound, err) 67 b, err = s.Get("heads/beta") 68 require.NoError(t, err) 69 assert.Equal(t, sum3, b) 70 refhelpers.AssertLatestReflogEqual(t, s, "heads/beta", l3) 71 72 // test Copy 73 require.NoError(t, s.Copy("heads/beta", "heads/theta")) 74 b, err = s.Get("heads/beta") 75 require.NoError(t, err) 76 assert.Equal(t, sum3, b) 77 refhelpers.AssertLatestReflogEqual(t, s, "heads/beta", l3) 78 b, err = s.Get("heads/theta") 79 require.NoError(t, err) 80 assert.Equal(t, sum3, b) 81 refhelpers.AssertLatestReflogEqual(t, s, "heads/theta", l3) 82 83 // test Delete along with logs 84 require.NoError(t, s.Delete("heads/beta")) 85 _, err = s.Get("heads/beta") 86 assert.Equal(t, ref.ErrKeyNotFound, err) 87 _, err = s.LogReader("heads/beta") 88 assert.Equal(t, ref.ErrKeyNotFound, err) 89 90 // test FilterKey 91 sum4 := testutils.SecureRandomBytes(16) 92 l4 := refhelpers.RandomReflog() 93 require.NoError(t, s.SetWithLog("heads/gamma", sum4, l4)) 94 sl, err := s.FilterKey([]string{"heads/"}, nil) 95 require.NoError(t, err) 96 sort.Slice(sl, func(i, j int) bool { return sl[i] < sl[j] }) 97 assert.Equal(t, []string{ 98 "heads/gamma", 99 "heads/theta", 100 }, sl) 101 102 sum5 := testutils.SecureRandomBytes(16) 103 require.NoError(t, s.Set("tags/def", sum5)) 104 sl, err = s.FilterKey(nil, nil) 105 require.NoError(t, err) 106 sort.Slice(sl, func(i, j int) bool { return sl[i] < sl[j] }) 107 assert.Equal(t, []string{ 108 "heads/gamma", 109 "heads/theta", 110 "tags/def", 111 }, sl) 112 113 // test Filter 114 m, err := s.Filter([]string{"heads/"}, nil) 115 require.NoError(t, err) 116 assert.Equal(t, map[string][]byte{ 117 "heads/gamma": sum4, 118 "heads/theta": sum3, 119 }, m) 120 m, err = s.Filter(nil, nil) 121 require.NoError(t, err) 122 assert.Equal(t, map[string][]byte{ 123 "heads/gamma": sum4, 124 "heads/theta": sum3, 125 "tags/def": sum5, 126 }, m) 127 128 // Filter non-existent keys 129 sl, err = s.FilterKey([]string{"remotes/"}, nil) 130 require.NoError(t, err) 131 assert.Len(t, sl, 0) 132 m, err = s.Filter([]string{"remotes/"}, nil) 133 require.NoError(t, err) 134 assert.Len(t, m, 0) 135 }