mirror of https://github.com/linkerd/linkerd2.git
				
				
				
			
		
			
				
	
	
		
			136 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Go
		
	
	
	
| package testutil
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"os"
 | |
| 	"runtime"
 | |
| 	"strings"
 | |
| 	"testing"
 | |
| )
 | |
| 
 | |
| const (
 | |
| 	envFlag  = "GH_ANNOTATION"
 | |
| 	rootPath = "/linkerd2/"
 | |
| )
 | |
| 
 | |
| type level int
 | |
| 
 | |
| const (
 | |
| 	err level = iota
 | |
| 	warn
 | |
| )
 | |
| 
 | |
| func (l level) String() string {
 | |
| 	switch l {
 | |
| 	case err:
 | |
| 		return "error"
 | |
| 	case warn:
 | |
| 		return "warning"
 | |
| 	}
 | |
| 	panic(fmt.Sprintf("invalid level: %d", l))
 | |
| }
 | |
| 
 | |
| func echoAnnotation(t *testing.T, l level, args ...interface{}) {
 | |
| 	if _, ok := os.LookupEnv(envFlag); ok {
 | |
| 		_, fileName, fileLine, ok := runtime.Caller(3)
 | |
| 		if !ok {
 | |
| 			panic("Couldn't recover runtime info")
 | |
| 		}
 | |
| 		fileName = fileName[strings.LastIndex(fileName, rootPath)+len(rootPath):]
 | |
| 		// In case of coming from `t.Run(testName, ...)`, only take the first part
 | |
| 		// of the name; the following parts might not be as generic
 | |
| 		parts := strings.Split(t.Name(), "/")
 | |
| 		testName := parts[0]
 | |
| 		for _, arg := range args {
 | |
| 			msg := fmt.Sprintf("%s - %s", testName, arg)
 | |
| 			fmt.Printf("::%s file=%s,line=%d::%s\n", l, fileName, fileLine, msg)
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func echoAnnotationErr(t *testing.T, args ...interface{}) {
 | |
| 	echoAnnotation(t, err, args...)
 | |
| }
 | |
| 
 | |
| func echoAnnotationWarn(t *testing.T, args ...interface{}) {
 | |
| 	echoAnnotation(t, warn, args...)
 | |
| }
 | |
| 
 | |
| // Error is a wrapper around t.Error()
 | |
| // args are passed to t.Error(args) and each arg will be sent to stdout formatted
 | |
| // as a GitHub annotation when the envFlag environment variable is set
 | |
| func Error(t *testing.T, args ...interface{}) {
 | |
| 	t.Helper()
 | |
| 	echoAnnotationErr(t, args...)
 | |
| 	t.Error(args...)
 | |
| }
 | |
| 
 | |
| // AnnotatedError is similar to Error() but it also admits a msg string that
 | |
| // will be used as the GitHub annotation
 | |
| func AnnotatedError(t *testing.T, msg string, args ...interface{}) {
 | |
| 	t.Helper()
 | |
| 	echoAnnotationErr(t, msg)
 | |
| 	t.Error(args...)
 | |
| }
 | |
| 
 | |
| // Errorf is a wrapper around t.Errorf()
 | |
| // format and args are passed to t.Errorf(format, args) and the formatted
 | |
| // message will be sent to stdout as a GitHub annotation when the envFlag
 | |
| // environment variable is set
 | |
| func Errorf(t *testing.T, format string, args ...interface{}) {
 | |
| 	t.Helper()
 | |
| 	echoAnnotationErr(t, fmt.Sprintf(format, args...))
 | |
| 	t.Errorf(format, args...)
 | |
| }
 | |
| 
 | |
| // AnnotatedErrorf is similar to Errorf() but it also admits a msg string that
 | |
| // will be used as the GitHub annotation
 | |
| func AnnotatedErrorf(t *testing.T, msg, format string, args ...interface{}) {
 | |
| 	t.Helper()
 | |
| 	echoAnnotationErr(t, msg)
 | |
| 	t.Errorf(format, args...)
 | |
| }
 | |
| 
 | |
| // Fatal is a wrapper around t.Fatal()
 | |
| // args are passed to t.Fatal(args) and each arg will be sent to stdout formatted
 | |
| // as a GitHub annotation when the envFlag environment variable is set
 | |
| func Fatal(t *testing.T, args ...interface{}) {
 | |
| 	t.Helper()
 | |
| 	echoAnnotationErr(t, args)
 | |
| 	t.Fatal(args...)
 | |
| }
 | |
| 
 | |
| // AnnotatedFatal is similar to Fatal() but it also admits a msg string that
 | |
| // will be used as the GitHub annotation
 | |
| func AnnotatedFatal(t *testing.T, msg string, args ...interface{}) {
 | |
| 	t.Helper()
 | |
| 	echoAnnotationErr(t, msg)
 | |
| 	t.Fatal(args...)
 | |
| }
 | |
| 
 | |
| // Fatalf is a wrapper around t.Errorf()
 | |
| // format and args are passed to t.Fatalf(format, args) and the formatted
 | |
| // message will be sent to stdout as a GitHub annotation when the envFlag
 | |
| // environment variable is set
 | |
| func Fatalf(t *testing.T, format string, args ...interface{}) {
 | |
| 	t.Helper()
 | |
| 	echoAnnotationErr(t, fmt.Sprintf(format, args...))
 | |
| 	t.Fatalf(format, args...)
 | |
| }
 | |
| 
 | |
| // AnnotatedFatalf is similar to Fatalf() but it also admits a msg string that
 | |
| // will be used as the GitHub annotation
 | |
| func AnnotatedFatalf(t *testing.T, msg, format string, args ...interface{}) {
 | |
| 	t.Helper()
 | |
| 	echoAnnotationErr(t, msg)
 | |
| 	t.Fatalf(format, args...)
 | |
| }
 | |
| 
 | |
| // AnnotatedWarn is a wrapper around t.Log() but it also admits a msg string that
 | |
| // will be used as the GitHub warning annotation
 | |
| func AnnotatedWarn(t *testing.T, msg string, args ...interface{}) {
 | |
| 	t.Helper()
 | |
| 	echoAnnotationWarn(t, msg)
 | |
| 	t.Log(args...)
 | |
| }
 |