@ -128,11 +128,11 @@ func createNamespace(disk StorageAPI, volume string, files []string) error {
// Test if tree walker returns entries matching prefix alone are received
// when a non empty prefix is supplied.
func testTreeWalkPrefix ( t * testing . T , listDir listDirFunc , isLeaf isLeafFunc ) {
func testTreeWalkPrefix ( t * testing . T , listDir listDirFunc , isLeaf isLeafFunc , isLeafDir isLeafDirFunc ) {
// Start the tree walk go-routine.
prefix := "d/"
endWalkCh := make ( chan struct { } )
twResultCh := startTreeWalk ( context . Background ( ) , volume , prefix , "" , true , listDir , isLeaf , endWalkCh )
twResultCh := startTreeWalk ( context . Background ( ) , volume , prefix , "" , true , listDir , isLeaf , isLeafDir , endWalkCh )
// Check if all entries received on the channel match the prefix.
for res := range twResultCh {
@ -143,11 +143,11 @@ func testTreeWalkPrefix(t *testing.T, listDir listDirFunc, isLeaf isLeafFunc) {
}
// Test if entries received on tree walk's channel appear after the supplied marker.
func testTreeWalkMarker ( t * testing . T , listDir listDirFunc , isLeaf isLeafFunc ) {
func testTreeWalkMarker ( t * testing . T , listDir listDirFunc , isLeaf isLeafFunc , isLeafDir isLeafDirFunc ) {
// Start the tree walk go-routine.
prefix := ""
endWalkCh := make ( chan struct { } )
twResultCh := startTreeWalk ( context . Background ( ) , volume , prefix , "d/g" , true , listDir , isLeaf , endWalkCh )
twResultCh := startTreeWalk ( context . Background ( ) , volume , prefix , "d/g" , true , listDir , isLeaf , isLeafDir , endWalkCh )
// Check if only 3 entries, namely d/g/h, i/j/k, lmn are received on the channel.
expectedCount := 3
@ -187,11 +187,20 @@ func TestTreeWalk(t *testing.T) {
isLeaf := func ( volume , prefix string ) bool {
return ! hasSuffix ( prefix , slashSeparator )
}
isLeafDir := func ( volume , prefix string ) bool {
entries , listErr := disk . ListDir ( volume , prefix , 1 )
if listErr != nil {
return false
}
return len ( entries ) == 0
}
listDir := listDirFactory ( context . Background ( ) , isLeaf , xlTreeWalkIgnoredErrs , disk )
// Simple test for prefix based walk.
testTreeWalkPrefix ( t , listDir , isLeaf )
testTreeWalkPrefix ( t , listDir , isLeaf , isLeafDir )
// Simple test when marker is set.
testTreeWalkMarker ( t , listDir , isLeaf )
testTreeWalkMarker ( t , listDir , isLeaf , isLeafDir )
err = os . RemoveAll ( fsDir )
if err != nil {
t . Fatal ( err )
@ -222,6 +231,15 @@ func TestTreeWalkTimeout(t *testing.T) {
isLeaf := func ( volume , prefix string ) bool {
return ! hasSuffix ( prefix , slashSeparator )
}
isLeafDir := func ( volume , prefix string ) bool {
entries , listErr := disk . ListDir ( volume , prefix , 1 )
if listErr != nil {
return false
}
return len ( entries ) == 0
}
listDir := listDirFactory ( context . Background ( ) , isLeaf , xlTreeWalkIgnoredErrs , disk )
// TreeWalk pool with 2 seconds timeout for tree-walk go routines.
@ -231,7 +249,7 @@ func TestTreeWalkTimeout(t *testing.T) {
prefix := ""
marker := ""
recursive := true
resultCh := startTreeWalk ( context . Background ( ) , volume , prefix , marker , recursive , listDir , isLeaf , endWalkCh )
resultCh := startTreeWalk ( context . Background ( ) , volume , prefix , marker , recursive , listDir , isLeaf , isLeafDir , endWalkCh )
params := listParams {
bucket : volume ,
@ -373,6 +391,14 @@ func TestRecursiveTreeWalk(t *testing.T) {
return ! hasSuffix ( prefix , slashSeparator )
}
isLeafDir := func ( volume , prefix string ) bool {
entries , listErr := disk1 . ListDir ( volume , prefix , 1 )
if listErr != nil {
return false
}
return len ( entries ) == 0
}
// Create listDir function.
listDir := listDirFactory ( context . Background ( ) , isLeaf , xlTreeWalkIgnoredErrs , disk1 )
@ -450,7 +476,7 @@ func TestRecursiveTreeWalk(t *testing.T) {
for i , testCase := range testCases {
for entry := range startTreeWalk ( context . Background ( ) , volume ,
testCase . prefix , testCase . marker , testCase . recursive ,
listDir , isLeaf , endWalkCh ) {
listDir , isLeaf , isLeafDir , endWalkCh ) {
if _ , found := testCase . expected [ entry . entry ] ; ! found {
t . Errorf ( "Test %d: Expected %s, but couldn't find" , i + 1 , entry . entry )
}
@ -479,6 +505,15 @@ func TestSortedness(t *testing.T) {
isLeaf := func ( volume , prefix string ) bool {
return ! hasSuffix ( prefix , slashSeparator )
}
isLeafDir := func ( volume , prefix string ) bool {
entries , listErr := disk1 . ListDir ( volume , prefix , 1 )
if listErr != nil {
return false
}
return len ( entries ) == 0
}
// Create listDir function.
listDir := listDirFactory ( context . Background ( ) , isLeaf , xlTreeWalkIgnoredErrs , disk1 )
@ -522,7 +557,7 @@ func TestSortedness(t *testing.T) {
var actualEntries [ ] string
for entry := range startTreeWalk ( context . Background ( ) , volume ,
test . prefix , test . marker , test . recursive ,
listDir , isLeaf , endWalkCh ) {
listDir , isLeaf , isLeafDir , endWalkCh ) {
actualEntries = append ( actualEntries , entry . entry )
}
if ! sort . IsSorted ( sort . StringSlice ( actualEntries ) ) {
@ -553,6 +588,15 @@ func TestTreeWalkIsEnd(t *testing.T) {
isLeaf := func ( volume , prefix string ) bool {
return ! hasSuffix ( prefix , slashSeparator )
}
isLeafDir := func ( volume , prefix string ) bool {
entries , listErr := disk1 . ListDir ( volume , prefix , 1 )
if listErr != nil {
return false
}
return len ( entries ) == 0
}
// Create listDir function.
listDir := listDirFactory ( context . Background ( ) , isLeaf , xlTreeWalkIgnoredErrs , disk1 )
@ -595,7 +639,7 @@ func TestTreeWalkIsEnd(t *testing.T) {
}
for i , test := range testCases {
var entry treeWalkResult
for entry = range startTreeWalk ( context . Background ( ) , volume , test . prefix , test . marker , test . recursive , listDir , isLeaf , endWalkCh ) {
for entry = range startTreeWalk ( context . Background ( ) , volume , test . prefix , test . marker , test . recursive , listDir , isLeaf , isLeafDir , endWalkCh ) {
}
if entry . entry != test . expectedEntry {
t . Errorf ( "Test %d: Expected entry %s, but received %s with the EOF marker" , i , test . expectedEntry , entry . entry )