aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/covermerger
diff options
context:
space:
mode:
authorTaras Madan <tarasmadan@google.com>2025-01-23 21:54:41 +0100
committerTaras Madan <tarasmadan@google.com>2025-01-27 10:05:21 +0000
commit2bf68614de1620ef12f086d9e86d5c8b334bf32d (patch)
tree24b69669a1ee44c1a34988d917cb248faed40cd3 /pkg/covermerger
parent0868754a9d325ba9011e1cb74510f68d4b627c79 (diff)
dashboard/app: test coverage /file link
1. Init coveragedb client once and propagate it through context to enable mocking. 2. Always init coverage handlers. It simplifies testing. 3. Read webGit and coveragedb client from ctx to make it mockable. 4. Use int for file line number and int64 for merged coverage. 5. Add tests.
Diffstat (limited to 'pkg/covermerger')
-rw-r--r--pkg/covermerger/covermerger_test.go6
-rw-r--r--pkg/covermerger/file_line_merger.go2
-rw-r--r--pkg/covermerger/mocks/FileVersProvider.go64
-rw-r--r--pkg/covermerger/provider_monorepo.go10
-rw-r--r--pkg/covermerger/provider_web.go4
5 files changed, 76 insertions, 10 deletions
diff --git a/pkg/covermerger/covermerger_test.go b/pkg/covermerger/covermerger_test.go
index 36f42fdc1..ab2b1efc5 100644
--- a/pkg/covermerger/covermerger_test.go
+++ b/pkg/covermerger/covermerger_test.go
@@ -95,7 +95,7 @@ func TestMergerdCoverageRecords(t *testing.T) {
FilePath: "file.c",
MergeResult: &MergeResult{
FileExists: true,
- HitCounts: map[int]int{
+ HitCounts: map[int]int64{
1: 5,
2: 7,
},
@@ -367,8 +367,8 @@ type fileVersProviderMock struct {
}
func (m *fileVersProviderMock) GetFileVersions(targetFilePath string, repoCommits ...RepoCommit,
-) (fileVersions, error) {
- res := make(fileVersions)
+) (FileVersions, error) {
+ res := make(FileVersions)
for _, repoCommit := range repoCommits {
filePath := filepath.Join(m.Workdir, "repos", repoCommit.Commit, targetFilePath)
if bytes, err := os.ReadFile(filePath); err == nil {
diff --git a/pkg/covermerger/file_line_merger.go b/pkg/covermerger/file_line_merger.go
index ebc747f47..817099a60 100644
--- a/pkg/covermerger/file_line_merger.go
+++ b/pkg/covermerger/file_line_merger.go
@@ -5,7 +5,7 @@ package covermerger
import "github.com/google/syzkaller/pkg/log"
-func makeFileLineCoverMerger(fvs fileVersions, base RepoCommit) FileCoverageMerger {
+func makeFileLineCoverMerger(fvs FileVersions, base RepoCommit) FileCoverageMerger {
baseFile := ""
baseFileExists := false
for repoCommit, fv := range fvs {
diff --git a/pkg/covermerger/mocks/FileVersProvider.go b/pkg/covermerger/mocks/FileVersProvider.go
new file mode 100644
index 000000000..69fadfa42
--- /dev/null
+++ b/pkg/covermerger/mocks/FileVersProvider.go
@@ -0,0 +1,64 @@
+// Code generated by mockery v2.45.1. DO NOT EDIT.
+
+package mocks
+
+import (
+ covermerger "github.com/google/syzkaller/pkg/covermerger"
+ mock "github.com/stretchr/testify/mock"
+)
+
+// FileVersProvider is an autogenerated mock type for the FileVersProvider type
+type FileVersProvider struct {
+ mock.Mock
+}
+
+// GetFileVersions provides a mock function with given fields: targetFilePath, repoCommits
+func (_m *FileVersProvider) GetFileVersions(targetFilePath string, repoCommits ...covermerger.RepoCommit) (covermerger.FileVersions, error) {
+ _va := make([]interface{}, len(repoCommits))
+ for _i := range repoCommits {
+ _va[_i] = repoCommits[_i]
+ }
+ var _ca []interface{}
+ _ca = append(_ca, targetFilePath)
+ _ca = append(_ca, _va...)
+ ret := _m.Called(_ca...)
+
+ if len(ret) == 0 {
+ panic("no return value specified for GetFileVersions")
+ }
+
+ var r0 covermerger.FileVersions
+ var r1 error
+ if rf, ok := ret.Get(0).(func(string, ...covermerger.RepoCommit) (covermerger.FileVersions, error)); ok {
+ return rf(targetFilePath, repoCommits...)
+ }
+ if rf, ok := ret.Get(0).(func(string, ...covermerger.RepoCommit) covermerger.FileVersions); ok {
+ r0 = rf(targetFilePath, repoCommits...)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(covermerger.FileVersions)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(string, ...covermerger.RepoCommit) error); ok {
+ r1 = rf(targetFilePath, repoCommits...)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// NewFileVersProvider creates a new instance of FileVersProvider. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
+// The first argument is typically a *testing.T value.
+func NewFileVersProvider(t interface {
+ mock.TestingT
+ Cleanup(func())
+}) *FileVersProvider {
+ mock := &FileVersProvider{}
+ mock.Mock.Test(t)
+
+ t.Cleanup(func() { mock.AssertExpectations(t) })
+
+ return mock
+}
diff --git a/pkg/covermerger/provider_monorepo.go b/pkg/covermerger/provider_monorepo.go
index e6c67d1d1..73a08786a 100644
--- a/pkg/covermerger/provider_monorepo.go
+++ b/pkg/covermerger/provider_monorepo.go
@@ -3,6 +3,8 @@
package covermerger
+//go:generate ../../tools/mockery.sh --name FileVersProvider -r
+
import (
"fmt"
"path/filepath"
@@ -15,7 +17,7 @@ import (
type FileVersProvider interface {
GetFileVersions(targetFilePath string, repoCommits ...RepoCommit,
- ) (fileVersions, error)
+ ) (FileVersions, error)
}
type monoRepo struct {
@@ -24,10 +26,10 @@ type monoRepo struct {
repo vcs.Repo
}
-type fileVersions map[RepoCommit]string
+type FileVersions map[RepoCommit]string
func (mr *monoRepo) GetFileVersions(targetFilePath string, repoCommits ...RepoCommit,
-) (fileVersions, error) {
+) (FileVersions, error) {
mr.mu.RLock()
if !mr.allRepoCommitsPresent(repoCommits) {
mr.mu.RUnlock()
@@ -35,7 +37,7 @@ func (mr *monoRepo) GetFileVersions(targetFilePath string, repoCommits ...RepoCo
mr.mu.RLock()
}
defer mr.mu.RUnlock()
- res := make(fileVersions)
+ res := make(FileVersions)
for _, repoCommit := range repoCommits {
fileBytes, err := mr.repo.Object(targetFilePath, repoCommit.Commit)
// It is ok if some file doesn't exist. It means we have repo FS diff.
diff --git a/pkg/covermerger/provider_web.go b/pkg/covermerger/provider_web.go
index 43bfee7e0..554ee3f97 100644
--- a/pkg/covermerger/provider_web.go
+++ b/pkg/covermerger/provider_web.go
@@ -18,8 +18,8 @@ type webGit struct {
}
func (mr *webGit) GetFileVersions(targetFilePath string, repoCommits ...RepoCommit,
-) (fileVersions, error) {
- res := make(fileVersions)
+) (FileVersions, error) {
+ res := make(FileVersions)
for _, repoCommit := range repoCommits {
fileBytes, err := mr.loadFile(targetFilePath, repoCommit.Repo, repoCommit.Commit)
// It is ok if some file doesn't exist. It means we have repo FS diff.