diff --git a/check_test.go b/check_test.go index de7c96c..bd757ef 100644 --- a/check_test.go +++ b/check_test.go @@ -1,6 +1,7 @@ package mtree import ( + "bytes" "io/ioutil" "os" "path/filepath" @@ -95,3 +96,46 @@ func ExampleCheck() { // handle failed validity ... } } + +// https://github.com/vbatts/go-mtree/issues/8 +func TestTimeComparison(t *testing.T) { + dir, err := ioutil.TempDir("", "test-time.") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(dir) + + // This is the format of time from FreeBSD + spec := ` +/set type=file time=5.000000000 +. type=dir + file time=5.000000000 +.. +` + + fh, err := os.Create(filepath.Join(dir, "file")) + if err != nil { + t.Fatal(err) + } + // This is what mode we're checking for. Round integer of epoch seconds + epoch := time.Unix(5, 0) + if err := os.Chtimes(fh.Name(), epoch, epoch); err != nil { + t.Fatal(err) + } + if err := fh.Close(); err != nil { + t.Error(err) + } + + dh, err := ParseSpec(bytes.NewBufferString(spec)) + if err != nil { + t.Fatal(err) + } + + res, err := Check(dir, dh, nil) + if err != nil { + t.Error(err) + } + if len(res.Failures) > 0 { + t.Fatal(res.Failures) + } +} diff --git a/keywords.go b/keywords.go index bffe169..8b01c80 100644 --- a/keywords.go +++ b/keywords.go @@ -208,7 +208,10 @@ var ( } timeKeywordFunc = func(path string, info os.FileInfo) (string, error) { t := info.ModTime().UnixNano() - return fmt.Sprintf("time=%d.%d", (t / 1e9), (t % (t / 1e9))), nil + if t == 0 { + return "time=0.000000000", nil + } + return fmt.Sprintf("time=%d.%9.9d", (t / 1e9), (t % (t / 1e9))), nil } linkKeywordFunc = func(path string, info os.FileInfo) (string, error) { if info.Mode()&os.ModeSymlink != 0 {