diff options
Diffstat (limited to 'server/tests/api')
-rw-r--r-- | server/tests/api/live/index.ts | 1 | ||||
-rw-r--r-- | server/tests/api/live/live-rtmps.ts | 146 |
2 files changed, 147 insertions, 0 deletions
diff --git a/server/tests/api/live/index.ts b/server/tests/api/live/index.ts index e6bcef49f..105416b8d 100644 --- a/server/tests/api/live/index.ts +++ b/server/tests/api/live/index.ts | |||
@@ -1,6 +1,7 @@ | |||
1 | import './live-constraints' | 1 | import './live-constraints' |
2 | import './live-socket-messages' | 2 | import './live-socket-messages' |
3 | import './live-permanent' | 3 | import './live-permanent' |
4 | import './live-rtmps' | ||
4 | import './live-save-replay' | 5 | import './live-save-replay' |
5 | import './live-views' | 6 | import './live-views' |
6 | import './live' | 7 | import './live' |
diff --git a/server/tests/api/live/live-rtmps.ts b/server/tests/api/live/live-rtmps.ts new file mode 100644 index 000000000..378e6df3c --- /dev/null +++ b/server/tests/api/live/live-rtmps.ts | |||
@@ -0,0 +1,146 @@ | |||
1 | /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ | ||
2 | |||
3 | import 'mocha' | ||
4 | import * as chai from 'chai' | ||
5 | import { VideoPrivacy } from '@shared/models' | ||
6 | import { | ||
7 | buildAbsoluteFixturePath, | ||
8 | cleanupTests, | ||
9 | createSingleServer, | ||
10 | PeerTubeServer, | ||
11 | sendRTMPStream, | ||
12 | setAccessTokensToServers, | ||
13 | setDefaultVideoChannel, | ||
14 | stopFfmpeg, | ||
15 | testFfmpegStreamError, | ||
16 | waitUntilLivePublishedOnAllServers | ||
17 | } from '../../../../shared/extra-utils' | ||
18 | |||
19 | const expect = chai.expect | ||
20 | |||
21 | describe('Test live RTMPS', function () { | ||
22 | let server: PeerTubeServer | ||
23 | let rtmpUrl: string | ||
24 | let rtmpsUrl: string | ||
25 | |||
26 | async function createLiveWrapper () { | ||
27 | const liveAttributes = { | ||
28 | name: 'live', | ||
29 | channelId: server.store.channel.id, | ||
30 | privacy: VideoPrivacy.PUBLIC, | ||
31 | saveReplay: false | ||
32 | } | ||
33 | |||
34 | const { uuid } = await server.live.create({ fields: liveAttributes }) | ||
35 | |||
36 | const live = await server.live.get({ videoId: uuid }) | ||
37 | const video = await server.videos.get({ id: uuid }) | ||
38 | |||
39 | return Object.assign(video, live) | ||
40 | } | ||
41 | |||
42 | before(async function () { | ||
43 | this.timeout(120000) | ||
44 | |||
45 | server = await createSingleServer(1) | ||
46 | |||
47 | // Get the access tokens | ||
48 | await setAccessTokensToServers([ server ]) | ||
49 | await setDefaultVideoChannel([ server ]) | ||
50 | |||
51 | await server.config.updateCustomSubConfig({ | ||
52 | newConfig: { | ||
53 | live: { | ||
54 | enabled: true, | ||
55 | allowReplay: true, | ||
56 | transcoding: { | ||
57 | enabled: false | ||
58 | } | ||
59 | } | ||
60 | } | ||
61 | }) | ||
62 | |||
63 | rtmpUrl = 'rtmp://' + server.hostname + ':' + server.rtmpPort + '/live' | ||
64 | rtmpsUrl = 'rtmps://' + server.hostname + ':' + server.rtmpsPort + '/live' | ||
65 | }) | ||
66 | |||
67 | it('Should enable RTMPS endpoint only', async function () { | ||
68 | this.timeout(240000) | ||
69 | |||
70 | await server.kill() | ||
71 | await server.run({ | ||
72 | live: { | ||
73 | rtmp: { | ||
74 | enabled: false | ||
75 | }, | ||
76 | rtmps: { | ||
77 | enabled: true, | ||
78 | port: server.rtmpsPort, | ||
79 | key_file: buildAbsoluteFixturePath('rtmps.key'), | ||
80 | cert_file: buildAbsoluteFixturePath('rtmps.cert') | ||
81 | } | ||
82 | } | ||
83 | }) | ||
84 | |||
85 | { | ||
86 | const liveVideo = await createLiveWrapper() | ||
87 | |||
88 | expect(liveVideo.rtmpUrl).to.not.exist | ||
89 | expect(liveVideo.rtmpsUrl).to.equal(rtmpsUrl) | ||
90 | |||
91 | const command = sendRTMPStream({ rtmpBaseUrl: rtmpUrl, streamKey: liveVideo.streamKey }) | ||
92 | await testFfmpegStreamError(command, true) | ||
93 | } | ||
94 | |||
95 | { | ||
96 | const liveVideo = await createLiveWrapper() | ||
97 | |||
98 | const command = sendRTMPStream({ rtmpBaseUrl: rtmpsUrl, streamKey: liveVideo.streamKey }) | ||
99 | await waitUntilLivePublishedOnAllServers([ server ], liveVideo.uuid) | ||
100 | await stopFfmpeg(command) | ||
101 | } | ||
102 | }) | ||
103 | |||
104 | it('Should enable both RTMP and RTMPS', async function () { | ||
105 | this.timeout(240000) | ||
106 | |||
107 | await server.kill() | ||
108 | await server.run({ | ||
109 | live: { | ||
110 | rtmp: { | ||
111 | enabled: true, | ||
112 | port: server.rtmpPort | ||
113 | }, | ||
114 | rtmps: { | ||
115 | enabled: true, | ||
116 | port: server.rtmpsPort, | ||
117 | key_file: buildAbsoluteFixturePath('rtmps.key'), | ||
118 | cert_file: buildAbsoluteFixturePath('rtmps.cert') | ||
119 | } | ||
120 | } | ||
121 | }) | ||
122 | |||
123 | { | ||
124 | const liveVideo = await createLiveWrapper() | ||
125 | |||
126 | expect(liveVideo.rtmpUrl).to.equal(rtmpUrl) | ||
127 | expect(liveVideo.rtmpsUrl).to.equal(rtmpsUrl) | ||
128 | |||
129 | const command = sendRTMPStream({ rtmpBaseUrl: rtmpUrl, streamKey: liveVideo.streamKey }) | ||
130 | await waitUntilLivePublishedOnAllServers([ server ], liveVideo.uuid) | ||
131 | await stopFfmpeg(command) | ||
132 | } | ||
133 | |||
134 | { | ||
135 | const liveVideo = await createLiveWrapper() | ||
136 | |||
137 | const command = sendRTMPStream({ rtmpBaseUrl: rtmpsUrl, streamKey: liveVideo.streamKey }) | ||
138 | await waitUntilLivePublishedOnAllServers([ server ], liveVideo.uuid) | ||
139 | await stopFfmpeg(command) | ||
140 | } | ||
141 | }) | ||
142 | |||
143 | after(async function () { | ||
144 | await cleanupTests([ server ]) | ||
145 | }) | ||
146 | }) | ||