Files
go-sip/internal/asterisk/answer_test.go
T

62 lines
2.3 KiB
Go

package asterisk
import (
"context"
"errors"
"strings"
"testing"
"time"
"github.com/CyCoreSystems/ari/v5"
)
type answerEvents struct {
ari.Subscription
events chan ari.Event
}
func (f answerEvents) Events() <-chan ari.Event { return f.events }
func (f answerEvents) Cancel() {}
func TestAwaitDialUpRequiresStasisAndPostDialUp(t *testing.T) {
const id = "execution-1"
for _, tc := range []struct {
name string
events []ari.Event
answer bool
}{
{"created_not_answered", []ari.Event{&ari.StasisStart{Channel: ari.ChannelData{ID: id}}}, false},
{"up_without_stasis", []ari.Event{&ari.ChannelStateChange{Channel: ari.ChannelData{ID: id, State: "Up"}}}, false},
{"wrong_channel", []ari.Event{&ari.StasisStart{Channel: ari.ChannelData{ID: "other"}}, &ari.ChannelStateChange{Channel: ari.ChannelData{ID: "other", State: "Up"}}}, false},
{"answer", []ari.Event{&ari.StasisStart{Channel: ari.ChannelData{ID: id}}, &ari.ChannelStateChange{Channel: ari.ChannelData{ID: id, State: "Up"}}}, true},
{"answer_reordered", []ari.Event{&ari.ChannelStateChange{Channel: ari.ChannelData{ID: id, State: "Up"}}, &ari.StasisStart{Channel: ari.ChannelData{ID: id}}}, true},
{"destroyed_before_answer", []ari.Event{&ari.StasisStart{Channel: ari.ChannelData{ID: id}}, &ari.ChannelDestroyed{Channel: ari.ChannelData{ID: id}}}, false},
} {
t.Run(tc.name, func(t *testing.T) {
ch := make(chan ari.Event, len(tc.events))
for _, event := range tc.events {
ch <- event
}
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Millisecond)
defer cancel()
err := awaitDialUp(ctx, answerEvents{events: ch}, id)
if (err == nil) != tc.answer {
t.Fatalf("answer proof mismatch: %v", err)
}
})
}
}
func TestAwaitDialUpFailsClosedOnLostEventsOrCancellation(t *testing.T) {
ch := make(chan ari.Event)
close(ch)
if err := awaitDialUp(context.Background(), answerEvents{events: ch}, "execution-1"); err == nil || !strings.Contains(err.Error(), "closed") {
t.Fatalf("subscription loss was hidden: %v", err)
}
ctx, cancel := context.WithCancel(context.Background())
cancel()
if err := awaitDialUp(ctx, answerEvents{events: make(chan ari.Event)}, "execution-1"); !errors.Is(err, context.Canceled) {
t.Fatalf("cancellation was hidden: %v", err)
}
}