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  }