# This test checks basic "go build -cover" functionality.

[short] skip

# Build for coverage.
go build -gcflags=-m -o example.exe -cover example/main &
[race] go build -o examplewithrace.exe -race -cover example/main &
wait

# First execute without GOCOVERDIR set...
env GOCOVERDIR=
exec ./example.exe normal
stderr '^warning: GOCOVERDIR not set, no coverage data emitted'

# ... then with GOCOVERDIR set.
env GOCOVERDIR=data/normal
exec ./example.exe normal
! stderr '^warning: GOCOVERDIR not set, no coverage data emitted'
go tool covdata percent -i=data/normal
stdout  'coverage:.*[1-9][0-9.]+%'

# Program makes a direct call to os.Exit(0).
env GOCOVERDIR=data/goodexit
exec ./example.exe goodexit
! stderr '^warning: GOCOVERDIR not set, no coverage data emitted'
go tool covdata percent -i=data/goodexit
stdout  'coverage:.*[1-9][0-9.]+%'

# Program makes a direct call to os.Exit(1).
env GOCOVERDIR=data/badexit
! exec ./example.exe badexit
! stderr '^warning: GOCOVERDIR not set, no coverage data emitted'
go tool covdata percent -i=data/badexit
stdout  'coverage:.*[1-9][0-9.]+%'

# Program invokes panic.
env GOCOVERDIR=data/panic
! exec ./example.exe panic
! stderr '^warning: GOCOVERDIR not set, no coverage data emitted'
go tool covdata percent -i=data/panic
stdout  'coverage:.*[0-9.]+%'

# Skip remainder if no race detector support.
[!race] skip

env GOCOVERDIR=data2/normal
exec ./examplewithrace.exe normal
! stderr '^warning: GOCOVERDIR not set, no coverage data emitted'
go tool covdata percent -i=data2/normal
stdout  'coverage:.*[1-9][0-9.]+%'

# Program makes a direct call to os.Exit(0).
env GOCOVERDIR=data2/goodexit
exec ./examplewithrace.exe goodexit
! stderr '^warning: GOCOVERDIR not set, no coverage data emitted'
go tool covdata percent -i=data2/goodexit
stdout  'coverage:.*[1-9][0-9.]+%'

# Program makes a direct call to os.Exit(1).
env GOCOVERDIR=data2/badexit
! exec ./examplewithrace.exe badexit
! stderr '^warning: GOCOVERDIR not set, no coverage data emitted'
go tool covdata percent -i=data2/badexit
stdout  'coverage:.*[1-9][0-9.]+%'

# Program invokes panic.
env GOCOVERDIR=data2/panic
! exec ./examplewithrace.exe panic
! stderr '^warning: GOCOVERDIR not set, no coverage data emitted'
go tool covdata percent -i=data2/panic
stdout  'coverage:.*[0-9.]+%'

# end of test cmds, start of harness and related files.

-- go.mod --
module example

go 1.18

-- main/example.go --
package main

import "example/sub"

func main() {
	sub.S()
}

-- sub/sub.go --

package sub

import "os"

func S() {
	switch os.Args[1] {
	case "normal":
		println("hi")
	case "goodexit":
		os.Exit(0)
	case "badexit":
		os.Exit(1)
	case "panic":
		panic("something bad happened")
	}
}

-- data/README.txt --

Just a location where we can write coverage profiles.

-- data/normal/f.txt --

X

-- data/goodexit/f.txt --

X

-- data/badexit/f.txt --

X

-- data/panic/f.txt --

X

-- data2/README.txt --

Just a location where we can write coverage profiles.

-- data2/normal/f.txt --

X

-- data2/goodexit/f.txt --

X

-- data2/badexit/f.txt --

X

-- data2/panic/f.txt --

X
