diff options
author | Chocobozzz <me@florianbigard.com> | 2021-06-16 15:14:41 +0200 |
---|---|---|
committer | Chocobozzz <me@florianbigard.com> | 2021-06-17 08:47:03 +0200 |
commit | 8ebf2a5d5d126e6ef9b89109124adf2a5e9e293d (patch) | |
tree | eee3ef972943be629519c2dc97928878dbd2d732 /server/tests/api/live/live-socket-messages.ts | |
parent | fd6584844b070cfc283902aba26f2853473e83d1 (diff) | |
download | PeerTube-8ebf2a5d5d126e6ef9b89109124adf2a5e9e293d.tar.gz PeerTube-8ebf2a5d5d126e6ef9b89109124adf2a5e9e293d.tar.zst PeerTube-8ebf2a5d5d126e6ef9b89109124adf2a5e9e293d.zip |
Refactor live manager
Diffstat (limited to 'server/tests/api/live/live-socket-messages.ts')
-rw-r--r-- | server/tests/api/live/live-socket-messages.ts | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/server/tests/api/live/live-socket-messages.ts b/server/tests/api/live/live-socket-messages.ts new file mode 100644 index 000000000..e00909ade --- /dev/null +++ b/server/tests/api/live/live-socket-messages.ts | |||
@@ -0,0 +1,196 @@ | |||
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 | }) | ||