go-hep.org/x/hep@v0.38.1/ci/run-tests.go (about)

     1  // Copyright ©2018 The go-hep Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  //go:build ignore
     6  
     7  package main
     8  
     9  import (
    10  	"bufio"
    11  	"bytes"
    12  	"flag"
    13  	"fmt"
    14  	"log"
    15  	"os"
    16  	"os/exec"
    17  	"strings"
    18  	"time"
    19  )
    20  
    21  func main() {
    22  	log.SetPrefix("ci: ")
    23  	log.SetFlags(0)
    24  
    25  	start := time.Now()
    26  	defer func() {
    27  		log.Printf("elapsed time: %v\n", time.Since(start))
    28  	}()
    29  
    30  	var (
    31  		race    = flag.Bool("race", false, "enable race detector")
    32  		cover   = flag.String("coverpkg", "", "apply coverage analysis in each test to packages matching the patterns.")
    33  		tags    = flag.String("tags", "", "build tags")
    34  		count   = flag.String("count", "", "run each test, benchmark, and fuzz seed n times")
    35  		run     = flag.String("run", "", "run the specified test(s)")
    36  		verbose = flag.Bool("v", false, "enable verbose output")
    37  	)
    38  
    39  	flag.Parse()
    40  
    41  	pkgs, err := pkgList(flag.Args())
    42  	if err != nil {
    43  		log.Fatal(err)
    44  	}
    45  
    46  	f, err := os.Create("coverage.txt")
    47  	if err != nil {
    48  		log.Fatal(err)
    49  	}
    50  	defer f.Close()
    51  
    52  	args := []string{"test"}
    53  
    54  	if *verbose {
    55  		args = append(args, "-v")
    56  	}
    57  	if *cover != "" {
    58  		args = append(args, "-coverprofile=profile.out", "-covermode=atomic", "-coverpkg="+*cover)
    59  	}
    60  	if *tags != "" {
    61  		args = append(args, "-tags="+*tags)
    62  	}
    63  	if *count != "" {
    64  		args = append(args, "-count="+*count)
    65  	}
    66  	if *run != "" {
    67  		args = append(args, "-run="+*run)
    68  	}
    69  	switch {
    70  	case *race:
    71  		args = append(args, "-race", "-timeout=20m")
    72  	default:
    73  		args = append(args, "-timeout=10m")
    74  	}
    75  	args = append(args, "")
    76  
    77  	for _, pkg := range pkgs {
    78  		args[len(args)-1] = pkg
    79  		cmd := exec.Command("go", args...)
    80  		cmd.Stdin = os.Stdin
    81  		cmd.Stdout = os.Stdout
    82  		cmd.Stderr = os.Stderr
    83  		err := cmd.Run()
    84  		if err != nil {
    85  			log.Fatal(err)
    86  		}
    87  		if *cover != "" {
    88  			profile, err := os.ReadFile("profile.out")
    89  			if err != nil {
    90  				log.Fatal(err)
    91  			}
    92  			_, err = f.Write(profile)
    93  			if err != nil {
    94  				log.Fatal(err)
    95  			}
    96  			os.Remove("profile.out")
    97  		}
    98  	}
    99  
   100  	err = f.Close()
   101  	if err != nil {
   102  		log.Fatal(err)
   103  	}
   104  }
   105  
   106  func pkgList(vs []string) ([]string, error) {
   107  	args := []string{"list"}
   108  	switch len(vs) {
   109  	case 0:
   110  		args = append(args, "./...")
   111  	default:
   112  		args = append(args, vs...)
   113  	}
   114  	out := new(bytes.Buffer)
   115  	cmd := exec.Command("go", args...)
   116  	cmd.Stdout = out
   117  	cmd.Stderr = os.Stderr
   118  	cmd.Stdin = os.Stdin
   119  
   120  	err := cmd.Run()
   121  	if err != nil {
   122  		return nil, fmt.Errorf("could not get package list: %w", err)
   123  	}
   124  
   125  	var pkgs []string
   126  	scan := bufio.NewScanner(out)
   127  	for scan.Scan() {
   128  		pkg := scan.Text()
   129  		if strings.Contains(pkg, "vendor") {
   130  			continue
   131  		}
   132  		pkgs = append(pkgs, pkg)
   133  	}
   134  
   135  	return pkgs, nil
   136  }