github.com/sttk/sabi@v0.5.0/notify_test.go (about) 1 package sabi 2 3 import ( 4 "container/list" 5 "reflect" 6 "strconv" 7 "testing" 8 "time" 9 10 "github.com/stretchr/testify/assert" 11 ) 12 13 type ReasonForNotification struct{} 14 15 func ClearErrHandlers() { 16 syncErrHandlers.head = nil 17 syncErrHandlers.last = nil 18 asyncErrHandlers.head = nil 19 asyncErrHandlers.last = nil 20 isErrCfgsFixed = false 21 } 22 23 func TestAddErrSyncHandler_oneHandler(t *testing.T) { 24 ClearErrHandlers() 25 defer ClearErrHandlers() 26 27 AddSyncErrHandler(func(err Err, occ ErrOccasion) {}) 28 29 assert.NotNil(t, syncErrHandlers.head) 30 assert.NotNil(t, syncErrHandlers.last) 31 assert.Equal(t, syncErrHandlers.head, syncErrHandlers.last) 32 33 assert.Nil(t, syncErrHandlers.last.next) 34 assert.Nil(t, syncErrHandlers.head.next) 35 36 assert.NotNil(t, syncErrHandlers.head.handler) 37 assert.Equal(t, reflect.TypeOf(syncErrHandlers.head.handler).String(), "func(sabi.Err, sabi.ErrOccasion)") 38 } 39 40 func TestAddErrSyncHandler_twoHandlers(t *testing.T) { 41 ClearErrHandlers() 42 defer ClearErrHandlers() 43 44 AddSyncErrHandler(func(err Err, occ ErrOccasion) {}) 45 AddSyncErrHandler(func(err Err, occ ErrOccasion) {}) 46 47 assert.NotNil(t, syncErrHandlers.head) 48 assert.NotNil(t, syncErrHandlers.last) 49 assert.NotEqual(t, syncErrHandlers.head, syncErrHandlers.last) 50 51 assert.Equal(t, syncErrHandlers.head.next, syncErrHandlers.last) 52 assert.Nil(t, syncErrHandlers.last.next) 53 54 assert.NotNil(t, syncErrHandlers.head.handler) 55 assert.Equal(t, reflect.TypeOf(syncErrHandlers.head.handler).String(), "func(sabi.Err, sabi.ErrOccasion)") 56 57 assert.NotNil(t, syncErrHandlers.head.next.handler) 58 assert.Equal(t, reflect.TypeOf(syncErrHandlers.head.next.handler).String(), "func(sabi.Err, sabi.ErrOccasion)") 59 } 60 61 func TestAddErrAsyncHandler_zeroHandler(t *testing.T) { 62 ClearErrHandlers() 63 defer ClearErrHandlers() 64 65 assert.Nil(t, asyncErrHandlers.head) 66 assert.Nil(t, asyncErrHandlers.last) 67 } 68 69 func TestAddErrAsyncHandler_oneHandler(t *testing.T) { 70 ClearErrHandlers() 71 defer ClearErrHandlers() 72 73 AddAsyncErrHandler(func(err Err, occ ErrOccasion) {}) 74 75 assert.NotNil(t, asyncErrHandlers.head) 76 assert.NotNil(t, asyncErrHandlers.last) 77 assert.Equal(t, asyncErrHandlers.head, asyncErrHandlers.last) 78 79 assert.Nil(t, asyncErrHandlers.last.next) 80 assert.Nil(t, asyncErrHandlers.head.next) 81 82 assert.NotNil(t, asyncErrHandlers.head.handler) 83 assert.Equal(t, reflect.TypeOf(asyncErrHandlers.head.handler).String(), "func(sabi.Err, sabi.ErrOccasion)") 84 } 85 86 func TestAddErrAsyncHandler_twoHandlers(t *testing.T) { 87 ClearErrHandlers() 88 defer ClearErrHandlers() 89 90 AddAsyncErrHandler(func(err Err, occ ErrOccasion) {}) 91 AddAsyncErrHandler(func(err Err, occ ErrOccasion) {}) 92 93 assert.NotNil(t, asyncErrHandlers.head) 94 assert.NotNil(t, asyncErrHandlers.last) 95 assert.NotEqual(t, asyncErrHandlers.head, asyncErrHandlers.last) 96 97 assert.Equal(t, asyncErrHandlers.head.next, asyncErrHandlers.last) 98 assert.Nil(t, asyncErrHandlers.last.next) 99 100 assert.NotNil(t, asyncErrHandlers.head.handler) 101 assert.Equal(t, reflect.TypeOf(asyncErrHandlers.head.handler).String(), "func(sabi.Err, sabi.ErrOccasion)") 102 103 assert.NotNil(t, asyncErrHandlers.head.next.handler) 104 assert.Equal(t, reflect.TypeOf(asyncErrHandlers.head.next.handler).String(), "func(sabi.Err, sabi.ErrOccasion)") 105 } 106 107 func TestFixErrCfgs(t *testing.T) { 108 ClearErrHandlers() 109 defer ClearErrHandlers() 110 111 AddSyncErrHandler(func(err Err, occ ErrOccasion) {}) 112 AddAsyncErrHandler(func(err Err, occ ErrOccasion) {}) 113 114 assert.NotNil(t, syncErrHandlers.head) 115 assert.NotNil(t, syncErrHandlers.last) 116 assert.Equal(t, syncErrHandlers.head, syncErrHandlers.last) 117 assert.NotNil(t, syncErrHandlers.head.handler) 118 assert.Nil(t, syncErrHandlers.head.next) 119 assert.Nil(t, syncErrHandlers.last.next) 120 121 assert.NotNil(t, asyncErrHandlers.head) 122 assert.NotNil(t, asyncErrHandlers.last) 123 assert.Equal(t, asyncErrHandlers.head, asyncErrHandlers.last) 124 assert.NotNil(t, asyncErrHandlers.head.handler) 125 assert.Nil(t, asyncErrHandlers.head.next) 126 assert.Nil(t, asyncErrHandlers.last.next) 127 128 assert.False(t, isErrCfgsFixed) 129 130 FixErrCfgs() 131 132 assert.True(t, isErrCfgsFixed) 133 134 AddSyncErrHandler(func(err Err, occ ErrOccasion) {}) 135 AddAsyncErrHandler(func(err Err, occ ErrOccasion) {}) 136 137 assert.NotNil(t, syncErrHandlers.head) 138 assert.NotNil(t, syncErrHandlers.last) 139 assert.Equal(t, syncErrHandlers.head, syncErrHandlers.last) 140 assert.NotNil(t, syncErrHandlers.head.handler) 141 assert.Nil(t, syncErrHandlers.head.next) 142 assert.Nil(t, syncErrHandlers.last.next) 143 144 assert.NotNil(t, asyncErrHandlers.head) 145 assert.NotNil(t, asyncErrHandlers.last) 146 assert.Equal(t, asyncErrHandlers.head, asyncErrHandlers.last) 147 assert.NotNil(t, asyncErrHandlers.head.handler) 148 assert.Nil(t, asyncErrHandlers.head.next) 149 assert.Nil(t, asyncErrHandlers.last.next) 150 } 151 152 func TestNotifyErr_withNoErrHandler(t *testing.T) { 153 ClearErrHandlers() 154 defer ClearErrHandlers() 155 156 NewErr(ReasonForNotification{}) 157 158 assert.False(t, isErrCfgsFixed) 159 160 FixErrCfgs() 161 162 assert.True(t, isErrCfgsFixed) 163 164 NewErr(ReasonForNotification{}) 165 } 166 167 func TestNotifyErr_withHandlers(t *testing.T) { 168 ClearErrHandlers() 169 defer ClearErrHandlers() 170 171 syncLogs := list.New() 172 asyncLogs := list.New() 173 174 AddSyncErrHandler(func(err Err, occ ErrOccasion) { 175 syncLogs.PushBack( 176 err.ReasonName() + "-1:" + occ.File() + ":" + strconv.Itoa(occ.Line())) 177 occ.Time() 178 }) 179 AddSyncErrHandler(func(err Err, occ ErrOccasion) { 180 syncLogs.PushBack( 181 err.ReasonName() + "-2:" + occ.File() + ":" + strconv.Itoa(occ.Line())) 182 occ.Time() 183 }) 184 AddAsyncErrHandler(func(err Err, occ ErrOccasion) { 185 asyncLogs.PushBack( 186 err.ReasonName() + "-3:" + occ.File() + ":" + strconv.Itoa(occ.Line())) 187 occ.Time() 188 }) 189 190 NewErr(ReasonForNotification{}) 191 192 assert.False(t, isErrCfgsFixed) 193 194 assert.Equal(t, syncLogs.Len(), 0) 195 assert.Equal(t, asyncLogs.Len(), 0) 196 197 FixErrCfgs() 198 199 NewErr(ReasonForNotification{}) 200 201 assert.True(t, isErrCfgsFixed) 202 203 assert.Equal(t, syncLogs.Len(), 2) 204 assert.Equal(t, syncLogs.Front().Value, 205 "ReasonForNotification-1:notify_test.go:199") 206 assert.Equal(t, syncLogs.Front().Next().Value, 207 "ReasonForNotification-2:notify_test.go:199") 208 209 time.Sleep(100 * time.Millisecond) 210 211 assert.Equal(t, asyncLogs.Len(), 1) 212 assert.Equal(t, asyncLogs.Front().Value, 213 "ReasonForNotification-3:notify_test.go:199") 214 }