]> Cypherpunks repositories - gostls13.git/commitdiff
internal/coverage: refactor EmitPercent in preparation for bugfix
authorThan McIntosh <thanm@google.com>
Wed, 12 Jun 2024 21:54:53 +0000 (21:54 +0000)
committerThan McIntosh <thanm@google.com>
Fri, 14 Jun 2024 11:45:22 +0000 (11:45 +0000)
Refactor cformat.EmitPercent to accept a package filter (list of
packages to report). This is a no-op in terms of exposed coverage
functionality, but we will need this feature in a subsequent patch.

Updates #65570.

Change-Id: I04ddc624a634837ea31c12ec395aa1295a0ea1f1
Reviewed-on: https://go-review.googlesource.com/c/go/+/592204
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: David Chase <drchase@google.com>
src/cmd/covdata/dump.go
src/internal/coverage/cfile/testsupport.go
src/internal/coverage/cformat/fmt_test.go
src/internal/coverage/cformat/format.go

index a51762f0d10e2c8b4296e16dd3cb7cb9df8150ee..cbbeae0a8020de30b016ceed9266e67cb8042d23 100644 (file)
@@ -325,7 +325,7 @@ func (d *dstate) Finish() {
        // d.format maybe nil here if the specified input dir was empty.
        if d.format != nil {
                if d.cmd == percentMode {
-                       d.format.EmitPercent(os.Stdout, "", false, false)
+                       d.format.EmitPercent(os.Stdout, nil, "", false, false)
                }
                if d.cmd == funcMode {
                        d.format.EmitFuncs(os.Stdout)
index a5119187a2ba04cd5b337428f7bd410598db21aa..72d09150cf7566bfdb5c05c798bc6d6d328c8446 100644 (file)
@@ -103,7 +103,7 @@ func ProcessCoverTestDir(dir string, cfile string, cm string, cpkg string, w io.
        }
 
        // Emit percent.
-       if err := ts.cf.EmitPercent(w, cpkg, true, true); err != nil {
+       if err := ts.cf.EmitPercent(w, nil, cpkg, true, true); err != nil {
                return err
        }
 
index f5ed01b3b0f5355926025addad2c28a322b1847b..d296939d5cd20ca6cc31f3b0cc81f53ee8ebe652 100644 (file)
@@ -66,7 +66,7 @@ lit.go:99.0,100.0 1 0`)
 
        // Percent output with no aggregation.
        noCoverPkg := ""
-       if err := fm.EmitPercent(&b2, noCoverPkg, false, false); err != nil {
+       if err := fm.EmitPercent(&b2, nil, noCoverPkg, false, false); err != nil {
                t.Fatalf("EmitPercent returned %v", err)
        }
        wantPercent := strings.Fields(`
@@ -81,7 +81,7 @@ lit.go:99.0,100.0 1 0`)
 
        // Percent mode with aggregation.
        withCoverPkg := " in ./..."
-       if err := fm.EmitPercent(&b3, withCoverPkg, false, true); err != nil {
+       if err := fm.EmitPercent(&b3, nil, withCoverPkg, false, true); err != nil {
                t.Fatalf("EmitPercent returned %v", err)
        }
        wantPercent = strings.Fields(`
@@ -110,6 +110,24 @@ total              (statements)    62.5%`)
                t.Logf("perc2 is %s\n", b3.String())
                t.Logf("funcs is %s\n", b4.String())
        }
+
+       // Percent output with specific packages selected.
+       {
+               var b strings.Builder
+               selpkgs := []string{"foo/bar", "my/pack1"}
+               if err := fm.EmitPercent(&b, selpkgs, noCoverPkg, false, false); err != nil {
+                       t.Fatalf("EmitPercent returned %v", err)
+               }
+               wantPercent := strings.Fields(`
+               my/pack1                coverage: 66.7% of statements
+`)
+               gotPercent := strings.Fields(b.String())
+               if !slices.Equal(wantPercent, gotPercent) {
+                       t.Errorf("emit percent: got:\n%+v\nwant:\n%+v\n",
+                               gotPercent, wantPercent)
+               }
+       }
+
 }
 
 func TestEmptyPackages(t *testing.T) {
@@ -122,7 +140,7 @@ func TestEmptyPackages(t *testing.T) {
        {
                var b strings.Builder
                noCoverPkg := ""
-               if err := fm.EmitPercent(&b, noCoverPkg, true, false); err != nil {
+               if err := fm.EmitPercent(&b, nil, noCoverPkg, true, false); err != nil {
                        t.Fatalf("EmitPercent returned %v", err)
                }
                wantPercent := strings.Fields(`
@@ -140,7 +158,7 @@ func TestEmptyPackages(t *testing.T) {
        {
                var b strings.Builder
                noCoverPkg := ""
-               if err := fm.EmitPercent(&b, noCoverPkg, true, true); err != nil {
+               if err := fm.EmitPercent(&b, nil, noCoverPkg, true, true); err != nil {
                        t.Fatalf("EmitPercent returned %v", err)
                }
                wantPercent := strings.Fields(`
index dcbe584c0be8b2a40fe76829f079940a5d533292..0f9e981df8b12d88427a3285e9b5a68ab231442b 100644 (file)
@@ -23,7 +23,7 @@ package cformat
 //                             }
 //                     }
 //             }
-//             myformatter.EmitPercent(os.Stdout, "", true, true)
+//             myformatter.EmitPercent(os.Stdout, nil, "", true, true)
 //             myformatter.EmitTextual(somefile)
 //
 // These apis are linked into tests that are built with "-cover", and
@@ -199,17 +199,21 @@ func (fm *Formatter) EmitTextual(w io.Writer) error {
        return nil
 }
 
-// EmitPercent writes out a "percentage covered" string to the writer 'w'.
-func (fm *Formatter) EmitPercent(w io.Writer, covpkgs string, noteEmpty bool, aggregate bool) error {
-       pkgs := make([]string, 0, len(fm.pm))
-       for importpath := range fm.pm {
-               pkgs = append(pkgs, importpath)
+// EmitPercent writes out a "percentage covered" string to the writer
+// 'w', selecting the set of packages in 'pkgs' and suffixing the
+// printed string with 'inpkgs'.
+func (fm *Formatter) EmitPercent(w io.Writer, pkgs []string, inpkgs string, noteEmpty bool, aggregate bool) error {
+       if len(pkgs) == 0 {
+               pkgs = make([]string, 0, len(fm.pm))
+               for importpath := range fm.pm {
+                       pkgs = append(pkgs, importpath)
+               }
        }
 
        rep := func(cov, tot uint64) error {
                if tot != 0 {
                        if _, err := fmt.Fprintf(w, "coverage: %.1f%% of statements%s\n",
-                               100.0*float64(cov)/float64(tot), covpkgs); err != nil {
+                               100.0*float64(cov)/float64(tot), inpkgs); err != nil {
                                return err
                        }
                } else if noteEmpty {
@@ -224,6 +228,9 @@ func (fm *Formatter) EmitPercent(w io.Writer, covpkgs string, noteEmpty bool, ag
        var totalStmts, coveredStmts uint64
        for _, importpath := range pkgs {
                p := fm.pm[importpath]
+               if p == nil {
+                       continue
+               }
                if !aggregate {
                        totalStmts, coveredStmts = 0, 0
                }