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  }