# Run parallel chatty tests.
# Check that multiple parallel outputs continue running.
! go test -parallel 3 chatty_parallel_test.go -v

stdout -count=1 '^=== CONT  TestChattyParallel/sub-0'
stdout -count=1 '^=== CONT  TestChattyParallel/sub-1'
stdout -count=1 '^=== CONT  TestChattyParallel/sub-2'

stdout -count=1 '^=== (CONT|NAME)  TestChattyParallel/sub-0\n    chatty_parallel_test.go:38: error from sub-0$'
stdout -count=1 '^=== (CONT|NAME)  TestChattyParallel/sub-1\n    chatty_parallel_test.go:38: error from sub-1$'
stdout -count=1 '^=== (CONT|NAME)  TestChattyParallel/sub-2\n    chatty_parallel_test.go:38: error from sub-2$'

# Run parallel chatty tests with -json.
# Check that each output is attributed to the right test.
! go test -json -parallel 3 chatty_parallel_test.go -v
stdout -count=1 '"Test":"TestChattyParallel/sub-0","Output":"    chatty_parallel_test.go:38: error from sub-0\\n"'
stdout -count=1 '"Test":"TestChattyParallel/sub-1","Output":"    chatty_parallel_test.go:38: error from sub-1\\n"'
stdout -count=1 '"Test":"TestChattyParallel/sub-2","Output":"    chatty_parallel_test.go:38: error from sub-2\\n"'

-- chatty_parallel_test.go --
package chatty_parallel_test

import (
	"testing"
	"fmt"
	"flag"
)

// This test ensures the order of CONT lines in parallel chatty tests.
func TestChattyParallel(t *testing.T) {
	t.Parallel()

	// The number of concurrent tests running. This is closely tied to the
	// -parallel test flag, so we grab it from the flag rather than setting it
	// to some constant.
	parallel := flag.Lookup("test.parallel").Value.(flag.Getter).Get().(int)

	// ready is a synchronization mechanism that causes subtests to execute
	// round robin.
	ready := make([]chan bool, parallel)
	for i := range ready {
		ready[i] = make(chan bool, 1)
	}
	ready[0] <- true

	for i := range ready {
		i := i
		t.Run(fmt.Sprintf("sub-%d", i), func(t *testing.T) {
			t.Parallel()

			// Some basic log output to precede the failures.
			<-ready[i]
			t.Logf("this is sub-%d", i)
			ready[(i+1)%len(ready)] <- true

			// The actual failure messages we care about.
			<-ready[i]
			t.Errorf("error from sub-%d", i)
			ready[(i+1)%len(ready)] <- true
		})
	}
}
