hello_fs_test.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. // Copyright 2015 Google Inc. All Rights Reserved.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package hellofs_test
  15. import (
  16. "io"
  17. "io/ioutil"
  18. "os"
  19. "path"
  20. "syscall"
  21. "testing"
  22. "github.com/jacobsa/fuse/fusetesting"
  23. "github.com/jacobsa/fuse/samples"
  24. "github.com/jacobsa/fuse/samples/hellofs"
  25. . "github.com/jacobsa/oglematchers"
  26. . "github.com/jacobsa/ogletest"
  27. )
  28. func TestHelloFS(t *testing.T) { RunTests(t) }
  29. ////////////////////////////////////////////////////////////////////////
  30. // Boilerplate
  31. ////////////////////////////////////////////////////////////////////////
  32. type HelloFSTest struct {
  33. samples.SampleTest
  34. }
  35. func init() { RegisterTestSuite(&HelloFSTest{}) }
  36. func (t *HelloFSTest) SetUp(ti *TestInfo) {
  37. var err error
  38. t.Server, err = hellofs.NewHelloFS(&t.Clock)
  39. AssertEq(nil, err)
  40. t.SampleTest.SetUp(ti)
  41. }
  42. ////////////////////////////////////////////////////////////////////////
  43. // Test functions
  44. ////////////////////////////////////////////////////////////////////////
  45. func (t *HelloFSTest) ReadDir_Root() {
  46. entries, err := fusetesting.ReadDirPicky(t.Dir)
  47. AssertEq(nil, err)
  48. AssertEq(2, len(entries))
  49. var fi os.FileInfo
  50. // dir
  51. fi = entries[0]
  52. ExpectEq("dir", fi.Name())
  53. ExpectEq(0, fi.Size())
  54. ExpectEq(os.ModeDir|0555, fi.Mode())
  55. ExpectEq(0, t.Clock.Now().Sub(fi.ModTime()), "ModTime: %v", fi.ModTime())
  56. ExpectTrue(fi.IsDir())
  57. // hello
  58. fi = entries[1]
  59. ExpectEq("hello", fi.Name())
  60. ExpectEq(len("Hello, world!"), fi.Size())
  61. ExpectEq(0444, fi.Mode())
  62. ExpectEq(0, t.Clock.Now().Sub(fi.ModTime()), "ModTime: %v", fi.ModTime())
  63. ExpectFalse(fi.IsDir())
  64. }
  65. func (t *HelloFSTest) ReadDir_Dir() {
  66. entries, err := fusetesting.ReadDirPicky(path.Join(t.Dir, "dir"))
  67. AssertEq(nil, err)
  68. AssertEq(1, len(entries))
  69. var fi os.FileInfo
  70. // world
  71. fi = entries[0]
  72. ExpectEq("world", fi.Name())
  73. ExpectEq(len("Hello, world!"), fi.Size())
  74. ExpectEq(0444, fi.Mode())
  75. ExpectEq(0, t.Clock.Now().Sub(fi.ModTime()), "ModTime: %v", fi.ModTime())
  76. ExpectFalse(fi.IsDir())
  77. }
  78. func (t *HelloFSTest) ReadDir_NonExistent() {
  79. _, err := fusetesting.ReadDirPicky(path.Join(t.Dir, "foobar"))
  80. AssertNe(nil, err)
  81. ExpectThat(err, Error(HasSubstr("no such file")))
  82. }
  83. func (t *HelloFSTest) Stat_Hello() {
  84. fi, err := os.Stat(path.Join(t.Dir, "hello"))
  85. AssertEq(nil, err)
  86. ExpectEq("hello", fi.Name())
  87. ExpectEq(len("Hello, world!"), fi.Size())
  88. ExpectEq(0444, fi.Mode())
  89. ExpectEq(0, t.Clock.Now().Sub(fi.ModTime()), "ModTime: %v", fi.ModTime())
  90. ExpectFalse(fi.IsDir())
  91. ExpectEq(1, fi.Sys().(*syscall.Stat_t).Nlink)
  92. }
  93. func (t *HelloFSTest) Stat_Dir() {
  94. fi, err := os.Stat(path.Join(t.Dir, "dir"))
  95. AssertEq(nil, err)
  96. ExpectEq("dir", fi.Name())
  97. ExpectEq(0, fi.Size())
  98. ExpectEq(0555|os.ModeDir, fi.Mode())
  99. ExpectEq(0, t.Clock.Now().Sub(fi.ModTime()), "ModTime: %v", fi.ModTime())
  100. ExpectTrue(fi.IsDir())
  101. ExpectEq(1, fi.Sys().(*syscall.Stat_t).Nlink)
  102. }
  103. func (t *HelloFSTest) Stat_World() {
  104. fi, err := os.Stat(path.Join(t.Dir, "dir/world"))
  105. AssertEq(nil, err)
  106. ExpectEq("world", fi.Name())
  107. ExpectEq(len("Hello, world!"), fi.Size())
  108. ExpectEq(0444, fi.Mode())
  109. ExpectEq(0, t.Clock.Now().Sub(fi.ModTime()), "ModTime: %v", fi.ModTime())
  110. ExpectFalse(fi.IsDir())
  111. ExpectEq(1, fi.Sys().(*syscall.Stat_t).Nlink)
  112. }
  113. func (t *HelloFSTest) Stat_NonExistent() {
  114. _, err := os.Stat(path.Join(t.Dir, "foobar"))
  115. AssertNe(nil, err)
  116. ExpectThat(err, Error(HasSubstr("no such file")))
  117. }
  118. func (t *HelloFSTest) ReadFile_Hello() {
  119. slice, err := ioutil.ReadFile(path.Join(t.Dir, "hello"))
  120. AssertEq(nil, err)
  121. ExpectEq("Hello, world!", string(slice))
  122. }
  123. func (t *HelloFSTest) ReadFile_Dir() {
  124. _, err := ioutil.ReadFile(path.Join(t.Dir, "dir"))
  125. AssertNe(nil, err)
  126. ExpectThat(err, Error(HasSubstr("is a directory")))
  127. }
  128. func (t *HelloFSTest) ReadFile_World() {
  129. slice, err := ioutil.ReadFile(path.Join(t.Dir, "dir/world"))
  130. AssertEq(nil, err)
  131. ExpectEq("Hello, world!", string(slice))
  132. }
  133. func (t *HelloFSTest) OpenAndRead() {
  134. var buf []byte = make([]byte, 1024)
  135. var n int
  136. var off int64
  137. var err error
  138. // Open the file.
  139. f, err := os.Open(path.Join(t.Dir, "hello"))
  140. defer func() {
  141. if f != nil {
  142. ExpectEq(nil, f.Close())
  143. }
  144. }()
  145. AssertEq(nil, err)
  146. // Seeking shouldn't affect the random access reads below.
  147. _, err = f.Seek(7, 0)
  148. AssertEq(nil, err)
  149. // Random access reads
  150. n, err = f.ReadAt(buf[:2], 0)
  151. AssertEq(nil, err)
  152. ExpectEq(2, n)
  153. ExpectEq("He", string(buf[:n]))
  154. n, err = f.ReadAt(buf[:2], int64(len("Hel")))
  155. AssertEq(nil, err)
  156. ExpectEq(2, n)
  157. ExpectEq("lo", string(buf[:n]))
  158. n, err = f.ReadAt(buf[:3], int64(len("Hello, wo")))
  159. AssertEq(nil, err)
  160. ExpectEq(3, n)
  161. ExpectEq("rld", string(buf[:n]))
  162. // Read beyond end.
  163. n, err = f.ReadAt(buf[:3], int64(len("Hello, world")))
  164. AssertEq(io.EOF, err)
  165. ExpectEq(1, n)
  166. ExpectEq("!", string(buf[:n]))
  167. // Seek then read the rest.
  168. off, err = f.Seek(int64(len("Hel")), 0)
  169. AssertEq(nil, err)
  170. AssertEq(len("Hel"), off)
  171. n, err = io.ReadFull(f, buf[:len("lo, world!")])
  172. AssertEq(nil, err)
  173. ExpectEq(len("lo, world!"), n)
  174. ExpectEq("lo, world!", string(buf[:n]))
  175. }
  176. func (t *HelloFSTest) Open_NonExistent() {
  177. _, err := os.Open(path.Join(t.Dir, "foobar"))
  178. AssertNe(nil, err)
  179. ExpectThat(err, Error(HasSubstr("no such file")))
  180. }