2022-12-08 13:05:19 -03:00

99 lines
2.2 KiB
Go

// Copyright (c) 2020 Gitpod GmbH. All rights reserved.
// Licensed under the GNU Affero General Public License (AGPL).
// See License.AGPL.txt in the project root for license information.
//go:build ignore
// +build ignore
// Tabularasa tries to remove test fixtures which did no add to the code coverage. It removes every single fixture one by one,
// runes the tests and if the code coverage did not go down, it renames the file.
//
// To exempt a testcase/fixture from this procedure, rename it to *.nt.json (nt as in "no tabularasa").
package main
import (
"crypto/sha1"
"fmt"
"os"
"os/exec"
"path/filepath"
"sort"
"strings"
)
func main() {
fixtures, err := filepath.Glob("*.json")
if err != nil {
panic(err)
}
allLines, err := getCoverage("all")
if err != nil {
panic(err)
}
masterSum := sha1.New()
masterSum.Write([]byte(strings.Join(allLines, "\n")))
masterHash := fmt.Sprintf("%x", masterSum.Sum(nil))
for i, f := range fixtures {
fmt.Printf("[%03d of %03d] %s: ", i+1, len(fixtures), f)
if strings.HasSuffix(f, ".nt.json") {
fmt.Println("exempt (make sure this test is worth it!)")
continue
}
nf := fmt.Sprintf("%s_DNT", f)
err := os.Rename(f, nf)
if err != nil {
panic(err)
}
lines, err := getCoverage(f)
if err != nil {
panic(err)
}
if len(lines) < len(allLines) {
fmt.Println("unnecessary (lc)")
continue
}
if len(lines) > len(allLines) {
panic("Removing a test increased test coverage - that cannot be")
}
lineSum := sha1.New()
lineSum.Write([]byte(strings.Join(lines, "\n")))
lineHash := fmt.Sprintf("%x", lineSum.Sum(nil))
if lineHash == masterHash {
fmt.Println("unnecessary (hash)")
continue
}
os.Rename(nf, f)
fmt.Println("good")
}
}
func getCoverage(name string) ([]string, error) {
td, err := filepath.Abs("..")
if err != nil {
return nil, err
}
coverFN := fmt.Sprintf("%s.cover", name)
cmd := exec.Command("go", "test", fmt.Sprintf("-coverprofile=testdata/%s", coverFN), ".")
cmd.Dir = td
_, err = cmd.CombinedOutput()
if err != nil {
return nil, err
}
fc, err := os.ReadFile(coverFN)
lines := strings.Split(string(fc), "\n")
sort.Strings(lines)
os.WriteFile(coverFN, []byte(strings.Join(lines, "\n")), 0644)
return lines, nil
}