diff options
Diffstat (limited to 'test/fuse_integration/directory_operations_test.go')
| -rw-r--r-- | test/fuse_integration/directory_operations_test.go | 351 |
1 files changed, 351 insertions, 0 deletions
diff --git a/test/fuse_integration/directory_operations_test.go b/test/fuse_integration/directory_operations_test.go new file mode 100644 index 000000000..060a3a027 --- /dev/null +++ b/test/fuse_integration/directory_operations_test.go @@ -0,0 +1,351 @@ +package fuse_test + +import ( + "fmt" + "os" + "path/filepath" + "sort" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// TestDirectoryOperations tests fundamental FUSE directory operations +func TestDirectoryOperations(t *testing.T) { + framework := NewFuseTestFramework(t, DefaultTestConfig()) + defer framework.Cleanup() + + require.NoError(t, framework.Setup(DefaultTestConfig())) + + t.Run("CreateDirectory", func(t *testing.T) { + testCreateDirectory(t, framework) + }) + + t.Run("RemoveDirectory", func(t *testing.T) { + testRemoveDirectory(t, framework) + }) + + t.Run("ReadDirectory", func(t *testing.T) { + testReadDirectory(t, framework) + }) + + t.Run("NestedDirectories", func(t *testing.T) { + testNestedDirectories(t, framework) + }) + + t.Run("DirectoryPermissions", func(t *testing.T) { + testDirectoryPermissions(t, framework) + }) + + t.Run("DirectoryRename", func(t *testing.T) { + testDirectoryRename(t, framework) + }) +} + +// testCreateDirectory tests creating directories +func testCreateDirectory(t *testing.T, framework *FuseTestFramework) { + dirName := "test_directory" + mountPath := filepath.Join(framework.GetMountPoint(), dirName) + + // Create directory + require.NoError(t, os.Mkdir(mountPath, 0755)) + + // Verify directory exists + info, err := os.Stat(mountPath) + require.NoError(t, err) + assert.True(t, info.IsDir()) + assert.Equal(t, os.FileMode(0755), info.Mode().Perm()) +} + +// testRemoveDirectory tests removing directories +func testRemoveDirectory(t *testing.T, framework *FuseTestFramework) { + dirName := "test_remove_dir" + mountPath := filepath.Join(framework.GetMountPoint(), dirName) + + // Create directory + require.NoError(t, os.Mkdir(mountPath, 0755)) + + // Verify it exists + _, err := os.Stat(mountPath) + require.NoError(t, err) + + // Remove directory + require.NoError(t, os.Remove(mountPath)) + + // Verify it's gone + _, err = os.Stat(mountPath) + require.True(t, os.IsNotExist(err)) +} + +// testReadDirectory tests reading directory contents +func testReadDirectory(t *testing.T, framework *FuseTestFramework) { + testDir := "test_read_dir" + framework.CreateTestDir(testDir) + + // Create various types of entries + entries := []string{ + "file1.txt", + "file2.log", + "subdir1", + "subdir2", + "script.sh", + } + + // Create files and subdirectories + for _, entry := range entries { + entryPath := filepath.Join(testDir, entry) + if entry == "subdir1" || entry == "subdir2" { + framework.CreateTestDir(entryPath) + } else { + framework.CreateTestFile(entryPath, []byte("content of "+entry)) + } + } + + // Read directory + mountPath := filepath.Join(framework.GetMountPoint(), testDir) + dirEntries, err := os.ReadDir(mountPath) + require.NoError(t, err) + + // Verify all entries are present + var actualNames []string + for _, entry := range dirEntries { + actualNames = append(actualNames, entry.Name()) + } + + sort.Strings(entries) + sort.Strings(actualNames) + assert.Equal(t, entries, actualNames) + + // Verify entry types + for _, entry := range dirEntries { + if entry.Name() == "subdir1" || entry.Name() == "subdir2" { + assert.True(t, entry.IsDir()) + } else { + assert.False(t, entry.IsDir()) + } + } +} + +// testNestedDirectories tests operations on nested directory structures +func testNestedDirectories(t *testing.T, framework *FuseTestFramework) { + // Create nested structure: parent/child1/grandchild/child2 + structure := []string{ + "parent", + "parent/child1", + "parent/child1/grandchild", + "parent/child2", + } + + // Create directories + for _, dir := range structure { + framework.CreateTestDir(dir) + } + + // Create files at various levels + files := map[string][]byte{ + "parent/root_file.txt": []byte("root level"), + "parent/child1/child_file.txt": []byte("child level"), + "parent/child1/grandchild/deep_file.txt": []byte("deep level"), + "parent/child2/another_file.txt": []byte("another child"), + } + + for path, content := range files { + framework.CreateTestFile(path, content) + } + + // Verify structure by walking + mountPath := filepath.Join(framework.GetMountPoint(), "parent") + var foundPaths []string + + err := filepath.Walk(mountPath, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + // Get relative path from mount point + relPath, _ := filepath.Rel(framework.GetMountPoint(), path) + foundPaths = append(foundPaths, relPath) + return nil + }) + require.NoError(t, err) + + // Verify all expected paths were found + expectedPaths := []string{ + "parent", + "parent/child1", + "parent/child1/grandchild", + "parent/child1/grandchild/deep_file.txt", + "parent/child1/child_file.txt", + "parent/child2", + "parent/child2/another_file.txt", + "parent/root_file.txt", + } + + sort.Strings(expectedPaths) + sort.Strings(foundPaths) + assert.Equal(t, expectedPaths, foundPaths) + + // Verify file contents + for path, expectedContent := range files { + framework.AssertFileContent(path, expectedContent) + } +} + +// testDirectoryPermissions tests directory permission operations +func testDirectoryPermissions(t *testing.T, framework *FuseTestFramework) { + dirName := "test_permissions_dir" + mountPath := filepath.Join(framework.GetMountPoint(), dirName) + + // Create directory with specific permissions + require.NoError(t, os.Mkdir(mountPath, 0700)) + + // Check initial permissions + info, err := os.Stat(mountPath) + require.NoError(t, err) + assert.Equal(t, os.FileMode(0700), info.Mode().Perm()) + + // Change permissions + require.NoError(t, os.Chmod(mountPath, 0755)) + + // Verify permission change + info, err = os.Stat(mountPath) + require.NoError(t, err) + assert.Equal(t, os.FileMode(0755), info.Mode().Perm()) +} + +// testDirectoryRename tests renaming directories +func testDirectoryRename(t *testing.T, framework *FuseTestFramework) { + oldName := "old_directory" + newName := "new_directory" + + // Create directory with content + framework.CreateTestDir(oldName) + framework.CreateTestFile(filepath.Join(oldName, "test_file.txt"), []byte("test content")) + + oldPath := filepath.Join(framework.GetMountPoint(), oldName) + newPath := filepath.Join(framework.GetMountPoint(), newName) + + // Rename directory + require.NoError(t, os.Rename(oldPath, newPath)) + + // Verify old path doesn't exist + _, err := os.Stat(oldPath) + require.True(t, os.IsNotExist(err)) + + // Verify new path exists and is a directory + info, err := os.Stat(newPath) + require.NoError(t, err) + assert.True(t, info.IsDir()) + + // Verify content still exists + framework.AssertFileContent(filepath.Join(newName, "test_file.txt"), []byte("test content")) +} + +// TestComplexDirectoryOperations tests more complex directory scenarios +func TestComplexDirectoryOperations(t *testing.T) { + framework := NewFuseTestFramework(t, DefaultTestConfig()) + defer framework.Cleanup() + + require.NoError(t, framework.Setup(DefaultTestConfig())) + + t.Run("RemoveNonEmptyDirectory", func(t *testing.T) { + testRemoveNonEmptyDirectory(t, framework) + }) + + t.Run("DirectoryWithManyFiles", func(t *testing.T) { + testDirectoryWithManyFiles(t, framework) + }) + + t.Run("DeepDirectoryNesting", func(t *testing.T) { + testDeepDirectoryNesting(t, framework) + }) +} + +// testRemoveNonEmptyDirectory tests behavior when trying to remove non-empty directories +func testRemoveNonEmptyDirectory(t *testing.T, framework *FuseTestFramework) { + dirName := "non_empty_dir" + framework.CreateTestDir(dirName) + + // Add content to directory + framework.CreateTestFile(filepath.Join(dirName, "file.txt"), []byte("content")) + framework.CreateTestDir(filepath.Join(dirName, "subdir")) + + mountPath := filepath.Join(framework.GetMountPoint(), dirName) + + // Try to remove non-empty directory (should fail) + err := os.Remove(mountPath) + require.Error(t, err) + + // Directory should still exist + info, err := os.Stat(mountPath) + require.NoError(t, err) + assert.True(t, info.IsDir()) + + // Remove with RemoveAll should work + require.NoError(t, os.RemoveAll(mountPath)) + + // Verify it's gone + _, err = os.Stat(mountPath) + require.True(t, os.IsNotExist(err)) +} + +// testDirectoryWithManyFiles tests directories with large numbers of files +func testDirectoryWithManyFiles(t *testing.T, framework *FuseTestFramework) { + dirName := "many_files_dir" + framework.CreateTestDir(dirName) + + // Create many files + numFiles := 100 + for i := 0; i < numFiles; i++ { + filename := filepath.Join(dirName, fmt.Sprintf("file_%03d.txt", i)) + content := []byte(fmt.Sprintf("Content of file %d", i)) + framework.CreateTestFile(filename, content) + } + + // Read directory + mountPath := filepath.Join(framework.GetMountPoint(), dirName) + entries, err := os.ReadDir(mountPath) + require.NoError(t, err) + + // Verify count + assert.Equal(t, numFiles, len(entries)) + + // Verify some random files + testIndices := []int{0, 10, 50, 99} + for _, i := range testIndices { + filename := filepath.Join(dirName, fmt.Sprintf("file_%03d.txt", i)) + expectedContent := []byte(fmt.Sprintf("Content of file %d", i)) + framework.AssertFileContent(filename, expectedContent) + } +} + +// testDeepDirectoryNesting tests very deep directory structures +func testDeepDirectoryNesting(t *testing.T, framework *FuseTestFramework) { + // Create deep nesting (20 levels) + depth := 20 + currentPath := "" + + for i := 0; i < depth; i++ { + if i == 0 { + currentPath = fmt.Sprintf("level_%02d", i) + } else { + currentPath = filepath.Join(currentPath, fmt.Sprintf("level_%02d", i)) + } + framework.CreateTestDir(currentPath) + } + + // Create a file at the deepest level + deepFile := filepath.Join(currentPath, "deep_file.txt") + deepContent := []byte("This is very deep!") + framework.CreateTestFile(deepFile, deepContent) + + // Verify file exists and has correct content + framework.AssertFileContent(deepFile, deepContent) + + // Verify we can navigate the full structure + mountPath := filepath.Join(framework.GetMountPoint(), currentPath) + info, err := os.Stat(mountPath) + require.NoError(t, err) + assert.True(t, info.IsDir()) +} |
