...
1 package internal
2
3 import (
4 "fmt"
5 "sync"
6
7 "github.com/onsi/ginkgo/v2/types"
8 )
9
10 type Failer struct {
11 lock *sync.Mutex
12 failure types.Failure
13 state types.SpecState
14 }
15
16 func NewFailer() *Failer {
17 return &Failer{
18 lock: &sync.Mutex{},
19 state: types.SpecStatePassed,
20 }
21 }
22
23 func (f *Failer) GetState() types.SpecState {
24 f.lock.Lock()
25 defer f.lock.Unlock()
26 return f.state
27 }
28
29 func (f *Failer) GetFailure() types.Failure {
30 f.lock.Lock()
31 defer f.lock.Unlock()
32 return f.failure
33 }
34
35 func (f *Failer) Panic(location types.CodeLocation, forwardedPanic interface{}) {
36 f.lock.Lock()
37 defer f.lock.Unlock()
38
39 if f.state == types.SpecStatePassed {
40 f.state = types.SpecStatePanicked
41 f.failure = types.Failure{
42 Message: "Test Panicked",
43 Location: location,
44 ForwardedPanic: fmt.Sprintf("%v", forwardedPanic),
45 }
46 }
47 }
48
49 func (f *Failer) Fail(message string, location types.CodeLocation) {
50 f.lock.Lock()
51 defer f.lock.Unlock()
52
53 if f.state == types.SpecStatePassed {
54 f.state = types.SpecStateFailed
55 f.failure = types.Failure{
56 Message: message,
57 Location: location,
58 }
59 }
60 }
61
62 func (f *Failer) Skip(message string, location types.CodeLocation) {
63 f.lock.Lock()
64 defer f.lock.Unlock()
65
66 if f.state == types.SpecStatePassed {
67 f.state = types.SpecStateSkipped
68 f.failure = types.Failure{
69 Message: message,
70 Location: location,
71 }
72 }
73 }
74
75 func (f *Failer) AbortSuite(message string, location types.CodeLocation) {
76 f.lock.Lock()
77 defer f.lock.Unlock()
78
79 if f.state == types.SpecStatePassed {
80 f.state = types.SpecStateAborted
81 f.failure = types.Failure{
82 Message: message,
83 Location: location,
84 }
85 }
86 }
87
88 func (f *Failer) Drain() (types.SpecState, types.Failure) {
89 f.lock.Lock()
90 defer f.lock.Unlock()
91
92 failure := f.failure
93 outcome := f.state
94
95 f.state = types.SpecStatePassed
96 f.failure = types.Failure{}
97
98 return outcome, failure
99 }
100
View as plain text