From 64d0e756ef01c499a6bd2ca2e8b2eb073330c010 Mon Sep 17 00:00:00 2001 From: Taras Madan Date: Tue, 13 Aug 2024 12:57:24 +0200 Subject: tools/syz-cover: add toolFileCover --- pkg/cover/file.go | 73 +++++++++++++++++++++++++++++++++++++++++ pkg/covermerger/provider_web.go | 11 +++++++ 2 files changed, 84 insertions(+) create mode 100644 pkg/cover/file.go (limited to 'pkg') diff --git a/pkg/cover/file.go b/pkg/cover/file.go new file mode 100644 index 000000000..3e04e3d2d --- /dev/null +++ b/pkg/cover/file.go @@ -0,0 +1,73 @@ +// Copyright 2024 syzkaller project authors. All rights reserved. +// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. + +package cover + +import ( + "context" + "fmt" + "strings" + + "cloud.google.com/go/civil" + "github.com/google/syzkaller/pkg/covermerger" +) + +type lineRender func(string, bool, int, int) string + +func RendFileCoverage(c context.Context, ns, repo, commit, filePath string, + fromDate, toDate civil.Date, render lineRender) (string, error) { + fileContent, err := covermerger.GetFileVersion(filePath, repo, commit) + if err != nil { + return "", fmt.Errorf("failed to GetFileVersion for file %s, commit %s from repo %s: %w", + filePath, commit, repo, err) + } + config := &covermerger.Config{ + Jobs: 1, + Base: covermerger.RepoBranchCommit{ + Repo: repo, + Commit: commit, + }, + FileVersProvider: covermerger.MakeWebGit(), + } + + dbReader := covermerger.MakeBQCSVReader() + if err := dbReader.InitNsRecords(c, + ns, + filePath, + fromDate, + toDate, + ); err != nil { + return "", fmt.Errorf("failed to dbReader.InitNsRecords: %w", err) + } + defer dbReader.Close() + csvReader, err := dbReader.Reader() + if err != nil { + return "", fmt.Errorf("failed to dbReader.Reader: %w", err) + } + + mergeResult, err := covermerger.MergeCSVData(config, csvReader) + if err != nil { + return "", fmt.Errorf("error merging coverage: %w", err) + } + + return rendResult(fileContent, mergeResult[filePath], render), nil +} + +func rendResult(content string, coverage *covermerger.MergeResult, render lineRender) string { + srclines := strings.Split(content, "\n") + var htmlLines []string + for i, srcLine := range srclines { + lineNum := i + 1 + covered, instrumented := coverage.HitCounts[lineNum] + htmlLines = append(htmlLines, render(srcLine, instrumented, covered, lineNum)) + } + return strings.Join(htmlLines, "\n") +} + +func RendTextLine(code string, instrumented bool, covered, num int) string { + covStr := fmt.Sprintf("%6d", covered) + if !instrumented { + covStr = strings.Repeat(" ", 6) + } + return fmt.Sprintf("%s %6d %s", covStr, num, code) +} diff --git a/pkg/covermerger/provider_web.go b/pkg/covermerger/provider_web.go index 72933f280..3347f7931 100644 --- a/pkg/covermerger/provider_web.go +++ b/pkg/covermerger/provider_web.go @@ -63,3 +63,14 @@ func loadFile(filePath, repo, commit string) ([]byte, error) { func MakeWebGit() FileVersProvider { return &webGit{} } + +func GetFileVersion(filePath, repo, commit string) (string, error) { + rbc := RepoBranchCommit{repo, "", commit} + files, err := MakeWebGit().GetFileVersions(nil, + filePath, + []RepoBranchCommit{rbc}) + if err != nil { + return "", fmt.Errorf("failed to GetFileVersions: %w", err) + } + return files[rbc], nil +} -- cgit mrf-deployment