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 }