1 /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
2 import { expect } from 'chai'
4 checkPeerTubeRunnerCacheIsEmpty,
5 completeCheckHlsPlaylist,
6 completeWebVideoFilesCheck,
8 } from '@server/tests/shared'
9 import { areMockObjectStorageTestsDisabled, getAllFiles, wait } from '@shared/core-utils'
10 import { VideoPrivacy } from '@shared/models'
13 createMultipleServers,
17 setAccessTokensToServers,
18 setDefaultVideoChannel,
20 } from '@shared/server-commands'
22 describe('Test VOD transcoding in peertube-runner program', function () {
23 let servers: PeerTubeServer[] = []
24 let peertubeRunner: PeerTubeRunnerProcess
26 function runSuite (options: {
27 webtorrentEnabled: boolean
29 objectStorage?: ObjectStorageCommand
31 const { webtorrentEnabled, hlsEnabled, objectStorage } = options
33 const objectStorageBaseUrlWebTorrent = objectStorage
34 ? objectStorage.getMockWebVideosBaseUrl()
37 const objectStorageBaseUrlHLS = objectStorage
38 ? objectStorage.getMockPlaylistBaseUrl()
41 it('Should upload a classic video mp4 and transcode it', async function () {
44 const { uuid } = await servers[0].videos.quickUpload({ name: 'mp4', fixture: 'video_short.mp4' })
46 await waitJobs(servers, { runnerJobs: true })
48 for (const server of servers) {
49 if (webtorrentEnabled) {
50 await completeWebVideoFilesCheck({
52 originServer: servers[0],
53 fixture: 'video_short.mp4',
55 objectStorageBaseUrl: objectStorageBaseUrlWebTorrent,
68 await completeCheckHlsPlaylist({
69 hlsOnly: !webtorrentEnabled,
72 objectStorageBaseUrl: objectStorageBaseUrlHLS,
73 resolutions: [ 720, 480, 360, 240, 144, 0 ]
79 it('Should upload a webm video and transcode it', async function () {
82 const { uuid } = await servers[0].videos.quickUpload({ name: 'mp4', fixture: 'video_short.webm' })
84 await waitJobs(servers, { runnerJobs: true })
86 for (const server of servers) {
87 if (webtorrentEnabled) {
88 await completeWebVideoFilesCheck({
90 originServer: servers[0],
91 fixture: 'video_short.webm',
93 objectStorageBaseUrl: objectStorageBaseUrlWebTorrent,
106 await completeCheckHlsPlaylist({
107 hlsOnly: !webtorrentEnabled,
110 objectStorageBaseUrl: objectStorageBaseUrlHLS,
111 resolutions: [ 720, 480, 360, 240, 144, 0 ]
117 it('Should upload an audio only video and transcode it', async function () {
120 const attributes = { name: 'audio_without_preview', fixture: 'sample.ogg' }
121 const { uuid } = await servers[0].videos.upload({ attributes, mode: 'resumable' })
123 await waitJobs(servers, { runnerJobs: true })
125 for (const server of servers) {
126 if (webtorrentEnabled) {
127 await completeWebVideoFilesCheck({
129 originServer: servers[0],
130 fixture: 'sample.ogg',
132 objectStorageBaseUrl: objectStorageBaseUrlWebTorrent,
144 await completeCheckHlsPlaylist({
145 hlsOnly: !webtorrentEnabled,
148 objectStorageBaseUrl: objectStorageBaseUrlHLS,
149 resolutions: [ 480, 360, 240, 144, 0 ]
155 it('Should upload a private video and transcode it', async function () {
158 const { uuid } = await servers[0].videos.quickUpload({ name: 'mp4', fixture: 'video_short.mp4', privacy: VideoPrivacy.PRIVATE })
160 await waitJobs(servers, { runnerJobs: true })
162 if (webtorrentEnabled) {
163 await completeWebVideoFilesCheck({
165 originServer: servers[0],
166 fixture: 'video_short.mp4',
168 objectStorageBaseUrl: objectStorageBaseUrlWebTorrent,
181 await completeCheckHlsPlaylist({
182 hlsOnly: !webtorrentEnabled,
183 servers: [ servers[0] ],
185 objectStorageBaseUrl: objectStorageBaseUrlHLS,
186 resolutions: [ 720, 480, 360, 240, 144, 0 ]
191 it('Should transcode videos on manual run', async function () {
194 await servers[0].config.disableTranscoding()
196 const { uuid } = await servers[0].videos.quickUpload({ name: 'manual transcoding', fixture: 'video_short.mp4' })
197 await waitJobs(servers, { runnerJobs: true })
200 const video = await servers[0].videos.get({ id: uuid })
201 expect(getAllFiles(video)).to.have.lengthOf(1)
204 await servers[0].config.enableTranscoding(true, true, true)
206 await servers[0].videos.runTranscoding({ transcodingType: 'webtorrent', videoId: uuid })
207 await waitJobs(servers, { runnerJobs: true })
209 await completeWebVideoFilesCheck({
211 originServer: servers[0],
212 fixture: 'video_short.mp4',
214 objectStorageBaseUrl: objectStorageBaseUrlWebTorrent,
225 await servers[0].videos.runTranscoding({ transcodingType: 'hls', videoId: uuid })
226 await waitJobs(servers, { runnerJobs: true })
228 await completeCheckHlsPlaylist({
230 servers: [ servers[0] ],
232 objectStorageBaseUrl: objectStorageBaseUrlHLS,
233 resolutions: [ 720, 480, 360, 240, 144, 0 ]
238 before(async function () {
239 this.timeout(120_000)
241 servers = await createMultipleServers(2)
243 await setAccessTokensToServers(servers)
244 await setDefaultVideoChannel(servers)
246 await doubleFollow(servers[0], servers[1])
248 await servers[0].config.enableRemoteTranscoding()
250 const registrationToken = await servers[0].runnerRegistrationTokens.getFirstRegistrationToken()
252 peertubeRunner = new PeerTubeRunnerProcess(servers[0])
253 await peertubeRunner.runServer()
254 await peertubeRunner.registerPeerTubeInstance({ registrationToken, runnerName: 'runner' })
257 describe('With videos on local filesystem storage', function () {
259 describe('Web video only enabled', function () {
261 before(async function () {
262 await servers[0].config.enableTranscoding(true, false, true)
265 runSuite({ webtorrentEnabled: true, hlsEnabled: false })
268 describe('HLS videos only enabled', function () {
270 before(async function () {
271 await servers[0].config.enableTranscoding(false, true, true)
274 runSuite({ webtorrentEnabled: false, hlsEnabled: true })
277 describe('Web video & HLS enabled', function () {
279 before(async function () {
280 await servers[0].config.enableTranscoding(true, true, true)
283 runSuite({ webtorrentEnabled: true, hlsEnabled: true })
287 describe('With videos on object storage', function () {
288 if (areMockObjectStorageTestsDisabled()) return
290 const objectStorage = new ObjectStorageCommand()
292 before(async function () {
293 await objectStorage.prepareDefaultMockBuckets()
295 await servers[0].kill()
297 await servers[0].run(objectStorage.getDefaultMockConfig())
299 // Wait for peertube runner socket reconnection
303 describe('Web video only enabled', function () {
305 before(async function () {
306 await servers[0].config.enableTranscoding(true, false, true)
309 runSuite({ webtorrentEnabled: true, hlsEnabled: false, objectStorage })
312 describe('HLS videos only enabled', function () {
314 before(async function () {
315 await servers[0].config.enableTranscoding(false, true, true)
318 runSuite({ webtorrentEnabled: false, hlsEnabled: true, objectStorage })
321 describe('Web video & HLS enabled', function () {
323 before(async function () {
324 await servers[0].config.enableTranscoding(true, true, true)
327 runSuite({ webtorrentEnabled: true, hlsEnabled: true, objectStorage })
330 after(async function () {
331 await objectStorage.cleanupMock()
335 describe('Check cleanup', function () {
337 it('Should have an empty cache directory', async function () {
338 await checkPeerTubeRunnerCacheIsEmpty(peertubeRunner)
342 after(async function () {
343 if (peertubeRunner) {
344 await peertubeRunner.unregisterPeerTubeInstance({ runnerName: 'runner' })
345 peertubeRunner.kill()
348 await cleanupTests(servers)