github.com/bazelbuild/bazel-watcher@v0.25.2/internal/ibazel/log/log_test.go (about)

     1  package log
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"reflect"
     7  	"runtime"
     8  	"strings"
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/google/go-cmp/cmp"
    13  )
    14  
    15  const prefix = "github.com/bazelbuild/bazel-watcher/internal/ibazel/log."
    16  
    17  func TestNonfLoggers(t *testing.T) {
    18  	tests := []struct {
    19  		method interface{}
    20  		msg    string
    21  		args   []interface{}
    22  		want   string
    23  		exits  bool
    24  		color  color
    25  	}{
    26  		{
    27  			method: Log,
    28  			msg:    "log",
    29  			want:   "log",
    30  			exits:  false,
    31  			color:  logColor,
    32  		},
    33  		{
    34  			method: Logf,
    35  			msg:    "log %d",
    36  			args:   []interface{}{123},
    37  			want:   "log 123",
    38  			exits:  false,
    39  			color:  logColor,
    40  		},
    41  		{
    42  			method: Error,
    43  			msg:    "error",
    44  			want:   "error",
    45  			exits:  false,
    46  			color:  errorColor,
    47  		},
    48  		{
    49  			method: Errorf,
    50  			msg:    "error %d",
    51  			args:   []interface{}{123},
    52  			want:   "error 123",
    53  			exits:  false,
    54  			color:  errorColor,
    55  		},
    56  		{
    57  			method: Fatal,
    58  			msg:    "fatal",
    59  			want:   "fatal",
    60  			exits:  true,
    61  			color:  fatalColor,
    62  		},
    63  		{
    64  			method: Fatalf,
    65  			msg:    "fatal %d",
    66  			args:   []interface{}{123},
    67  			want:   "fatal 123",
    68  			exits:  true,
    69  			color:  fatalColor,
    70  		},
    71  	}
    72  
    73  	for _, test := range tests {
    74  		funcName := strings.TrimPrefix(
    75  			runtime.FuncForPC(
    76  				reflect.ValueOf(test.method).Pointer()).Name(), prefix)
    77  
    78  		t.Run(fmt.Sprintf("%v(%q, %v)", funcName, test.msg, test.args), func(t *testing.T) {
    79  			calledExit := false
    80  			osExit = func(int) {
    81  				calledExit = true
    82  			}
    83  			timeNow = func() time.Time {
    84  				parsedTime, err := time.Parse(time.RFC3339, "2019-11-13T00:05:07+00:00")
    85  				if err != nil {
    86  					t.Errorf("Couldn't parse time: %v", err)
    87  				}
    88  				return parsedTime
    89  			}
    90  
    91  			buf := &bytes.Buffer{}
    92  			SetLogger(&writerLogger{buf})
    93  
    94  			switch f := test.method.(type) {
    95  			case func(string):
    96  				f(test.msg)
    97  			case func(string, ...interface{}):
    98  				f(test.msg, test.args...)
    99  			}
   100  
   101  			if test.exits && calledExit == false {
   102  				t.Errorf("Fatal should call exit")
   103  			}
   104  
   105  			got := buf.String()
   106  			want := fmt.Sprintf("%siBazel [12:05AM]\x1b[0m: %s\n", test.color, test.want)
   107  			if diff := cmp.Diff(got, want); diff != "" {
   108  				t.Errorf("\nGot:  %q\nWant: %q\nDiff:\n%s", got, want, diff)
   109  			}
   110  
   111  			buf.Reset()
   112  		})
   113  	}
   114  }
   115  
   116  func TestBanner(t *testing.T) {
   117  	buf := &bytes.Buffer{}
   118  	SetLogger(&writerLogger{buf})
   119  
   120  	Banner("This is multi", "line output that", "is expected to be printed")
   121  
   122  	got := buf.String()
   123  	want := fmt.Sprintf(`
   124  %s################################################################################%s
   125  %s#%s This is multi                                                                %s#%s
   126  %s#%s line output that                                                             %s#%s
   127  %s#%s is expected to be printed                                                    %s#%s
   128  %s################################################################################%s
   129  
   130  `, bannerColor, resetColor, bannerColor, resetColor, bannerColor, resetColor, bannerColor, resetColor, bannerColor, resetColor, bannerColor, resetColor, bannerColor, resetColor, bannerColor, resetColor)
   131  	if diff := cmp.Diff(got, want); diff != "" {
   132  		t.Errorf("\nGot:  %q\nWant: %q\nDiff:\n%s", got, want, diff)
   133  	}
   134  }