| // +build linux |
| |
| package lumberjack |
| |
| import ( |
| "os" |
| "syscall" |
| "testing" |
| "time" |
| ) |
| |
| func TestMaintainMode(t *testing.T) { |
| currentTime = fakeTime |
| dir := makeTempDir("TestMaintainMode", t) |
| defer os.RemoveAll(dir) |
| |
| filename := logFile(dir) |
| |
| mode := os.FileMode(0600) |
| f, err := os.OpenFile(filename, os.O_CREATE|os.O_RDWR, mode) |
| isNil(err, t) |
| f.Close() |
| |
| l := &Logger{ |
| Filename: filename, |
| MaxBackups: 1, |
| MaxSize: 100, // megabytes |
| } |
| defer l.Close() |
| b := []byte("boo!") |
| n, err := l.Write(b) |
| isNil(err, t) |
| equals(len(b), n, t) |
| |
| newFakeTime() |
| |
| err = l.Rotate() |
| isNil(err, t) |
| |
| filename2 := backupFile(dir) |
| info, err := os.Stat(filename) |
| isNil(err, t) |
| info2, err := os.Stat(filename2) |
| isNil(err, t) |
| equals(mode, info.Mode(), t) |
| equals(mode, info2.Mode(), t) |
| } |
| |
| func TestMaintainOwner(t *testing.T) { |
| fakeFS := newFakeFS() |
| os_Chown = fakeFS.Chown |
| os_Stat = fakeFS.Stat |
| defer func() { |
| os_Chown = os.Chown |
| os_Stat = os.Stat |
| }() |
| currentTime = fakeTime |
| dir := makeTempDir("TestMaintainOwner", t) |
| defer os.RemoveAll(dir) |
| |
| filename := logFile(dir) |
| |
| f, err := os.OpenFile(filename, os.O_CREATE|os.O_RDWR, 0644) |
| isNil(err, t) |
| f.Close() |
| |
| l := &Logger{ |
| Filename: filename, |
| MaxBackups: 1, |
| MaxSize: 100, // megabytes |
| } |
| defer l.Close() |
| b := []byte("boo!") |
| n, err := l.Write(b) |
| isNil(err, t) |
| equals(len(b), n, t) |
| |
| newFakeTime() |
| |
| err = l.Rotate() |
| isNil(err, t) |
| |
| equals(555, fakeFS.files[filename].uid, t) |
| equals(666, fakeFS.files[filename].gid, t) |
| } |
| |
| func TestCompressMaintainMode(t *testing.T) { |
| currentTime = fakeTime |
| |
| dir := makeTempDir("TestCompressMaintainMode", t) |
| defer os.RemoveAll(dir) |
| |
| filename := logFile(dir) |
| |
| mode := os.FileMode(0600) |
| f, err := os.OpenFile(filename, os.O_CREATE|os.O_RDWR, mode) |
| isNil(err, t) |
| f.Close() |
| |
| l := &Logger{ |
| Compress: true, |
| Filename: filename, |
| MaxBackups: 1, |
| MaxSize: 100, // megabytes |
| } |
| defer l.Close() |
| b := []byte("boo!") |
| n, err := l.Write(b) |
| isNil(err, t) |
| equals(len(b), n, t) |
| |
| newFakeTime() |
| |
| err = l.Rotate() |
| isNil(err, t) |
| |
| // we need to wait a little bit since the files get compressed on a different |
| // goroutine. |
| <-time.After(10 * time.Millisecond) |
| |
| // a compressed version of the log file should now exist with the correct |
| // mode. |
| filename2 := backupFile(dir) |
| info, err := os.Stat(filename) |
| isNil(err, t) |
| info2, err := os.Stat(filename2+compressSuffix) |
| isNil(err, t) |
| equals(mode, info.Mode(), t) |
| equals(mode, info2.Mode(), t) |
| } |
| |
| func TestCompressMaintainOwner(t *testing.T) { |
| fakeFS := newFakeFS() |
| os_Chown = fakeFS.Chown |
| os_Stat = fakeFS.Stat |
| defer func() { |
| os_Chown = os.Chown |
| os_Stat = os.Stat |
| }() |
| currentTime = fakeTime |
| dir := makeTempDir("TestCompressMaintainOwner", t) |
| defer os.RemoveAll(dir) |
| |
| filename := logFile(dir) |
| |
| f, err := os.OpenFile(filename, os.O_CREATE|os.O_RDWR, 0644) |
| isNil(err, t) |
| f.Close() |
| |
| l := &Logger{ |
| Compress: true, |
| Filename: filename, |
| MaxBackups: 1, |
| MaxSize: 100, // megabytes |
| } |
| defer l.Close() |
| b := []byte("boo!") |
| n, err := l.Write(b) |
| isNil(err, t) |
| equals(len(b), n, t) |
| |
| newFakeTime() |
| |
| err = l.Rotate() |
| isNil(err, t) |
| |
| // we need to wait a little bit since the files get compressed on a different |
| // goroutine. |
| <-time.After(10 * time.Millisecond) |
| |
| // a compressed version of the log file should now exist with the correct |
| // owner. |
| filename2 := backupFile(dir) |
| equals(555, fakeFS.files[filename2+compressSuffix].uid, t) |
| equals(666, fakeFS.files[filename2+compressSuffix].gid, t) |
| } |
| |
| type fakeFile struct { |
| uid int |
| gid int |
| } |
| |
| type fakeFS struct { |
| files map[string]fakeFile |
| } |
| |
| func newFakeFS() *fakeFS { |
| return &fakeFS{files: make(map[string]fakeFile)} |
| } |
| |
| func (fs *fakeFS) Chown(name string, uid, gid int) error { |
| fs.files[name] = fakeFile{uid: uid, gid: gid} |
| return nil |
| } |
| |
| func (fs *fakeFS) Stat(name string) (os.FileInfo, error) { |
| info, err := os.Stat(name) |
| if err != nil { |
| return nil, err |
| } |
| stat := info.Sys().(*syscall.Stat_t) |
| stat.Uid = 555 |
| stat.Gid = 666 |
| return info, nil |
| } |