github.com/getgauge/gauge@v1.6.9/logger/logWriter_test.go (about)

     1  // Copyright 2019 ThoughtWorks, Inc.
     2  
     3  /*----------------------------------------------------------------
     4   *  Copyright (c) ThoughtWorks, Inc.
     5   *  Licensed under the Apache License, Version 2.0
     6   *  See LICENSE in the project root for license information.
     7   *----------------------------------------------------------------*/
     8  
     9  package logger
    10  
    11  import (
    12  	"os"
    13  	"path/filepath"
    14  	"strings"
    15  	"sync"
    16  	"testing"
    17  
    18  	"github.com/getgauge/gauge/config"
    19  )
    20  
    21  func TestMain(m *testing.M) {
    22  	exitCode := m.Run()
    23  	os.RemoveAll(filepath.Join("_testdata", "logs"))
    24  	os.Exit(exitCode)
    25  }
    26  
    27  func TestLogWriterToOutputInfoLogInCorrectFormat(t *testing.T) {
    28  	defer tearDown(t)
    29  	setupLogger("info")
    30  	l := newLogWriter("js")
    31  
    32  	if _, err := l.Stdout.Write([]byte("{\"logLevel\": \"info\", \"message\": \"Foo\"}\n")); err != nil {
    33  		t.Fatalf("Unable to write to logWriter")
    34  	}
    35  
    36  	assertLogContains(t, []string{"[js] [INFO] Foo"})
    37  }
    38  
    39  func TestLogWriterToOutputInfoLogInCorrectFormatWhenNewLinesPresent(t *testing.T) {
    40  	defer tearDown(t)
    41  	setupLogger("info")
    42  	l := newLogWriter("js")
    43  
    44  	if _, err := l.Stdout.Write([]byte("{\"logLevel\": \"info\", \"message\": \"Foo\"}\n\r\n{\"logLevel\": \"info\", \"message\": \"Bar\"}\n{\"logLevel\": \"info\", \"message\": \"Baz\"}")); err != nil {
    45  		t.Fatalf("Unable to write to logWriter")
    46  	}
    47  
    48  	assertLogContains(t, []string{"[js] [INFO] Foo", "[js] [INFO] Bar", "[js] [INFO] Baz"})
    49  	assertLogDoesNotContains(t, []string{"[js] [INFO] \r"})
    50  }
    51  
    52  func TestLogWriterToOutputInfoLogWithMultipleLines(t *testing.T) {
    53  	defer tearDown(t)
    54  	setupLogger("debug")
    55  	l := newLogWriter("js")
    56  
    57  	if _, err := l.Stdout.Write([]byte("{\"logLevel\": \"info\", \"message\": \"Foo\"}\n{\"logLevel\": \"debug\", \"message\": \"Bar\"}\n")); err != nil {
    58  		t.Fatalf("Unable to write to logWriter")
    59  	}
    60  
    61  	assertLogContains(t, []string{"[js] [INFO] Foo", "[js] [DEBUG] Bar"})
    62  }
    63  
    64  func TestLogWriterToLogPlainStrings(t *testing.T) {
    65  	defer tearDown(t)
    66  	setupLogger("debug")
    67  	l := newLogWriter("js")
    68  
    69  	if _, err := l.Stdout.Write([]byte("Foo Bar\n")); err != nil {
    70  		t.Fatalf("Unable to write to logWriter")
    71  	}
    72  
    73  	assertLogContains(t, []string{"Foo Bar"})
    74  }
    75  
    76  func TestUnformattedLogWrittenToStderrShouldBePrefixedWithError(t *testing.T) {
    77  	defer tearDown(t)
    78  	setupLogger("debug")
    79  	l := newLogWriter("js")
    80  
    81  	if _, err := l.Stderr.Write([]byte("Foo Bar\n")); err != nil {
    82  		t.Fatalf("Unable to write to logWriter")
    83  	}
    84  
    85  	assertLogContains(t, []string{"[ERROR]"})
    86  }
    87  
    88  func TestUnformattedLogWrittenToStdoutShouldBePrefixedWithInfo(t *testing.T) {
    89  	defer tearDown(t)
    90  	setupLogger("debug")
    91  	l := newLogWriter("js")
    92  
    93  	if _, err := l.Stdout.Write([]byte("Foo Bar\n")); err != nil {
    94  		t.Fatalf("Unable to write to logWriter")
    95  	}
    96  
    97  	assertLogContains(t, []string{"[INFO]"})
    98  }
    99  
   100  func TestLoggingFromDifferentWritersAtSameTime(t *testing.T) {
   101  	defer tearDown(t)
   102  	setupLogger("info")
   103  	j := newLogWriter("js")
   104  	h := newLogWriter("html-report")
   105  
   106  	var wg sync.WaitGroup
   107  	var err error
   108  	wg.Add(5)
   109  	go func() {
   110  		Debug(false, "debug msg")
   111  		wg.Done()
   112  	}()
   113  	go func() {
   114  		_, err = h.Stdout.Write([]byte("{\"logLevel\": \"warning\", \"message\": \"warning msg\"}\n{\"logLevel\": \"debug\", \"message\": \"debug msg\"}\n"))
   115  		wg.Done()
   116  	}()
   117  	go func() {
   118  		_, err = j.Stdout.Write([]byte("{\"logLevel\": \"info\", \"message\": \"info msg\"}\n{\"logLevel\": \"error\", \"message\": \"error msg\"}\n"))
   119  		wg.Done()
   120  	}()
   121  	go func() {
   122  		_, err = h.Stdout.Write([]byte("{\"logLevel\": \"info\", \"message\": \"info msg\"}\n{\"logLevel\": \"error\", \"message\": \"error msg\"}\n"))
   123  		wg.Done()
   124  	}()
   125  	go func() {
   126  		_, err = j.Stdout.Write([]byte("{\"logLevel\": \"warning\", \"message\": \"warning msg\"}\n{\"logLevel\": \"debug\", \"message\": \"debug msg\"}\n"))
   127  		wg.Done()
   128  	}()
   129  	wg.Wait()
   130  	if err != nil {
   131  		t.Fatalf("Unable to write to logWriter")
   132  	}
   133  
   134  	assertLogContains(t, []string{
   135  		"[js] [WARNING] warning msg",
   136  		"[js] [ERROR] error msg",
   137  		"[js] [INFO] info msg",
   138  		"[js] [DEBUG] debug msg",
   139  		"[html-report] [WARNING] warning msg",
   140  		"[html-report] [ERROR] error msg",
   141  		"[html-report] [INFO] info msg",
   142  		"[html-report] [DEBUG] debug msg",
   143  		"[Gauge] [DEBUG] debug msg",
   144  	})
   145  }
   146  
   147  func tearDown(t *testing.T) {
   148  	config.ProjectRoot = ""
   149  	initialized = false
   150  	if err := os.Truncate(ActiveLogFile, 0); err != nil {
   151  		t.Logf("Could not truncate file")
   152  	}
   153  
   154  }
   155  
   156  func setupLogger(level string) {
   157  	config.ProjectRoot, _ = filepath.Abs("_testdata")
   158  	Initialize(false, "info", CLI)
   159  }
   160  
   161  func newLogWriter(loggerID string) *LogWriter {
   162  	f, _ := os.OpenFile(ActiveLogFile, os.O_RDWR, 0)
   163  	return &LogWriter{
   164  		Stderr: Writer{ShouldWriteToStdout: false, stream: 0, LoggerID: loggerID, File: f, isErrorStream: true},
   165  		Stdout: Writer{ShouldWriteToStdout: false, stream: 0, LoggerID: loggerID, File: f},
   166  	}
   167  }
   168  
   169  func assertLogContains(t *testing.T, want []string) {
   170  	got, err := os.ReadFile(ActiveLogFile)
   171  	if err != nil {
   172  		t.Fatalf("Unable to read log file. Error: %s", err.Error())
   173  	}
   174  	for _, w := range want {
   175  		if !strings.Contains(string(got), w) {
   176  			t.Errorf("Expected %s to contain %s.", string(got), w)
   177  		}
   178  	}
   179  }
   180  
   181  func assertLogDoesNotContains(t *testing.T, want []string) {
   182  	got, err := os.ReadFile(ActiveLogFile)
   183  	if err != nil {
   184  		t.Fatalf("Unable to read log file. Error: %s", err.Error())
   185  	}
   186  	for _, w := range want {
   187  		if strings.Contains(string(got), w) {
   188  			t.Errorf("Expected %s to not contain %s.", string(got), w)
   189  		}
   190  	}
   191  }