91 lines
2.1 KiB
Go
91 lines
2.1 KiB
Go
|
package leafnodes
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"io/ioutil"
|
||
|
"net/http"
|
||
|
"time"
|
||
|
|
||
|
"github.com/onsi/ginkgo/internal/failer"
|
||
|
"github.com/onsi/ginkgo/types"
|
||
|
)
|
||
|
|
||
|
type synchronizedAfterSuiteNode struct {
|
||
|
runnerA *runner
|
||
|
runnerB *runner
|
||
|
|
||
|
outcome types.SpecState
|
||
|
failure types.SpecFailure
|
||
|
runTime time.Duration
|
||
|
}
|
||
|
|
||
|
func NewSynchronizedAfterSuiteNode(bodyA interface{}, bodyB interface{}, codeLocation types.CodeLocation, timeout time.Duration, failer *failer.Failer) SuiteNode {
|
||
|
return &synchronizedAfterSuiteNode{
|
||
|
runnerA: newRunner(bodyA, codeLocation, timeout, failer, types.SpecComponentTypeAfterSuite, 0),
|
||
|
runnerB: newRunner(bodyB, codeLocation, timeout, failer, types.SpecComponentTypeAfterSuite, 0),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (node *synchronizedAfterSuiteNode) Run(parallelNode int, parallelTotal int, syncHost string) bool {
|
||
|
node.outcome, node.failure = node.runnerA.run()
|
||
|
|
||
|
if parallelNode == 1 {
|
||
|
if parallelTotal > 1 {
|
||
|
node.waitUntilOtherNodesAreDone(syncHost)
|
||
|
}
|
||
|
|
||
|
outcome, failure := node.runnerB.run()
|
||
|
|
||
|
if node.outcome == types.SpecStatePassed {
|
||
|
node.outcome, node.failure = outcome, failure
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return node.outcome == types.SpecStatePassed
|
||
|
}
|
||
|
|
||
|
func (node *synchronizedAfterSuiteNode) Passed() bool {
|
||
|
return node.outcome == types.SpecStatePassed
|
||
|
}
|
||
|
|
||
|
func (node *synchronizedAfterSuiteNode) Summary() *types.SetupSummary {
|
||
|
return &types.SetupSummary{
|
||
|
ComponentType: node.runnerA.nodeType,
|
||
|
CodeLocation: node.runnerA.codeLocation,
|
||
|
State: node.outcome,
|
||
|
RunTime: node.runTime,
|
||
|
Failure: node.failure,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (node *synchronizedAfterSuiteNode) waitUntilOtherNodesAreDone(syncHost string) {
|
||
|
for {
|
||
|
if node.canRun(syncHost) {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
time.Sleep(50 * time.Millisecond)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (node *synchronizedAfterSuiteNode) canRun(syncHost string) bool {
|
||
|
resp, err := http.Get(syncHost + "/RemoteAfterSuiteData")
|
||
|
if err != nil || resp.StatusCode != http.StatusOK {
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
body, err := ioutil.ReadAll(resp.Body)
|
||
|
if err != nil {
|
||
|
return false
|
||
|
}
|
||
|
resp.Body.Close()
|
||
|
|
||
|
afterSuiteData := types.RemoteAfterSuiteData{}
|
||
|
err = json.Unmarshal(body, &afterSuiteData)
|
||
|
if err != nil {
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
return afterSuiteData.CanRun
|
||
|
}
|