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 }