github.com/neilgarb/delve@v1.9.2-nobreaks/_scripts/gen-backend_test_health.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"go/ast"
     6  	"go/parser"
     7  	"go/token"
     8  	"io"
     9  	"log"
    10  	"os"
    11  	"sort"
    12  	"strconv"
    13  	"strings"
    14  )
    15  
    16  func main() {
    17  	f, err := parser.ParseFile(new(token.FileSet), "pkg/proc/proc_test.go", nil, 0)
    18  	if err != nil {
    19  		log.Fatalf("could not compile proc_test.go: %v", err)
    20  	}
    21  	ntests := 0
    22  	skipped := make(map[string]map[string]int)
    23  	ast.Inspect(f, func(node ast.Node) bool {
    24  		switch node := node.(type) {
    25  		case *ast.File:
    26  			return true
    27  		case *ast.FuncDecl:
    28  			if !strings.HasPrefix(node.Name.Name, "Test") {
    29  				return false
    30  			}
    31  			ntests++
    32  		stmtLoop:
    33  			for _, stmt := range node.Body.List {
    34  				expr, isexpr := stmt.(*ast.ExprStmt)
    35  				if !isexpr {
    36  					continue
    37  				}
    38  				call, ok := expr.X.(*ast.CallExpr)
    39  				if !ok {
    40  					return false
    41  				}
    42  				fun, ok := call.Fun.(*ast.Ident)
    43  				if !ok {
    44  					return false
    45  				}
    46  				switch fun.Name {
    47  				case "skipOn":
    48  					reason, conditions := skipOnArgs(call.Args)
    49  					if reason == "N/A" {
    50  						ntests--
    51  						break stmtLoop
    52  					}
    53  					if skipped[conditions] == nil {
    54  						skipped[conditions] = make(map[string]int)
    55  					}
    56  					skipped[conditions][reason]++
    57  				case "skipUnlessOn":
    58  					ntests--
    59  					break stmtLoop
    60  				}
    61  			}
    62  		}
    63  		return false
    64  	})
    65  	var fh io.WriteCloser
    66  	if len(os.Args) > 1 && os.Args[1] == "-" {
    67  		fh = os.Stdout
    68  	} else {
    69  		fh, err = os.Create("./Documentation/backend_test_health.md")
    70  		if err != nil {
    71  			log.Fatalf("could not create backend_test_health.md: %v", err)
    72  		}
    73  	}
    74  	fmt.Fprintf(fh, "Tests skipped by each supported backend:\n\n")
    75  	conds := []string{}
    76  	for cond := range skipped {
    77  		conds = append(conds, cond)
    78  	}
    79  	sort.Strings(conds)
    80  	for _, cond := range conds {
    81  		tot := 0
    82  		for _, v := range skipped[cond] {
    83  			tot += v
    84  		}
    85  		fmt.Fprintf(fh, "* %s skipped = %d\n", cond, tot)
    86  		reasons := []string{}
    87  		for reason := range skipped[cond] {
    88  			reasons = append(reasons, reason)
    89  		}
    90  		sort.Strings(reasons)
    91  		for _, reason := range reasons {
    92  			fmt.Fprintf(fh, "\t* %d %s\n", skipped[cond][reason], reason)
    93  		}
    94  	}
    95  	err = fh.Close()
    96  	if err != nil {
    97  		log.Fatalf("could not close output file: %v", err)
    98  	}
    99  }
   100  
   101  func skipOnArgs(args []ast.Expr) (reason string, conditions string) {
   102  	reason, _ = strconv.Unquote(args[1].(*ast.BasicLit).Value)
   103  	conds := []string{}
   104  	for _, arg := range args[2:] {
   105  		cond, _ := strconv.Unquote(arg.(*ast.BasicLit).Value)
   106  		conds = append(conds, cond)
   107  	}
   108  	conditions = strings.Join(conds, "/")
   109  	return reason, conditions
   110  }