Add run safe method that reads stderr and stdout regardless of panic (#2475)

Run method will now always return stdout,stderr, and a recoveredErr
on Exit or Panic. MustRun will Panic with recoveredErr.
This commit is contained in:
zcstarr
2016-09-06 11:30:57 -07:00
committed by GitHub
parent fd4c52acef
commit 3cdebb7e77
17 changed files with 126 additions and 129 deletions

View File

@@ -38,7 +38,7 @@ func (s *nomsDiffTestSuite) TestNomsDiffOutputNotTruncated() {
r2 := spec.CreateValueSpecString("ldb", s.LdbDir, "#"+ds.HeadRef().TargetHash().String())
ds.Database().Close()
out, _ := s.Run(main, []string{"diff", r1, r2})
out, _ := s.MustRun(main, []string{"diff", r1, r2})
s.True(strings.HasSuffix(out, "\"second commit\"\n }\n"), out)
}
@@ -57,11 +57,11 @@ func (s *nomsDiffTestSuite) TestNomsDiffSummarize() {
s.NoError(err)
r2 := spec.CreateHashSpecString("ldb", s.LdbDir, ds.HeadRef().TargetHash())
out, _ := s.Run(main, []string{"diff", "--summarize", r1, r2})
out, _ := s.MustRun(main, []string{"diff", "--summarize", r1, r2})
s.Contains(out, "Comparing commit values")
s.Contains(out, "1 insertion (100.00%), 1 deletion (100.00%), 0 changes (0.00%), (1 value vs 1 value)")
out, _ = s.Run(main, []string{"diff", "--summarize", r1 + ".value", r2 + ".value"})
out, _ = s.MustRun(main, []string{"diff", "--summarize", r1 + ".value", r2 + ".value"})
s.NotContains(out, "Comparing commit values")
ds, err = ds.CommitValue(types.NewList(types.Number(1), types.Number(2), types.Number(3), types.Number(4)))
@@ -72,6 +72,6 @@ func (s *nomsDiffTestSuite) TestNomsDiffSummarize() {
s.NoError(err)
r4 := spec.CreateHashSpecString("ldb", s.LdbDir, ds.HeadRef().TargetHash()) + ".value"
out, _ = s.Run(main, []string{"diff", "--summarize", r3, r4})
out, _ = s.MustRun(main, []string{"diff", "--summarize", r3, r4})
s.Contains(out, "1 insertion (25.00%), 2 deletions (50.00%), 0 changes (0.00%), (4 values vs 3 values)")
}

View File

@@ -8,7 +8,6 @@ import (
"testing"
"github.com/attic-labs/noms/go/chunks"
"github.com/attic-labs/noms/go/d"
"github.com/attic-labs/noms/go/datas"
"github.com/attic-labs/noms/go/dataset"
"github.com/attic-labs/noms/go/spec"
@@ -18,7 +17,6 @@ import (
)
func TestDs(t *testing.T) {
d.UtilExiter = testExiter{}
suite.Run(t, &nomsDsTestSuite{})
}
@@ -35,7 +33,7 @@ func (s *nomsDsTestSuite) TestEmptyNomsDs() {
ds.Close()
dbSpec := spec.CreateDatabaseSpecString("ldb", dir+"/name")
rtnVal, _ := s.Run(main, []string{"ds", dbSpec})
rtnVal, _ := s.MustRun(main, []string{"ds", dbSpec})
s.Equal("", rtnVal)
}
@@ -63,26 +61,26 @@ func (s *nomsDsTestSuite) TestNomsDs() {
dataset2Name := spec.CreateValueSpecString("ldb", dir+"/name", id2)
// both datasets show up
rtnVal, _ := s.Run(main, []string{"ds", dbSpec})
rtnVal, _ := s.MustRun(main, []string{"ds", dbSpec})
s.Equal(id+"\n"+id2+"\n", rtnVal)
// both datasets again, to make sure printing doesn't change them
rtnVal, _ = s.Run(main, []string{"ds", dbSpec})
rtnVal, _ = s.MustRun(main, []string{"ds", dbSpec})
s.Equal(id+"\n"+id2+"\n", rtnVal)
// delete one dataset, print message at delete
rtnVal, _ = s.Run(main, []string{"ds", "-d", datasetName})
rtnVal, _ = s.MustRun(main, []string{"ds", "-d", datasetName})
s.Equal("Deleted "+datasetName+" (was #6ebc05f71q4sk2psi534fom9se228161)\n", rtnVal)
// print datasets, just one left
rtnVal, _ = s.Run(main, []string{"ds", dbSpec})
rtnVal, _ = s.MustRun(main, []string{"ds", dbSpec})
s.Equal(id2+"\n", rtnVal)
// delete the second dataset
rtnVal, _ = s.Run(main, []string{"ds", "-d", dataset2Name})
rtnVal, _ = s.MustRun(main, []string{"ds", "-d", dataset2Name})
s.Equal("Deleted "+dataset2Name+" (was #f5qtovr9mv7mjj2uoq7flcfpksgf0s2j)\n", rtnVal)
// print datasets, none left
rtnVal, _ = s.Run(main, []string{"ds", dbSpec})
rtnVal, _ = s.MustRun(main, []string{"ds", dbSpec})
s.Equal("", rtnVal)
}

View File

@@ -5,10 +5,8 @@
package main
import (
"fmt"
"testing"
"github.com/attic-labs/noms/go/d"
"github.com/attic-labs/noms/go/dataset"
"github.com/attic-labs/noms/go/spec"
"github.com/attic-labs/noms/go/types"
@@ -18,21 +16,7 @@ import (
"github.com/attic-labs/testify/suite"
)
type testExiter struct{}
type exitError struct {
code int
}
func (e exitError) Error() string {
return fmt.Sprintf("Exiting with code: %d", e.code)
}
func (testExiter) Exit(code int) {
panic(exitError{code})
}
func TestNomsLog(t *testing.T) {
d.UtilExiter = testExiter{}
suite.Run(t, &nomsLogTestSuite{})
}
@@ -47,7 +31,7 @@ func testCommitInResults(s *nomsLogTestSuite, str string, i int) {
s.NoError(err)
commit := ds.Head()
ds.Database().Close()
res, _ := s.Run(main, []string{"log", str})
res, _ := s.MustRun(main, []string{"log", str})
s.Contains(res, commit.Hash().String())
}
@@ -58,7 +42,7 @@ func (s *nomsLogTestSuite) TestNomsLog() {
s.NoError(err)
ds.Database().Close()
s.Panics(func() { s.Run(main, []string{"log", str}) })
s.Panics(func() { s.MustRun(main, []string{"log", str}) })
testCommitInResults(s, str, 1)
testCommitInResults(s, str, 2)
@@ -102,17 +86,17 @@ func (s *nomsLogTestSuite) TestNArg() {
db.Close()
dsSpec := spec.CreateValueSpecString("ldb", s.LdbDir, dsName)
res, _ := s.Run(main, []string{"log", "-n1", dsSpec})
res, _ := s.MustRun(main, []string{"log", "-n1", dsSpec})
s.NotContains(res, h1.String())
res, _ = s.Run(main, []string{"log", "-n0", dsSpec})
res, _ = s.MustRun(main, []string{"log", "-n0", dsSpec})
s.Contains(res, h3.String())
s.Contains(res, h2.String())
s.Contains(res, h1.String())
vSpec := spec.CreateValueSpecString("ldb", s.LdbDir, "#"+h3.String())
res, _ = s.Run(main, []string{"log", "-n1", vSpec})
res, _ = s.MustRun(main, []string{"log", "-n1", vSpec})
s.NotContains(res, h1.String())
res, _ = s.Run(main, []string{"log", "-n0", vSpec})
res, _ = s.MustRun(main, []string{"log", "-n0", vSpec})
s.Contains(res, h3.String())
s.Contains(res, h2.String())
s.Contains(res, h1.String())
@@ -136,10 +120,10 @@ func (s *nomsLogTestSuite) TestEmptyCommit() {
db.Close()
dsSpec := spec.CreateValueSpecString("ldb", s.LdbDir, "ds1")
res, _ := s.Run(main, []string{"log", "--show-value=false", dsSpec})
res, _ := s.MustRun(main, []string{"log", "--show-value=false", dsSpec})
test.EqualsIgnoreHashes(s.T(), metaRes1, res)
res, _ = s.Run(main, []string{"log", "--show-value=false", "--oneline", dsSpec})
res, _ = s.MustRun(main, []string{"log", "--show-value=false", "--oneline", dsSpec})
test.EqualsIgnoreHashes(s.T(), metaRes2, res)
}
@@ -190,9 +174,9 @@ func (s *nomsLogTestSuite) TestNomsGraph1() {
s.NoError(err)
b1.Database().Close()
res, _ := s.Run(main, []string{"log", "--graph", "--show-value=true", spec.CreateValueSpecString("ldb", s.LdbDir, "b1")})
res, _ := s.MustRun(main, []string{"log", "--graph", "--show-value=true", spec.CreateValueSpecString("ldb", s.LdbDir, "b1")})
s.Equal(graphRes1, res)
res, _ = s.Run(main, []string{"log", "--graph", "--show-value=false", spec.CreateValueSpecString("ldb", s.LdbDir, "b1")})
res, _ = s.MustRun(main, []string{"log", "--graph", "--show-value=false", spec.CreateValueSpecString("ldb", s.LdbDir, "b1")})
s.Equal(diffRes1, res)
}
@@ -222,9 +206,9 @@ func (s *nomsLogTestSuite) TestNomsGraph2() {
db.Close()
res, _ := s.Run(main, []string{"log", "--graph", "--show-value=true", spec.CreateValueSpecString("ldb", s.LdbDir, "ba")})
res, _ := s.MustRun(main, []string{"log", "--graph", "--show-value=true", spec.CreateValueSpecString("ldb", s.LdbDir, "ba")})
s.Equal(graphRes2, res)
res, _ = s.Run(main, []string{"log", "--graph", "--show-value=false", spec.CreateValueSpecString("ldb", s.LdbDir, "ba")})
res, _ = s.MustRun(main, []string{"log", "--graph", "--show-value=false", spec.CreateValueSpecString("ldb", s.LdbDir, "ba")})
s.Equal(diffRes2, res)
}
@@ -263,9 +247,9 @@ func (s *nomsLogTestSuite) TestNomsGraph3() {
s.NoError(err)
db.Close()
res, _ := s.Run(main, []string{"log", "--graph", "--show-value=true", spec.CreateValueSpecString("ldb", s.LdbDir, "w")})
res, _ := s.MustRun(main, []string{"log", "--graph", "--show-value=true", spec.CreateValueSpecString("ldb", s.LdbDir, "w")})
test.EqualsIgnoreHashes(s.T(), graphRes3, res)
res, _ = s.Run(main, []string{"log", "--graph", "--show-value=false", spec.CreateValueSpecString("ldb", s.LdbDir, "w")})
res, _ = s.MustRun(main, []string{"log", "--graph", "--show-value=false", spec.CreateValueSpecString("ldb", s.LdbDir, "w")})
test.EqualsIgnoreHashes(s.T(), diffRes3, res)
}
@@ -293,19 +277,19 @@ func (s *nomsLogTestSuite) TestTruncation() {
db.Close()
dsSpec := spec.CreateValueSpecString("ldb", s.LdbDir, "truncate")
res, _ := s.Run(main, []string{"log", "--graph", "--show-value=true", dsSpec})
res, _ := s.MustRun(main, []string{"log", "--graph", "--show-value=true", dsSpec})
test.EqualsIgnoreHashes(s.T(), truncRes1, res)
res, _ = s.Run(main, []string{"log", "--graph", "--show-value=false", dsSpec})
res, _ = s.MustRun(main, []string{"log", "--graph", "--show-value=false", dsSpec})
test.EqualsIgnoreHashes(s.T(), diffTrunc1, res)
res, _ = s.Run(main, []string{"log", "--graph", "--show-value=true", "--max-lines=-1", dsSpec})
res, _ = s.MustRun(main, []string{"log", "--graph", "--show-value=true", "--max-lines=-1", dsSpec})
test.EqualsIgnoreHashes(s.T(), truncRes2, res)
res, _ = s.Run(main, []string{"log", "--graph", "--show-value=false", "--max-lines=-1", dsSpec})
res, _ = s.MustRun(main, []string{"log", "--graph", "--show-value=false", "--max-lines=-1", dsSpec})
test.EqualsIgnoreHashes(s.T(), diffTrunc2, res)
res, _ = s.Run(main, []string{"log", "--graph", "--show-value=true", "--max-lines=0", dsSpec})
res, _ = s.MustRun(main, []string{"log", "--graph", "--show-value=true", "--max-lines=0", dsSpec})
test.EqualsIgnoreHashes(s.T(), truncRes3, res)
res, _ = s.Run(main, []string{"log", "--graph", "--show-value=false", "--max-lines=0", dsSpec})
res, _ = s.MustRun(main, []string{"log", "--graph", "--show-value=false", "--max-lines=0", dsSpec})
test.EqualsIgnoreHashes(s.T(), diffTrunc3, res)
}

View File

@@ -50,23 +50,23 @@ func (s *nomsShowTestSuite) TestNomsShow() {
s1 := types.String("test string")
r := writeTestData(str, s1)
res, _ := s.Run(main, []string{"show", str})
res, _ := s.MustRun(main, []string{"show", str})
s.Equal(res1, res)
str1 := spec.CreateValueSpecString("ldb", s.LdbDir, "#"+r.TargetHash().String())
res, _ = s.Run(main, []string{"show", str1})
res, _ = s.MustRun(main, []string{"show", str1})
s.Equal(res2, res)
list := types.NewList(types.String("elem1"), types.Number(2), types.String("elem3"))
r = writeTestData(str, list)
res, _ = s.Run(main, []string{"show", str})
res, _ = s.MustRun(main, []string{"show", str})
test.EqualsIgnoreHashes(s.T(), res3, res)
str1 = spec.CreateValueSpecString("ldb", s.LdbDir, "#"+r.TargetHash().String())
res, _ = s.Run(main, []string{"show", str1})
res, _ = s.MustRun(main, []string{"show", str1})
s.Equal(res4, res)
_ = writeTestData(str, s1)
res, _ = s.Run(main, []string{"show", str})
res, _ = s.MustRun(main, []string{"show", str})
test.EqualsIgnoreHashes(s.T(), res5, res)
}

View File

@@ -9,7 +9,6 @@ import (
"testing"
"github.com/attic-labs/noms/go/chunks"
"github.com/attic-labs/noms/go/d"
"github.com/attic-labs/noms/go/datas"
"github.com/attic-labs/noms/go/dataset"
"github.com/attic-labs/noms/go/spec"
@@ -19,7 +18,6 @@ import (
)
func TestSync(t *testing.T) {
d.UtilExiter = testExiter{}
suite.Run(t, &nomsSyncTestSuite{})
}
@@ -40,10 +38,10 @@ func (s *nomsSyncTestSuite) TestSyncValidation() {
defer func() {
err := recover()
s.Equal(exitError{-1}, err)
s.Equal(clienttest.ExitError{-1}, err)
}()
s.Run(main, []string{"sync", sourceSpecMissingHashSymbol, sinkDatasetSpec})
s.MustRun(main, []string{"sync", sourceSpecMissingHashSymbol, sinkDatasetSpec})
}
func (s *nomsSyncTestSuite) TestSync() {
@@ -58,7 +56,7 @@ func (s *nomsSyncTestSuite) TestSync() {
sourceSpec := spec.CreateValueSpecString("ldb", s.LdbDir, "#"+source1HeadRef.String())
ldb2dir := path.Join(s.TempDir, "ldb2")
sinkDatasetSpec := spec.CreateValueSpecString("ldb", ldb2dir, "dest")
sout, _ := s.Run(main, []string{"sync", sourceSpec, sinkDatasetSpec})
sout, _ := s.MustRun(main, []string{"sync", sourceSpec, sinkDatasetSpec})
s.Regexp("Created", sout)
dest := dataset.NewDataset(datas.NewDatabase(chunks.NewLevelDBStore(ldb2dir, "", 1, false)), "dest")
@@ -66,14 +64,14 @@ func (s *nomsSyncTestSuite) TestSync() {
dest.Database().Close()
sourceDataset := spec.CreateValueSpecString("ldb", s.LdbDir, "src")
sout, _ = s.Run(main, []string{"sync", sourceDataset, sinkDatasetSpec})
sout, _ = s.MustRun(main, []string{"sync", sourceDataset, sinkDatasetSpec})
s.Regexp("Synced", sout)
dest = dataset.NewDataset(datas.NewDatabase(chunks.NewLevelDBStore(ldb2dir, "", 1, false)), "dest")
s.True(types.Number(43).Equals(dest.HeadValue()))
dest.Database().Close()
sout, _ = s.Run(main, []string{"sync", sourceDataset, sinkDatasetSpec})
sout, _ = s.MustRun(main, []string{"sync", sourceDataset, sinkDatasetSpec})
s.Regexp("up to date", sout)
}
@@ -89,7 +87,7 @@ func (s *nomsSyncTestSuite) TestRewind() {
sourceSpec := spec.CreateValueSpecString("ldb", s.LdbDir, "#"+rewindRef.String())
sinkDatasetSpec := spec.CreateValueSpecString("ldb", s.LdbDir, "foo")
s.Run(main, []string{"sync", sourceSpec, sinkDatasetSpec})
s.MustRun(main, []string{"sync", sourceSpec, sinkDatasetSpec})
dest := dataset.NewDataset(datas.NewDatabase(chunks.NewLevelDBStore(s.LdbDir, "", 1, false)), "foo")
s.True(types.Number(42).Equals(dest.HeadValue()))

View File

@@ -22,7 +22,7 @@ type nomsVersionTestSuite struct {
}
func (s *nomsVersionTestSuite) TestVersion() {
val, _ := s.Run(main, []string{"version"})
val, _ := s.MustRun(main, []string{"version"})
expectedVal := fmt.Sprintf("format version: %v\nbuilt from %v\n", constants.NomsVersion, constants.NomsGitSHA)
s.Equal(val, expectedVal)
}

View File

@@ -23,6 +23,10 @@ type ClientTestSuite struct {
err *os.File
}
type ExitError struct {
Code int
}
func (suite *ClientTestSuite) SetupSuite() {
dir, err := ioutil.TempDir(os.TempDir(), "nomstest")
d.Chk.NoError(err)
@@ -35,6 +39,7 @@ func (suite *ClientTestSuite) SetupSuite() {
suite.LdbDir = path.Join(dir, "ldb")
suite.out = stdOutput
suite.err = errOutput
d.UtilExiter = suite
}
func (suite *ClientTestSuite) TearDownSuite() {
@@ -43,7 +48,19 @@ func (suite *ClientTestSuite) TearDownSuite() {
defer d.Chk.NoError(os.RemoveAll(suite.TempDir))
}
func (suite *ClientTestSuite) Run(m func(), args []string) (stdout string, stderr string) {
// MustRun is a wrapper around Run that will panic on Exit or Panic
func (suite *ClientTestSuite) MustRun(m func(), args []string) (stdout string, stderr string) {
var err interface{}
if stdout, stderr, err = suite.Run(m, args); err != nil {
panic(err)
}
return
}
// Run will execute a function passing to it commandline args, and captures stdout,stderr.
// If m() panics the panic is caught, and returned with recoveredError
// If m() calls os.Exit() m() will panic and return ExitError with recoveredError
func (suite *ClientTestSuite) Run(m func(), args []string) (stdout string, stderr string, recoveredErr interface{}) {
origArgs := os.Args
origOut := os.Stdout
origErr := os.Stderr
@@ -53,39 +70,39 @@ func (suite *ClientTestSuite) Run(m func(), args []string) (stdout string, stder
os.Stderr = suite.err
defer func() {
recoveredErr = recover()
_, err := suite.out.Seek(0, 0)
d.Chk.NoError(err)
capturedOut, err := ioutil.ReadAll(os.Stdout)
d.Chk.NoError(err)
_, err = suite.out.Seek(0, 0)
d.Chk.NoError(err)
err = suite.out.Truncate(0)
d.Chk.NoError(err)
_, err = suite.err.Seek(0, 0)
d.Chk.NoError(err)
capturedErr, err := ioutil.ReadAll(os.Stderr)
d.Chk.NoError(err)
_, err = suite.err.Seek(0, 0)
d.Chk.NoError(err)
err = suite.err.Truncate(0)
d.Chk.NoError(err)
os.Args = origArgs
os.Stdout = origOut
os.Stderr = origErr
stdout, stderr = string(capturedOut), string(capturedErr)
}()
suite.ExitStatus = 0
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
m()
_, err := suite.out.Seek(0, 0)
d.Chk.NoError(err)
capturedOut, err := ioutil.ReadAll(os.Stdout)
d.Chk.NoError(err)
_, err = suite.out.Seek(0, 0)
d.Chk.NoError(err)
err = suite.out.Truncate(0)
d.Chk.NoError(err)
_, err = suite.err.Seek(0, 0)
d.Chk.NoError(err)
capturedErr, err := ioutil.ReadAll(os.Stderr)
d.Chk.NoError(err)
_, err = suite.err.Seek(0, 0)
d.Chk.NoError(err)
err = suite.err.Truncate(0)
d.Chk.NoError(err)
return string(capturedOut), string(capturedErr)
return
}
// Mock os.Exit() implementation for use during testing.
func (suite *ClientTestSuite) Exit(status int) {
suite.ExitStatus = status
panic(ExitError{status})
}

View File

@@ -36,7 +36,7 @@ func (s *bgSuite) TestBlobGet() {
hash_spec := fmt.Sprintf("%s::#%s", s.TempDir, hash.TargetHash().String())
file_path := filepath.Join(s.TempDir, "out")
s.Run(main, []string{hash_spec, file_path})
s.MustRun(main, []string{hash_spec, file_path})
file_bytes, err := ioutil.ReadFile(file_path)
s.NoError(err)

View File

@@ -23,13 +23,13 @@ type counterTestSuite struct {
func (s *counterTestSuite) TestCounter() {
spec := spec.CreateValueSpecString("ldb", s.LdbDir, "counter")
args := []string{spec}
stdout, stderr := s.Run(main, args)
stdout, stderr := s.MustRun(main, args)
s.Equal("1\n", stdout)
s.Equal("", stderr)
stdout, stderr = s.Run(main, args)
stdout, stderr = s.MustRun(main, args)
s.Equal("2\n", stdout)
s.Equal("", stderr)
stdout, stderr = s.Run(main, args)
stdout, stderr = s.MustRun(main, args)
s.Equal("3\n", stdout)
s.Equal("", stderr)
}

View File

@@ -57,37 +57,37 @@ func (s *csvAnalyzeTestSuite) TearDownTest() {
}
func (s *csvAnalyzeTestSuite) TestCSVAnalyzeDetectColumnTypes() {
stdout, stderr := s.Run(main, []string{"--detect-column-types=1", s.tmpFileName})
stdout, stderr := s.MustRun(main, []string{"--detect-column-types=1", s.tmpFileName})
s.Equal("String,String,String\n", stdout)
s.Equal("", stderr)
}
func (s *csvAnalyzeTestSuite) TestCSVAnalyzeDetectColumnTypesSamples20() {
stdout, stderr := s.Run(main, []string{"--detect-column-types=1", "--num-samples=20", s.tmpFileName})
stdout, stderr := s.MustRun(main, []string{"--detect-column-types=1", "--num-samples=20", s.tmpFileName})
s.Equal("String,String,Number\n", stdout)
s.Equal("", stderr)
}
func (s *csvAnalyzeTestSuite) TestCSVAnalyzeDetectPrimaryKeys() {
stdout, stderr := s.Run(main, []string{"--detect-pk=1", s.tmpFileName})
stdout, stderr := s.MustRun(main, []string{"--detect-pk=1", s.tmpFileName})
s.Equal("Time\nDate,Time\nTime,Temperature\nDate,Time,Temperature\n", stdout)
s.Equal("", stderr)
}
func (s *csvAnalyzeTestSuite) TestCSVAnalyzeDetectPrimaryKeysSamples20() {
stdout, stderr := s.Run(main, []string{"--detect-pk=1", "--num-samples=20", s.tmpFileName})
stdout, stderr := s.MustRun(main, []string{"--detect-pk=1", "--num-samples=20", s.tmpFileName})
s.Equal("Time\nTemperature\nDate,Time\nDate,Temperature\nTime,Temperature\nDate,Time,Temperature\n", stdout)
s.Equal("", stderr)
}
func (s *csvAnalyzeTestSuite) TestCSVAnalyzeDetectPrimaryKeysSingleField() {
stdout, stderr := s.Run(main, []string{"--detect-pk=1", "--num-fields-pk=1", s.tmpFileName})
stdout, stderr := s.MustRun(main, []string{"--detect-pk=1", "--num-fields-pk=1", s.tmpFileName})
s.Equal("Time\n", stdout)
s.Equal("", stderr)
}
func (s *csvAnalyzeTestSuite) TestCSVAnalyzeDetectPrimaryKeysTwoFields() {
stdout, stderr := s.Run(main, []string{"--detect-pk=1", "--num-fields-pk=2", s.tmpFileName})
stdout, stderr := s.MustRun(main, []string{"--detect-pk=1", "--num-fields-pk=2", s.tmpFileName})
s.Equal("Time\nDate,Time\nTime,Temperature\n", stdout)
s.Equal("", stderr)
}

View File

@@ -96,7 +96,7 @@ func (s *testSuite) TestCSVExportFromList() {
// Run exporter
dataspec := spec.CreateValueSpecString("ldb", s.LdbDir, setName)
stdout, stderr := s.Run(main, []string{dataspec})
stdout, stderr := s.MustRun(main, []string{dataspec})
s.Equal("", stderr)
verifyOutput(s, stdout)
@@ -116,7 +116,7 @@ func (s *testSuite) TestCSVExportFromMap() {
// Run exporter
dataspec := spec.CreateValueSpecString("ldb", s.LdbDir, setName)
stdout, stderr := s.Run(main, []string{dataspec})
stdout, stderr := s.MustRun(main, []string{dataspec})
s.Equal("", stderr)
verifyOutput(s, stdout)

View File

@@ -108,7 +108,7 @@ func validateNestedMap(s *testSuite, m types.Map) {
func (s *testSuite) TestCSVImporter() {
setName := "csv"
dataspec := spec.CreateValueSpecString("ldb", s.LdbDir, setName)
stdout, stderr := s.Run(main, []string{"--no-progress", "--column-types", TEST_FIELDS, s.tmpFileName, dataspec})
stdout, stderr := s.MustRun(main, []string{"--no-progress", "--column-types", TEST_FIELDS, s.tmpFileName, dataspec})
s.Equal("", stdout)
s.Equal("", stderr)
@@ -136,7 +136,7 @@ func (s *testSuite) TestCSVImporterFromBlob() {
rawDS.CommitValue(types.NewBlob(csv))
db.Close()
stdout, stderr := s.Run(main, []string{
stdout, stderr := s.MustRun(main, []string{
"--no-progress", "--column-types", TEST_FIELDS,
pathFlag, spec.CreateValueSpecString("ldb", s.LdbDir, "raw.value"),
spec.CreateValueSpecString("ldb", s.LdbDir, "csv"),
@@ -156,7 +156,7 @@ func (s *testSuite) TestCSVImporterFromBlob() {
func (s *testSuite) TestCSVImporterToMap() {
setName := "csv"
dataspec := spec.CreateValueSpecString("ldb", s.LdbDir, setName)
stdout, stderr := s.Run(main, []string{"--no-progress", "--column-types", TEST_FIELDS, "--dest-type", "map:1", s.tmpFileName, dataspec})
stdout, stderr := s.MustRun(main, []string{"--no-progress", "--column-types", TEST_FIELDS, "--dest-type", "map:1", s.tmpFileName, dataspec})
s.Equal("", stdout)
s.Equal("", stderr)
@@ -172,7 +172,7 @@ func (s *testSuite) TestCSVImporterToMap() {
func (s *testSuite) TestCSVImporterToNestedMap() {
setName := "csv"
dataspec := spec.CreateValueSpecString("ldb", s.LdbDir, setName)
stdout, stderr := s.Run(main, []string{"--no-progress", "--column-types", TEST_FIELDS, "--dest-type", "map:0,1", s.tmpFileName, dataspec})
stdout, stderr := s.MustRun(main, []string{"--no-progress", "--column-types", TEST_FIELDS, "--dest-type", "map:0,1", s.tmpFileName, dataspec})
s.Equal("", stdout)
s.Equal("", stderr)
@@ -188,7 +188,7 @@ func (s *testSuite) TestCSVImporterToNestedMap() {
func (s *testSuite) TestCSVImporterToNestedMapByName() {
setName := "csv"
dataspec := spec.CreateValueSpecString("ldb", s.LdbDir, setName)
stdout, stderr := s.Run(main, []string{"--no-progress", "--column-types", TEST_FIELDS, "--dest-type", "map:year,a", s.tmpFileName, dataspec})
stdout, stderr := s.MustRun(main, []string{"--no-progress", "--column-types", TEST_FIELDS, "--dest-type", "map:year,a", s.tmpFileName, dataspec})
s.Equal("", stdout)
s.Equal("", stderr)
@@ -212,7 +212,7 @@ func (s *testSuite) TestCSVImporterWithPipe() {
setName := "csv"
dataspec := spec.CreateValueSpecString("ldb", s.LdbDir, setName)
stdout, stderr := s.Run(main, []string{"--no-progress", "--column-types", "String,Number", "--delimiter", "|", input.Name(), dataspec})
stdout, stderr := s.MustRun(main, []string{"--no-progress", "--column-types", "String,Number", "--delimiter", "|", input.Name(), dataspec})
s.Equal("", stdout)
s.Equal("", stderr)
@@ -240,7 +240,7 @@ func (s *testSuite) TestCSVImporterWithExternalHeader() {
setName := "csv"
dataspec := spec.CreateValueSpecString("ldb", s.LdbDir, setName)
stdout, stderr := s.Run(main, []string{"--no-progress", "--column-types", "String,Number", "--header", "x,y", input.Name(), dataspec})
stdout, stderr := s.MustRun(main, []string{"--no-progress", "--column-types", "String,Number", "--header", "x,y", input.Name(), dataspec})
s.Equal("", stdout)
s.Equal("", stderr)
@@ -277,7 +277,7 @@ func (s *testSuite) TestCSVImportSkipRecords() {
setName := "csv"
dataspec := spec.CreateValueSpecString("ldb", s.LdbDir, setName)
stdout, stderr := s.Run(main, []string{"--no-progress", "--skip-records", "2", input.Name(), dataspec})
stdout, stderr := s.MustRun(main, []string{"--no-progress", "--skip-records", "2", input.Name(), dataspec})
s.Equal("", stdout)
s.Equal("", stderr)
@@ -308,7 +308,7 @@ func (s *testSuite) TestCSVImportSkipRecordsCustomHeader() {
setName := "csv"
dataspec := spec.CreateValueSpecString("ldb", s.LdbDir, setName)
stdout, stderr := s.Run(main, []string{"--no-progress", "--skip-records", "1", "--header", "x,y", input.Name(), dataspec})
stdout, stderr := s.MustRun(main, []string{"--no-progress", "--skip-records", "1", "--header", "x,y", input.Name(), dataspec})
s.Equal("", stdout)
s.Equal("", stderr)

View File

@@ -26,19 +26,19 @@ type testSuite struct {
func (s *testSuite) TestRoundTrip() {
spec := fmt.Sprintf("ldb:%s::hr", s.LdbDir)
stdout, stderr := s.Run(main, []string{"--ds", spec, "list-persons"})
stdout, stderr := s.MustRun(main, []string{"--ds", spec, "list-persons"})
s.Equal("No people found\n", stdout)
s.Equal("", stderr)
stdout, stderr = s.Run(main, []string{"--ds", spec, "add-person", "42", "Benjamin Kalman", "Programmer, Barista"})
stdout, stderr = s.MustRun(main, []string{"--ds", spec, "add-person", "42", "Benjamin Kalman", "Programmer, Barista"})
s.Equal("", stdout)
s.Equal("", stderr)
stdout, stderr = s.Run(main, []string{"--ds", spec, "add-person", "43", "Abigail Boodman", "Chief Architect"})
stdout, stderr = s.MustRun(main, []string{"--ds", spec, "add-person", "43", "Abigail Boodman", "Chief Architect"})
s.Equal("", stdout)
s.Equal("", stderr)
stdout, stderr = s.Run(main, []string{"--ds", spec, "list-persons"})
stdout, stderr = s.MustRun(main, []string{"--ds", spec, "list-persons"})
s.Equal(`Benjamin Kalman (id: 42, title: Programmer, Barista)
Abigail Boodman (id: 43, title: Chief Architect)
`, stdout)
@@ -54,7 +54,7 @@ func (s *testSuite) TestReadCanned() {
// Have to copy the canned data elsewhere because just reading the database modifies it.
_, err = exec.Command("cp", "-r", p, dst).Output()
s.NoError(err)
stdout, stderr := s.Run(main, []string{"--ds", fmt.Sprintf("ldb:%s/test-data::hr", dst), "list-persons"})
stdout, stderr := s.MustRun(main, []string{"--ds", fmt.Sprintf("ldb:%s/test-data::hr", dst), "list-persons"})
s.Equal(`Aaron Boodman (id: 7, title: Chief Evangelism Officer)
Samuel Boodman (id: 13, title: VP, Culture)
`, stdout)
@@ -63,5 +63,5 @@ Samuel Boodman (id: 13, title: VP, Culture)
func (s *testSuite) TestInvalidDatasetSpec() {
// Should not crash
_, _ = s.Run(main, []string{"--ds", "invalid-dataset", "list-persons"})
_, _ = s.MustRun(main, []string{"--ds", "invalid-dataset", "list-persons"})
}

View File

@@ -85,32 +85,32 @@ func (s *testSuite) TestNomdex() {
fnameIdx := "fname-idx"
dataSpec := spec.CreateValueSpecString("ldb", s.LdbDir, dsId)
dbSpec := spec.CreateDatabaseSpecString("ldb", s.LdbDir)
stdout, stderr := s.Run(main, []string{"up", "--out-ds", fnameIdx, "--in-path", dataSpec, "--by", ".fname"})
stdout, stderr := s.MustRun(main, []string{"up", "--out-ds", fnameIdx, "--in-path", dataSpec, "--by", ".fname"})
s.Contains(stdout, "Indexed 24 objects")
s.Equal("", stderr)
genderIdx := "gender-idx"
stdout, stderr = s.Run(main, []string{"up", "--out-ds", genderIdx, "--in-path", dataSpec, "--by", ".gender"})
stdout, stderr = s.MustRun(main, []string{"up", "--out-ds", genderIdx, "--in-path", dataSpec, "--by", ".gender"})
s.Contains(stdout, "Indexed 24 objects")
s.Equal("", stderr)
stdout, stderr = s.Run(main, []string{"find", "--db", dbSpec, `fname-idx = "lady"`})
stdout, stderr = s.MustRun(main, []string{"find", "--db", dbSpec, `fname-idx = "lady"`})
s.Contains(stdout, "Found 1 objects")
s.Equal("", stderr)
stdout, stderr = s.Run(main, []string{"find", "--db", dbSpec, `fname-idx = "lady" and gender-idx = "f"`})
stdout, stderr = s.MustRun(main, []string{"find", "--db", dbSpec, `fname-idx = "lady" and gender-idx = "f"`})
s.Contains(stdout, "Found 1 objects")
s.Equal("", stderr)
stdout, stderr = s.Run(main, []string{"find", "--db", dbSpec, `fname-idx != "lady" and gender-idx != "m"`})
stdout, stderr = s.MustRun(main, []string{"find", "--db", dbSpec, `fname-idx != "lady" and gender-idx != "m"`})
s.Contains(stdout, "Found 2 objects")
s.Equal("", stderr)
stdout, stderr = s.Run(main, []string{"find", "--db", dbSpec, `fname-idx != "lady" and fname-idx != "john"`})
stdout, stderr = s.MustRun(main, []string{"find", "--db", dbSpec, `fname-idx != "lady" and fname-idx != "john"`})
s.Contains(stdout, "Found 21 objects")
s.Equal("", stderr)
stdout, stderr = s.Run(main, []string{"find", "--db", dbSpec, `fname-idx != "lady" or gender-idx != "f"`})
stdout, stderr = s.MustRun(main, []string{"find", "--db", dbSpec, `fname-idx != "lady" or gender-idx != "f"`})
s.Contains(stdout, "Found 23 objects")
s.Equal("", stderr)
}

View File

@@ -65,7 +65,7 @@ func (s *testSuite) TestWin() {
})
var mainErr error
stdout, stderr := s.Run(func() { mainErr = nomsMerge() }, []string{"--quiet=true", "--parent=" + p, s.LdbDir, l, r})
stdout, stderr, _ := s.Run(func() { mainErr = nomsMerge() }, []string{"--quiet=true", "--parent=" + p, s.LdbDir, l, r})
if s.NoError(mainErr, "%s", mainErr) {
s.Equal("", stdout)
s.Equal("", stderr)
@@ -110,7 +110,7 @@ func (s *testSuite) TestLose() {
for _, c := range cases {
var mainErr error
stdout, _ := s.Run(func() { mainErr = nomsMerge() }, c.args)
stdout, _, _ := s.Run(func() { mainErr = nomsMerge() }, c.args)
s.Empty(stdout, "Expected empty stdout for case: %#v", c.args)
if s.Error(mainErr) {
s.Equal(c.err, mainErr.Error(), "Unexpected output for case: %#v\n", c.args)

View File

@@ -47,10 +47,10 @@ func (s *testSuite) TestWin() {
}
for k, v := range changes {
stdout, stderr := s.Run(main, []string{sp, k, v})
stdout, stderr, err := s.Run(main, []string{sp, k, v})
s.Equal("", stdout)
s.Equal("", stderr)
s.Equal(0, s.ExitStatus)
s.Equal(nil, err)
}
ds, _ = spec.GetDataset(sp)
@@ -92,9 +92,9 @@ func (s *testSuite) TestLose() {
ds.Database().Close()
for _, c := range cases {
stdout, stderr := s.Run(main, c.args)
stdout, stderr, err := s.Run(main, c.args)
s.Empty(stdout, "Expected empty stdout for case: %#v", c.args)
s.Equal(c.err, stderr, "Unexpected output for case: %#v\n", c.args)
s.Equal(1, s.ExitStatus)
s.Equal(clienttest.ExitError{1}, err)
}
}

View File

@@ -44,7 +44,7 @@ func (s *testSuite) TestImportFromStdin() {
dsName := spec.CreateValueSpecString("ldb", s.LdbDir, "ds")
// Run() will return when blobOut is closed.
s.Run(main, []string{"--stdin", dsName})
s.MustRun(main, []string{"--stdin", dsName})
db, blob, err := spec.GetPath(dsName + ".value")
assert.NoError(err)
@@ -71,7 +71,7 @@ func (s *testSuite) TestImportFromFile() {
f.Close()
dsName := spec.CreateValueSpecString("ldb", s.LdbDir, "ds")
s.Run(main, []string{f.Name(), dsName})
s.MustRun(main, []string{f.Name(), dsName})
db, blob, err := spec.GetPath(dsName + ".value")
assert.NoError(err)