Drop unnecessary prefix in test output since we rely on go's testing to do the right thing

This commit is contained in:
Vivek Lakshmanan 2020-11-17 13:13:25 -08:00
parent 84d1505807
commit 302f869dc5
4 changed files with 26 additions and 91 deletions

View file

@ -619,16 +619,6 @@ func ProgramTestManualLifeCycle(t *testing.T, opts *ProgramTestOptions) *Program
return pt
}
// fprintf works like fmt.FPrintf, except it explicitly drops the return values. This keeps the linters happy, since
// they don't like to see errors dropped on the floor. It is possible that our call to fmt.Fprintf will fail, even
// for "standard" streams like `stdout` and `stderr`, if they have been set to non-blocking by an external process.
// In that case, we just drop the error on the floor and continue. We see this behavior in Travis when we try to write
// a lot of messages quickly (as we do when logging test failures)
func fprintf(w io.Writer, format string, a ...interface{}) {
_, err := fmt.Fprintf(w, format, a...)
contract.IgnoreError(err)
}
// ProgramTester contains state associated with running a single test pass.
type ProgramTester struct {
t *testing.T // the Go tester for this run.
@ -880,8 +870,8 @@ func (pt *ProgramTester) runVirtualEnvCommand(name string, args []string, wd str
}
if pt.opts.Verbose {
fprintf(pt.opts.Stdout, "acquired pip install lock\n")
defer fprintf(pt.opts.Stdout, "released pip install lock\n")
pt.t.Log("acquired pip install lock")
defer pt.t.Log("released pip install lock")
}
defer func() {
if err := pipMutex.Unlock(); err != nil {
@ -931,8 +921,8 @@ func (pt *ProgramTester) runPipenvCommand(name string, args []string, wd string)
}
if pt.opts.Verbose {
fprintf(pt.opts.Stdout, "acquired pip install lock\n")
defer fprintf(pt.opts.Stdout, "released pip install lock\n")
pt.t.Log("acquired pip install lock")
defer pt.t.Log("released pip install lock")
}
defer func() {
if err := pipMutex.Unlock(); err != nil {
@ -1062,7 +1052,7 @@ func (pt *ProgramTester) TestLifeCycleInitialize() error {
}
// Ensure all links are present, the stack is created, and all configs are applied.
fprintf(pt.opts.Stdout, "Initializing project (dir %s; stack %s)\n", dir, stackName)
pt.t.Logf("Initializing project (dir %s; stack %s)", dir, stackName)
// Login as needed.
stackInitName := string(pt.opts.GetStackNameWithOwner())
@ -1130,7 +1120,7 @@ func (pt *ProgramTester) TestLifeCycleInitialize() error {
func (pt *ProgramTester) TestLifeCycleDestroy() error {
if pt.projdir != "" {
// Destroy and remove the stack.
fprintf(pt.opts.Stdout, "Destroying stack\n")
pt.t.Log("Destroying stack")
destroy := []string{"destroy", "--non-interactive", "--yes", "--skip-preview"}
if pt.opts.GetDebugUpdates() {
destroy = append(destroy, "-d")
@ -1140,7 +1130,7 @@ func (pt *ProgramTester) TestLifeCycleDestroy() error {
}
if pt.t.Failed() {
fprintf(pt.opts.Stdout, "Test failed, retaining stack '%s'\n", pt.opts.GetStackNameWithOwner())
pt.t.Logf("Test failed, retaining stack '%s'", pt.opts.GetStackNameWithOwner())
return nil
}
@ -1155,7 +1145,7 @@ func (pt *ProgramTester) TestLifeCycleDestroy() error {
func (pt *ProgramTester) TestPreviewUpdateAndEdits() error {
dir := pt.projdir
// Now preview and update the real changes.
fprintf(pt.opts.Stdout, "Performing primary preview and update\n")
pt.t.Log("Performing primary preview and update")
initErr := pt.PreviewAndUpdate(dir, "initial", pt.opts.ExpectFailure, false, false)
// If the initial preview/update failed, just exit without trying the rest (but make sure to destroy).
@ -1165,7 +1155,7 @@ func (pt *ProgramTester) TestPreviewUpdateAndEdits() error {
// Perform an empty preview and update; nothing is expected to happen here.
if !pt.opts.SkipExportImport {
fprintf(pt.opts.Stdout, "Roundtripping checkpoint via stack export and stack import\n")
pt.t.Log("Roundtripping checkpoint via stack export and stack import")
if err := pt.exportImport(dir); err != nil {
return err
@ -1177,7 +1167,7 @@ func (pt *ProgramTester) TestPreviewUpdateAndEdits() error {
if !pt.opts.AllowEmptyUpdateChanges {
msg = "(no changes expected)"
}
fprintf(pt.opts.Stdout, "Performing empty preview and update%s\n", msg)
pt.t.Logf("Performing empty preview and update%s", msg)
if err := pt.PreviewAndUpdate(
dir, "empty", false, !pt.opts.AllowEmptyPreviewChanges, !pt.opts.AllowEmptyUpdateChanges); err != nil {
@ -1250,7 +1240,7 @@ func (pt *ProgramTester) PreviewAndUpdate(dir string, name string, shouldFail, e
if !pt.opts.SkipPreview {
if err := pt.runPulumiCommand("pulumi-preview-"+name, preview, dir, shouldFail); err != nil {
if shouldFail {
fprintf(pt.opts.Stdout, "Permitting failure (ExpectFailure=true for this preview)\n")
pt.t.Log("Permitting failure (ExpectFailure=true for this preview)")
return nil
}
return err
@ -1261,7 +1251,7 @@ func (pt *ProgramTester) PreviewAndUpdate(dir string, name string, shouldFail, e
if !pt.opts.SkipUpdate {
if err := pt.runPulumiCommand("pulumi-update-"+name, update, dir, shouldFail); err != nil {
if shouldFail {
fprintf(pt.opts.Stdout, "Permitting failure (ExpectFailure=true for this update)\n")
pt.t.Log("Permitting failure (ExpectFailure=true for this update)")
return nil
}
return err
@ -1289,7 +1279,7 @@ func (pt *ProgramTester) query(dir string, name string, shouldFail bool) error {
// Now run a query.
if err := pt.runPulumiCommand("pulumi-query-"+name, query, dir, shouldFail); err != nil {
if shouldFail {
fprintf(pt.opts.Stdout, "Permitting failure (ExpectFailure=true for this update)\n")
pt.t.Log("Permitting failure (ExpectFailure=true for this update)")
return nil
}
return err
@ -1314,7 +1304,7 @@ func (pt *ProgramTester) testEdits(dir string) error {
}
func (pt *ProgramTester) testEdit(dir string, i int, edit EditDir) error {
fprintf(pt.opts.Stdout, "Applying edit '%v' and rerunning preview and update\n", edit.Dir)
pt.t.Logf("Applying edit '%v' and rerunning preview and update", edit.Dir)
if edit.Additive {
// Just copy new files into dir
@ -1498,9 +1488,9 @@ func (pt *ProgramTester) performExtraRuntimeValidation(
Events: events,
}
fprintf(pt.opts.Stdout, "Performing extra runtime validation.\n")
pt.t.Log("Performing extra runtime validation.")
extraRuntimeValidation(pt.t, stackInfo)
fprintf(pt.opts.Stdout, "Extra runtime validation complete.\n")
pt.t.Log("Extra runtime validation complete.")
return nil
}
@ -1513,31 +1503,19 @@ func (pt *ProgramTester) copyTestToTemporaryDirectory() (string, string, error)
return "", "", err
}
// Set up a prefix so that all output has the test directory name in it. This is important for debugging
// because we run tests in parallel, and so all output will be interleaved and difficult to follow otherwise.
var prefix string
if len(sourceDir) <= 30 {
prefix = fmt.Sprintf("[ %30.30s ] ", sourceDir)
} else {
prefix = fmt.Sprintf("[ %30.30s ] ", sourceDir[len(sourceDir)-30:])
if pt.opts.Stdout == nil {
pt.opts.Stdout = os.Stdout
}
stdout := pt.opts.Stdout
if stdout == nil {
stdout = newPrefixer(os.Stdout, prefix)
pt.opts.Stdout = stdout
}
stderr := pt.opts.Stderr
if stderr == nil {
stderr = newPrefixer(os.Stderr, prefix)
pt.opts.Stderr = stderr
if pt.opts.Stderr == nil {
pt.opts.Stderr = os.Stderr
}
fprintf(pt.opts.Stdout, "sample: %v\n", sourceDir)
pt.t.Logf("sample: %v", sourceDir)
bin, err := pt.getBin()
if err != nil {
return "", "", err
}
fprintf(pt.opts.Stdout, "pulumi: %v\n", bin)
pt.t.Logf("pulumi: %v\n", bin)
stackName := string(pt.opts.GetStackName())
@ -1600,7 +1578,7 @@ func (pt *ProgramTester) copyTestToTemporaryDirectory() (string, string, error)
}
}
fprintf(stdout, "projdir: %v\n", projdir)
pt.t.Logf("projdir: %v", projdir)
return tmpdir, projdir, nil
}
@ -1675,7 +1653,7 @@ func (pt *ProgramTester) prepareNodeJSProject(projinfo *engine.Projinfo) error {
}
}
fprintf(pt.opts.Stdout, "adding resolution for %s to version %s\n", packageName, packageVersion)
pt.t.Logf("adding resolution for %s to version %s", packageName, packageVersion)
resolutions["**/"+packageName] = packageVersion
}

View file

@ -15,7 +15,6 @@
package integration
import (
"bytes"
"io/ioutil"
"os"
"os/exec"
@ -27,15 +26,6 @@ import (
"github.com/pulumi/pulumi/sdk/v2/go/common/util/contract"
)
func TestPrefixer(t *testing.T) {
byts := make([]byte, 0, 1000)
buf := bytes.NewBuffer(byts)
prefixer := newPrefixer(buf, "OK: ")
_, err := prefixer.Write([]byte("\nsadsada\n\nasdsadsa\nasdsadsa\n"))
contract.AssertNoError(err)
assert.Equal(t, []byte("OK: \nOK: sadsada\nOK: \nOK: asdsadsa\nOK: asdsadsa\n"), buf.Bytes())
}
// Test that RunCommand writes the command's output to a log file.
func TestRunCommandLog(t *testing.T) {
// Try to find node on the path. We need a program to run, and node is probably
@ -55,7 +45,7 @@ func TestRunCommandLog(t *testing.T) {
defer os.RemoveAll(tempdir)
args := []string{node, "-e", "console.log('output from node');"}
err = RunCommand(nil, "node", args, tempdir, opts)
err = RunCommand(t, "node", args, tempdir, opts)
assert.Nil(t, err)
matches, err := filepath.Glob(filepath.Join(tempdir, commandOutputFolderName, "node.*"))

View file

@ -15,7 +15,6 @@
package integration
import (
"bytes"
"fmt"
"io"
"io/ioutil"
@ -105,38 +104,6 @@ func writeCommandOutput(commandName, runDir string, output []byte) (string, erro
return logFile, nil
}
type prefixer struct {
writer io.Writer
prefix []byte
anyOutput bool
}
// newPrefixer wraps an io.Writer, prepending a fixed prefix after each \n emitting on the wrapped writer
func newPrefixer(writer io.Writer, prefix string) *prefixer {
return &prefixer{writer, []byte(prefix), false}
}
var _ io.Writer = (*prefixer)(nil)
func (prefixer *prefixer) Write(p []byte) (int, error) {
n := 0
lines := bytes.SplitAfter(p, []byte{'\n'})
for _, line := range lines {
if len(line) > 0 {
_, err := prefixer.writer.Write(prefixer.prefix)
if err != nil {
return n, err
}
}
m, err := prefixer.writer.Write(line)
n += m
if err != nil {
return n, err
}
}
return n, nil
}
// CopyFile copies a single file from src to dst
// From https://blog.depado.eu/post/copy-files-and-directories-in-go
func CopyFile(src, dst string) error {

View file

@ -394,7 +394,7 @@ func TestRuntimeErrorPython(t *testing.T) {
_, err = s.Up(ctx)
assert.NotNil(t, err)
assert.True(t, IsRuntimeError(err))
assert.True(t, IsRuntimeError(err), "%+v", err)
// -- pulumi destroy --