041a9510c6
Save was failing file integrity checksums due to bugs in both Windows and Docker. This commit includes fixes to file time handling in tarexport and system.chtimes that are necessary along with the Windows platform fixes to correctly support save. With this change, sysfile_backups for windowsfilter driver are no longer needed, so that code is removed. Signed-off-by: Stefan J. Wernli <swernli@microsoft.com>
91 lines
2.2 KiB
Go
91 lines
2.2 KiB
Go
// +build !windows
|
|
|
|
package system
|
|
|
|
import (
|
|
"os"
|
|
"syscall"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
// TestChtimes tests Chtimes access time on a tempfile on Linux
|
|
func TestChtimesLinux(t *testing.T) {
|
|
file, dir := prepareTempFile(t)
|
|
defer os.RemoveAll(dir)
|
|
|
|
beforeUnixEpochTime := time.Unix(0, 0).Add(-100 * time.Second)
|
|
unixEpochTime := time.Unix(0, 0)
|
|
afterUnixEpochTime := time.Unix(100, 0)
|
|
unixMaxTime := maxTime
|
|
|
|
// Test both aTime and mTime set to Unix Epoch
|
|
Chtimes(file, unixEpochTime, unixEpochTime)
|
|
|
|
f, err := os.Stat(file)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
stat := f.Sys().(*syscall.Stat_t)
|
|
aTime := time.Unix(int64(stat.Atim.Sec), int64(stat.Atim.Nsec))
|
|
if aTime != unixEpochTime {
|
|
t.Fatalf("Expected: %s, got: %s", unixEpochTime, aTime)
|
|
}
|
|
|
|
// Test aTime before Unix Epoch and mTime set to Unix Epoch
|
|
Chtimes(file, beforeUnixEpochTime, unixEpochTime)
|
|
|
|
f, err = os.Stat(file)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
stat = f.Sys().(*syscall.Stat_t)
|
|
aTime = time.Unix(int64(stat.Atim.Sec), int64(stat.Atim.Nsec))
|
|
if aTime != unixEpochTime {
|
|
t.Fatalf("Expected: %s, got: %s", unixEpochTime, aTime)
|
|
}
|
|
|
|
// Test aTime set to Unix Epoch and mTime before Unix Epoch
|
|
Chtimes(file, unixEpochTime, beforeUnixEpochTime)
|
|
|
|
f, err = os.Stat(file)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
stat = f.Sys().(*syscall.Stat_t)
|
|
aTime = time.Unix(int64(stat.Atim.Sec), int64(stat.Atim.Nsec))
|
|
if aTime != unixEpochTime {
|
|
t.Fatalf("Expected: %s, got: %s", unixEpochTime, aTime)
|
|
}
|
|
|
|
// Test both aTime and mTime set to after Unix Epoch (valid time)
|
|
Chtimes(file, afterUnixEpochTime, afterUnixEpochTime)
|
|
|
|
f, err = os.Stat(file)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
stat = f.Sys().(*syscall.Stat_t)
|
|
aTime = time.Unix(int64(stat.Atim.Sec), int64(stat.Atim.Nsec))
|
|
if aTime != afterUnixEpochTime {
|
|
t.Fatalf("Expected: %s, got: %s", afterUnixEpochTime, aTime)
|
|
}
|
|
|
|
// Test both aTime and mTime set to Unix max time
|
|
Chtimes(file, unixMaxTime, unixMaxTime)
|
|
|
|
f, err = os.Stat(file)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
stat = f.Sys().(*syscall.Stat_t)
|
|
aTime = time.Unix(int64(stat.Atim.Sec), int64(stat.Atim.Nsec))
|
|
if aTime.Truncate(time.Second) != unixMaxTime.Truncate(time.Second) {
|
|
t.Fatalf("Expected: %s, got: %s", unixMaxTime.Truncate(time.Second), aTime.Truncate(time.Second))
|
|
}
|
|
}
|