dynamic_fs_test.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. package dynamicfs_test
  2. import (
  3. "testing"
  4. "github.com/jacobsa/fuse/fusetesting"
  5. "github.com/jacobsa/fuse/samples"
  6. "github.com/jacobsa/fuse/samples/dynamicfs"
  7. "bytes"
  8. "fmt"
  9. "io/ioutil"
  10. "os"
  11. "path"
  12. "syscall"
  13. "time"
  14. . "github.com/jacobsa/oglematchers"
  15. . "github.com/jacobsa/ogletest"
  16. )
  17. func TestDynamicFS(t *testing.T) { RunTests(t) }
  18. type DynamicFSTest struct {
  19. samples.SampleTest
  20. }
  21. func init() {
  22. RegisterTestSuite(&DynamicFSTest{})
  23. }
  24. var gCreateTime = time.Date(2017, 5, 4, 14, 53, 10, 0, time.UTC)
  25. func (t *DynamicFSTest) SetUp(ti *TestInfo) {
  26. var err error
  27. t.Clock.SetTime(gCreateTime)
  28. t.Server, err = dynamicfs.NewDynamicFS(&t.Clock)
  29. AssertEq(nil, err)
  30. t.SampleTest.SetUp(ti)
  31. }
  32. func (t *DynamicFSTest) ReadDir_Root() {
  33. entries, err := fusetesting.ReadDirPicky(t.Dir)
  34. AssertEq(nil, err)
  35. AssertEq(2, len(entries))
  36. var fi os.FileInfo
  37. fi = entries[0]
  38. ExpectEq("age", fi.Name())
  39. ExpectEq(0, fi.Size())
  40. ExpectEq(0444, fi.Mode())
  41. ExpectFalse(fi.IsDir())
  42. fi = entries[1]
  43. ExpectEq("weekday", fi.Name())
  44. ExpectEq(0, fi.Size())
  45. ExpectEq(0444, fi.Mode())
  46. ExpectFalse(fi.IsDir())
  47. }
  48. func (t *DynamicFSTest) ReadDir_NonExistent() {
  49. _, err := fusetesting.ReadDirPicky(path.Join(t.Dir, "nosuchfile"))
  50. AssertNe(nil, err)
  51. ExpectThat(err, Error(HasSubstr("no such file")))
  52. }
  53. func (t *DynamicFSTest) Stat_Age() {
  54. fi, err := os.Stat(path.Join(t.Dir, "age"))
  55. AssertEq(nil, err)
  56. ExpectEq("age", fi.Name())
  57. ExpectEq(0, fi.Size())
  58. ExpectEq(0444, fi.Mode())
  59. ExpectFalse(fi.IsDir())
  60. ExpectEq(1, fi.Sys().(*syscall.Stat_t).Nlink)
  61. }
  62. func (t *DynamicFSTest) Stat_Weekday() {
  63. fi, err := os.Stat(path.Join(t.Dir, "weekday"))
  64. AssertEq(nil, err)
  65. ExpectEq("weekday", fi.Name())
  66. ExpectEq(0, fi.Size())
  67. ExpectEq(0444, fi.Mode())
  68. ExpectFalse(fi.IsDir())
  69. ExpectEq(1, fi.Sys().(*syscall.Stat_t).Nlink)
  70. }
  71. func (t *DynamicFSTest) Stat_NonExistent() {
  72. _, err := os.Stat(path.Join(t.Dir, "nosuchfile"))
  73. AssertNe(nil, err)
  74. ExpectThat(err, Error(HasSubstr("no such file")))
  75. }
  76. func (t *DynamicFSTest) ReadFile_AgeZero() {
  77. t.Clock.SetTime(gCreateTime)
  78. slice, err := ioutil.ReadFile(path.Join(t.Dir, "age"))
  79. AssertEq(nil, err)
  80. ExpectEq("This filesystem is 0 seconds old.", string(slice))
  81. }
  82. func (t *DynamicFSTest) ReadFile_Age1000() {
  83. t.Clock.SetTime(gCreateTime.Add(1000 * time.Second))
  84. slice, err := ioutil.ReadFile(path.Join(t.Dir, "age"))
  85. AssertEq(nil, err)
  86. ExpectEq("This filesystem is 1000 seconds old.", string(slice))
  87. }
  88. func (t *DynamicFSTest) ReadFile_WeekdayNow() {
  89. now := t.Clock.Now()
  90. // Does simulated clock advance itself by default?
  91. // Manually set time to ensure it's frozen.
  92. t.Clock.SetTime(now)
  93. slice, err := ioutil.ReadFile(path.Join(t.Dir, "weekday"))
  94. AssertEq(nil, err)
  95. ExpectEq(fmt.Sprintf("Today is %s.", now.Weekday().String()), string(slice))
  96. }
  97. func (t *DynamicFSTest) ReadFile_WeekdayCreateTime() {
  98. t.Clock.SetTime(gCreateTime)
  99. slice, err := ioutil.ReadFile(path.Join(t.Dir, "weekday"))
  100. AssertEq(nil, err)
  101. ExpectEq(fmt.Sprintf("Today is %s.", gCreateTime.Weekday().String()), string(slice))
  102. }
  103. func (t *DynamicFSTest) ReadFile_AgeUnchangedForHandle() {
  104. t.Clock.SetTime(gCreateTime.Add(100 * time.Second))
  105. var err error
  106. var file *os.File
  107. file, err = os.Open(path.Join(t.Dir, "age"))
  108. AssertEq(nil, err)
  109. // Ensure that all reads from the same handle return the contents created at
  110. // file open time.
  111. func(file *os.File) {
  112. defer file.Close()
  113. var expectedContents string
  114. var buffer bytes.Buffer
  115. var bytesRead int64
  116. expectedContents = "This filesystem is 100 seconds old."
  117. bytesRead, err = buffer.ReadFrom(file)
  118. AssertEq(nil, err)
  119. ExpectEq(len(expectedContents), bytesRead)
  120. ExpectEq(expectedContents, buffer.String())
  121. t.Clock.SetTime(gCreateTime.Add(1000 * time.Second))
  122. // Seek back to the beginning of the file. The contents should be unchanged
  123. // for the life of the file handle.
  124. _, err = file.Seek(0, 0)
  125. AssertEq(nil, err)
  126. buffer.Reset()
  127. bytesRead, err = buffer.ReadFrom(file)
  128. AssertEq(nil, err)
  129. ExpectEq(len(expectedContents), bytesRead)
  130. ExpectEq(expectedContents, buffer.String())
  131. }(file)
  132. // The clock was advanced while the old handle was open. The content change
  133. // should be reflected by the new handle.
  134. file, err = os.Open(path.Join(t.Dir, "age"))
  135. AssertEq(nil, err)
  136. func(file *os.File) {
  137. defer file.Close()
  138. expectedContents := "This filesystem is 1000 seconds old."
  139. buffer := bytes.Buffer{}
  140. bytesRead, err := buffer.ReadFrom(file)
  141. AssertEq(nil, err)
  142. ExpectEq(len(expectedContents), bytesRead)
  143. ExpectEq(expectedContents, buffer.String())
  144. }(file)
  145. }