master
go 84 lines 1.5 KB
Raw
1 // Only built when collecting coverage via "go test -tags testrunmain".
2 //go:build testrunmain
3
4 package main
5
6 import (
7 "fmt"
8 "io"
9 "os"
10 "os/exec"
11 "os/signal"
12 "strconv"
13 "syscall"
14 )
15
16 func main() {
17 coverDir := os.Getenv("IPFS_COVER_DIR")
18 if len(coverDir) == 0 {
19 fmt.Println("IPFS_COVER_DIR not defined")
20 os.Exit(1)
21 }
22 coverFile, err := os.CreateTemp(coverDir, "coverage-")
23 if err != nil {
24 fmt.Println(err.Error())
25 os.Exit(1)
26 }
27
28 retFile, err := os.CreateTemp("", "cover-ret-file")
29 if err != nil {
30 fmt.Println(err.Error())
31 os.Exit(1)
32 }
33
34 args := []string{"-test.run", "^TestRunMain$", "-test.coverprofile=" + coverFile.Name(), "--"}
35 args = append(args, os.Args[1:]...)
36
37 p := exec.Command("ipfs-test-cover", args...)
38 p.Stdin = os.Stdin
39 p.Stdout = os.Stdout
40 p.Stderr = os.Stderr
41 p.Env = append(os.Environ(), "IPFS_COVER_RET_FILE="+retFile.Name())
42
43 p.SysProcAttr = &syscall.SysProcAttr{
44 Pdeathsig: syscall.SIGTERM,
45 }
46
47 sig := make(chan os.Signal, 10)
48 start := make(chan struct{})
49 go func() {
50 <-start
51 for {
52 p.Process.Signal(<-sig)
53 }
54 }()
55
56 signal.Notify(sig, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM)
57
58 err = p.Start()
59 if err != nil {
60 fmt.Println(err.Error())
61 os.Exit(1)
62 }
63
64 close(start)
65
66 err = p.Wait()
67 if err != nil {
68 fmt.Println(err.Error())
69 os.Exit(1)
70 }
71
72 b, err := io.ReadAll(retFile)
73 if err != nil {
74 fmt.Println(err.Error())
75 os.Exit(1)
76 }
77 b = b[:len(b)-1]
78 d, err := strconv.Atoi(string(b))
79 if err != nil {
80 fmt.Println(err.Error())
81 os.Exit(1)
82 }
83 os.Exit(d)
84 }