93 lines
1.9 KiB
Go
93 lines
1.9 KiB
Go
|
package failer
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"sync"
|
||
|
|
||
|
"github.com/onsi/ginkgo/types"
|
||
|
)
|
||
|
|
||
|
type Failer struct {
|
||
|
lock *sync.Mutex
|
||
|
failure types.SpecFailure
|
||
|
state types.SpecState
|
||
|
}
|
||
|
|
||
|
func New() *Failer {
|
||
|
return &Failer{
|
||
|
lock: &sync.Mutex{},
|
||
|
state: types.SpecStatePassed,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (f *Failer) Panic(location types.CodeLocation, forwardedPanic interface{}) {
|
||
|
f.lock.Lock()
|
||
|
defer f.lock.Unlock()
|
||
|
|
||
|
if f.state == types.SpecStatePassed {
|
||
|
f.state = types.SpecStatePanicked
|
||
|
f.failure = types.SpecFailure{
|
||
|
Message: "Test Panicked",
|
||
|
Location: location,
|
||
|
ForwardedPanic: fmt.Sprintf("%v", forwardedPanic),
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (f *Failer) Timeout(location types.CodeLocation) {
|
||
|
f.lock.Lock()
|
||
|
defer f.lock.Unlock()
|
||
|
|
||
|
if f.state == types.SpecStatePassed {
|
||
|
f.state = types.SpecStateTimedOut
|
||
|
f.failure = types.SpecFailure{
|
||
|
Message: "Timed out",
|
||
|
Location: location,
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (f *Failer) Fail(message string, location types.CodeLocation) {
|
||
|
f.lock.Lock()
|
||
|
defer f.lock.Unlock()
|
||
|
|
||
|
if f.state == types.SpecStatePassed {
|
||
|
f.state = types.SpecStateFailed
|
||
|
f.failure = types.SpecFailure{
|
||
|
Message: message,
|
||
|
Location: location,
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (f *Failer) Drain(componentType types.SpecComponentType, componentIndex int, componentCodeLocation types.CodeLocation) (types.SpecFailure, types.SpecState) {
|
||
|
f.lock.Lock()
|
||
|
defer f.lock.Unlock()
|
||
|
|
||
|
failure := f.failure
|
||
|
outcome := f.state
|
||
|
if outcome != types.SpecStatePassed {
|
||
|
failure.ComponentType = componentType
|
||
|
failure.ComponentIndex = componentIndex
|
||
|
failure.ComponentCodeLocation = componentCodeLocation
|
||
|
}
|
||
|
|
||
|
f.state = types.SpecStatePassed
|
||
|
f.failure = types.SpecFailure{}
|
||
|
|
||
|
return failure, outcome
|
||
|
}
|
||
|
|
||
|
func (f *Failer) Skip(message string, location types.CodeLocation) {
|
||
|
f.lock.Lock()
|
||
|
defer f.lock.Unlock()
|
||
|
|
||
|
if f.state == types.SpecStatePassed {
|
||
|
f.state = types.SpecStateSkipped
|
||
|
f.failure = types.SpecFailure{
|
||
|
Message: message,
|
||
|
Location: location,
|
||
|
}
|
||
|
}
|
||
|
}
|