in registry/storage/driver/testsuites/testsuites.go [2269:2371]
func (s *DriverSuite) TestWalk() {
rootDirectory := "/" + dtestutil.RandomFilenameRange(8, 8)
defer s.deletePath(s.StorageDriver, rootDirectory)
s.T().Logf("root directory used for testing: %s", rootDirectory)
numWantedFiles := 10
wantedFiles := dtestutil.RandomBranchingFiles(rootDirectory, numWantedFiles)
wantedDirectoriesSet := make(map[string]struct{})
for i := 0; i < numWantedFiles; i++ {
// Gather unique directories from the full path, excluding the root directory.
p := path.Dir(wantedFiles[i])
for {
// Guard against non-terminating loops: path.Dir returns "." if the path is empty.
if p == rootDirectory || p == "." {
break
}
wantedDirectoriesSet[p] = struct{}{}
p = path.Dir(p)
}
/* #nosec G404 */
err := s.StorageDriver.PutContent(s.ctx, wantedFiles[i], s.blobberFactory.GetBlobber(8+mrand.Int64N(8)).GetAllBytes())
require.NoError(s.T(), err)
}
verifyResults := func(actualFiles, actualDirectories []string) {
require.ElementsMatch(s.T(), wantedFiles, actualFiles)
// Convert from a set of wanted directories into a slice.
wantedDirectories := make([]string, len(wantedDirectoriesSet))
var i int
for k := range wantedDirectoriesSet {
wantedDirectories[i] = k
i++
}
require.ElementsMatch(s.T(), wantedDirectories, actualDirectories)
}
s.Run("PararellWalk", func() {
s.skipIfWalkParallelIsNotSupported()
fChan := make(chan string)
dChan := make(chan string)
var actualFiles []string
var actualDirectories []string
var wg sync.WaitGroup
go func() {
defer wg.Done()
wg.Add(1)
for f := range fChan {
actualFiles = append(actualFiles, f)
}
}()
go func() {
defer wg.Done()
wg.Add(1)
for d := range dChan {
actualDirectories = append(actualDirectories, d)
}
}()
err := s.StorageDriver.WalkParallel(s.ctx, rootDirectory, func(fInfo storagedriver.FileInfo) error {
// Use append here to prevent a panic if walk finds more than we expect.
if fInfo.IsDir() {
dChan <- fInfo.Path()
} else {
fChan <- fInfo.Path()
}
return nil
})
require.NoError(s.T(), err)
close(fChan)
close(dChan)
wg.Wait()
verifyResults(actualFiles, actualDirectories)
})
s.Run("PlainWalk", func() {
var actualFiles []string
var actualDirectories []string
err := s.StorageDriver.Walk(s.ctx, rootDirectory, func(fInfo storagedriver.FileInfo) error {
if fInfo.IsDir() {
actualDirectories = append(actualDirectories, fInfo.Path())
} else {
actualFiles = append(actualFiles, fInfo.Path())
}
return nil
})
require.NoError(s.T(), err)
verifyResults(actualFiles, actualDirectories)
})
}