github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/kbfs/libkbfs/safe_test_reporter_test.go (about)

     1  // Copyright 2016 Keybase Inc. All rights reserved.
     2  // Use of this source code is governed by a BSD
     3  // license that can be found in the LICENSE file.
     4  
     5  package libkbfs
     6  
     7  import (
     8  	"fmt"
     9  	"runtime"
    10  	"strings"
    11  	"testing"
    12  )
    13  
    14  // SafeTestReporter logs failures as they happen, but ferries failure
    15  // calls back to the main test goroutine, to avoid violating
    16  // testing.T's FailNow() semantics.
    17  type SafeTestReporter struct {
    18  	t *testing.T
    19  }
    20  
    21  func NewSafeTestReporter(t *testing.T) *SafeTestReporter {
    22  	return &SafeTestReporter{t: t}
    23  }
    24  
    25  // makePrefix() returns a string with the file and line of the call site.
    26  //
    27  // This function was adapted from decorate() in testing/testing.go.
    28  func makePrefix() string {
    29  	// makePrefix + error + Errorf or Fatalf + function.
    30  	_, file, line, ok := runtime.Caller(4)
    31  	if ok {
    32  		// Truncate file name at last file name separator.
    33  		if index := strings.LastIndex(file, "/"); index >= 0 {
    34  			file = file[index+1:]
    35  		} else if index = strings.LastIndex(file, "\\"); index >= 0 {
    36  			file = file[index+1:]
    37  		}
    38  	} else {
    39  		file = "???"
    40  		line = 1
    41  	}
    42  	return fmt.Sprintf("%s:%d", file, line)
    43  }
    44  
    45  func (ctr *SafeTestReporter) error(s string) {
    46  	// Use \r to clear out testing.T's prefix (at least on a terminal).
    47  	ctr.t.Errorf("\r%s: %s", makePrefix(), s)
    48  }
    49  
    50  func (ctr *SafeTestReporter) Errorf(format string, args ...interface{}) {
    51  	ctr.error(fmt.Sprintf(format, args...))
    52  }
    53  
    54  // Fatalf errors and then panics.
    55  func (ctr *SafeTestReporter) Fatalf(format string, args ...interface{}) {
    56  	s := fmt.Sprintf(format, args...)
    57  	ctr.error(s)
    58  	// panic here, since a Goexit() might leave the main thread
    59  	// waiting for results.
    60  	panic(s)
    61  }
    62  
    63  func (ctr *SafeTestReporter) CheckForFailures() {
    64  	// Empty for now, since any fatal failure will have panic'd the
    65  	// test.  In the future, we may have a better strategy.
    66  }