1 /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
4 import * as chai from 'chai'
5 import { User, VideoDetails, VideoPrivacy } from '@shared/models'
12 flushAndRunMultipleServers,
15 runAndTestFfmpegStreamError,
17 setAccessTokensToServers,
18 setDefaultVideoChannel,
19 updateCustomSubConfig,
24 } from '../../../../shared/extra-utils'
26 const expect = chai.expect
28 describe('Test live constraints', function () {
29 let servers: ServerInfo[] = []
31 let userAccessToken: string
32 let userChannelId: number
34 async function createLiveWrapper (saveReplay: boolean) {
35 const liveAttributes = {
37 channelId: userChannelId,
38 privacy: VideoPrivacy.PUBLIC,
42 const res = await createLive(servers[0].url, userAccessToken, liveAttributes)
43 return res.body.video.uuid as string
46 async function checkSaveReplay (videoId: string, resolutions = [ 720 ]) {
47 for (const server of servers) {
48 const res = await getVideo(server.url, videoId)
50 const video: VideoDetails = res.body
51 expect(video.isLive).to.be.false
52 expect(video.duration).to.be.greaterThan(0)
55 await checkLiveCleanup(servers[0], videoId, resolutions)
58 before(async function () {
61 servers = await flushAndRunMultipleServers(2)
63 // Get the access tokens
64 await setAccessTokensToServers(servers)
65 await setDefaultVideoChannel(servers)
67 await updateCustomSubConfig(servers[0].url, servers[0].accessToken, {
78 const user = { username: 'user1', password: 'superpassword' }
79 const res = await createUser({
81 accessToken: servers[0].accessToken,
82 username: user.username,
83 password: user.password
85 userId = res.body.user.id
87 userAccessToken = await userLogin(servers[0], user)
89 const resMe = await getMyUserInformation(servers[0].url, userAccessToken)
90 userChannelId = (resMe.body as User).videoChannels[0].id
95 accessToken: servers[0].accessToken,
101 // Server 1 and server 2 follow each other
102 await doubleFollow(servers[0], servers[1])
105 it('Should not have size limit if save replay is disabled', async function () {
108 const userVideoLiveoId = await createLiveWrapper(false)
109 await runAndTestFfmpegStreamError(servers[0].url, userAccessToken, userVideoLiveoId, false)
112 it('Should have size limit depending on user global quota if save replay is enabled', async function () {
115 // Wait for user quota memoize cache invalidation
118 const userVideoLiveoId = await createLiveWrapper(true)
119 await runAndTestFfmpegStreamError(servers[0].url, userAccessToken, userVideoLiveoId, true)
121 await waitJobs(servers)
123 await checkSaveReplay(userVideoLiveoId)
126 it('Should have size limit depending on user daily quota if save replay is enabled', async function () {
129 // Wait for user quota memoize cache invalidation
135 accessToken: servers[0].accessToken,
140 const userVideoLiveoId = await createLiveWrapper(true)
141 await runAndTestFfmpegStreamError(servers[0].url, userAccessToken, userVideoLiveoId, true)
143 await waitJobs(servers)
145 await checkSaveReplay(userVideoLiveoId)
148 it('Should succeed without quota limit', async function () {
151 // Wait for user quota memoize cache invalidation
157 accessToken: servers[0].accessToken,
158 videoQuota: 10 * 1000 * 1000,
162 const userVideoLiveoId = await createLiveWrapper(true)
163 await runAndTestFfmpegStreamError(servers[0].url, userAccessToken, userVideoLiveoId, false)
166 it('Should have max duration limit', async function () {
169 await updateCustomSubConfig(servers[0].url, servers[0].accessToken, {
188 const userVideoLiveoId = await createLiveWrapper(true)
189 await runAndTestFfmpegStreamError(servers[0].url, userAccessToken, userVideoLiveoId, true)
191 await waitJobs(servers)
193 await checkSaveReplay(userVideoLiveoId, [ 720, 480, 360, 240 ])
196 after(async function () {
197 await cleanupTests(servers)