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, } } }