github.com/pachyderm/pachyderm@v1.13.4/src/server/pkg/storage/fileset/index/index_test.go (about) 1 package index 2 3 import ( 4 "context" 5 "strings" 6 "testing" 7 8 "github.com/pachyderm/pachyderm/src/client/pkg/require" 9 "github.com/pachyderm/pachyderm/src/server/pkg/dbutil" 10 "github.com/pachyderm/pachyderm/src/server/pkg/storage/chunk" 11 "github.com/pachyderm/pachyderm/src/server/pkg/storage/track" 12 "github.com/pachyderm/pachyderm/src/server/pkg/uuid" 13 ) 14 15 func write(tb testing.TB, chunks *chunk.Storage, fileNames []string) *Index { 16 iw := NewWriter(context.Background(), chunks, uuid.NewWithoutDashes()) 17 for _, fileName := range fileNames { 18 idx := &Index{ 19 Path: fileName, 20 File: &File{}, 21 } 22 require.NoError(tb, iw.WriteIndex(idx)) 23 } 24 topIdx, err := iw.Close() 25 require.NoError(tb, err) 26 return topIdx 27 } 28 29 func actualFiles(tb testing.TB, topIdx *Index, chunks *chunk.Storage, opts ...Option) []string { 30 ir := NewReader(chunks, topIdx, opts...) 31 result := []string{} 32 require.NoError(tb, ir.Iterate(context.Background(), func(idx *Index) error { 33 result = append(result, idx.Path) 34 return nil 35 })) 36 return result 37 } 38 39 func expectedFiles(fileNames []string, prefix string) []string { 40 result := []string{} 41 for _, fileName := range fileNames { 42 if strings.HasPrefix(fileName, prefix) { 43 result = append(result, fileName) 44 } 45 } 46 return result 47 } 48 49 func pathRange(fileNames []string) *PathRange { 50 return &PathRange{ 51 Lower: fileNames[0], 52 Upper: fileNames[len(fileNames)-1], 53 } 54 } 55 56 func Check(t *testing.T, permString string) { 57 db := dbutil.NewTestDB(t) 58 tr := track.NewTestTracker(t, db) 59 _, chunks := chunk.NewTestStorage(t, db, tr) 60 fileNames := Generate(permString) 61 averageBits = 12 62 topIdx := write(t, chunks, fileNames) 63 t.Run("Full", func(t *testing.T) { 64 expected := fileNames 65 actual := actualFiles(t, topIdx, chunks) 66 require.Equal(t, expected, actual) 67 }) 68 t.Run("FirstFile", func(t *testing.T) { 69 prefix := fileNames[0] 70 expected := []string{prefix} 71 actual := actualFiles(t, topIdx, chunks, WithPrefix(prefix)) 72 require.Equal(t, expected, actual) 73 actual = actualFiles(t, topIdx, chunks, WithRange(pathRange(expected))) 74 require.Equal(t, expected, actual) 75 }) 76 t.Run("FirstRange", func(t *testing.T) { 77 prefix := string(fileNames[0][0]) 78 expected := expectedFiles(fileNames, prefix) 79 actual := actualFiles(t, topIdx, chunks, WithPrefix(prefix)) 80 require.Equal(t, expected, actual) 81 actual = actualFiles(t, topIdx, chunks, WithRange(pathRange(expected))) 82 require.Equal(t, expected, actual) 83 }) 84 t.Run("MiddleFile", func(t *testing.T) { 85 prefix := fileNames[len(fileNames)/2] 86 expected := []string{prefix} 87 actual := actualFiles(t, topIdx, chunks, WithPrefix(prefix)) 88 require.Equal(t, expected, actual) 89 actual = actualFiles(t, topIdx, chunks, WithRange(pathRange(expected))) 90 require.Equal(t, expected, actual) 91 }) 92 t.Run("MiddleRange", func(t *testing.T) { 93 prefix := string(fileNames[len(fileNames)/2][0]) 94 expected := expectedFiles(fileNames, prefix) 95 actual := actualFiles(t, topIdx, chunks, WithPrefix(prefix)) 96 require.Equal(t, expected, actual) 97 actual = actualFiles(t, topIdx, chunks, WithRange(pathRange(expected))) 98 require.Equal(t, expected, actual) 99 }) 100 t.Run("LastFile", func(t *testing.T) { 101 prefix := fileNames[len(fileNames)-1] 102 expected := []string{prefix} 103 actual := actualFiles(t, topIdx, chunks, WithPrefix(prefix)) 104 require.Equal(t, expected, actual) 105 actual = actualFiles(t, topIdx, chunks, WithRange(pathRange(expected))) 106 require.Equal(t, expected, actual) 107 }) 108 t.Run("LastRange", func(t *testing.T) { 109 prefix := string(fileNames[len(fileNames)-1][0]) 110 expected := expectedFiles(fileNames, prefix) 111 actual := actualFiles(t, topIdx, chunks, WithPrefix(prefix)) 112 require.Equal(t, expected, actual) 113 actual = actualFiles(t, topIdx, chunks, WithRange(pathRange(expected))) 114 require.Equal(t, expected, actual) 115 }) 116 } 117 118 func TestSingleLevel(t *testing.T) { 119 Check(t, "abc") 120 } 121 122 func TestMultiLevel(t *testing.T) { 123 Check(t, "abcdefg") 124 }