github.com/CyCoreSystems/ari@v4.8.4+incompatible/stdbus/bus_test.go (about) 1 package stdbus 2 3 import ( 4 "testing" 5 "time" 6 7 "github.com/CyCoreSystems/ari" 8 ) 9 10 var dtmfTestEventData = ` 11 { 12 "channel": { 13 "id": "9ae755c1-28a1-11e7-a1b1-0a580a480105", 14 "dialplan": { 15 "priority": 1, 16 "context": "default", 17 "exten": "9ae88e27-28a1-11e7-ba20-0a580a480707" 18 }, 19 "creationtime": "2017-04-24T03:53:41.188+0000", 20 "name": "Local/9ae88e27-28a1-11e7-ba20-0a580a480707@default-0000008b;1", 21 "state": "Up", 22 "connected": { 23 "name": "", 24 "number": "" 25 }, 26 "caller": { 27 "name": "", 28 "number": "" 29 }, 30 "accountcode": "", 31 "language": "en" 32 }, 33 "duration_ms": 240, 34 "type": "ChannelDtmfReceived", 35 "application": "sdp", 36 "timestamp": "2017-04-24T03:53:42.155+0000", 37 "digit": "1", 38 "asterisk_id": "42:01:0a:64:00:06" 39 } 40 ` 41 42 var dtmfTestEvent ari.Event 43 44 func init() { 45 var err error 46 dtmfTestEvent, err = ari.DecodeEvent([]byte(dtmfTestEventData)) 47 if err != nil { 48 panic("failed to construct dtmf test event: " + err.Error()) 49 } 50 } 51 52 func TestSubscribe(t *testing.T) { 53 b := &bus{ 54 subs: []*subscription{}, 55 } 56 57 defer b.Close() 58 59 sub := b.Subscribe(nil, ari.Events.ChannelDtmfReceived) 60 if len(b.subs) != 1 { 61 t.Error("failed to add subscription to bus") 62 } 63 sub.Cancel() 64 } 65 66 func TestClose(t *testing.T) { 67 defer func() { 68 if r := recover(); r != nil { 69 t.Error("Close caused a panic") 70 } 71 }() 72 73 b := New() 74 sub := b.Subscribe(nil, ari.Events.ChannelDtmfReceived) 75 sub.Cancel() 76 sub.Cancel() 77 78 sub2 := b.Subscribe(nil, ari.Events.ChannelDestroyed).(*subscription) 79 80 b.Close() 81 b.Close() 82 83 if !sub2.closed { 84 t.Error("subscription was not marked as closed") 85 return 86 } 87 88 select { 89 case _, ok := <-sub2.C: 90 if ok { 91 t.Error("subscription channel is not closed") 92 return 93 } 94 default: 95 } 96 97 } 98 99 func TestEvents(t *testing.T) { 100 b := New() 101 defer b.Close() 102 103 sub := b.Subscribe(nil, ari.Events.All) 104 defer sub.Cancel() 105 106 b.Send(dtmfTestEvent) 107 108 select { 109 case <-time.After(time.Millisecond): 110 t.Error("failed to receive event") 111 return 112 case e, ok := <-sub.Events(): 113 t.Log("event received") 114 if !ok { 115 t.Error("events channel was closed") 116 return 117 } 118 if e == nil { 119 t.Error("received empty event") 120 return 121 } 122 123 dtmf, ok := e.(*ari.ChannelDtmfReceived) 124 if !ok { 125 t.Errorf("event is not a DTMF received event") 126 return 127 } 128 if dtmf.Channel.ID != "9ae755c1-28a1-11e7-a1b1-0a580a480105" { 129 t.Errorf("Failed to parse channel subentity on DTMF event") 130 return 131 } 132 } 133 } 134 135 func TestEventsMultipleKeys(t *testing.T) { 136 b := New() 137 defer b.Close() 138 139 sub := b.Subscribe(nil, ari.Events.All) 140 defer sub.Cancel() 141 142 multiKeyEvent := ari.BridgeCreated{ 143 Bridge: ari.BridgeData{ 144 ID: "A", 145 ChannelIDs: []string{"x", "y"}, 146 }, 147 } 148 149 keys := multiKeyEvent.Keys() 150 if len(keys) != 5 { 151 t.Errorf("Expected BridgeCreated.Keys() to be 2, got '%v'", len(keys)) 152 } 153 154 b.Send(&multiKeyEvent) 155 156 var eventCount = 0 157 L: 158 for { 159 select { 160 case <-time.After(time.Millisecond): 161 break L 162 case <-sub.Events(): 163 eventCount++ 164 } 165 } 166 167 if eventCount != 1 { 168 t.Errorf("Expected 1 event to be sent, got %v", eventCount) 169 } 170 }