You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
182 lines
4.5 KiB
Go
182 lines
4.5 KiB
Go
package dynamicfs_test
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/jacobsa/fuse/fusetesting"
|
|
"github.com/jacobsa/fuse/samples"
|
|
"github.com/jacobsa/fuse/samples/dynamicfs"
|
|
|
|
"bytes"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"os"
|
|
"path"
|
|
"syscall"
|
|
"time"
|
|
|
|
. "github.com/jacobsa/oglematchers"
|
|
. "github.com/jacobsa/ogletest"
|
|
)
|
|
|
|
func TestDynamicFS(t *testing.T) { RunTests(t) }
|
|
|
|
type DynamicFSTest struct {
|
|
samples.SampleTest
|
|
}
|
|
|
|
func init() {
|
|
RegisterTestSuite(&DynamicFSTest{})
|
|
}
|
|
|
|
var gCreateTime = time.Date(2017, 5, 4, 14, 53, 10, 0, time.UTC)
|
|
|
|
func (t *DynamicFSTest) SetUp(ti *TestInfo) {
|
|
var err error
|
|
t.Clock.SetTime(gCreateTime)
|
|
t.Server, err = dynamicfs.NewDynamicFS(&t.Clock)
|
|
AssertEq(nil, err)
|
|
t.SampleTest.SetUp(ti)
|
|
}
|
|
|
|
func (t *DynamicFSTest) ReadDir_Root() {
|
|
entries, err := fusetesting.ReadDirPicky(t.Dir)
|
|
AssertEq(nil, err)
|
|
AssertEq(2, len(entries))
|
|
|
|
var fi os.FileInfo
|
|
fi = entries[0]
|
|
ExpectEq("age", fi.Name())
|
|
ExpectEq(0, fi.Size())
|
|
ExpectEq(0444, fi.Mode())
|
|
ExpectFalse(fi.IsDir())
|
|
|
|
fi = entries[1]
|
|
ExpectEq("weekday", fi.Name())
|
|
ExpectEq(0, fi.Size())
|
|
ExpectEq(0444, fi.Mode())
|
|
ExpectFalse(fi.IsDir())
|
|
}
|
|
|
|
func (t *DynamicFSTest) ReadDir_NonExistent() {
|
|
_, err := fusetesting.ReadDirPicky(path.Join(t.Dir, "nosuchfile"))
|
|
|
|
AssertNe(nil, err)
|
|
ExpectThat(err, Error(HasSubstr("no such file")))
|
|
}
|
|
|
|
func (t *DynamicFSTest) Stat_Age() {
|
|
fi, err := os.Stat(path.Join(t.Dir, "age"))
|
|
AssertEq(nil, err)
|
|
|
|
ExpectEq("age", fi.Name())
|
|
ExpectEq(0, fi.Size())
|
|
ExpectEq(0444, fi.Mode())
|
|
ExpectFalse(fi.IsDir())
|
|
ExpectEq(1, fi.Sys().(*syscall.Stat_t).Nlink)
|
|
}
|
|
|
|
func (t *DynamicFSTest) Stat_Weekday() {
|
|
fi, err := os.Stat(path.Join(t.Dir, "weekday"))
|
|
AssertEq(nil, err)
|
|
|
|
ExpectEq("weekday", fi.Name())
|
|
ExpectEq(0, fi.Size())
|
|
ExpectEq(0444, fi.Mode())
|
|
ExpectFalse(fi.IsDir())
|
|
ExpectEq(1, fi.Sys().(*syscall.Stat_t).Nlink)
|
|
}
|
|
|
|
func (t *DynamicFSTest) Stat_NonExistent() {
|
|
_, err := os.Stat(path.Join(t.Dir, "nosuchfile"))
|
|
|
|
AssertNe(nil, err)
|
|
ExpectThat(err, Error(HasSubstr("no such file")))
|
|
}
|
|
|
|
func (t *DynamicFSTest) ReadFile_AgeZero() {
|
|
t.Clock.SetTime(gCreateTime)
|
|
slice, err := ioutil.ReadFile(path.Join(t.Dir, "age"))
|
|
|
|
AssertEq(nil, err)
|
|
ExpectEq("This filesystem is 0 seconds old.", string(slice))
|
|
}
|
|
|
|
func (t *DynamicFSTest) ReadFile_Age1000() {
|
|
t.Clock.SetTime(gCreateTime.Add(1000 * time.Second))
|
|
slice, err := ioutil.ReadFile(path.Join(t.Dir, "age"))
|
|
|
|
AssertEq(nil, err)
|
|
ExpectEq("This filesystem is 1000 seconds old.", string(slice))
|
|
}
|
|
|
|
func (t *DynamicFSTest) ReadFile_WeekdayNow() {
|
|
now := t.Clock.Now()
|
|
// Does simulated clock advance itself by default?
|
|
// Manually set time to ensure it's frozen.
|
|
t.Clock.SetTime(now)
|
|
slice, err := ioutil.ReadFile(path.Join(t.Dir, "weekday"))
|
|
|
|
AssertEq(nil, err)
|
|
ExpectEq(fmt.Sprintf("Today is %s.", now.Weekday().String()), string(slice))
|
|
}
|
|
|
|
func (t *DynamicFSTest) ReadFile_WeekdayCreateTime() {
|
|
t.Clock.SetTime(gCreateTime)
|
|
slice, err := ioutil.ReadFile(path.Join(t.Dir, "weekday"))
|
|
|
|
AssertEq(nil, err)
|
|
ExpectEq(fmt.Sprintf("Today is %s.", gCreateTime.Weekday().String()), string(slice))
|
|
}
|
|
|
|
func (t *DynamicFSTest) ReadFile_AgeUnchangedForHandle() {
|
|
t.Clock.SetTime(gCreateTime.Add(100 * time.Second))
|
|
var err error
|
|
var file *os.File
|
|
file, err = os.Open(path.Join(t.Dir, "age"))
|
|
AssertEq(nil, err)
|
|
|
|
// Ensure that all reads from the same handle return the contents created at
|
|
// file open time.
|
|
func(file *os.File) {
|
|
defer file.Close()
|
|
|
|
var expectedContents string
|
|
var buffer bytes.Buffer
|
|
var bytesRead int64
|
|
|
|
expectedContents = "This filesystem is 100 seconds old."
|
|
bytesRead, err = buffer.ReadFrom(file)
|
|
AssertEq(nil, err)
|
|
ExpectEq(len(expectedContents), bytesRead)
|
|
ExpectEq(expectedContents, buffer.String())
|
|
|
|
t.Clock.SetTime(gCreateTime.Add(1000 * time.Second))
|
|
// Seek back to the beginning of the file. The contents should be unchanged
|
|
// for the life of the file handle.
|
|
_, err = file.Seek(0, 0)
|
|
AssertEq(nil, err)
|
|
|
|
buffer.Reset()
|
|
bytesRead, err = buffer.ReadFrom(file)
|
|
AssertEq(nil, err)
|
|
ExpectEq(len(expectedContents), bytesRead)
|
|
ExpectEq(expectedContents, buffer.String())
|
|
}(file)
|
|
|
|
// The clock was advanced while the old handle was open. The content change
|
|
// should be reflected by the new handle.
|
|
file, err = os.Open(path.Join(t.Dir, "age"))
|
|
AssertEq(nil, err)
|
|
func(file *os.File) {
|
|
defer file.Close()
|
|
|
|
expectedContents := "This filesystem is 1000 seconds old."
|
|
buffer := bytes.Buffer{}
|
|
bytesRead, err := buffer.ReadFrom(file)
|
|
AssertEq(nil, err)
|
|
ExpectEq(len(expectedContents), bytesRead)
|
|
ExpectEq(expectedContents, buffer.String())
|
|
}(file)
|
|
}
|