github.com/astrogo/cfitsio@v0.1.0/ci/run-tests.go (about) 1 // Copyright ©2018 The astrogo 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 // +build ignore 7 8 package main 9 10 import ( 11 "bufio" 12 "bytes" 13 "flag" 14 "fmt" 15 "io/ioutil" 16 "log" 17 "os" 18 "os/exec" 19 "strings" 20 "time" 21 ) 22 23 func main() { 24 log.SetPrefix("ci: ") 25 log.SetFlags(0) 26 27 start := time.Now() 28 defer func() { 29 log.Printf("elapsed time: %v\n", time.Since(start)) 30 }() 31 32 var ( 33 race = flag.Bool("race", false, "enable race detector") 34 cover = flag.String("coverpkg", "", "apply coverage analysis in each test to packages matching the patterns.") 35 tags = flag.String("tags", "", "build tags") 36 verbose = flag.Bool("v", false, "enable verbose output") 37 ) 38 39 flag.Parse() 40 41 pkgs, err := pkgList() 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 switch { 64 case *race: 65 args = append(args, "-race", "-timeout=20m") 66 default: 67 args = append(args, "-timeout=10m") 68 } 69 args = append(args, "") 70 71 for _, pkg := range pkgs { 72 args[len(args)-1] = pkg 73 cmd := exec.Command("go", args...) 74 cmd.Stdin = os.Stdin 75 cmd.Stdout = os.Stdout 76 cmd.Stderr = os.Stderr 77 err := cmd.Run() 78 if err != nil { 79 log.Fatal(err) 80 } 81 if *cover != "" { 82 profile, err := ioutil.ReadFile("profile.out") 83 if err != nil { 84 log.Fatal(err) 85 } 86 _, err = f.Write(profile) 87 if err != nil { 88 log.Fatal(err) 89 } 90 os.Remove("profile.out") 91 } 92 } 93 94 err = f.Close() 95 if err != nil { 96 log.Fatal(err) 97 } 98 } 99 100 func pkgList() ([]string, error) { 101 out := new(bytes.Buffer) 102 cmd := exec.Command("go", "list", "./...") 103 cmd.Stdout = out 104 cmd.Stderr = os.Stderr 105 cmd.Stdin = os.Stdin 106 107 err := cmd.Run() 108 if err != nil { 109 return nil, fmt.Errorf("could not get package list: %w", err) 110 } 111 112 var pkgs []string 113 scan := bufio.NewScanner(out) 114 for scan.Scan() { 115 pkg := scan.Text() 116 if strings.Contains(pkg, "vendor") { 117 continue 118 } 119 pkgs = append(pkgs, pkg) 120 } 121 122 return pkgs, nil 123 }