aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/tests
diff options
context:
space:
mode:
authorChocobozzz <me@florianbigard.com>2021-11-05 11:36:03 +0100
committerChocobozzz <me@florianbigard.com>2021-11-05 11:38:17 +0100
commitdf1db951c512a58110171d046ef367789df02733 (patch)
treea8894b4a4864d9e378923f011b4ca9d206e2ee0b /server/tests
parent8dd754c76735417305c4b68e2ada6f623e9d7650 (diff)
downloadPeerTube-df1db951c512a58110171d046ef367789df02733.tar.gz
PeerTube-df1db951c512a58110171d046ef367789df02733.tar.zst
PeerTube-df1db951c512a58110171d046ef367789df02733.zip
Support RTMPS
Diffstat (limited to 'server/tests')
-rw-r--r--server/tests/api/live/index.ts1
-rw-r--r--server/tests/api/live/live-rtmps.ts146
-rw-r--r--server/tests/fixtures/rtmps.cert21
-rw-r--r--server/tests/fixtures/rtmps.key28
4 files changed, 196 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 @@
1import './live-constraints' 1import './live-constraints'
2import './live-socket-messages' 2import './live-socket-messages'
3import './live-permanent' 3import './live-permanent'
4import './live-rtmps'
4import './live-save-replay' 5import './live-save-replay'
5import './live-views' 6import './live-views'
6import './live' 7import './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
3import 'mocha'
4import * as chai from 'chai'
5import { VideoPrivacy } from '@shared/models'
6import {
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
19const expect = chai.expect
20
21describe('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})
diff --git a/server/tests/fixtures/rtmps.cert b/server/tests/fixtures/rtmps.cert
new file mode 100644
index 000000000..3ef606c52
--- /dev/null
+++ b/server/tests/fixtures/rtmps.cert
@@ -0,0 +1,21 @@
1-----BEGIN CERTIFICATE-----
2MIIDazCCAlOgAwIBAgIUKNycLAZUs2jFsWUW+zZhBkpLB2wwDQYJKoZIhvcNAQEL
3BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
4GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMTExMDUxMDA4MzhaFw0yMTEy
5MDUxMDA4MzhaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw
6HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEB
7AQUAA4IBDwAwggEKAoIBAQDak20d81KG/9mVLU6Qw/uRniC935yf9Rlp8FVCDxUd
8zLbfHjrnIOv8kqinUI0nuEQC4DnF7Rbafe88WDU33Q8ixU/R0czUGq1AEwIjyN30
95NjokCb26xWIly7RCfc/Ot6tjguHwKvcxqJMNC0Lit9Go9MDVnGFLkgHia68P72T
10ZDVV44YpzwYDicwQs5C4nZ4yzAeclia07qfUY0VAEZlxJ/9zjwYHCT0AKaEPH35E
11dUvjuvJ1OSHSN1S4acR+TPR3FwKQh3H/M/GWIqoiIOpdjFUBLs80QOM2aNrLmlyP
12JtyFJLxCP7Ery9fGY/yzHeSxpgOKwZopD6uHZKi5yazNAgMBAAGjUzBRMB0GA1Ud
13DgQWBBSSjhRQdWsybNQMLMhkwV+xiP2uoDAfBgNVHSMEGDAWgBSSjhRQdWsybNQM
14LMhkwV+xiP2uoDAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQC8
15rJu3J5sqVKNQaXOmLPd49RM7KG3Y1KPqbQi1lh+sW6aefZ9daeh3JDYGBZGPG/Fi
16IMMP+LhGG0WqDm4ClK00wyNhBuNPEyzvuN/WMRX5djPxO1IZi+KogFwXsn853Ov9
17oV3nxArNNjDu2n92FiB7RTlXRXPIoRo2zEBcLvveGySn9XUazRzlqx6FAxYe2xsw
18U3cZ6/wwU1YsEZa5bwIQk+gkFj3zDsTyEkn2ntcE2NlR+AhCHKa/yAxgPFycAVPX
192o+wNnc6H4syP98mMGj9hEE3RSJyCPgGBlgi7Swl64G3YygFPJzfLX9YTuxwr/eI
20oitEjF9ljtmdEnf0RdOj
21-----END CERTIFICATE-----
diff --git a/server/tests/fixtures/rtmps.key b/server/tests/fixtures/rtmps.key
new file mode 100644
index 000000000..14a85e70a
--- /dev/null
+++ b/server/tests/fixtures/rtmps.key
@@ -0,0 +1,28 @@
1-----BEGIN PRIVATE KEY-----
2MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDak20d81KG/9mV
3LU6Qw/uRniC935yf9Rlp8FVCDxUdzLbfHjrnIOv8kqinUI0nuEQC4DnF7Rbafe88
4WDU33Q8ixU/R0czUGq1AEwIjyN305NjokCb26xWIly7RCfc/Ot6tjguHwKvcxqJM
5NC0Lit9Go9MDVnGFLkgHia68P72TZDVV44YpzwYDicwQs5C4nZ4yzAeclia07qfU
6Y0VAEZlxJ/9zjwYHCT0AKaEPH35EdUvjuvJ1OSHSN1S4acR+TPR3FwKQh3H/M/GW
7IqoiIOpdjFUBLs80QOM2aNrLmlyPJtyFJLxCP7Ery9fGY/yzHeSxpgOKwZopD6uH
8ZKi5yazNAgMBAAECggEAND7C+UK8+jnTl13CBsZhrnfemaQGexGJ5pGkv2p9gKb7
9Gy/Nooty/OdNWtjdNJ5N22YfSRkXulgZxBHNfrHfOU9yedOtIxHRUZx5iXYs36mH
1002cJeUHN3t1MOnkoWTvIGDH4vZUnP1lXV+Gs1rJ2Fht4h7a04cGjQ/H8C1EtDjqX
11kzH2T/gwo5hdGrxifRTs5wCVoP/iUwNtBI4WrY2rfC6sV+NOICgp0xX0NvGWZ8UT
12K1Ntpl8IxnxmeBd26d+Gbjc9d9fIRDtyXby4YOIlDZxnIiZEI0I452JqGl/jrXaP
13F3Troet4OBj5uH5s374d6ubKq66XogiLMIjEj2tYfQKBgQDtuaOu+y549bFJKVc9
14TCiWSOl/0j2kKKG8UG23zMC//AT13WqZDT5ObfOAuMhy70au/PD84D9RU/+gRVWb
15ptfybD9ugRNC8PkmdT82uYtZpS4+Xw4qyWVRgqQFmjSYz63cLcULVi8kiG8XmG5u
16QGgT/tNv5mxhOMUGSxhClOpLBwKBgQDrYO9UrLs+gDVKbHF4Dh+YJpaLnwwF+TFA
17j3ZbkE0XEeeXp/YDgyClmWwEkteJeNljtreCZ9gMkx3JdR9i8uecUQ2tFDBg3cN0
18BZAex2jFwSb0QbfzHNnE07I+aEIfHHjYXjzABl+1Yt95giKjce0Ke+8Zzahue0+9
19lYcAHemQiwKBgQCs9JAbIdJo3NBUW0iGZ19sH7YKciq4wXsSaC27OLPPugrd2m7Q
201arMIwCzWT01KdLyQ0MNqBVJFWT49RjYuuWIEauAuVYLMQkEKu+H4Cx7V0syw7Op
21+4bEa9jr3op/1zE17PLcUaLQ4JZ6w0Ms4Z0XVyH72thlT4lBD+ehoXhohwKBgEtJ
22LAPnY9Sv6Vuup/SAf/aIkSqDarMWa3x85pyO4Tl5zpuha3zgGjcdhYFI/ovIDbBp
23JvUdBeuvup1PSwS5MP+8pSUxCfBRvkyD4v8VRRvLlgwWYSHvnm/oTmDLtCqDTtvV
24+JRq9X3s7BHPYAjrTahGz8lvEGqWIoE/LHkLGEPVAoGAaF3VHuqDfmD9PJUAlsU1
25qxN7yfOd2ve0+66Ghus24DVqUFqwp5f2AxZXYUtSaNUp8fVbqIi+Yq3YDTU2KfId
265QNA/AiKi4VUNLElsG5DZlbszsE5KNp9fWQoggdQ5LND7AGEKeFERHOVQ7C5sc/C
27omIqK5/PsZmaf4OZLyecxJY=
28-----END PRIVATE KEY-----