file_test.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. // Copyright 2014 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package webdav
  5. import (
  6. "path/filepath"
  7. "testing"
  8. )
  9. func TestDir(t *testing.T) {
  10. testCases := []struct {
  11. dir, name, want string
  12. }{
  13. {"/", "", "/"},
  14. {"/", "/", "/"},
  15. {"/", ".", "/"},
  16. {"/", "./a", "/a"},
  17. {"/", "..", "/"},
  18. {"/", "..", "/"},
  19. {"/", "../", "/"},
  20. {"/", "../.", "/"},
  21. {"/", "../a", "/a"},
  22. {"/", "../..", "/"},
  23. {"/", "../bar/a", "/bar/a"},
  24. {"/", "../baz/a", "/baz/a"},
  25. {"/", "...", "/..."},
  26. {"/", ".../a", "/.../a"},
  27. {"/", ".../..", "/"},
  28. {"/", "a", "/a"},
  29. {"/", "a/./b", "/a/b"},
  30. {"/", "a/../../b", "/b"},
  31. {"/", "a/../b", "/b"},
  32. {"/", "a/b", "/a/b"},
  33. {"/", "a/b/c/../../d", "/a/d"},
  34. {"/", "a/b/c/../../../d", "/d"},
  35. {"/", "a/b/c/../../../../d", "/d"},
  36. {"/", "a/b/c/d", "/a/b/c/d"},
  37. {"/foo/bar", "", "/foo/bar"},
  38. {"/foo/bar", "/", "/foo/bar"},
  39. {"/foo/bar", ".", "/foo/bar"},
  40. {"/foo/bar", "./a", "/foo/bar/a"},
  41. {"/foo/bar", "..", "/foo/bar"},
  42. {"/foo/bar", "../", "/foo/bar"},
  43. {"/foo/bar", "../.", "/foo/bar"},
  44. {"/foo/bar", "../a", "/foo/bar/a"},
  45. {"/foo/bar", "../..", "/foo/bar"},
  46. {"/foo/bar", "../bar/a", "/foo/bar/bar/a"},
  47. {"/foo/bar", "../baz/a", "/foo/bar/baz/a"},
  48. {"/foo/bar", "...", "/foo/bar/..."},
  49. {"/foo/bar", ".../a", "/foo/bar/.../a"},
  50. {"/foo/bar", ".../..", "/foo/bar"},
  51. {"/foo/bar", "a", "/foo/bar/a"},
  52. {"/foo/bar", "a/./b", "/foo/bar/a/b"},
  53. {"/foo/bar", "a/../../b", "/foo/bar/b"},
  54. {"/foo/bar", "a/../b", "/foo/bar/b"},
  55. {"/foo/bar", "a/b", "/foo/bar/a/b"},
  56. {"/foo/bar", "a/b/c/../../d", "/foo/bar/a/d"},
  57. {"/foo/bar", "a/b/c/../../../d", "/foo/bar/d"},
  58. {"/foo/bar", "a/b/c/../../../../d", "/foo/bar/d"},
  59. {"/foo/bar", "a/b/c/d", "/foo/bar/a/b/c/d"},
  60. {"/foo/bar/", "", "/foo/bar"},
  61. {"/foo/bar/", "/", "/foo/bar"},
  62. {"/foo/bar/", ".", "/foo/bar"},
  63. {"/foo/bar/", "./a", "/foo/bar/a"},
  64. {"/foo/bar/", "..", "/foo/bar"},
  65. {"/foo//bar///", "", "/foo/bar"},
  66. {"/foo//bar///", "/", "/foo/bar"},
  67. {"/foo//bar///", ".", "/foo/bar"},
  68. {"/foo//bar///", "./a", "/foo/bar/a"},
  69. {"/foo//bar///", "..", "/foo/bar"},
  70. {"/x/y/z", "ab/c\x00d/ef", ""},
  71. {".", "", "."},
  72. {".", "/", "."},
  73. {".", ".", "."},
  74. {".", "./a", "a"},
  75. {".", "..", "."},
  76. {".", "..", "."},
  77. {".", "../", "."},
  78. {".", "../.", "."},
  79. {".", "../a", "a"},
  80. {".", "../..", "."},
  81. {".", "../bar/a", "bar/a"},
  82. {".", "../baz/a", "baz/a"},
  83. {".", "...", "..."},
  84. {".", ".../a", ".../a"},
  85. {".", ".../..", "."},
  86. {".", "a", "a"},
  87. {".", "a/./b", "a/b"},
  88. {".", "a/../../b", "b"},
  89. {".", "a/../b", "b"},
  90. {".", "a/b", "a/b"},
  91. {".", "a/b/c/../../d", "a/d"},
  92. {".", "a/b/c/../../../d", "d"},
  93. {".", "a/b/c/../../../../d", "d"},
  94. {".", "a/b/c/d", "a/b/c/d"},
  95. {"", "", "."},
  96. {"", "/", "."},
  97. {"", ".", "."},
  98. {"", "./a", "a"},
  99. {"", "..", "."},
  100. }
  101. for _, tc := range testCases {
  102. d := Dir(filepath.FromSlash(tc.dir))
  103. if got := filepath.ToSlash(d.resolve(tc.name)); got != tc.want {
  104. t.Errorf("dir=%q, name=%q: got %q, want %q", tc.dir, tc.name, got, tc.want)
  105. }
  106. }
  107. }