aofs_test.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package ftp
  2. import (
  3. "os"
  4. "sort"
  5. "testing"
  6. "imuslab.com/arozos/mod/filesystem"
  7. "imuslab.com/arozos/mod/storage"
  8. "imuslab.com/arozos/mod/user"
  9. )
  10. // newTestAofs returns an aofs whose user can reach a local storage, a
  11. // buffered remote storage and a closed storage.
  12. func newTestAofs() aofs {
  13. return aofs{
  14. userinfo: &user.User{
  15. Username: "alice",
  16. HomeDirectories: &storage.StoragePool{
  17. Storages: []*filesystem.FileSystemHandler{
  18. {UUID: "user"},
  19. {UUID: "remote", RequireBuffer: true},
  20. {UUID: "closed", Closed: true},
  21. },
  22. },
  23. },
  24. }
  25. }
  26. func TestIsVirtualRootPath(t *testing.T) {
  27. cases := []struct {
  28. path string
  29. want bool
  30. }{
  31. {"/", true},
  32. {"/README.txt", true},
  33. {"/user/../README.txt", true},
  34. {"/user", false},
  35. {"/user/README.txt", false},
  36. {"/readme.txt", false},
  37. }
  38. for _, c := range cases {
  39. if got := isVirtualRootPath(c.path); got != c.want {
  40. t.Errorf("isVirtualRootPath(%q) = %v, want %v", c.path, got, c.want)
  41. }
  42. }
  43. }
  44. func TestRootListing(t *testing.T) {
  45. a := newTestAofs()
  46. fi, err := a.Stat("/")
  47. if err != nil {
  48. t.Fatalf("Stat root: %v", err)
  49. }
  50. if !fi.IsDir() {
  51. t.Error("expected root to be a directory")
  52. }
  53. f, err := a.Open("/")
  54. if err != nil {
  55. t.Fatalf("Open root: %v", err)
  56. }
  57. defer f.Close()
  58. names, err := f.Readdirnames(-1)
  59. if err != nil {
  60. t.Fatalf("Readdirnames: %v", err)
  61. }
  62. sort.Strings(names)
  63. want := []string{"README.txt", "user"}
  64. if len(names) != len(want) {
  65. t.Fatalf("root entries = %v, want %v", names, want)
  66. }
  67. for i := range want {
  68. if names[i] != want[i] {
  69. t.Errorf("root entries = %v, want %v", names, want)
  70. break
  71. }
  72. }
  73. }
  74. func TestRootReadmeReadable(t *testing.T) {
  75. a := newTestAofs()
  76. f, err := a.Open("/README.txt")
  77. if err != nil {
  78. t.Fatalf("Open README: %v", err)
  79. }
  80. defer f.Close()
  81. buf := make([]byte, 64)
  82. n, _ := f.Read(buf)
  83. if n == 0 {
  84. t.Error("expected README.txt to have content")
  85. }
  86. }
  87. func TestRootIsReadOnly(t *testing.T) {
  88. a := newTestAofs()
  89. if _, err := a.OpenFile("/README.txt", os.O_WRONLY|os.O_TRUNC, 0644); err == nil {
  90. t.Error("expected writing README.txt to fail")
  91. }
  92. if _, err := a.Create("/README.txt"); err == nil {
  93. t.Error("expected creating README.txt to fail")
  94. }
  95. if err := a.Remove("/README.txt"); err == nil {
  96. t.Error("expected removing README.txt to fail")
  97. }
  98. if err := a.Mkdir("/", 0755); err == nil {
  99. t.Error("expected mkdir on root to fail")
  100. }
  101. if err := a.Rename("/README.txt", "/user/README.txt"); err == nil {
  102. t.Error("expected renaming README.txt to fail")
  103. }
  104. }