github.com/cobalt77/jfrog-client-go@v0.14.5/utils/tests/utils.go (about)

     1  package tests
     2  
     3  import (
     4  	"bufio"
     5  	"net"
     6  	"net/http"
     7  	"os"
     8  	"os/exec"
     9  	"path/filepath"
    10  	"strings"
    11  
    12  	"github.com/cobalt77/jfrog-client-go/utils/io/fileutils"
    13  	"github.com/cobalt77/jfrog-client-go/utils/log"
    14  )
    15  
    16  type HttpServerHandlers map[string]func(w http.ResponseWriter, r *http.Request)
    17  
    18  func StartHttpServer(handlers HttpServerHandlers) (int, error) {
    19  	listener, err := net.Listen("tcp", ":0")
    20  	if err != nil {
    21  		return 0, err
    22  	}
    23  	go func() {
    24  		httpMux := http.NewServeMux()
    25  		for k, v := range handlers {
    26  			httpMux.HandleFunc(k, v)
    27  		}
    28  		err = http.Serve(listener, httpMux)
    29  		if err != nil {
    30  			panic(err)
    31  		}
    32  	}()
    33  	return listener.Addr().(*net.TCPAddr).Port, nil
    34  }
    35  
    36  func GetTestPackages(searchPattern string) []string {
    37  	// Get all packages with test files.
    38  	cmd := exec.Command("go", "list", "-f", "{{.ImportPath}} {{.TestGoFiles}}", searchPattern)
    39  	packages, _ := cmd.Output()
    40  
    41  	scanner := bufio.NewScanner(strings.NewReader(string(packages)))
    42  	var unitTests []string
    43  	for scanner.Scan() {
    44  		fields := strings.Split(scanner.Text(), " ")
    45  		// Skip if package does not contain test files.
    46  		if len(fields) > 1 && len(fields[1]) > 2 {
    47  			unitTests = append(unitTests, fields[0])
    48  		}
    49  	}
    50  	return unitTests
    51  }
    52  
    53  func ExcludeTestsPackage(packages []string, packageToExclude string) []string {
    54  	var res []string
    55  	for _, packageName := range packages {
    56  		if packageName != packageToExclude {
    57  			res = append(res, packageName)
    58  		}
    59  	}
    60  	return res
    61  }
    62  
    63  func RunTests(testsPackages []string, hideUnitTestsLog bool) error {
    64  	if len(testsPackages) == 0 {
    65  		return nil
    66  	}
    67  	testsPackages = append([]string{"test", "-v"}, testsPackages...)
    68  	cmd := exec.Command("go", testsPackages...)
    69  
    70  	if hideUnitTestsLog {
    71  		tempDirPath, err := getTestsLogsDir()
    72  		exitOnErr(err)
    73  
    74  		f, err := os.Create(filepath.Join(tempDirPath, "unit_tests.log"))
    75  		exitOnErr(err)
    76  
    77  		cmd.Stdout, cmd.Stderr = f, f
    78  		if err := cmd.Run(); err != nil {
    79  			log.Error("Unit tests failed, full report available at the following path:", f.Name())
    80  			exitOnErr(err)
    81  		}
    82  		log.Info("Full unit testing report available at the following path:", f.Name())
    83  		return nil
    84  	}
    85  
    86  	cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr
    87  	if err := cmd.Run(); err != nil {
    88  		log.Error("Unit tests failed")
    89  		exitOnErr(err)
    90  	}
    91  
    92  	return nil
    93  }
    94  
    95  func getTestsLogsDir() (string, error) {
    96  	tempDirPath := filepath.Join(os.TempDir(), "jfrog_tests_logs")
    97  	return tempDirPath, fileutils.CreateDirIfNotExist(tempDirPath)
    98  }
    99  
   100  func exitOnErr(err error) {
   101  	if err != nil {
   102  		log.Error(err)
   103  		os.Exit(1)
   104  	}
   105  }