github.com/maier/nomad@v0.4.1-0.20161110003312-a9e3d0b8549d/client/driver/logging/rotator_test.go (about) 1 package logging 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "log" 7 "os" 8 "path/filepath" 9 "testing" 10 11 "github.com/hashicorp/nomad/testutil" 12 ) 13 14 var ( 15 logger = log.New(os.Stdout, "", log.LstdFlags) 16 pathPrefix = "logrotator" 17 baseFileName = "redis.stdout" 18 ) 19 20 func TestFileRotator_IncorrectPath(t *testing.T) { 21 if _, err := NewFileRotator("/foo", baseFileName, 10, 10, logger); err == nil { 22 t.Fatalf("expected error") 23 } 24 } 25 26 func TestFileRotator_CreateNewFile(t *testing.T) { 27 var path string 28 var err error 29 if path, err = ioutil.TempDir("", pathPrefix); err != nil { 30 t.Fatalf("test setup err: %v", err) 31 } 32 defer os.RemoveAll(path) 33 34 _, err = NewFileRotator(path, baseFileName, 10, 10, logger) 35 if err != nil { 36 t.Fatalf("test setup err: %v", err) 37 } 38 39 if _, err := os.Stat(filepath.Join(path, "redis.stdout.0")); err != nil { 40 t.Fatalf("expected file") 41 } 42 } 43 44 func TestFileRotator_OpenLastFile(t *testing.T) { 45 var path string 46 var err error 47 if path, err = ioutil.TempDir("", pathPrefix); err != nil { 48 t.Fatalf("test setup err: %v", err) 49 } 50 defer os.RemoveAll(path) 51 52 fname1 := filepath.Join(path, "redis.stdout.0") 53 fname2 := filepath.Join(path, "redis.stdout.2") 54 if _, err := os.Create(fname1); err != nil { 55 t.Fatalf("test setup failure: %v", err) 56 } 57 if _, err := os.Create(fname2); err != nil { 58 t.Fatalf("test setup failure: %v", err) 59 } 60 61 fr, err := NewFileRotator(path, baseFileName, 10, 10, logger) 62 if err != nil { 63 t.Fatalf("test setup err: %v", err) 64 } 65 66 if fr.currentFile.Name() != fname2 { 67 t.Fatalf("expected current file: %v, got: %v", fname2, fr.currentFile.Name()) 68 } 69 } 70 71 func TestFileRotator_WriteToCurrentFile(t *testing.T) { 72 var path string 73 var err error 74 if path, err = ioutil.TempDir("", pathPrefix); err != nil { 75 t.Fatalf("test setup err: %v", err) 76 } 77 defer os.RemoveAll(path) 78 79 fname1 := filepath.Join(path, "redis.stdout.0") 80 if _, err := os.Create(fname1); err != nil { 81 t.Fatalf("test setup failure: %v", err) 82 } 83 84 fr, err := NewFileRotator(path, baseFileName, 10, 5, logger) 85 if err != nil { 86 t.Fatalf("test setup err: %v", err) 87 } 88 89 fr.Write([]byte("abcde")) 90 91 var actual int64 92 testutil.WaitForResult(func() (bool, error) { 93 fi, err := os.Stat(fname1) 94 if err != nil { 95 return false, err 96 } 97 actual = fi.Size() 98 if actual != 5 { 99 return false, nil 100 } 101 102 return true, nil 103 }, func(err error) { 104 t.Fatalf("expected size: %v, actual: %v", 5, actual) 105 }) 106 } 107 108 func TestFileRotator_RotateFiles(t *testing.T) { 109 var path string 110 var err error 111 if path, err = ioutil.TempDir("", pathPrefix); err != nil { 112 t.Fatalf("test setup err: %v", err) 113 } 114 defer os.RemoveAll(path) 115 116 fr, err := NewFileRotator(path, baseFileName, 10, 5, logger) 117 if err != nil { 118 t.Fatalf("test setup err: %v", err) 119 } 120 121 str := "abcdefgh" 122 nw, err := fr.Write([]byte(str)) 123 if err != nil { 124 t.Fatalf("got error while writing: %v", err) 125 } 126 127 if nw != len(str) { 128 t.Fatalf("expected %v, got %v", len(str), nw) 129 } 130 131 var lastErr error 132 testutil.WaitForResult(func() (bool, error) { 133 fname1 := filepath.Join(path, "redis.stdout.0") 134 fi, err := os.Stat(fname1) 135 if err != nil { 136 lastErr = err 137 return false, nil 138 } 139 if fi.Size() != 5 { 140 lastErr = fmt.Errorf("expected size: %v, actual: %v", 5, fi.Size()) 141 return false, nil 142 } 143 144 fname2 := filepath.Join(path, "redis.stdout.1") 145 if _, err := os.Stat(fname2); err != nil { 146 lastErr = fmt.Errorf("expected file %v to exist", fname2) 147 return false, nil 148 } 149 150 if fi2, err := os.Stat(fname2); err == nil { 151 if fi2.Size() != 3 { 152 lastErr = fmt.Errorf("expected size: %v, actual: %v", 3, fi2.Size()) 153 return false, nil 154 } 155 } else { 156 lastErr = fmt.Errorf("error getting the file info: %v", err) 157 return false, nil 158 } 159 160 return true, nil 161 }, func(err error) { 162 t.Fatalf("%v", lastErr) 163 }) 164 } 165 166 func TestFileRotator_WriteRemaining(t *testing.T) { 167 var path string 168 var err error 169 if path, err = ioutil.TempDir("", pathPrefix); err != nil { 170 t.Fatalf("test setup err: %v", err) 171 } 172 defer os.RemoveAll(path) 173 174 fname1 := filepath.Join(path, "redis.stdout.0") 175 if f, err := os.Create(fname1); err == nil { 176 f.Write([]byte("abcd")) 177 } else { 178 t.Fatalf("test setup failure: %v", err) 179 } 180 181 fr, err := NewFileRotator(path, baseFileName, 10, 5, logger) 182 if err != nil { 183 t.Fatalf("test setup err: %v", err) 184 } 185 186 str := "efghijkl" 187 nw, err := fr.Write([]byte(str)) 188 if err != nil { 189 t.Fatalf("got error while writing: %v", err) 190 } 191 if nw != len(str) { 192 t.Fatalf("expected %v, got %v", len(str), nw) 193 } 194 var lastErr error 195 testutil.WaitForResult(func() (bool, error) { 196 fi, err := os.Stat(fname1) 197 if err != nil { 198 lastErr = fmt.Errorf("error getting the file info: %v", err) 199 return false, nil 200 } 201 if fi.Size() != 5 { 202 lastErr = fmt.Errorf("expected size: %v, actual: %v", 5, fi.Size()) 203 return false, nil 204 } 205 206 fname2 := filepath.Join(path, "redis.stdout.1") 207 if _, err := os.Stat(fname2); err != nil { 208 lastErr = fmt.Errorf("expected file %v to exist", fname2) 209 return false, nil 210 } 211 212 if fi2, err := os.Stat(fname2); err == nil { 213 if fi2.Size() != 5 { 214 lastErr = fmt.Errorf("expected size: %v, actual: %v", 5, fi2.Size()) 215 return false, nil 216 } 217 } else { 218 lastErr = fmt.Errorf("error getting the file info: %v", err) 219 return false, nil 220 } 221 222 fname3 := filepath.Join(path, "redis.stdout.2") 223 if _, err := os.Stat(fname3); err != nil { 224 lastErr = fmt.Errorf("expected file %v to exist", fname3) 225 return false, nil 226 } 227 228 if fi3, err := os.Stat(fname3); err == nil { 229 if fi3.Size() != 2 { 230 lastErr = fmt.Errorf("expected size: %v, actual: %v", 2, fi3.Size()) 231 return false, nil 232 } 233 } else { 234 lastErr = fmt.Errorf("error getting the file info: %v", err) 235 return false, nil 236 } 237 238 return true, nil 239 }, func(err error) { 240 t.Fatalf("%v", lastErr) 241 }) 242 243 } 244 245 func TestFileRotator_PurgeOldFiles(t *testing.T) { 246 var path string 247 var err error 248 if path, err = ioutil.TempDir("", pathPrefix); err != nil { 249 t.Fatalf("test setup err: %v", err) 250 } 251 defer os.RemoveAll(path) 252 253 fr, err := NewFileRotator(path, baseFileName, 2, 2, logger) 254 if err != nil { 255 t.Fatalf("test setup err: %v", err) 256 } 257 258 str := "abcdeghijklmn" 259 nw, err := fr.Write([]byte(str)) 260 if err != nil { 261 t.Fatalf("got error while writing: %v", err) 262 } 263 if nw != len(str) { 264 t.Fatalf("expected %v, got %v", len(str), nw) 265 } 266 267 var lastErr error 268 testutil.WaitForResult(func() (bool, error) { 269 f, err := ioutil.ReadDir(path) 270 if err != nil { 271 lastErr = fmt.Errorf("test error: %v", err) 272 return false, nil 273 } 274 275 if len(f) != 2 { 276 lastErr = fmt.Errorf("expected number of files: %v, got: %v", 2, len(f)) 277 return false, nil 278 } 279 280 return true, nil 281 }, func(err error) { 282 t.Fatalf("%v", lastErr) 283 }) 284 }