diff options
| author | Taras Madan <tarasmadan@google.com> | 2025-01-23 21:54:41 +0100 |
|---|---|---|
| committer | Taras Madan <tarasmadan@google.com> | 2025-01-27 10:05:21 +0000 |
| commit | 2bf68614de1620ef12f086d9e86d5c8b334bf32d (patch) | |
| tree | 24b69669a1ee44c1a34988d917cb248faed40cd3 /pkg/covermerger | |
| parent | 0868754a9d325ba9011e1cb74510f68d4b627c79 (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.go | 6 | ||||
| -rw-r--r-- | pkg/covermerger/file_line_merger.go | 2 | ||||
| -rw-r--r-- | pkg/covermerger/mocks/FileVersProvider.go | 64 | ||||
| -rw-r--r-- | pkg/covermerger/provider_monorepo.go | 10 | ||||
| -rw-r--r-- | pkg/covermerger/provider_web.go | 4 |
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. |
