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  }