Live video on the AT Protocol
1package misttriggers
2
3import (
4 "bytes"
5 "context"
6 "fmt"
7 "net/http"
8 "net/http/httptest"
9 "testing"
10
11 "github.com/stretchr/testify/require"
12 "stream.place/streamplace/pkg/config"
13)
14
15var userNewPayload = MistTriggerBody(`
16 video+c447r0acdmqhhhpb
17 127.0.0.1
18 2251870645
19 HLS
20 http://localhost:8080/hls/video%20c447r0acdmqhhhpb/index.m3u8?stream=video%2bc447r0acdmqhhhpb
21 073458ebf34cb051d3baea5f82263d0643c4d3aa425b5ac53e08cf9c1e70e7fd
22`)
23
24var userNewPayloadBadLines = MistTriggerBody(`
25 video+c447r0acdmqhhhpb
26`)
27
28var userNewPayloadBadURL = MistTriggerBody(`
29 video+c447r0acdmqhhhpb
30 127.0.0.1
31 2251870645
32 HLS
33 http://hostname with spaces.com
34 073458ebf34cb051d3baea5f82263d0643c4d3aa425b5ac53e08cf9c1e70e7fd
35`)
36
37func TestItCanParseAValidUserNewPayload(t *testing.T) {
38 p, err := ParseUserNewPayload(userNewPayload)
39 require.NoError(t, err)
40 require.Equal(t, p.StreamName, "video+c447r0acdmqhhhpb")
41 require.Equal(t, p.Hostname, "127.0.0.1")
42 require.Equal(t, p.ConnectionID, "2251870645")
43 require.Equal(t, p.Protocol, "HLS")
44 require.Equal(t, p.URL.Scheme, "http")
45 require.Equal(t, p.URL.Host, "localhost:8080")
46 require.Equal(t, p.URL.Path, "/hls/video c447r0acdmqhhhpb/index.m3u8")
47 require.Equal(t, p.URL.Query().Get("stream"), "video+c447r0acdmqhhhpb")
48 require.Equal(t, p.FullURL, "http://localhost:8080/hls/video%20c447r0acdmqhhhpb/index.m3u8?stream=video%2bc447r0acdmqhhhpb")
49 require.Equal(t, p.SessionID, "073458ebf34cb051d3baea5f82263d0643c4d3aa425b5ac53e08cf9c1e70e7fd")
50}
51
52func TestItCanRejectABadUserNewPayload(t *testing.T) {
53 _, err := ParseUserNewPayload(userNewPayloadBadLines)
54 require.Error(t, err)
55 _, err = ParseUserNewPayload(userNewPayloadBadURL)
56 require.Error(t, err)
57}
58
59func doUserNewRequest(t *testing.T, payload MistTriggerBody, cb func(ctx context.Context, p *UserNewPayload) (bool, error)) *httptest.ResponseRecorder {
60 broker := NewTriggerBroker()
61 broker.OnUserNew(cb)
62 d := NewMistCallbackHandlersCollection(&config.CLI{}, broker)
63 req, err := http.NewRequest("POST", "/trigger", bytes.NewBuffer([]byte(payload)))
64 require.NoError(t, err)
65 rr := httptest.NewRecorder()
66 d.TriggerUserNew(context.Background(), rr, req, payload)
67 return rr
68}
69
70func TestItCanHandleUserNewRequests(t *testing.T) {
71 rr := doUserNewRequest(t, userNewPayload, func(ctx context.Context, p *UserNewPayload) (bool, error) {
72 require.Equal(t, p.StreamName, "video+c447r0acdmqhhhpb")
73 return true, nil
74 })
75 require.Equal(t, rr.Result().StatusCode, 200)
76 require.Equal(t, rr.Body.String(), "true")
77}
78
79func TestItCanRejectUserNewRequests(t *testing.T) {
80 rr := doUserNewRequest(t, userNewPayload, func(ctx context.Context, p *UserNewPayload) (bool, error) {
81 return false, nil
82 })
83 require.Equal(t, rr.Result().StatusCode, 200)
84 require.Equal(t, rr.Body.String(), "false")
85}
86
87func TestItCanHandleFailureToHandle(t *testing.T) {
88 // should always return false on error no matter what we return
89 for _, state := range []bool{true, false} {
90 rr := doUserNewRequest(t, userNewPayload, func(ctx context.Context, p *UserNewPayload) (bool, error) {
91 return state, fmt.Errorf("something went wrong")
92 })
93 require.Equal(t, rr.Result().StatusCode, 500)
94 require.Equal(t, rr.Body.String(), "false")
95 }
96}
97
98func TestItCanErrorUserNewRequests(t *testing.T) {
99 for _, testCase := range []MistTriggerBody{userNewPayloadBadLines, userNewPayloadBadURL} {
100 rr := doUserNewRequest(t, testCase, func(ctx context.Context, p *UserNewPayload) (bool, error) {
101 require.Fail(t, "test should be failing before it gets to me")
102 return false, nil
103 })
104 require.Equal(t, rr.Result().StatusCode, 400)
105 }
106}