123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- // +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
- }
|