1 /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
3 import { join } from 'path'
4 import { checkDirectoryIsEmpty, checkTmpIsEmpty, completeCheckHlsPlaylist } from '@server/tests/shared'
5 import { areMockObjectStorageTestsDisabled } from '@shared/core-utils'
6 import { HttpStatusCode } from '@shared/models'
13 setAccessTokensToServers,
15 } from '@shared/server-commands'
16 import { DEFAULT_AUDIO_RESOLUTION } from '../../../initializers/constants'
18 describe('Test HLS videos', function () {
19 let servers: PeerTubeServer[] = []
21 function runTestSuite (hlsOnly: boolean, objectStorageBaseUrl?: string) {
22 const videoUUIDs: string[] = []
24 it('Should upload a video and transcode it to HLS', async function () {
27 const { uuid } = await servers[0].videos.upload({ attributes: { name: 'video 1', fixture: 'video_short.webm' } })
30 await waitJobs(servers)
32 await completeCheckHlsPlaylist({ servers, videoUUID: uuid, hlsOnly, objectStorageBaseUrl })
35 it('Should upload an audio file and transcode it to HLS', async function () {
38 const { uuid } = await servers[0].videos.upload({ attributes: { name: 'video audio', fixture: 'sample.ogg' } })
41 await waitJobs(servers)
43 await completeCheckHlsPlaylist({
47 resolutions: [ DEFAULT_AUDIO_RESOLUTION, 360, 240 ],
52 it('Should update the video', async function () {
55 await servers[0].videos.update({ id: videoUUIDs[0], attributes: { name: 'video 1 updated' } })
57 await waitJobs(servers)
59 await completeCheckHlsPlaylist({ servers, videoUUID: videoUUIDs[0], hlsOnly, objectStorageBaseUrl })
62 it('Should delete videos', async function () {
65 for (const uuid of videoUUIDs) {
66 await servers[0].videos.remove({ id: uuid })
69 await waitJobs(servers)
71 for (const server of servers) {
72 for (const uuid of videoUUIDs) {
73 await server.videos.get({ id: uuid, expectedStatus: HttpStatusCode.NOT_FOUND_404 })
78 it('Should have the playlists/segment deleted from the disk', async function () {
79 for (const server of servers) {
80 await checkDirectoryIsEmpty(server, 'videos', [ 'private' ])
81 await checkDirectoryIsEmpty(server, join('videos', 'private'))
83 await checkDirectoryIsEmpty(server, join('streaming-playlists', 'hls'), [ 'private' ])
84 await checkDirectoryIsEmpty(server, join('streaming-playlists', 'hls', 'private'))
88 it('Should have an empty tmp directory', async function () {
89 for (const server of servers) {
90 await checkTmpIsEmpty(server)
95 before(async function () {
98 const configOverride = {
101 allow_audio_files: true,
107 servers = await createMultipleServers(2, configOverride)
109 // Get the access tokens
110 await setAccessTokensToServers(servers)
112 // Server 1 and server 2 follow each other
113 await doubleFollow(servers[0], servers[1])
116 describe('With WebTorrent & HLS enabled', function () {
120 describe('With only HLS enabled', function () {
122 before(async function () {
123 await servers[0].config.updateCustomSubConfig({
127 allowAudioFiles: true,
152 describe('With object storage enabled', function () {
153 if (areMockObjectStorageTestsDisabled()) return
155 before(async function () {
158 const configOverride = ObjectStorageCommand.getDefaultMockConfig()
159 await ObjectStorageCommand.prepareDefaultMockBuckets()
161 await servers[0].kill()
162 await servers[0].run(configOverride)
165 runTestSuite(true, ObjectStorageCommand.getMockPlaylistBaseUrl())
168 after(async function () {
169 await cleanupTests(servers)