]>
Commit | Line | Data |
---|---|---|
8ebf2a5d C |
1 | /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ |
2 | ||
3 | import 'mocha' | |
4 | import * as chai from 'chai' | |
5 | import { getLiveNotificationSocket } from '@shared/extra-utils/socket/socket-io' | |
6 | import { VideoPrivacy, VideoState } from '@shared/models' | |
7 | import { | |
8 | cleanupTests, | |
9 | createLive, | |
10 | doubleFollow, | |
11 | flushAndRunMultipleServers, | |
12 | getVideoIdFromUUID, | |
13 | sendRTMPStreamInVideo, | |
14 | ServerInfo, | |
15 | setAccessTokensToServers, | |
16 | setDefaultVideoChannel, | |
17 | stopFfmpeg, | |
18 | updateCustomSubConfig, | |
19 | viewVideo, | |
20 | wait, | |
21 | waitJobs, | |
22 | waitUntilLiveEnded, | |
23 | waitUntilLivePublishedOnAllServers | |
24 | } from '../../../../shared/extra-utils' | |
25 | ||
26 | const expect = chai.expect | |
27 | ||
28 | describe('Test live', function () { | |
29 | let servers: ServerInfo[] = [] | |
30 | ||
31 | before(async function () { | |
32 | this.timeout(120000) | |
33 | ||
34 | servers = await flushAndRunMultipleServers(2) | |
35 | ||
36 | // Get the access tokens | |
37 | await setAccessTokensToServers(servers) | |
38 | await setDefaultVideoChannel(servers) | |
39 | ||
40 | await updateCustomSubConfig(servers[0].url, servers[0].accessToken, { | |
41 | live: { | |
42 | enabled: true, | |
43 | allowReplay: true, | |
44 | transcoding: { | |
45 | enabled: false | |
46 | } | |
47 | } | |
48 | }) | |
49 | ||
50 | // Server 1 and server 2 follow each other | |
51 | await doubleFollow(servers[0], servers[1]) | |
52 | }) | |
53 | ||
54 | describe('Live socket messages', function () { | |
55 | ||
56 | async function createLiveWrapper () { | |
57 | const liveAttributes = { | |
58 | name: 'live video', | |
59 | channelId: servers[0].videoChannel.id, | |
60 | privacy: VideoPrivacy.PUBLIC | |
61 | } | |
62 | ||
63 | const res = await createLive(servers[0].url, servers[0].accessToken, liveAttributes) | |
64 | return res.body.video.uuid | |
65 | } | |
66 | ||
67 | it('Should correctly send a message when the live starts and ends', async function () { | |
68 | this.timeout(60000) | |
69 | ||
70 | const localStateChanges: VideoState[] = [] | |
71 | const remoteStateChanges: VideoState[] = [] | |
72 | ||
73 | const liveVideoUUID = await createLiveWrapper() | |
74 | await waitJobs(servers) | |
75 | ||
76 | { | |
77 | const videoId = await getVideoIdFromUUID(servers[0].url, liveVideoUUID) | |
78 | ||
79 | const localSocket = getLiveNotificationSocket(servers[0].url) | |
80 | localSocket.on('state-change', data => localStateChanges.push(data.state)) | |
81 | localSocket.emit('subscribe', { videoId }) | |
82 | } | |
83 | ||
84 | { | |
85 | const videoId = await getVideoIdFromUUID(servers[1].url, liveVideoUUID) | |
86 | ||
87 | const remoteSocket = getLiveNotificationSocket(servers[1].url) | |
88 | remoteSocket.on('state-change', data => remoteStateChanges.push(data.state)) | |
89 | remoteSocket.emit('subscribe', { videoId }) | |
90 | } | |
91 | ||
92 | const command = await sendRTMPStreamInVideo(servers[0].url, servers[0].accessToken, liveVideoUUID) | |
93 | ||
94 | await waitUntilLivePublishedOnAllServers(servers, liveVideoUUID) | |
95 | await waitJobs(servers) | |
96 | ||
97 | for (const stateChanges of [ localStateChanges, remoteStateChanges ]) { | |
98 | expect(stateChanges).to.have.length.at.least(1) | |
99 | expect(stateChanges[stateChanges.length - 1]).to.equal(VideoState.PUBLISHED) | |
100 | } | |
101 | ||
102 | await stopFfmpeg(command) | |
103 | ||
104 | for (const server of servers) { | |
105 | await waitUntilLiveEnded(server.url, server.accessToken, liveVideoUUID) | |
106 | } | |
107 | await waitJobs(servers) | |
108 | ||
109 | for (const stateChanges of [ localStateChanges, remoteStateChanges ]) { | |
110 | expect(stateChanges).to.have.length.at.least(2) | |
111 | expect(stateChanges[stateChanges.length - 1]).to.equal(VideoState.LIVE_ENDED) | |
112 | } | |
113 | }) | |
114 | ||
115 | it('Should correctly send views change notification', async function () { | |
116 | this.timeout(60000) | |
117 | ||
118 | let localLastVideoViews = 0 | |
119 | let remoteLastVideoViews = 0 | |
120 | ||
121 | const liveVideoUUID = await createLiveWrapper() | |
122 | await waitJobs(servers) | |
123 | ||
124 | { | |
125 | const videoId = await getVideoIdFromUUID(servers[0].url, liveVideoUUID) | |
126 | ||
127 | const localSocket = getLiveNotificationSocket(servers[0].url) | |
128 | localSocket.on('views-change', data => { localLastVideoViews = data.views }) | |
129 | localSocket.emit('subscribe', { videoId }) | |
130 | } | |
131 | ||
132 | { | |
133 | const videoId = await getVideoIdFromUUID(servers[1].url, liveVideoUUID) | |
134 | ||
135 | const remoteSocket = getLiveNotificationSocket(servers[1].url) | |
136 | remoteSocket.on('views-change', data => { remoteLastVideoViews = data.views }) | |
137 | remoteSocket.emit('subscribe', { videoId }) | |
138 | } | |
139 | ||
140 | const command = await sendRTMPStreamInVideo(servers[0].url, servers[0].accessToken, liveVideoUUID) | |
141 | ||
142 | await waitUntilLivePublishedOnAllServers(servers, liveVideoUUID) | |
143 | await waitJobs(servers) | |
144 | ||
145 | expect(localLastVideoViews).to.equal(0) | |
146 | expect(remoteLastVideoViews).to.equal(0) | |
147 | ||
148 | await viewVideo(servers[0].url, liveVideoUUID) | |
149 | await viewVideo(servers[1].url, liveVideoUUID) | |
150 | ||
151 | await waitJobs(servers) | |
152 | await wait(5000) | |
153 | await waitJobs(servers) | |
154 | ||
155 | expect(localLastVideoViews).to.equal(2) | |
156 | expect(remoteLastVideoViews).to.equal(2) | |
157 | ||
158 | await stopFfmpeg(command) | |
159 | }) | |
160 | ||
161 | it('Should not receive a notification after unsubscribe', async function () { | |
162 | this.timeout(120000) | |
163 | ||
164 | const stateChanges: VideoState[] = [] | |
165 | ||
166 | const liveVideoUUID = await createLiveWrapper() | |
167 | await waitJobs(servers) | |
168 | ||
169 | const videoId = await getVideoIdFromUUID(servers[0].url, liveVideoUUID) | |
170 | ||
171 | const socket = getLiveNotificationSocket(servers[0].url) | |
172 | socket.on('state-change', data => stateChanges.push(data.state)) | |
173 | socket.emit('subscribe', { videoId }) | |
174 | ||
175 | const command = await sendRTMPStreamInVideo(servers[0].url, servers[0].accessToken, liveVideoUUID) | |
176 | ||
177 | await waitUntilLivePublishedOnAllServers(servers, liveVideoUUID) | |
178 | await waitJobs(servers) | |
179 | ||
180 | // Notifier waits before sending a notification | |
181 | await wait(10000) | |
182 | ||
183 | expect(stateChanges).to.have.lengthOf(1) | |
184 | socket.emit('unsubscribe', { videoId }) | |
185 | ||
186 | await stopFfmpeg(command) | |
187 | await waitJobs(servers) | |
188 | ||
189 | expect(stateChanges).to.have.lengthOf(1) | |
190 | }) | |
191 | }) | |
192 | ||
193 | after(async function () { | |
194 | await cleanupTests(servers) | |
195 | }) | |
196 | }) |