1 /* tslint:disable:no-unused-expression */
3 import * as chai from 'chai'
5 import { VideoDetails } from '../../../../shared/models/videos'
8 flushAndRunMultipleServers,
10 getFollowingListPaginationAndSort,
14 setAccessTokensToServers,
19 import { waitJobs } from '../../utils/server/jobs'
20 import * as magnetUtil from 'magnet-uri'
21 import { updateRedundancy } from '../../utils/server/redundancy'
22 import { ActorFollow } from '../../../../shared/models/actors'
23 import { readdir } from 'fs-extra'
24 import { join } from 'path'
26 const expect = chai.expect
28 function checkMagnetWebseeds (file: { magnetUri: string, resolution: { id: number } }, baseWebseeds: string[]) {
29 const parsed = magnetUtil.decode(file.magnetUri)
31 for (const ws of baseWebseeds) {
32 const found = parsed.urlList.find(url => url === `${ws}-${file.resolution.id}.mp4`)
33 expect(found, `Webseed ${ws} not found in ${file.magnetUri}`).to.not.be.undefined
37 describe('Test videos redundancy', function () {
38 let servers: ServerInfo[] = []
39 let video1Server2UUID: string
40 let video2Server2UUID: string
42 before(async function () {
45 servers = await flushAndRunMultipleServers(3)
47 // Get the access tokens
48 await setAccessTokensToServers(servers)
51 const res = await uploadVideo(servers[ 1 ].url, servers[ 1 ].accessToken, { name: 'video 1 server 2' })
52 video1Server2UUID = res.body.video.uuid
54 await viewVideo(servers[1].url, video1Server2UUID)
58 const res = await uploadVideo(servers[ 1 ].url, servers[ 1 ].accessToken, { name: 'video 2 server 2' })
59 video2Server2UUID = res.body.video.uuid
62 await waitJobs(servers)
64 // Server 1 and server 2 follow each other
65 await doubleFollow(servers[0], servers[1])
66 // Server 1 and server 3 follow each other
67 await doubleFollow(servers[0], servers[2])
68 // Server 2 and server 3 follow each other
69 await doubleFollow(servers[1], servers[2])
71 await waitJobs(servers)
74 it('Should have 1 webseed on the first video', async function () {
76 'http://localhost:9002/static/webseed/' + video1Server2UUID
79 for (const server of servers) {
80 const res = await getVideo(server.url, video1Server2UUID)
82 const video: VideoDetails = res.body
83 video.files.forEach(f => checkMagnetWebseeds(f, webseeds))
87 it('Should enable redundancy on server 1', async function () {
88 await updateRedundancy(servers[0].url, servers[0].accessToken, servers[1].host, true)
90 const res = await getFollowingListPaginationAndSort(servers[0].url, 0, 5, '-createdAt')
91 const follows: ActorFollow[] = res.body.data
92 const server2 = follows.find(f => f.following.host === 'localhost:9002')
93 const server3 = follows.find(f => f.following.host === 'localhost:9003')
95 expect(server3).to.not.be.undefined
96 expect(server3.following.hostRedundancyAllowed).to.be.false
98 expect(server2).to.not.be.undefined
99 expect(server2.following.hostRedundancyAllowed).to.be.true
102 it('Should have 2 webseed on the first video', async function () {
105 await waitJobs(servers)
107 await waitJobs(servers)
110 'http://localhost:9001/static/webseed/' + video1Server2UUID,
111 'http://localhost:9002/static/webseed/' + video1Server2UUID
114 for (const server of servers) {
115 const res = await getVideo(server.url, video1Server2UUID)
117 const video: VideoDetails = res.body
119 for (const file of video.files) {
120 checkMagnetWebseeds(file, webseeds)
124 const files = await readdir(join(root(), 'test1', 'videos'))
125 expect(files).to.have.lengthOf(4)
127 for (const resolution of [ 240, 360, 480, 720 ]) {
128 expect(files.find(f => f === `${video1Server2UUID}-${resolution}.mp4`)).to.not.be.undefined
132 after(async function () {
133 killallServers(servers)
135 // Keep the logs if the test failed