codeberg.org/go-pdf/fpdf@v0.11.1/ci/run-tests.go (about)

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