1 /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
4 import { expect } from 'chai'
11 setAccessTokensToServers,
13 } from '@shared/extra-utils'
14 import { VideoPrivacy } from '@shared/models'
16 describe('Test redundancy constraints', function () {
17 let remoteServer: ServerInfo
18 let localServer: ServerInfo
19 let servers: ServerInfo[]
21 const remoteServerConfig = {
24 check_interval: '1 second',
27 strategy: 'recently-added',
28 min_lifetime: '1 hour',
37 async function uploadWrapper (videoName: string) {
38 // Wait for transcoding
39 const { id } = await localServer.videos.upload({ attributes: { name: 'to transcode', privacy: VideoPrivacy.PRIVATE } })
40 await waitJobs([ localServer ])
42 // Update video to schedule a federation
43 await localServer.videos.update({ id, attributes: { name: videoName, privacy: VideoPrivacy.PUBLIC } })
46 async function getTotalRedundanciesLocalServer () {
47 const body = await localServer.redundancy.listVideos({ target: 'my-videos' })
52 async function getTotalRedundanciesRemoteServer () {
53 const body = await remoteServer.redundancy.listVideos({ target: 'remote-videos' })
58 before(async function () {
62 remoteServer = await flushAndRunServer(1, remoteServerConfig)
73 localServer = await flushAndRunServer(2, config)
76 servers = [ remoteServer, localServer ]
78 // Get the access tokens
79 await setAccessTokensToServers(servers)
81 await localServer.videos.upload({ attributes: { name: 'video 1 server 2' } })
83 await waitJobs(servers)
85 // Server 1 and server 2 follow each other
86 await remoteServer.follows.follow({ targets: [ localServer.url ] })
87 await waitJobs(servers)
88 await remoteServer.redundancy.updateRedundancy({ host: localServer.host, redundancyAllowed: true })
90 await waitJobs(servers)
93 it('Should have redundancy on server 1 but not on server 2 with a nobody filter', async function () {
96 await waitJobs(servers)
97 await remoteServer.servers.waitUntilLog('Duplicated ', 5)
98 await waitJobs(servers)
101 const total = await getTotalRedundanciesRemoteServer()
102 expect(total).to.equal(1)
106 const total = await getTotalRedundanciesLocalServer()
107 expect(total).to.equal(0)
111 it('Should have redundancy on server 1 and on server 2 with an anybody filter', async function () {
117 accept_from: 'anybody'
121 await await killallServers([ localServer ])
122 await reRunServer(localServer, config)
124 await uploadWrapper('video 2 server 2')
126 await remoteServer.servers.waitUntilLog('Duplicated ', 10)
127 await waitJobs(servers)
130 const total = await getTotalRedundanciesRemoteServer()
131 expect(total).to.equal(2)
135 const total = await getTotalRedundanciesLocalServer()
136 expect(total).to.equal(1)
140 it('Should have redundancy on server 1 but not on server 2 with a followings filter', async function () {
146 accept_from: 'followings'
150 await killallServers([ localServer ])
151 await reRunServer(localServer, config)
153 await uploadWrapper('video 3 server 2')
155 await remoteServer.servers.waitUntilLog('Duplicated ', 15)
156 await waitJobs(servers)
159 const total = await getTotalRedundanciesRemoteServer()
160 expect(total).to.equal(3)
164 const total = await getTotalRedundanciesLocalServer()
165 expect(total).to.equal(1)
169 it('Should have redundancy on server 1 and on server 2 with followings filter now server 2 follows server 1', async function () {
172 await localServer.follows.follow({ targets: [ remoteServer.url ] })
173 await waitJobs(servers)
175 await uploadWrapper('video 4 server 2')
176 await remoteServer.servers.waitUntilLog('Duplicated ', 20)
177 await waitJobs(servers)
180 const total = await getTotalRedundanciesRemoteServer()
181 expect(total).to.equal(4)
185 const total = await getTotalRedundanciesLocalServer()
186 expect(total).to.equal(2)
190 after(async function () {
191 await cleanupTests(servers)