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  }