diff --git a/lntest/itest/lnd_test.go b/lntest/itest/lnd_test.go index 986fb630..03334cd2 100644 --- a/lntest/itest/lnd_test.go +++ b/lntest/itest/lnd_test.go @@ -71,81 +71,6 @@ const ( noFeeLimitMsat = math.MaxInt64 ) -// harnessTest wraps a regular testing.T providing enhanced error detection -// and propagation. All error will be augmented with a full stack-trace in -// order to aid in debugging. Additionally, any panics caused by active -// test cases will also be handled and represented as fatals. -type harnessTest struct { - t *testing.T - - // testCase is populated during test execution and represents the - // current test case. - testCase *testCase - - // lndHarness is a reference to the current network harness. Will be - // nil if not yet set up. - lndHarness *lntest.NetworkHarness -} - -// newHarnessTest creates a new instance of a harnessTest from a regular -// testing.T instance. -func newHarnessTest(t *testing.T, net *lntest.NetworkHarness) *harnessTest { - return &harnessTest{t, nil, net} -} - -// Skipf calls the underlying testing.T's Skip method, causing the current test -// to be skipped. -func (h *harnessTest) Skipf(format string, args ...interface{}) { - h.t.Skipf(format, args...) -} - -// Fatalf causes the current active test case to fail with a fatal error. All -// integration tests should mark test failures solely with this method due to -// the error stack traces it produces. -func (h *harnessTest) Fatalf(format string, a ...interface{}) { - if h.lndHarness != nil { - h.lndHarness.SaveProfilesPages() - } - - stacktrace := errors.Wrap(fmt.Sprintf(format, a...), 1).ErrorStack() - - if h.testCase != nil { - h.t.Fatalf("Failed: (%v): exited with error: \n"+ - "%v", h.testCase.name, stacktrace) - } else { - h.t.Fatalf("Error outside of test: %v", stacktrace) - } -} - -// RunTestCase executes a harness test case. Any errors or panics will be -// represented as fatal. -func (h *harnessTest) RunTestCase(testCase *testCase) { - h.testCase = testCase - defer func() { - h.testCase = nil - }() - - defer func() { - if err := recover(); err != nil { - description := errors.Wrap(err, 2).ErrorStack() - h.t.Fatalf("Failed: (%v) panicked with: \n%v", - h.testCase.name, description) - } - }() - - testCase.test(h.lndHarness, h) - - return -} - -func (h *harnessTest) Logf(format string, args ...interface{}) { - h.t.Logf(format, args...) -} - -func (h *harnessTest) Log(args ...interface{}) { - h.t.Log(args...) -} - func assertTxInBlock(t *harnessTest, block *wire.MsgBlock, txid *chainhash.Hash) { for _, tx := range block.Transactions { sha := tx.TxHash() diff --git a/lntest/itest/test_harness.go b/lntest/itest/test_harness.go new file mode 100644 index 00000000..2f8ca62a --- /dev/null +++ b/lntest/itest/test_harness.go @@ -0,0 +1,90 @@ +package itest + +import ( + "fmt" + "testing" + + "github.com/go-errors/errors" + "github.com/lightningnetwork/lnd/lntest" +) + +// harnessTest wraps a regular testing.T providing enhanced error detection +// and propagation. All error will be augmented with a full stack-trace in +// order to aid in debugging. Additionally, any panics caused by active +// test cases will also be handled and represented as fatals. +type harnessTest struct { + t *testing.T + + // testCase is populated during test execution and represents the + // current test case. + testCase *testCase + + // lndHarness is a reference to the current network harness. Will be + // nil if not yet set up. + lndHarness *lntest.NetworkHarness +} + +// newHarnessTest creates a new instance of a harnessTest from a regular +// testing.T instance. +func newHarnessTest(t *testing.T, net *lntest.NetworkHarness) *harnessTest { + return &harnessTest{t, nil, net} +} + +// Skipf calls the underlying testing.T's Skip method, causing the current test +// to be skipped. +func (h *harnessTest) Skipf(format string, args ...interface{}) { + h.t.Skipf(format, args...) +} + +// Fatalf causes the current active test case to fail with a fatal error. All +// integration tests should mark test failures solely with this method due to +// the error stack traces it produces. +func (h *harnessTest) Fatalf(format string, a ...interface{}) { + if h.lndHarness != nil { + h.lndHarness.SaveProfilesPages() + } + + stacktrace := errors.Wrap(fmt.Sprintf(format, a...), 1).ErrorStack() + + if h.testCase != nil { + h.t.Fatalf("Failed: (%v): exited with error: \n"+ + "%v", h.testCase.name, stacktrace) + } else { + h.t.Fatalf("Error outside of test: %v", stacktrace) + } +} + +// RunTestCase executes a harness test case. Any errors or panics will be +// represented as fatal. +func (h *harnessTest) RunTestCase(testCase *testCase) { + + h.testCase = testCase + defer func() { + h.testCase = nil + }() + + defer func() { + if err := recover(); err != nil { + description := errors.Wrap(err, 2).ErrorStack() + h.t.Fatalf("Failed: (%v) panicked with: \n%v", + h.testCase.name, description) + } + }() + + testCase.test(h.lndHarness, h) + + return +} + +func (h *harnessTest) Logf(format string, args ...interface{}) { + h.t.Logf(format, args...) +} + +func (h *harnessTest) Log(args ...interface{}) { + h.t.Log(args...) +} + +type testCase struct { + name string + test func(net *lntest.NetworkHarness, t *harnessTest) +}