From e94834c03d8bd189227351a69bdd395f45ddbd5a Mon Sep 17 00:00:00 2001 From: Taras Madan Date: Wed, 17 Jul 2024 10:05:09 +0200 Subject: syz-cover: add subsystems heatmap --- pkg/cover/heatmap.go | 24 ++++++++++++++++++++++++ tools/syz-cover/syz-cover.go | 26 ++++++++++++++++++-------- 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/pkg/cover/heatmap.go b/pkg/cover/heatmap.go index 7745a1d49..2582de7d7 100644 --- a/pkg/cover/heatmap.go +++ b/pkg/cover/heatmap.go @@ -15,6 +15,8 @@ import ( "cloud.google.com/go/civil" "cloud.google.com/go/spanner" "github.com/google/syzkaller/pkg/spanner/coveragedb" + "github.com/google/syzkaller/pkg/subsystem" + _ "github.com/google/syzkaller/pkg/subsystem/lists" "golang.org/x/exp/maps" "google.golang.org/api/iterator" ) @@ -174,6 +176,28 @@ func DoHeatMap(w io.Writer, projectID, ns string, dateFrom, dateTo civil.Date) e return heatmapTemplate.Execute(w, templateData) } +func DoSubsystemsHeatMap(w io.Writer, projectID, ns string, dateFrom, dateTo civil.Date) error { + covAndDates, err := filesCoverageAndDates(context.Background(), projectID, ns, dateFrom, dateTo) + if err != nil { + panic(err) + } + ssMatcher := subsystem.MakePathMatcher(subsystem.GetList("linux")) + var ssCovAndDates []*fileCoverageAndDate + for _, cad := range covAndDates { + for _, ss := range ssMatcher.Match(cad.Filepath) { + newRecord := fileCoverageAndDate{ + Filepath: ss.Name + "/" + cad.Filepath, + Instrumented: cad.Instrumented, + Covered: cad.Covered, + Dateto: cad.Dateto, + } + ssCovAndDates = append(ssCovAndDates, &newRecord) + } + } + templateData := filesCoverageToTemplateData(ssCovAndDates) + return heatmapTemplate.Execute(w, templateData) +} + func approximateInstrumented(points int64) string { dim := "_" if points > 10000 { diff --git a/tools/syz-cover/syz-cover.go b/tools/syz-cover/syz-cover.go index 14de498ad..1f0550238 100644 --- a/tools/syz-cover/syz-cover.go +++ b/tools/syz-cover/syz-cover.go @@ -43,12 +43,13 @@ var ( flagConfig = flag.String("config", "", "configuration file") flagModules = flag.String("modules", "", "modules JSON info obtained from /modules (optional)") - flagExportCSV = flag.String("csv", "", "export coverage data in csv format (optional)") - flagExportLineJSON = flag.String("json", "", "export coverage data with source line info in json format (optional)") - flagExportJSONL = flag.String("jsonl", "", "export jsonl coverage data (optional)") - flagExportHTML = flag.String("html", "", "save coverage HTML report to file (optional)") - flagNsHeatmap = flag.String("heatmap", "", "generate namespace heatmap") - flagDateFrom = flag.String("from", + flagExportCSV = flag.String("csv", "", "export coverage data in csv format (optional)") + flagExportLineJSON = flag.String("json", "", "export coverage data with source line info in json format (optional)") + flagExportJSONL = flag.String("jsonl", "", "export jsonl coverage data (optional)") + flagExportHTML = flag.String("html", "", "save coverage HTML report to file (optional)") + flagNsHeatmap = flag.String("heatmap", "", "generate namespace heatmap") + flagNsHeatmapGroupBy = flag.String("group-by", "dir", "dir or subsystem") + flagDateFrom = flag.String("from", civil.DateOf(time.Now().Add(-14*24*time.Hour)).String(), "heatmap date from(optional)") flagDateTo = flag.String("to", civil.DateOf(time.Now()).String(), "heatmap date to(optional)") @@ -65,8 +66,17 @@ func toolBuildNsHeatmap() { if dateTo, err = civil.ParseDate(*flagDateTo); err != nil { tool.Failf("failed to parse date to: %v", err.Error()) } - if err = cover.DoHeatMap(buf, *flagProjectID, *flagNsHeatmap, dateFrom, dateTo); err != nil { - tool.Fail(err) + switch *flagNsHeatmapGroupBy { + case "dir": + if err = cover.DoHeatMap(buf, *flagProjectID, *flagNsHeatmap, dateFrom, dateTo); err != nil { + tool.Fail(err) + } + case "subsystem": + if err = cover.DoSubsystemsHeatMap(buf, *flagProjectID, *flagNsHeatmap, dateFrom, dateTo); err != nil { + tool.Fail(err) + } + default: + tool.Failf("group by %s not supported", *flagNsHeatmapGroupBy) } if err = osutil.WriteFile(*flagNsHeatmap+".html", buf.Bytes()); err != nil { tool.Fail(err) -- cgit mrf-deployment