github.com/ryanslade/nomad@v0.2.4-0.20160128061903-fc95782f2089/client/driver/logs_test.go (about) 1 package driver 2 3 import ( 4 "io" 5 "io/ioutil" 6 "log" 7 "os" 8 "path/filepath" 9 "testing" 10 ) 11 12 var ( 13 logger = log.New(os.Stdout, "", log.LstdFlags) 14 pathPrefix = "logrotator" 15 ) 16 17 func TestLogRotator_InvalidPath(t *testing.T) { 18 invalidPath := "/foo" 19 20 if _, err := NewLogRotator(invalidPath, "redis.stdout", 10, 10, logger); err == nil { 21 t.Fatal("expected err") 22 } 23 } 24 25 func TestLogRotator_FindCorrectIndex(t *testing.T) { 26 var path string 27 var err error 28 if path, err = ioutil.TempDir("", pathPrefix); err != nil { 29 t.Fatalf("test setup err: %v", err) 30 } 31 defer os.RemoveAll(path) 32 33 fname := filepath.Join(path, "redis.stdout.1") 34 if f, err := os.Create(fname); err == nil { 35 f.Close() 36 } 37 38 fname = filepath.Join(path, "redis.stdout.2") 39 if f, err := os.Create(fname); err == nil { 40 f.Close() 41 } 42 43 r, err := NewLogRotator(path, "redis.stdout", 10, 10, logger) 44 if err != nil { 45 t.Fatalf("test setup err: %v", err) 46 } 47 if r.logFileIdx != 2 { 48 t.Fatalf("Expected log file idx: %v, actual: %v", 2, r.logFileIdx) 49 } 50 } 51 52 func TestLogRotator_AppendToCurrentFile(t *testing.T) { 53 var path string 54 var err error 55 defer os.RemoveAll(path) 56 if path, err = ioutil.TempDir("", pathPrefix); err != nil { 57 t.Fatalf("test setup err: %v", err) 58 } 59 fname := filepath.Join(path, "redis.stdout.0") 60 if f, err := os.Create(fname); err == nil { 61 f.WriteString("abcde") 62 f.Close() 63 } 64 65 l, err := NewLogRotator(path, "redis.stdout", 10, 6, logger) 66 if err != nil && err != io.EOF { 67 t.Fatalf("test setup err: %v", err) 68 } 69 70 r, w := io.Pipe() 71 go func() { 72 w.Write([]byte("fg")) 73 w.Close() 74 }() 75 err = l.Start(r) 76 if err != nil && err != io.EOF { 77 t.Fatal(err) 78 } 79 finfo, err := os.Stat(fname) 80 if err != nil { 81 t.Fatal(err) 82 } 83 if finfo.Size() != 6 { 84 t.Fatalf("Expected size of file: %v, actual: %v", 6, finfo.Size()) 85 } 86 } 87 88 func TestLogRotator_RotateFiles(t *testing.T) { 89 var path string 90 var err error 91 defer os.RemoveAll(path) 92 if path, err = ioutil.TempDir("", pathPrefix); err != nil { 93 t.Fatalf("test setup err: %v", err) 94 } 95 fname := filepath.Join(path, "redis.stdout.0") 96 if f, err := os.Create(fname); err == nil { 97 f.WriteString("abcde") 98 f.Close() 99 } 100 101 l, err := NewLogRotator(path, "redis.stdout", 10, 6, logger) 102 if err != nil { 103 t.Fatalf("test setup err: %v", err) 104 } 105 106 r, w := io.Pipe() 107 go func() { 108 // This should make the current log file rotate 109 w.Write([]byte("fg")) 110 w.Close() 111 }() 112 err = l.Start(r) 113 if err != nil && err != io.EOF { 114 t.Fatalf("Failure in logrotator start %v", err) 115 } 116 117 if finfo, err := os.Stat(filepath.Join(path, "redis.stdout.1")); err == nil { 118 if finfo.Size() != 1 { 119 t.Fatalf("expected number of bytes: %v, actual: %v", 1, finfo.Size()) 120 } 121 } else { 122 t.Fatal("expected file redis.stdout.1") 123 } 124 125 if finfo, err := os.Stat(filepath.Join(path, "redis.stdout.0")); err == nil { 126 if finfo.Size() != 6 { 127 t.Fatalf("expected number of bytes: %v, actual: %v", 1, finfo.Size()) 128 } 129 } else { 130 t.Fatal("expected file redis.stdout.0") 131 } 132 } 133 134 func TestLogRotator_StartFromEmptyDir(t *testing.T) { 135 var path string 136 var err error 137 defer os.RemoveAll(path) 138 if path, err = ioutil.TempDir("", pathPrefix); err != nil { 139 t.Fatalf("test setup err: %v", err) 140 } 141 142 l, err := NewLogRotator(path, "redis.stdout", 10, 10, logger) 143 if err != nil { 144 t.Fatalf("test setup err: %v", err) 145 } 146 147 r, w := io.Pipe() 148 go func() { 149 w.Write([]byte("abcdefg")) 150 w.Close() 151 }() 152 err = l.Start(r) 153 if err != nil && err != io.EOF { 154 t.Fatalf("Failure in logrotator start %v", err) 155 } 156 157 finfo, err := os.Stat(filepath.Join(path, "redis.stdout.0")) 158 if err != nil { 159 t.Fatal(err) 160 } 161 if finfo.Size() != 7 { 162 t.Fatalf("expected size of file: %v, actual: %v", 7, finfo.Size()) 163 } 164 165 } 166 167 func TestLogRotator_SetPathAsFile(t *testing.T) { 168 var f *os.File 169 var err error 170 var path string 171 defer os.RemoveAll(path) 172 if f, err = ioutil.TempFile("", pathPrefix); err != nil { 173 t.Fatalf("test setup problem: %v", err) 174 } 175 path = f.Name() 176 if _, err = NewLogRotator(f.Name(), "redis.stdout", 10, 10, logger); err == nil { 177 t.Fatal("expected error") 178 } 179 } 180 181 func TestLogRotator_ExcludeDirs(t *testing.T) { 182 var path string 183 var err error 184 defer os.RemoveAll(path) 185 if path, err = ioutil.TempDir("", pathPrefix); err != nil { 186 t.Fatalf("test setup err: %v", err) 187 } 188 if err := os.Mkdir(filepath.Join(path, "redis.stdout.0"), os.ModeDir|os.ModePerm); err != nil { 189 t.Fatalf("test setup err: %v", err) 190 } 191 192 l, err := NewLogRotator(path, "redis.stdout", 10, 6, logger) 193 if err != nil { 194 t.Fatalf("test setup err: %v", err) 195 } 196 197 r, w := io.Pipe() 198 go func() { 199 w.Write([]byte("fg")) 200 w.Close() 201 }() 202 err = l.Start(r) 203 if err != nil && err != io.EOF { 204 t.Fatalf("Failure in logrotator start %v", err) 205 } 206 207 finfo, err := os.Stat(filepath.Join(path, "redis.stdout.1")) 208 if err != nil { 209 t.Fatal("expected rotator to create redis.stdout.1") 210 } 211 if finfo.Size() != 2 { 212 t.Fatalf("expected size: %v, actual: %v", 2, finfo.Size()) 213 } 214 } 215 216 func TestLogRotator_PurgeDirs(t *testing.T) { 217 var path string 218 var err error 219 defer os.RemoveAll(path) 220 if path, err = ioutil.TempDir("", pathPrefix); err != nil { 221 t.Fatalf("test setup err: %v", err) 222 } 223 224 l, err := NewLogRotator(path, "redis.stdout", 2, 4, logger) 225 if err != nil { 226 t.Fatalf("test setup err: %v", err) 227 } 228 229 r, w := io.Pipe() 230 go func() { 231 w.Write([]byte("abcdefghijklmno")) 232 w.Close() 233 }() 234 235 err = l.Start(r) 236 if err != nil && err != io.EOF { 237 t.Fatalf("failure in logrotator start: %v", err) 238 } 239 l.PurgeOldFiles() 240 241 files, err := ioutil.ReadDir(path) 242 if err != nil { 243 t.Fatalf("err: %v", err) 244 } 245 if len(files) != 2 { 246 t.Fatalf("expected number of files: %v, actual: %v", 2, len(files)) 247 } 248 }