From e136de284734ccf567de566bdf0f0021e5f4afd0 Mon Sep 17 00:00:00 2001 From: Dinesh Kumar Date: Fri, 2 Aug 2019 17:03:07 +0530 Subject: [PATCH 1/3] fixing suite teardown ordering issue (cherry picked from commit 92c097a5af7b4bbbe3a66c2e7484f68194cd555a) --- suite/suite.go | 9 ++++++- suite/suite_order_test.go | 49 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 suite/suite_order_test.go diff --git a/suite/suite.go b/suite/suite.go index d708d7d75..75c465869 100644 --- a/suite/suite.go +++ b/suite/suite.go @@ -7,6 +7,7 @@ import ( "reflect" "regexp" "runtime/debug" + "sync" "testing" "github.com/stretchr/testify/assert" @@ -80,11 +81,12 @@ func (suite *Suite) Run(name string, subtest func()) bool { // Run takes a testing suite and runs all of the tests attached // to it. func Run(t *testing.T, suite TestingSuite) { + testsSync := &sync.WaitGroup{} suite.SetT(t) defer failOnPanic(t) suiteSetupDone := false - + methodFinder := reflect.TypeOf(suite) tests := []testing.InternalTest{} for index := 0; index < methodFinder.NumMethod(); index++ { @@ -103,6 +105,7 @@ func Run(t *testing.T, suite TestingSuite) { } defer func() { if tearDownAllSuite, ok := suite.(TearDownAllSuite); ok { + testsSync.Wait() tearDownAllSuite.TearDownSuite() } }() @@ -111,6 +114,9 @@ func Run(t *testing.T, suite TestingSuite) { test := testing.InternalTest{ Name: method.Name, F: func(t *testing.T) { + defer func() { + testsSync.Done() + }() parentT := suite.T() suite.SetT(t) defer failOnPanic(t) @@ -134,6 +140,7 @@ func Run(t *testing.T, suite TestingSuite) { }, } tests = append(tests, test) + testsSync.Add(1) } runTests(t, tests) } diff --git a/suite/suite_order_test.go b/suite/suite_order_test.go new file mode 100644 index 000000000..d9c217b10 --- /dev/null +++ b/suite/suite_order_test.go @@ -0,0 +1,49 @@ +package suite + +import ( + "strings" + "testing" + + "github.com/stretchr/testify/assert" +) + +type CallOrderSuite struct { + Suite + callOrder []string +} + +func (s *CallOrderSuite) call(method string) { + // s.Mutex.Lock() + // defer s.Mutex.Unlock() + + s.callOrder = append(s.callOrder, method) +} + +func TestSuiteCallOrder(t *testing.T) { + Run(t, new(CallOrderSuite)) +} +func (s *CallOrderSuite) SetupSuite() { + s.call("SetupSuite") +} + +func (s *CallOrderSuite) TearDownSuite() { + s.call("TearDownSuite") + assert.Equal(s.T(), "SetupSuite;SetupTest;Test A;TearDownTest;TearDownSuite", strings.Join(s.callOrder, ";")) +} +func (s *CallOrderSuite) SetupTest() { + s.T().Parallel() + s.call("SetupTest") +} + +func (s *CallOrderSuite) TearDownTest() { + s.call("TearDownTest") +} + +func (s *CallOrderSuite) Test_A() { + s.call("Test A") +} + +//func (s *CallOrderSuite) Test_B() { +// time.Sleep(time.Second) +// s.call("Test B") +//} From 5f6e296d4f9e04afbdb5402bd907bb32c72928f9 Mon Sep 17 00:00:00 2001 From: Dinesh Kumar Date: Fri, 2 Aug 2019 18:00:16 +0530 Subject: [PATCH 2/3] Remove parallel as that makes goroutines deadlock --- suite/suite_order_test.go | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/suite/suite_order_test.go b/suite/suite_order_test.go index d9c217b10..91a56f6f6 100644 --- a/suite/suite_order_test.go +++ b/suite/suite_order_test.go @@ -1,8 +1,10 @@ package suite import ( + "math/rand" "strings" "testing" + "time" "github.com/stretchr/testify/assert" ) @@ -13,9 +15,7 @@ type CallOrderSuite struct { } func (s *CallOrderSuite) call(method string) { - // s.Mutex.Lock() - // defer s.Mutex.Unlock() - + time.Sleep(time.Duration(rand.Intn(300)) * time.Millisecond) s.callOrder = append(s.callOrder, method) } @@ -28,10 +28,9 @@ func (s *CallOrderSuite) SetupSuite() { func (s *CallOrderSuite) TearDownSuite() { s.call("TearDownSuite") - assert.Equal(s.T(), "SetupSuite;SetupTest;Test A;TearDownTest;TearDownSuite", strings.Join(s.callOrder, ";")) + assert.Equal(s.T(), "SetupSuite;SetupTest;Test A;TearDownTest;SetupTest;Test B;TearDownTest;TearDownSuite", strings.Join(s.callOrder, ";")) } func (s *CallOrderSuite) SetupTest() { - s.T().Parallel() s.call("SetupTest") } @@ -43,7 +42,6 @@ func (s *CallOrderSuite) Test_A() { s.call("Test A") } -//func (s *CallOrderSuite) Test_B() { -// time.Sleep(time.Second) -// s.call("Test B") -//} +func (s *CallOrderSuite) Test_B() { + s.call("Test B") +} From 27fc78a65fc5351641220fc240fb6f3def1a77c1 Mon Sep 17 00:00:00 2001 From: devdinu Date: Thu, 16 Jan 2020 08:23:53 +0530 Subject: [PATCH 3/3] Merging suite_order_test in suite test, removing anonymous defer func call --- suite/suite.go | 4 +--- suite/suite_order_test.go | 47 --------------------------------------- suite/suite_test.go | 41 +++++++++++++++++++++++++++++++++- 3 files changed, 41 insertions(+), 51 deletions(-) delete mode 100644 suite/suite_order_test.go diff --git a/suite/suite.go b/suite/suite.go index 75c465869..619530187 100644 --- a/suite/suite.go +++ b/suite/suite.go @@ -114,9 +114,7 @@ func Run(t *testing.T, suite TestingSuite) { test := testing.InternalTest{ Name: method.Name, F: func(t *testing.T) { - defer func() { - testsSync.Done() - }() + defer testsSync.Done() parentT := suite.T() suite.SetT(t) defer failOnPanic(t) diff --git a/suite/suite_order_test.go b/suite/suite_order_test.go deleted file mode 100644 index 91a56f6f6..000000000 --- a/suite/suite_order_test.go +++ /dev/null @@ -1,47 +0,0 @@ -package suite - -import ( - "math/rand" - "strings" - "testing" - "time" - - "github.com/stretchr/testify/assert" -) - -type CallOrderSuite struct { - Suite - callOrder []string -} - -func (s *CallOrderSuite) call(method string) { - time.Sleep(time.Duration(rand.Intn(300)) * time.Millisecond) - s.callOrder = append(s.callOrder, method) -} - -func TestSuiteCallOrder(t *testing.T) { - Run(t, new(CallOrderSuite)) -} -func (s *CallOrderSuite) SetupSuite() { - s.call("SetupSuite") -} - -func (s *CallOrderSuite) TearDownSuite() { - s.call("TearDownSuite") - assert.Equal(s.T(), "SetupSuite;SetupTest;Test A;TearDownTest;SetupTest;Test B;TearDownTest;TearDownSuite", strings.Join(s.callOrder, ";")) -} -func (s *CallOrderSuite) SetupTest() { - s.call("SetupTest") -} - -func (s *CallOrderSuite) TearDownTest() { - s.call("TearDownTest") -} - -func (s *CallOrderSuite) Test_A() { - s.call("Test A") -} - -func (s *CallOrderSuite) Test_B() { - s.call("Test B") -} diff --git a/suite/suite_test.go b/suite/suite_test.go index 26dddbd36..5d757dd1b 100644 --- a/suite/suite_test.go +++ b/suite/suite_test.go @@ -3,7 +3,9 @@ package suite import ( "errors" "io/ioutil" + "math/rand" "os" + "strings" "testing" "time" @@ -350,7 +352,7 @@ func TestRunSuite(t *testing.T) { type SuiteSetupSkipTester struct { Suite - setUp bool + setUp bool toreDown bool } @@ -443,3 +445,40 @@ func TestSuiteLogging(t *testing.T) { assert.NotContains(t, output, "TESTLOGPASS") } } + +type CallOrderSuite struct { + Suite + callOrder []string +} + +func (s *CallOrderSuite) call(method string) { + time.Sleep(time.Duration(rand.Intn(300)) * time.Millisecond) + s.callOrder = append(s.callOrder, method) +} + +func TestSuiteCallOrder(t *testing.T) { + Run(t, new(CallOrderSuite)) +} +func (s *CallOrderSuite) SetupSuite() { + s.call("SetupSuite") +} + +func (s *CallOrderSuite) TearDownSuite() { + s.call("TearDownSuite") + assert.Equal(s.T(), "SetupSuite;SetupTest;Test A;TearDownTest;SetupTest;Test B;TearDownTest;TearDownSuite", strings.Join(s.callOrder, ";")) +} +func (s *CallOrderSuite) SetupTest() { + s.call("SetupTest") +} + +func (s *CallOrderSuite) TearDownTest() { + s.call("TearDownTest") +} + +func (s *CallOrderSuite) Test_A() { + s.call("Test A") +} + +func (s *CallOrderSuite) Test_B() { + s.call("Test B") +}