• Daniel Martí's avatar
    cmd/go: fail if a test binary exits with no output · 1fba10c9
    Daniel Martí authored
    For example, if a test calls os.Exit(0), that could trick a 'go test'
    run into not running some of the other tests, and thinking that they all
    succeeded. This can easily go unnoticed and cause developers headaches.
    
    Add a simple sanity check as part of 'go test': if the test binary
    succeeds and doesn't print anything, we should error, as something
    clearly went very wrong.
    
    This is done by inspecting each of the stdout writes from the spawned
    process, since we don't want to read the entirety of the output into a
    buffer. We need to introduce a "buffered" bool var, as there's now an
    io.Writer layer between cmd.Stdout and &buf.
    
    A few TestMain funcs in the standard library needed fixing, as they
    returned without printing anything as a means to skip testing the entire
    package. For that purpose add testenv.MainMust, which prints a warning
    and prints SKIP, similar to when -run matches no tests.
    
    Finally, add tests for both os.Exit(0) and os.Exit(1), both as part of
    TestMain and as part of a single test, and test that the various stdout
    modes still do the right thing.
    
    Fixes #29062.
    
    Change-Id: Ic6f8ef3387dfc64e4cd3e8f903d7ca5f5f38d397
    Reviewed-on: https://go-review.googlesource.com/c/go/+/184457
    Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: default avatarBryan C. Mills <bcmills@google.com>
    1fba10c9
goobj_test.go 6.27 KB