mirror of
https://github.com/containers/podman.git
synced 2025-07-04 01:48:28 +08:00
Merge pull request #22331 from edsantiago/tools-ginkgo-update
vendor ginkgo 2.17.1 into test/tools
This commit is contained in:
2
Makefile
2
Makefile
@ -242,7 +242,7 @@ binaries: podman podman-remote podmansh rootlessport quadlet ## Build podman, po
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
# Extract text following double-# for targets, as their description for
|
# Extract text following double-# for targets, as their description for
|
||||||
# the `help` target. Otherwise These simple-substitutions are resolved
|
# the `help` target. Otherwise these simple-substitutions are resolved
|
||||||
# at reference-time (due to `=` and not `=:`).
|
# at reference-time (due to `=` and not `=:`).
|
||||||
_HLP_TGTS_RX = '^[[:print:]]+:.*?\#\# .*$$'
|
_HLP_TGTS_RX = '^[[:print:]]+:.*?\#\# .*$$'
|
||||||
_HLP_TGTS_CMD = $(GREP) -E $(_HLP_TGTS_RX) $(MAKEFILE_LIST)
|
_HLP_TGTS_CMD = $(GREP) -E $(_HLP_TGTS_RX) $(MAKEFILE_LIST)
|
||||||
|
@ -4,7 +4,7 @@ go 1.20
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.4
|
github.com/cpuguy83/go-md2man/v2 v2.0.4
|
||||||
github.com/onsi/ginkgo/v2 v2.14.0
|
github.com/onsi/ginkgo/v2 v2.17.1
|
||||||
github.com/vbatts/git-validation v1.2.1
|
github.com/vbatts/git-validation v1.2.1
|
||||||
golang.org/x/tools v0.20.0
|
golang.org/x/tools v0.20.0
|
||||||
)
|
)
|
||||||
|
@ -8,7 +8,7 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
|
|||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs=
|
github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs=
|
||||||
github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw=
|
github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw=
|
||||||
github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=
|
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
|
||||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
|
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
|
||||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
|
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
|
||||||
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
|
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
|
||||||
@ -25,8 +25,8 @@ github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovk
|
|||||||
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
||||||
github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
|
github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
|
||||||
github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
||||||
github.com/onsi/ginkgo/v2 v2.14.0 h1:vSmGj2Z5YPb9JwCWT6z6ihcUvDhuXLc3sJiqd3jMKAY=
|
github.com/onsi/ginkgo/v2 v2.17.1 h1:V++EzdbhI4ZV4ev0UTIj0PzhzOcReJFyJaLjtSF55M8=
|
||||||
github.com/onsi/ginkgo/v2 v2.14.0/go.mod h1:JkUdW7JkN0V6rFvsHcJ478egV3XH9NxpD27Hal/PhZw=
|
github.com/onsi/ginkgo/v2 v2.17.1/go.mod h1:llBI3WDLL9Z6taip6f33H76YcWtJv+7R3HigUjbIBOs=
|
||||||
github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8=
|
github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
129
test/tools/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/gocovmerge.go
generated
vendored
Normal file
129
test/tools/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/gocovmerge.go
generated
vendored
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
// Copyright (c) 2015, Wade Simmons
|
||||||
|
// All rights reserved.
|
||||||
|
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
// 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
// list of conditions and the following disclaimer.
|
||||||
|
// 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer in the documentation
|
||||||
|
// and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
// Package gocovmerge takes the results from multiple `go test -coverprofile`
|
||||||
|
// runs and merges them into one profile
|
||||||
|
|
||||||
|
// this file was originally taken from the gocovmerge project
|
||||||
|
// see also: https://go.shabbyrobe.org/gocovmerge
|
||||||
|
package internal
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"sort"
|
||||||
|
|
||||||
|
"golang.org/x/tools/cover"
|
||||||
|
)
|
||||||
|
|
||||||
|
func AddCoverProfile(profiles []*cover.Profile, p *cover.Profile) []*cover.Profile {
|
||||||
|
i := sort.Search(len(profiles), func(i int) bool { return profiles[i].FileName >= p.FileName })
|
||||||
|
if i < len(profiles) && profiles[i].FileName == p.FileName {
|
||||||
|
MergeCoverProfiles(profiles[i], p)
|
||||||
|
} else {
|
||||||
|
profiles = append(profiles, nil)
|
||||||
|
copy(profiles[i+1:], profiles[i:])
|
||||||
|
profiles[i] = p
|
||||||
|
}
|
||||||
|
return profiles
|
||||||
|
}
|
||||||
|
|
||||||
|
func DumpCoverProfiles(profiles []*cover.Profile, out io.Writer) error {
|
||||||
|
if len(profiles) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if _, err := fmt.Fprintf(out, "mode: %s\n", profiles[0].Mode); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for _, p := range profiles {
|
||||||
|
for _, b := range p.Blocks {
|
||||||
|
if _, err := fmt.Fprintf(out, "%s:%d.%d,%d.%d %d %d\n", p.FileName, b.StartLine, b.StartCol, b.EndLine, b.EndCol, b.NumStmt, b.Count); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func MergeCoverProfiles(into *cover.Profile, merge *cover.Profile) error {
|
||||||
|
if into.Mode != merge.Mode {
|
||||||
|
return fmt.Errorf("cannot merge profiles with different modes")
|
||||||
|
}
|
||||||
|
// Since the blocks are sorted, we can keep track of where the last block
|
||||||
|
// was inserted and only look at the blocks after that as targets for merge
|
||||||
|
startIndex := 0
|
||||||
|
for _, b := range merge.Blocks {
|
||||||
|
var err error
|
||||||
|
startIndex, err = mergeProfileBlock(into, b, startIndex)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func mergeProfileBlock(p *cover.Profile, pb cover.ProfileBlock, startIndex int) (int, error) {
|
||||||
|
sortFunc := func(i int) bool {
|
||||||
|
pi := p.Blocks[i+startIndex]
|
||||||
|
return pi.StartLine >= pb.StartLine && (pi.StartLine != pb.StartLine || pi.StartCol >= pb.StartCol)
|
||||||
|
}
|
||||||
|
|
||||||
|
i := 0
|
||||||
|
if sortFunc(i) != true {
|
||||||
|
i = sort.Search(len(p.Blocks)-startIndex, sortFunc)
|
||||||
|
}
|
||||||
|
|
||||||
|
i += startIndex
|
||||||
|
if i < len(p.Blocks) && p.Blocks[i].StartLine == pb.StartLine && p.Blocks[i].StartCol == pb.StartCol {
|
||||||
|
if p.Blocks[i].EndLine != pb.EndLine || p.Blocks[i].EndCol != pb.EndCol {
|
||||||
|
return i, fmt.Errorf("gocovmerge: overlapping merge %v %v %v", p.FileName, p.Blocks[i], pb)
|
||||||
|
}
|
||||||
|
switch p.Mode {
|
||||||
|
case "set":
|
||||||
|
p.Blocks[i].Count |= pb.Count
|
||||||
|
case "count", "atomic":
|
||||||
|
p.Blocks[i].Count += pb.Count
|
||||||
|
default:
|
||||||
|
return i, fmt.Errorf("gocovmerge: unsupported covermode '%s'", p.Mode)
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
if i > 0 {
|
||||||
|
pa := p.Blocks[i-1]
|
||||||
|
if pa.EndLine >= pb.EndLine && (pa.EndLine != pb.EndLine || pa.EndCol > pb.EndCol) {
|
||||||
|
return i, fmt.Errorf("gocovmerge: overlap before %v %v %v", p.FileName, pa, pb)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if i < len(p.Blocks)-1 {
|
||||||
|
pa := p.Blocks[i+1]
|
||||||
|
if pa.StartLine <= pb.StartLine && (pa.StartLine != pb.StartLine || pa.StartCol < pb.StartCol) {
|
||||||
|
return i, fmt.Errorf("gocovmerge: overlap after %v %v %v", p.FileName, pa, pb)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
p.Blocks = append(p.Blocks, cover.ProfileBlock{})
|
||||||
|
copy(p.Blocks[i+1:], p.Blocks[i:])
|
||||||
|
p.Blocks[i] = pb
|
||||||
|
}
|
||||||
|
|
||||||
|
return i + 1, nil
|
||||||
|
}
|
44
test/tools/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/profiles_and_reports.go
generated
vendored
44
test/tools/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/profiles_and_reports.go
generated
vendored
@ -1,7 +1,6 @@
|
|||||||
package internal
|
package internal
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
@ -12,6 +11,7 @@ import (
|
|||||||
"github.com/google/pprof/profile"
|
"github.com/google/pprof/profile"
|
||||||
"github.com/onsi/ginkgo/v2/reporters"
|
"github.com/onsi/ginkgo/v2/reporters"
|
||||||
"github.com/onsi/ginkgo/v2/types"
|
"github.com/onsi/ginkgo/v2/types"
|
||||||
|
"golang.org/x/tools/cover"
|
||||||
)
|
)
|
||||||
|
|
||||||
func AbsPathForGeneratedAsset(assetName string, suite TestSuite, cliConfig types.CLIConfig, process int) string {
|
func AbsPathForGeneratedAsset(assetName string, suite TestSuite, cliConfig types.CLIConfig, process int) string {
|
||||||
@ -144,38 +144,26 @@ func FinalizeProfilesAndReportsForSuites(suites TestSuites, cliConfig types.CLIC
|
|||||||
return messages, nil
|
return messages, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
//loads each profile, combines them, deletes them, stores them in destination
|
// loads each profile, merges them, deletes them, stores them in destination
|
||||||
func MergeAndCleanupCoverProfiles(profiles []string, destination string) error {
|
func MergeAndCleanupCoverProfiles(profiles []string, destination string) error {
|
||||||
combined := &bytes.Buffer{}
|
var merged []*cover.Profile
|
||||||
modeRegex := regexp.MustCompile(`^mode: .*\n`)
|
for _, file := range profiles {
|
||||||
for i, profile := range profiles {
|
parsedProfiles, err := cover.ParseProfiles(file)
|
||||||
contents, err := os.ReadFile(profile)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Unable to read coverage file %s:\n%s", profile, err.Error())
|
return err
|
||||||
}
|
}
|
||||||
os.Remove(profile)
|
os.Remove(file)
|
||||||
|
for _, p := range parsedProfiles {
|
||||||
// remove the cover mode line from every file
|
merged = AddCoverProfile(merged, p)
|
||||||
// except the first one
|
|
||||||
if i > 0 {
|
|
||||||
contents = modeRegex.ReplaceAll(contents, []byte{})
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = combined.Write(contents)
|
|
||||||
|
|
||||||
// Add a newline to the end of every file if missing.
|
|
||||||
if err == nil && len(contents) > 0 && contents[len(contents)-1] != '\n' {
|
|
||||||
_, err = combined.Write([]byte("\n"))
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("Unable to append to coverprofile:\n%s", err.Error())
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
dst, err := os.OpenFile(destination, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666)
|
||||||
err := os.WriteFile(destination, combined.Bytes(), 0666)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Unable to create combined cover profile:\n%s", err.Error())
|
return err
|
||||||
|
}
|
||||||
|
err = DumpCoverProfiles(merged, dst)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -184,7 +172,7 @@ func GetCoverageFromCoverProfile(profile string) (float64, error) {
|
|||||||
cmd := exec.Command("go", "tool", "cover", "-func", profile)
|
cmd := exec.Command("go", "tool", "cover", "-func", profile)
|
||||||
output, err := cmd.CombinedOutput()
|
output, err := cmd.CombinedOutput()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, fmt.Errorf("Could not process Coverprofile %s: %s", profile, err.Error())
|
return 0, fmt.Errorf("Could not process Coverprofile %s: %s - %s", profile, err.Error(), string(output))
|
||||||
}
|
}
|
||||||
re := regexp.MustCompile(`total:\s*\(statements\)\s*(\d*\.\d*)\%`)
|
re := regexp.MustCompile(`total:\s*\(statements\)\s*(\d*\.\d*)\%`)
|
||||||
matches := re.FindStringSubmatch(string(output))
|
matches := re.FindStringSubmatch(string(output))
|
||||||
|
3
test/tools/vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/ginkgo.go
generated
vendored
3
test/tools/vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/ginkgo.go
generated
vendored
@ -1,10 +1,11 @@
|
|||||||
package outline
|
package outline
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/onsi/ginkgo/v2/types"
|
|
||||||
"go/ast"
|
"go/ast"
|
||||||
"go/token"
|
"go/token"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
"github.com/onsi/ginkgo/v2/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
9
test/tools/vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/import.go
generated
vendored
9
test/tools/vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/import.go
generated
vendored
@ -28,14 +28,7 @@ func packageNameForImport(f *ast.File, path string) *string {
|
|||||||
}
|
}
|
||||||
name := spec.Name.String()
|
name := spec.Name.String()
|
||||||
if name == "<nil>" {
|
if name == "<nil>" {
|
||||||
// If the package name is not explicitly specified,
|
name = "ginkgo"
|
||||||
// make an educated guess. This is not guaranteed to be correct.
|
|
||||||
lastSlash := strings.LastIndex(path, "/")
|
|
||||||
if lastSlash == -1 {
|
|
||||||
name = path
|
|
||||||
} else {
|
|
||||||
name = path[lastSlash+1:]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if name == "." {
|
if name == "." {
|
||||||
name = ""
|
name = ""
|
||||||
|
47
test/tools/vendor/github.com/onsi/ginkgo/v2/reporters/default_reporter.go
generated
vendored
47
test/tools/vendor/github.com/onsi/ginkgo/v2/reporters/default_reporter.go
generated
vendored
@ -182,6 +182,22 @@ func (r *DefaultReporter) WillRun(report types.SpecReport) {
|
|||||||
r.emitBlock(r.f(r.codeLocationBlock(report, "{{/}}", v.Is(types.VerbosityLevelVeryVerbose), false)))
|
r.emitBlock(r.f(r.codeLocationBlock(report, "{{/}}", v.Is(types.VerbosityLevelVeryVerbose), false)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *DefaultReporter) wrapTextBlock(sectionName string, fn func()) {
|
||||||
|
r.emitBlock("\n")
|
||||||
|
if r.conf.GithubOutput {
|
||||||
|
r.emitBlock(r.fi(1, "::group::%s", sectionName))
|
||||||
|
} else {
|
||||||
|
r.emitBlock(r.fi(1, "{{gray}}%s >>{{/}}", sectionName))
|
||||||
|
}
|
||||||
|
fn()
|
||||||
|
if r.conf.GithubOutput {
|
||||||
|
r.emitBlock(r.fi(1, "::endgroup::"))
|
||||||
|
} else {
|
||||||
|
r.emitBlock(r.fi(1, "{{gray}}<< %s{{/}}", sectionName))
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func (r *DefaultReporter) DidRun(report types.SpecReport) {
|
func (r *DefaultReporter) DidRun(report types.SpecReport) {
|
||||||
v := r.conf.Verbosity()
|
v := r.conf.Verbosity()
|
||||||
inParallel := report.RunningInParallel
|
inParallel := report.RunningInParallel
|
||||||
@ -283,26 +299,23 @@ func (r *DefaultReporter) DidRun(report types.SpecReport) {
|
|||||||
|
|
||||||
//Emit Stdout/Stderr Output
|
//Emit Stdout/Stderr Output
|
||||||
if showSeparateStdSection {
|
if showSeparateStdSection {
|
||||||
r.emitBlock("\n")
|
r.wrapTextBlock("Captured StdOut/StdErr Output", func() {
|
||||||
r.emitBlock(r.fi(1, "{{gray}}Captured StdOut/StdErr Output >>{{/}}"))
|
r.emitBlock(r.fi(1, "%s", report.CapturedStdOutErr))
|
||||||
r.emitBlock(r.fi(1, "%s", report.CapturedStdOutErr))
|
})
|
||||||
r.emitBlock(r.fi(1, "{{gray}}<< Captured StdOut/StdErr Output{{/}}"))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if showSeparateVisibilityAlwaysReportsSection {
|
if showSeparateVisibilityAlwaysReportsSection {
|
||||||
r.emitBlock("\n")
|
r.wrapTextBlock("Report Entries", func() {
|
||||||
r.emitBlock(r.fi(1, "{{gray}}Report Entries >>{{/}}"))
|
for _, entry := range report.ReportEntries.WithVisibility(types.ReportEntryVisibilityAlways) {
|
||||||
for _, entry := range report.ReportEntries.WithVisibility(types.ReportEntryVisibilityAlways) {
|
r.emitReportEntry(1, entry)
|
||||||
r.emitReportEntry(1, entry)
|
}
|
||||||
}
|
})
|
||||||
r.emitBlock(r.fi(1, "{{gray}}<< Report Entries{{/}}"))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if showTimeline {
|
if showTimeline {
|
||||||
r.emitBlock("\n")
|
r.wrapTextBlock("Timeline", func() {
|
||||||
r.emitBlock(r.fi(1, "{{gray}}Timeline >>{{/}}"))
|
r.emitTimeline(1, report, timeline)
|
||||||
r.emitTimeline(1, report, timeline)
|
})
|
||||||
r.emitBlock(r.fi(1, "{{gray}}<< Timeline{{/}}"))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Emit Failure Message
|
// Emit Failure Message
|
||||||
@ -405,7 +418,11 @@ func (r *DefaultReporter) emitShortFailure(indent uint, state types.SpecState, f
|
|||||||
func (r *DefaultReporter) emitFailure(indent uint, state types.SpecState, failure types.Failure, includeAdditionalFailure bool) {
|
func (r *DefaultReporter) emitFailure(indent uint, state types.SpecState, failure types.Failure, includeAdditionalFailure bool) {
|
||||||
highlightColor := r.highlightColorForState(state)
|
highlightColor := r.highlightColorForState(state)
|
||||||
r.emitBlock(r.fi(indent, highlightColor+"[%s] %s{{/}}", r.humanReadableState(state), failure.Message))
|
r.emitBlock(r.fi(indent, highlightColor+"[%s] %s{{/}}", r.humanReadableState(state), failure.Message))
|
||||||
r.emitBlock(r.fi(indent, highlightColor+"In {{bold}}[%s]{{/}}"+highlightColor+" at: {{bold}}%s{{/}} {{gray}}@ %s{{/}}\n", failure.FailureNodeType, failure.Location, failure.TimelineLocation.Time.Format(types.GINKGO_TIME_FORMAT)))
|
if r.conf.GithubOutput {
|
||||||
|
r.emitBlock(r.fi(indent, "::error file=%s,line=%d::%s %s", failure.Location.FileName, failure.Location.LineNumber, failure.FailureNodeType, failure.TimelineLocation.Time.Format(types.GINKGO_TIME_FORMAT)))
|
||||||
|
} else {
|
||||||
|
r.emitBlock(r.fi(indent, highlightColor+"In {{bold}}[%s]{{/}}"+highlightColor+" at: {{bold}}%s{{/}} {{gray}}@ %s{{/}}\n", failure.FailureNodeType, failure.Location, failure.TimelineLocation.Time.Format(types.GINKGO_TIME_FORMAT)))
|
||||||
|
}
|
||||||
if failure.ForwardedPanic != "" {
|
if failure.ForwardedPanic != "" {
|
||||||
r.emitBlock("\n")
|
r.emitBlock("\n")
|
||||||
r.emitBlock(r.fi(indent, highlightColor+"%s{{/}}", failure.ForwardedPanic))
|
r.emitBlock(r.fi(indent, highlightColor+"%s{{/}}", failure.ForwardedPanic))
|
||||||
|
12
test/tools/vendor/github.com/onsi/ginkgo/v2/reporters/junit_report.go
generated
vendored
12
test/tools/vendor/github.com/onsi/ginkgo/v2/reporters/junit_report.go
generated
vendored
@ -15,6 +15,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/onsi/ginkgo/v2/config"
|
"github.com/onsi/ginkgo/v2/config"
|
||||||
@ -104,6 +105,8 @@ type JUnitProperty struct {
|
|||||||
Value string `xml:"value,attr"`
|
Value string `xml:"value,attr"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var ownerRE = regexp.MustCompile(`(?i)^owner:(.*)$`)
|
||||||
|
|
||||||
type JUnitTestCase struct {
|
type JUnitTestCase struct {
|
||||||
// Name maps onto the full text of the spec - equivalent to "[SpecReport.LeafNodeType] SpecReport.FullText()"
|
// Name maps onto the full text of the spec - equivalent to "[SpecReport.LeafNodeType] SpecReport.FullText()"
|
||||||
Name string `xml:"name,attr"`
|
Name string `xml:"name,attr"`
|
||||||
@ -113,6 +116,8 @@ type JUnitTestCase struct {
|
|||||||
Status string `xml:"status,attr"`
|
Status string `xml:"status,attr"`
|
||||||
// Time is the time in seconds to execute the spec - maps onto SpecReport.RunTime
|
// Time is the time in seconds to execute the spec - maps onto SpecReport.RunTime
|
||||||
Time float64 `xml:"time,attr"`
|
Time float64 `xml:"time,attr"`
|
||||||
|
// Owner is the owner the spec - is set if a label matching Label("owner:X") is provided. The last matching label is used as the owner, thereby allowing specs to override owners specified in container nodes.
|
||||||
|
Owner string `xml:"owner,attr,omitempty"`
|
||||||
//Skipped is populated with a message if the test was skipped or pending
|
//Skipped is populated with a message if the test was skipped or pending
|
||||||
Skipped *JUnitSkipped `xml:"skipped,omitempty"`
|
Skipped *JUnitSkipped `xml:"skipped,omitempty"`
|
||||||
//Error is populated if the test panicked or was interrupted
|
//Error is populated if the test panicked or was interrupted
|
||||||
@ -195,6 +200,12 @@ func GenerateJUnitReportWithConfig(report types.Report, dst string, config Junit
|
|||||||
if len(labels) > 0 && !config.OmitSpecLabels {
|
if len(labels) > 0 && !config.OmitSpecLabels {
|
||||||
name = name + " [" + strings.Join(labels, ", ") + "]"
|
name = name + " [" + strings.Join(labels, ", ") + "]"
|
||||||
}
|
}
|
||||||
|
owner := ""
|
||||||
|
for _, label := range labels {
|
||||||
|
if matches := ownerRE.FindStringSubmatch(label); len(matches) == 2 {
|
||||||
|
owner = matches[1]
|
||||||
|
}
|
||||||
|
}
|
||||||
name = strings.TrimSpace(name)
|
name = strings.TrimSpace(name)
|
||||||
|
|
||||||
test := JUnitTestCase{
|
test := JUnitTestCase{
|
||||||
@ -202,6 +213,7 @@ func GenerateJUnitReportWithConfig(report types.Report, dst string, config Junit
|
|||||||
Classname: report.SuiteDescription,
|
Classname: report.SuiteDescription,
|
||||||
Status: spec.State.String(),
|
Status: spec.State.String(),
|
||||||
Time: spec.RunTime.Seconds(),
|
Time: spec.RunTime.Seconds(),
|
||||||
|
Owner: owner,
|
||||||
}
|
}
|
||||||
if !spec.State.Is(config.OmitTimelinesForSpecState) {
|
if !spec.State.Is(config.OmitTimelinesForSpecState) {
|
||||||
test.SystemErr = systemErrForUnstructuredReporters(spec)
|
test.SystemErr = systemErrForUnstructuredReporters(spec)
|
||||||
|
5
test/tools/vendor/github.com/onsi/ginkgo/v2/types/config.go
generated
vendored
5
test/tools/vendor/github.com/onsi/ginkgo/v2/types/config.go
generated
vendored
@ -89,6 +89,7 @@ type ReporterConfig struct {
|
|||||||
VeryVerbose bool
|
VeryVerbose bool
|
||||||
FullTrace bool
|
FullTrace bool
|
||||||
ShowNodeEvents bool
|
ShowNodeEvents bool
|
||||||
|
GithubOutput bool
|
||||||
|
|
||||||
JSONReport string
|
JSONReport string
|
||||||
JUnitReport string
|
JUnitReport string
|
||||||
@ -264,7 +265,7 @@ var FlagSections = GinkgoFlagSections{
|
|||||||
// SuiteConfigFlags provides flags for the Ginkgo test process, and CLI
|
// SuiteConfigFlags provides flags for the Ginkgo test process, and CLI
|
||||||
var SuiteConfigFlags = GinkgoFlags{
|
var SuiteConfigFlags = GinkgoFlags{
|
||||||
{KeyPath: "S.RandomSeed", Name: "seed", SectionKey: "order", UsageDefaultValue: "randomly generated by Ginkgo",
|
{KeyPath: "S.RandomSeed", Name: "seed", SectionKey: "order", UsageDefaultValue: "randomly generated by Ginkgo",
|
||||||
Usage: "The seed used to randomize the spec suite."},
|
Usage: "The seed used to randomize the spec suite.", AlwaysExport: true},
|
||||||
{KeyPath: "S.RandomizeAllSpecs", Name: "randomize-all", SectionKey: "order", DeprecatedName: "randomizeAllSpecs", DeprecatedDocLink: "changed-command-line-flags",
|
{KeyPath: "S.RandomizeAllSpecs", Name: "randomize-all", SectionKey: "order", DeprecatedName: "randomizeAllSpecs", DeprecatedDocLink: "changed-command-line-flags",
|
||||||
Usage: "If set, ginkgo will randomize all specs together. By default, ginkgo only randomizes the top level Describe, Context and When containers."},
|
Usage: "If set, ginkgo will randomize all specs together. By default, ginkgo only randomizes the top level Describe, Context and When containers."},
|
||||||
|
|
||||||
@ -331,6 +332,8 @@ var ReporterConfigFlags = GinkgoFlags{
|
|||||||
Usage: "If set, default reporter prints out the full stack trace when a failure occurs"},
|
Usage: "If set, default reporter prints out the full stack trace when a failure occurs"},
|
||||||
{KeyPath: "R.ShowNodeEvents", Name: "show-node-events", SectionKey: "output",
|
{KeyPath: "R.ShowNodeEvents", Name: "show-node-events", SectionKey: "output",
|
||||||
Usage: "If set, default reporter prints node > Enter and < Exit events when specs fail"},
|
Usage: "If set, default reporter prints node > Enter and < Exit events when specs fail"},
|
||||||
|
{KeyPath: "R.GithubOutput", Name: "github-output", SectionKey: "output",
|
||||||
|
Usage: "If set, default reporter prints easier to manage output in Github Actions."},
|
||||||
|
|
||||||
{KeyPath: "R.JSONReport", Name: "json-report", UsageArgument: "filename.json", SectionKey: "output",
|
{KeyPath: "R.JSONReport", Name: "json-report", UsageArgument: "filename.json", SectionKey: "output",
|
||||||
Usage: "If set, Ginkgo will generate a JSON-formatted test report at the specified location."},
|
Usage: "If set, Ginkgo will generate a JSON-formatted test report at the specified location."},
|
||||||
|
15
test/tools/vendor/github.com/onsi/ginkgo/v2/types/flags.go
generated
vendored
15
test/tools/vendor/github.com/onsi/ginkgo/v2/types/flags.go
generated
vendored
@ -24,7 +24,8 @@ type GinkgoFlag struct {
|
|||||||
DeprecatedDocLink string
|
DeprecatedDocLink string
|
||||||
DeprecatedVersion string
|
DeprecatedVersion string
|
||||||
|
|
||||||
ExportAs string
|
ExportAs string
|
||||||
|
AlwaysExport bool
|
||||||
}
|
}
|
||||||
|
|
||||||
type GinkgoFlags []GinkgoFlag
|
type GinkgoFlags []GinkgoFlag
|
||||||
@ -431,7 +432,7 @@ func (ssv stringSliceVar) Set(s string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
//given a set of GinkgoFlags and bindings, generate flag arguments suitable to be passed to an application with that set of flags configured.
|
// given a set of GinkgoFlags and bindings, generate flag arguments suitable to be passed to an application with that set of flags configured.
|
||||||
func GenerateFlagArgs(flags GinkgoFlags, bindings interface{}) ([]string, error) {
|
func GenerateFlagArgs(flags GinkgoFlags, bindings interface{}) ([]string, error) {
|
||||||
result := []string{}
|
result := []string{}
|
||||||
for _, flag := range flags {
|
for _, flag := range flags {
|
||||||
@ -451,19 +452,19 @@ func GenerateFlagArgs(flags GinkgoFlags, bindings interface{}) ([]string, error)
|
|||||||
iface := value.Interface()
|
iface := value.Interface()
|
||||||
switch value.Type() {
|
switch value.Type() {
|
||||||
case reflect.TypeOf(string("")):
|
case reflect.TypeOf(string("")):
|
||||||
if iface.(string) != "" {
|
if iface.(string) != "" || flag.AlwaysExport {
|
||||||
result = append(result, fmt.Sprintf("--%s=%s", name, iface))
|
result = append(result, fmt.Sprintf("--%s=%s", name, iface))
|
||||||
}
|
}
|
||||||
case reflect.TypeOf(int64(0)):
|
case reflect.TypeOf(int64(0)):
|
||||||
if iface.(int64) != 0 {
|
if iface.(int64) != 0 || flag.AlwaysExport {
|
||||||
result = append(result, fmt.Sprintf("--%s=%d", name, iface))
|
result = append(result, fmt.Sprintf("--%s=%d", name, iface))
|
||||||
}
|
}
|
||||||
case reflect.TypeOf(float64(0)):
|
case reflect.TypeOf(float64(0)):
|
||||||
if iface.(float64) != 0 {
|
if iface.(float64) != 0 || flag.AlwaysExport {
|
||||||
result = append(result, fmt.Sprintf("--%s=%f", name, iface))
|
result = append(result, fmt.Sprintf("--%s=%f", name, iface))
|
||||||
}
|
}
|
||||||
case reflect.TypeOf(int(0)):
|
case reflect.TypeOf(int(0)):
|
||||||
if iface.(int) != 0 {
|
if iface.(int) != 0 || flag.AlwaysExport {
|
||||||
result = append(result, fmt.Sprintf("--%s=%d", name, iface))
|
result = append(result, fmt.Sprintf("--%s=%d", name, iface))
|
||||||
}
|
}
|
||||||
case reflect.TypeOf(bool(true)):
|
case reflect.TypeOf(bool(true)):
|
||||||
@ -471,7 +472,7 @@ func GenerateFlagArgs(flags GinkgoFlags, bindings interface{}) ([]string, error)
|
|||||||
result = append(result, fmt.Sprintf("--%s", name))
|
result = append(result, fmt.Sprintf("--%s", name))
|
||||||
}
|
}
|
||||||
case reflect.TypeOf(time.Duration(0)):
|
case reflect.TypeOf(time.Duration(0)):
|
||||||
if iface.(time.Duration) != time.Duration(0) {
|
if iface.(time.Duration) != time.Duration(0) || flag.AlwaysExport {
|
||||||
result = append(result, fmt.Sprintf("--%s=%s", name, iface))
|
result = append(result, fmt.Sprintf("--%s=%s", name, iface))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
2
test/tools/vendor/github.com/onsi/ginkgo/v2/types/version.go
generated
vendored
2
test/tools/vendor/github.com/onsi/ginkgo/v2/types/version.go
generated
vendored
@ -1,3 +1,3 @@
|
|||||||
package types
|
package types
|
||||||
|
|
||||||
const VERSION = "2.14.0"
|
const VERSION = "2.17.1"
|
||||||
|
266
test/tools/vendor/golang.org/x/tools/cover/profile.go
generated
vendored
Normal file
266
test/tools/vendor/golang.org/x/tools/cover/profile.go
generated
vendored
Normal file
@ -0,0 +1,266 @@
|
|||||||
|
// Copyright 2013 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// Package cover provides support for parsing coverage profiles
|
||||||
|
// generated by "go test -coverprofile=cover.out".
|
||||||
|
package cover // import "golang.org/x/tools/cover"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"math"
|
||||||
|
"os"
|
||||||
|
"sort"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Profile represents the profiling data for a specific file.
|
||||||
|
type Profile struct {
|
||||||
|
FileName string
|
||||||
|
Mode string
|
||||||
|
Blocks []ProfileBlock
|
||||||
|
}
|
||||||
|
|
||||||
|
// ProfileBlock represents a single block of profiling data.
|
||||||
|
type ProfileBlock struct {
|
||||||
|
StartLine, StartCol int
|
||||||
|
EndLine, EndCol int
|
||||||
|
NumStmt, Count int
|
||||||
|
}
|
||||||
|
|
||||||
|
type byFileName []*Profile
|
||||||
|
|
||||||
|
func (p byFileName) Len() int { return len(p) }
|
||||||
|
func (p byFileName) Less(i, j int) bool { return p[i].FileName < p[j].FileName }
|
||||||
|
func (p byFileName) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
|
||||||
|
|
||||||
|
// ParseProfiles parses profile data in the specified file and returns a
|
||||||
|
// Profile for each source file described therein.
|
||||||
|
func ParseProfiles(fileName string) ([]*Profile, error) {
|
||||||
|
pf, err := os.Open(fileName)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer pf.Close()
|
||||||
|
return ParseProfilesFromReader(pf)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ParseProfilesFromReader parses profile data from the Reader and
|
||||||
|
// returns a Profile for each source file described therein.
|
||||||
|
func ParseProfilesFromReader(rd io.Reader) ([]*Profile, error) {
|
||||||
|
// First line is "mode: foo", where foo is "set", "count", or "atomic".
|
||||||
|
// Rest of file is in the format
|
||||||
|
// encoding/base64/base64.go:34.44,37.40 3 1
|
||||||
|
// where the fields are: name.go:line.column,line.column numberOfStatements count
|
||||||
|
files := make(map[string]*Profile)
|
||||||
|
s := bufio.NewScanner(rd)
|
||||||
|
mode := ""
|
||||||
|
for s.Scan() {
|
||||||
|
line := s.Text()
|
||||||
|
if mode == "" {
|
||||||
|
const p = "mode: "
|
||||||
|
if !strings.HasPrefix(line, p) || line == p {
|
||||||
|
return nil, fmt.Errorf("bad mode line: %v", line)
|
||||||
|
}
|
||||||
|
mode = line[len(p):]
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
fn, b, err := parseLine(line)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("line %q doesn't match expected format: %v", line, err)
|
||||||
|
}
|
||||||
|
p := files[fn]
|
||||||
|
if p == nil {
|
||||||
|
p = &Profile{
|
||||||
|
FileName: fn,
|
||||||
|
Mode: mode,
|
||||||
|
}
|
||||||
|
files[fn] = p
|
||||||
|
}
|
||||||
|
p.Blocks = append(p.Blocks, b)
|
||||||
|
}
|
||||||
|
if err := s.Err(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
for _, p := range files {
|
||||||
|
sort.Sort(blocksByStart(p.Blocks))
|
||||||
|
// Merge samples from the same location.
|
||||||
|
j := 1
|
||||||
|
for i := 1; i < len(p.Blocks); i++ {
|
||||||
|
b := p.Blocks[i]
|
||||||
|
last := p.Blocks[j-1]
|
||||||
|
if b.StartLine == last.StartLine &&
|
||||||
|
b.StartCol == last.StartCol &&
|
||||||
|
b.EndLine == last.EndLine &&
|
||||||
|
b.EndCol == last.EndCol {
|
||||||
|
if b.NumStmt != last.NumStmt {
|
||||||
|
return nil, fmt.Errorf("inconsistent NumStmt: changed from %d to %d", last.NumStmt, b.NumStmt)
|
||||||
|
}
|
||||||
|
if mode == "set" {
|
||||||
|
p.Blocks[j-1].Count |= b.Count
|
||||||
|
} else {
|
||||||
|
p.Blocks[j-1].Count += b.Count
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
p.Blocks[j] = b
|
||||||
|
j++
|
||||||
|
}
|
||||||
|
p.Blocks = p.Blocks[:j]
|
||||||
|
}
|
||||||
|
// Generate a sorted slice.
|
||||||
|
profiles := make([]*Profile, 0, len(files))
|
||||||
|
for _, profile := range files {
|
||||||
|
profiles = append(profiles, profile)
|
||||||
|
}
|
||||||
|
sort.Sort(byFileName(profiles))
|
||||||
|
return profiles, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// parseLine parses a line from a coverage file.
|
||||||
|
// It is equivalent to the regex
|
||||||
|
// ^(.+):([0-9]+)\.([0-9]+),([0-9]+)\.([0-9]+) ([0-9]+) ([0-9]+)$
|
||||||
|
//
|
||||||
|
// However, it is much faster: https://golang.org/cl/179377
|
||||||
|
func parseLine(l string) (fileName string, block ProfileBlock, err error) {
|
||||||
|
end := len(l)
|
||||||
|
|
||||||
|
b := ProfileBlock{}
|
||||||
|
b.Count, end, err = seekBack(l, ' ', end, "Count")
|
||||||
|
if err != nil {
|
||||||
|
return "", b, err
|
||||||
|
}
|
||||||
|
b.NumStmt, end, err = seekBack(l, ' ', end, "NumStmt")
|
||||||
|
if err != nil {
|
||||||
|
return "", b, err
|
||||||
|
}
|
||||||
|
b.EndCol, end, err = seekBack(l, '.', end, "EndCol")
|
||||||
|
if err != nil {
|
||||||
|
return "", b, err
|
||||||
|
}
|
||||||
|
b.EndLine, end, err = seekBack(l, ',', end, "EndLine")
|
||||||
|
if err != nil {
|
||||||
|
return "", b, err
|
||||||
|
}
|
||||||
|
b.StartCol, end, err = seekBack(l, '.', end, "StartCol")
|
||||||
|
if err != nil {
|
||||||
|
return "", b, err
|
||||||
|
}
|
||||||
|
b.StartLine, end, err = seekBack(l, ':', end, "StartLine")
|
||||||
|
if err != nil {
|
||||||
|
return "", b, err
|
||||||
|
}
|
||||||
|
fn := l[0:end]
|
||||||
|
if fn == "" {
|
||||||
|
return "", b, errors.New("a FileName cannot be blank")
|
||||||
|
}
|
||||||
|
return fn, b, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// seekBack searches backwards from end to find sep in l, then returns the
|
||||||
|
// value between sep and end as an integer.
|
||||||
|
// If seekBack fails, the returned error will reference what.
|
||||||
|
func seekBack(l string, sep byte, end int, what string) (value int, nextSep int, err error) {
|
||||||
|
// Since we're seeking backwards and we know only ASCII is legal for these values,
|
||||||
|
// we can ignore the possibility of non-ASCII characters.
|
||||||
|
for start := end - 1; start >= 0; start-- {
|
||||||
|
if l[start] == sep {
|
||||||
|
i, err := strconv.Atoi(l[start+1 : end])
|
||||||
|
if err != nil {
|
||||||
|
return 0, 0, fmt.Errorf("couldn't parse %q: %v", what, err)
|
||||||
|
}
|
||||||
|
if i < 0 {
|
||||||
|
return 0, 0, fmt.Errorf("negative values are not allowed for %s, found %d", what, i)
|
||||||
|
}
|
||||||
|
return i, start, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0, 0, fmt.Errorf("couldn't find a %s before %s", string(sep), what)
|
||||||
|
}
|
||||||
|
|
||||||
|
type blocksByStart []ProfileBlock
|
||||||
|
|
||||||
|
func (b blocksByStart) Len() int { return len(b) }
|
||||||
|
func (b blocksByStart) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
|
||||||
|
func (b blocksByStart) Less(i, j int) bool {
|
||||||
|
bi, bj := b[i], b[j]
|
||||||
|
return bi.StartLine < bj.StartLine || bi.StartLine == bj.StartLine && bi.StartCol < bj.StartCol
|
||||||
|
}
|
||||||
|
|
||||||
|
// Boundary represents the position in a source file of the beginning or end of a
|
||||||
|
// block as reported by the coverage profile. In HTML mode, it will correspond to
|
||||||
|
// the opening or closing of a <span> tag and will be used to colorize the source
|
||||||
|
type Boundary struct {
|
||||||
|
Offset int // Location as a byte offset in the source file.
|
||||||
|
Start bool // Is this the start of a block?
|
||||||
|
Count int // Event count from the cover profile.
|
||||||
|
Norm float64 // Count normalized to [0..1].
|
||||||
|
Index int // Order in input file.
|
||||||
|
}
|
||||||
|
|
||||||
|
// Boundaries returns a Profile as a set of Boundary objects within the provided src.
|
||||||
|
func (p *Profile) Boundaries(src []byte) (boundaries []Boundary) {
|
||||||
|
// Find maximum count.
|
||||||
|
max := 0
|
||||||
|
for _, b := range p.Blocks {
|
||||||
|
if b.Count > max {
|
||||||
|
max = b.Count
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Divisor for normalization.
|
||||||
|
divisor := math.Log(float64(max))
|
||||||
|
|
||||||
|
// boundary returns a Boundary, populating the Norm field with a normalized Count.
|
||||||
|
index := 0
|
||||||
|
boundary := func(offset int, start bool, count int) Boundary {
|
||||||
|
b := Boundary{Offset: offset, Start: start, Count: count, Index: index}
|
||||||
|
index++
|
||||||
|
if !start || count == 0 {
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
if max <= 1 {
|
||||||
|
b.Norm = 0.8 // Profile is in"set" mode; we want a heat map. Use cov8 in the CSS.
|
||||||
|
} else if count > 0 {
|
||||||
|
b.Norm = math.Log(float64(count)) / divisor
|
||||||
|
}
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
line, col := 1, 2 // TODO: Why is this 2?
|
||||||
|
for si, bi := 0, 0; si < len(src) && bi < len(p.Blocks); {
|
||||||
|
b := p.Blocks[bi]
|
||||||
|
if b.StartLine == line && b.StartCol == col {
|
||||||
|
boundaries = append(boundaries, boundary(si, true, b.Count))
|
||||||
|
}
|
||||||
|
if b.EndLine == line && b.EndCol == col || line > b.EndLine {
|
||||||
|
boundaries = append(boundaries, boundary(si, false, 0))
|
||||||
|
bi++
|
||||||
|
continue // Don't advance through src; maybe the next block starts here.
|
||||||
|
}
|
||||||
|
if src[si] == '\n' {
|
||||||
|
line++
|
||||||
|
col = 0
|
||||||
|
}
|
||||||
|
col++
|
||||||
|
si++
|
||||||
|
}
|
||||||
|
sort.Sort(boundariesByPos(boundaries))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
type boundariesByPos []Boundary
|
||||||
|
|
||||||
|
func (b boundariesByPos) Len() int { return len(b) }
|
||||||
|
func (b boundariesByPos) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
|
||||||
|
func (b boundariesByPos) Less(i, j int) bool {
|
||||||
|
if b[i].Offset == b[j].Offset {
|
||||||
|
// Boundaries at the same offset should be ordered according to
|
||||||
|
// their original position.
|
||||||
|
return b[i].Index < b[j].Index
|
||||||
|
}
|
||||||
|
return b[i].Offset < b[j].Offset
|
||||||
|
}
|
5
test/tools/vendor/modules.txt
vendored
5
test/tools/vendor/modules.txt
vendored
@ -23,8 +23,8 @@ github.com/mattn/go-colorable
|
|||||||
# github.com/mattn/go-isatty v0.0.17
|
# github.com/mattn/go-isatty v0.0.17
|
||||||
## explicit; go 1.15
|
## explicit; go 1.15
|
||||||
github.com/mattn/go-isatty
|
github.com/mattn/go-isatty
|
||||||
# github.com/onsi/ginkgo/v2 v2.14.0
|
# github.com/onsi/ginkgo/v2 v2.17.1
|
||||||
## explicit; go 1.18
|
## explicit; go 1.20
|
||||||
github.com/onsi/ginkgo/v2/config
|
github.com/onsi/ginkgo/v2/config
|
||||||
github.com/onsi/ginkgo/v2/formatter
|
github.com/onsi/ginkgo/v2/formatter
|
||||||
github.com/onsi/ginkgo/v2/ginkgo
|
github.com/onsi/ginkgo/v2/ginkgo
|
||||||
@ -68,6 +68,7 @@ golang.org/x/sys/windows
|
|||||||
# golang.org/x/tools v0.20.0
|
# golang.org/x/tools v0.20.0
|
||||||
## explicit; go 1.19
|
## explicit; go 1.19
|
||||||
golang.org/x/tools/cmd/goimports
|
golang.org/x/tools/cmd/goimports
|
||||||
|
golang.org/x/tools/cover
|
||||||
golang.org/x/tools/go/ast/astutil
|
golang.org/x/tools/go/ast/astutil
|
||||||
golang.org/x/tools/go/ast/inspector
|
golang.org/x/tools/go/ast/inspector
|
||||||
golang.org/x/tools/internal/event
|
golang.org/x/tools/internal/event
|
||||||
|
Reference in New Issue
Block a user