diff options
| author | Kevin Ding <quic_likaid@quicinc.com> | 2025-02-24 10:23:57 +0800 |
|---|---|---|
| committer | Taras Madan <tarasmadan@google.com> | 2025-03-11 15:17:43 +0000 |
| commit | f2eee6b3351e8cecbbd53e27c4f690a78b9ec2a2 (patch) | |
| tree | bb0c756ad0af8dfcca909d719bc4fd519b8366d1 | |
| parent | 16256247d9c41cf4980c36db3841ddd674a04b58 (diff) | |
pkg/cover: allow paths to be excluded from stats
Some sub paths may not be covered due to hardware configuration, or lack
of interest. This patch allows them to be excluded from the stats. This
can be convenient if the excluded paths are deep in the hierarchy:
{
"name": "sound",
"path": [
"techpack/audio",
"-techpack/audio/asoc/aaa/bbb"
"-techpack/audio/asoc/aaa/ccc"
]
}
| -rw-r--r-- | pkg/cover/html.go | 25 | ||||
| -rw-r--r-- | pkg/cover/report_test.go | 43 | ||||
| -rw-r--r-- | pkg/mgrconfig/config.go | 4 |
3 files changed, 69 insertions, 3 deletions
diff --git a/pkg/cover/html.go b/pkg/cover/html.go index ae4aa6c4b..042d28b40 100644 --- a/pkg/cover/html.go +++ b/pkg/cover/html.go @@ -537,8 +537,12 @@ func groupCoverByFilePrefixes(datas []fileStats, subsystems []mgrconfig.Subsyste var percentCoveredFunc float64 for _, path := range subsystem.Paths { + if strings.HasPrefix(path, "-") { + continue + } + excludes := buildExcludePaths(path, subsystem.Paths) for _, data := range datas { - if !strings.HasPrefix(data.Name, path) { + if !strings.HasPrefix(data.Name, path) || isExcluded(data.Name, excludes) { continue } coveredLines += data.CoveredLines @@ -582,6 +586,25 @@ func groupCoverByFilePrefixes(datas []fileStats, subsystems []mgrconfig.Subsyste return d } +func buildExcludePaths(prefix string, paths []string) []string { + var excludes []string + for _, path := range paths { + if strings.HasPrefix(path, "-") && strings.HasPrefix(path[1:], prefix) { + excludes = append(excludes, path[1:]) + } + } + return excludes +} + +func isExcluded(path string, excludes []string) bool { + for _, exclude := range excludes { + if strings.HasPrefix(path, exclude) { + return true + } + } + return false +} + func (rg *ReportGenerator) DoSubsystemCover(w io.Writer, params HandlerParams) error { var progs = fixUpPCs(params.Progs, params.Filter) data, err := rg.convertToStats(progs) diff --git a/pkg/cover/report_test.go b/pkg/cover/report_test.go index 8f27590e9..8c86049f1 100644 --- a/pkg/cover/report_test.go +++ b/pkg/cover/report_test.go @@ -459,3 +459,46 @@ var sampleJSONLlProgs = []byte(`{ } ] }`) + +func makeFileStat(name string) fileStats { + return fileStats{ + Name: name, + CoveredLines: 1, + TotalLines: 8, + CoveredPCs: 1, + TotalPCs: 4, + TotalFunctions: 2, + CoveredFunctions: 1, + CoveredPCsInFunctions: 1, + TotalPCsInCoveredFunctions: 2, + TotalPCsInFunctions: 2, + } +} + +func TestCoverByFilePrefixes(t *testing.T) { + datas := []fileStats{ + makeFileStat("a"), + makeFileStat("a/1"), + makeFileStat("a/2"), + makeFileStat("a/2/A"), + makeFileStat("a/3"), + } + subsystems := []mgrconfig.Subsystem{ + { + Name: "test", + Paths: []string{ + "a", + "-a/2", + }, + }, + } + d := groupCoverByFilePrefixes(datas, subsystems) + assert.Equal(t, d["test"], map[string]string{ + "name": "test", + "lines": "3 / 24 / 12.50%", + "PCsInFiles": "3 / 12 / 25.00%", + "Funcs": "3 / 6 / 50.00%", + "PCsInFuncs": "3 / 6 / 50.00%", + "PCsInCoveredFuncs": "3 / 6 / 50.00%", + }) +} diff --git a/pkg/mgrconfig/config.go b/pkg/mgrconfig/config.go index 42730eef4..6bf88c574 100644 --- a/pkg/mgrconfig/config.go +++ b/pkg/mgrconfig/config.go @@ -51,9 +51,9 @@ type Config struct { KernelBuildSrc string `json:"kernel_build_src,omitempty"` // Is the kernel built separately from the modules? (Specific to Android builds) AndroidSplitBuild bool `json:"android_split_build"` - // Kernel subsystem with paths to each subsystem + // Kernel subsystem with paths to each subsystem, paths starting with "-" will be excluded // "kernel_subsystem": [ - // { "name": "sound", "path": ["sound", "techpack/audio"]}, + // { "name": "sound", "path": ["sound", "techpack/audio", "-techpack/audio/dsp"]}, // { "name": "mydriver": "path": ["mydriver_path"]} // ] KernelSubsystem []Subsystem `json:"kernel_subsystem,omitempty"` |
