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  }