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  }