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