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) } }