blob: 543626f7838a5906a55ed1f2d027dc3f27317956 [file] [log] [blame]
# Testcase for #63356. In this bug we're doing a "go test -coverprofile"
# run for a collection of packages, mostly independent (hence tests can
# be done in parallel) and in the original bug, temp coverage profile
# files were not being properly qualified and were colliding, resulting
# in a corrupted final profile. Actual content of the packages doesn't
# especially matter as long as we have a mix of packages with tests and
# multiple packages without tests.
[short] skip
# Kick off test.
go test -p=10 -vet=off -count=1 -coverprofile=cov.p ./...
# Make sure resulting profile is digestible.
go tool cover -func=cov.p
# No extraneous extra files please.
! exists _cover_.out
-- a/a.go --
package a
func init() {
println("package 'a' init: launch the missiles!")
}
func AFunc() int {
return 42
}
-- a/a_test.go --
package a
import "testing"
func TestA(t *testing.T) {
if AFunc() != 42 {
t.Fatalf("bad!")
}
}
-- aa/aa.go --
package aa
import "M/it"
func AA(y int) int {
c := it.Conc{}
x := it.Callee(&c)
println(x, y)
return 0
}
-- aa/aa_test.go --
package aa
import "testing"
func TestMumble(t *testing.T) {
AA(3)
}
-- b/b.go --
package b
func init() {
println("package 'b' init: release the kraken")
}
func BFunc() int {
return -42
}
-- b/b_test.go --
package b
import "testing"
func TestB(t *testing.T) {
if BFunc() != -42 {
t.Fatalf("bad!")
}
}
-- deadstuff/deadstuff.go --
package deadstuff
func downStreamOfPanic(x int) {
panic("bad")
if x < 10 {
println("foo")
}
}
-- deadstuff/deadstuff_test.go --
package deadstuff
import "testing"
func TestMumble(t *testing.T) {
defer func() {
if x := recover(); x != nil {
println("recovered")
}
}()
downStreamOfPanic(10)
}
-- go.mod --
module M
go 1.21
-- it/it.go --
package it
type Ctr interface {
Count() int
}
type Conc struct {
X int
}
func (c *Conc) Count() int {
return c.X
}
func DoCall(c *Conc) {
c2 := Callee(c)
println(c2.Count())
}
func Callee(ii Ctr) Ctr {
q := ii.Count()
return &Conc{X: q}
}
-- main/main.go --
package main
import (
"M/a"
"M/b"
)
func MFunc() string {
return "42"
}
func M2Func() int {
return a.AFunc() + b.BFunc()
}
func init() {
println("package 'main' init")
}
func main() {
println(a.AFunc() + b.BFunc())
}
-- main/main_test.go --
package main
import "testing"
func TestMain(t *testing.T) {
if MFunc() != "42" {
t.Fatalf("bad!")
}
if M2Func() != 0 {
t.Fatalf("also bad!")
}
}
-- n/n.go --
package n
type N int
-- onlytest/mumble_test.go --
package onlytest
import "testing"
func TestFoo(t *testing.T) {
t.Logf("Whee\n")
}
-- x/x.go --
package x
func XFunc() int {
return 2 * 2
}
-- xinternal/i.go --
package i
func I() int { return 32 }
-- xinternal/q/q.go --
package q
func Q() int {
return 42
}