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  }