diff options
author | Chocobozzz <me@florianbigard.com> | 2018-09-11 16:27:07 +0200 |
---|---|---|
committer | Chocobozzz <me@florianbigard.com> | 2018-09-13 14:05:49 +0200 |
commit | c48e82b5e0478434de30626d14594a97f2402e7c (patch) | |
tree | a78e5272bd0fe4f5b41831e571e02d05f1515b82 /server/tests/api | |
parent | a651038487faa838bda3ce04695b08bc65baff70 (diff) | |
download | PeerTube-c48e82b5e0478434de30626d14594a97f2402e7c.tar.gz PeerTube-c48e82b5e0478434de30626d14594a97f2402e7c.tar.zst PeerTube-c48e82b5e0478434de30626d14594a97f2402e7c.zip |
Basic video redundancy implementation
Diffstat (limited to 'server/tests/api')
-rw-r--r-- | server/tests/api/check-params/follows.ts | 9 | ||||
-rw-r--r-- | server/tests/api/check-params/index.ts | 8 | ||||
-rw-r--r-- | server/tests/api/check-params/redundancy.ts | 103 | ||||
-rw-r--r-- | server/tests/api/server/index.ts | 1 | ||||
-rw-r--r-- | server/tests/api/server/redundancy.ts | 140 |
5 files changed, 249 insertions, 12 deletions
diff --git a/server/tests/api/check-params/follows.ts b/server/tests/api/check-params/follows.ts index 2bc3b27d9..cdc95c81a 100644 --- a/server/tests/api/check-params/follows.ts +++ b/server/tests/api/check-params/follows.ts | |||
@@ -169,15 +169,6 @@ describe('Test server follows API validators', function () { | |||
169 | statusCodeExpected: 404 | 169 | statusCodeExpected: 404 |
170 | }) | 170 | }) |
171 | }) | 171 | }) |
172 | |||
173 | it('Should succeed with the correct parameters', async function () { | ||
174 | await makeDeleteRequest({ | ||
175 | url: server.url, | ||
176 | path: path + '/localhost:9002', | ||
177 | token: server.accessToken, | ||
178 | statusCodeExpected: 404 | ||
179 | }) | ||
180 | }) | ||
181 | }) | 172 | }) |
182 | }) | 173 | }) |
183 | 174 | ||
diff --git a/server/tests/api/check-params/index.ts b/server/tests/api/check-params/index.ts index 777acbb0f..44460a167 100644 --- a/server/tests/api/check-params/index.ts +++ b/server/tests/api/check-params/index.ts | |||
@@ -1,15 +1,17 @@ | |||
1 | // Order of the tests we want to execute | 1 | // Order of the tests we want to execute |
2 | import './accounts' | 2 | import './accounts' |
3 | import './config' | ||
3 | import './follows' | 4 | import './follows' |
4 | import './jobs' | 5 | import './jobs' |
6 | import './redundancy' | ||
7 | import './search' | ||
5 | import './services' | 8 | import './services' |
9 | import './user-subscriptions' | ||
6 | import './users' | 10 | import './users' |
7 | import './video-abuses' | 11 | import './video-abuses' |
8 | import './video-blacklist' | 12 | import './video-blacklist' |
9 | import './video-captions' | 13 | import './video-captions' |
10 | import './video-channels' | 14 | import './video-channels' |
11 | import './video-comments' | 15 | import './video-comments' |
12 | import './videos' | ||
13 | import './video-imports' | 16 | import './video-imports' |
14 | import './search' | 17 | import './videos' |
15 | import './user-subscriptions' | ||
diff --git a/server/tests/api/check-params/redundancy.ts b/server/tests/api/check-params/redundancy.ts new file mode 100644 index 000000000..aa588e3dd --- /dev/null +++ b/server/tests/api/check-params/redundancy.ts | |||
@@ -0,0 +1,103 @@ | |||
1 | /* tslint:disable:no-unused-expression */ | ||
2 | |||
3 | import 'mocha' | ||
4 | |||
5 | import { | ||
6 | createUser, | ||
7 | doubleFollow, | ||
8 | flushAndRunMultipleServers, | ||
9 | flushTests, | ||
10 | killallServers, | ||
11 | makePutBodyRequest, | ||
12 | ServerInfo, | ||
13 | setAccessTokensToServers, | ||
14 | userLogin | ||
15 | } from '../../utils' | ||
16 | |||
17 | describe('Test server redundancy API validators', function () { | ||
18 | let servers: ServerInfo[] | ||
19 | let userAccessToken = null | ||
20 | |||
21 | // --------------------------------------------------------------- | ||
22 | |||
23 | before(async function () { | ||
24 | this.timeout(30000) | ||
25 | |||
26 | await flushTests() | ||
27 | servers = await flushAndRunMultipleServers(2) | ||
28 | |||
29 | await setAccessTokensToServers(servers) | ||
30 | await doubleFollow(servers[0], servers[1]) | ||
31 | |||
32 | const user = { | ||
33 | username: 'user1', | ||
34 | password: 'password' | ||
35 | } | ||
36 | |||
37 | await createUser(servers[0].url, servers[0].accessToken, user.username, user.password) | ||
38 | userAccessToken = await userLogin(servers[0], user) | ||
39 | }) | ||
40 | |||
41 | describe('When updating redundancy', function () { | ||
42 | const path = '/api/v1/server/redundancy' | ||
43 | |||
44 | it('Should fail with an invalid token', async function () { | ||
45 | await makePutBodyRequest({ | ||
46 | url: servers[0].url, | ||
47 | path: path + '/localhost:9002', | ||
48 | fields: { redundancyAllowed: true }, | ||
49 | token: 'fake_token', | ||
50 | statusCodeExpected: 401 | ||
51 | }) | ||
52 | }) | ||
53 | |||
54 | it('Should fail if the user is not an administrator', async function () { | ||
55 | await makePutBodyRequest({ | ||
56 | url: servers[0].url, | ||
57 | path: path + '/localhost:9002', | ||
58 | fields: { redundancyAllowed: true }, | ||
59 | token: userAccessToken, | ||
60 | statusCodeExpected: 403 | ||
61 | }) | ||
62 | }) | ||
63 | |||
64 | it('Should fail if we do not follow this server', async function () { | ||
65 | await makePutBodyRequest({ | ||
66 | url: servers[0].url, | ||
67 | path: path + '/example.com', | ||
68 | fields: { redundancyAllowed: true }, | ||
69 | token: servers[0].accessToken, | ||
70 | statusCodeExpected: 404 | ||
71 | }) | ||
72 | }) | ||
73 | |||
74 | it('Should fail without de redundancyAllowed param', async function () { | ||
75 | await makePutBodyRequest({ | ||
76 | url: servers[0].url, | ||
77 | path: path + '/localhost:9002', | ||
78 | fields: { blabla: true }, | ||
79 | token: servers[0].accessToken, | ||
80 | statusCodeExpected: 400 | ||
81 | }) | ||
82 | }) | ||
83 | |||
84 | it('Should succeed with the correct parameters', async function () { | ||
85 | await makePutBodyRequest({ | ||
86 | url: servers[0].url, | ||
87 | path: path + '/localhost:9002', | ||
88 | fields: { redundancyAllowed: true }, | ||
89 | token: servers[0].accessToken, | ||
90 | statusCodeExpected: 204 | ||
91 | }) | ||
92 | }) | ||
93 | }) | ||
94 | |||
95 | after(async function () { | ||
96 | killallServers(servers) | ||
97 | |||
98 | // Keep the logs if the test failed | ||
99 | if (this['ok']) { | ||
100 | await flushTests() | ||
101 | } | ||
102 | }) | ||
103 | }) | ||
diff --git a/server/tests/api/server/index.ts b/server/tests/api/server/index.ts index eeb8b7a28..c74c68a33 100644 --- a/server/tests/api/server/index.ts +++ b/server/tests/api/server/index.ts | |||
@@ -3,6 +3,7 @@ import './email' | |||
3 | import './follows' | 3 | import './follows' |
4 | import './handle-down' | 4 | import './handle-down' |
5 | import './jobs' | 5 | import './jobs' |
6 | import './redundancy' | ||
6 | import './reverse-proxy' | 7 | import './reverse-proxy' |
7 | import './stats' | 8 | import './stats' |
8 | import './tracker' | 9 | import './tracker' |
diff --git a/server/tests/api/server/redundancy.ts b/server/tests/api/server/redundancy.ts new file mode 100644 index 000000000..c0ec75a45 --- /dev/null +++ b/server/tests/api/server/redundancy.ts | |||
@@ -0,0 +1,140 @@ | |||
1 | /* tslint:disable:no-unused-expression */ | ||
2 | |||
3 | import * as chai from 'chai' | ||
4 | import 'mocha' | ||
5 | import { VideoDetails } from '../../../../shared/models/videos' | ||
6 | import { | ||
7 | doubleFollow, | ||
8 | flushAndRunMultipleServers, | ||
9 | flushTests, | ||
10 | getFollowingListPaginationAndSort, | ||
11 | getVideo, | ||
12 | killallServers, | ||
13 | ServerInfo, | ||
14 | setAccessTokensToServers, | ||
15 | uploadVideo, | ||
16 | wait, | ||
17 | root, viewVideo | ||
18 | } from '../../utils' | ||
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' | ||
25 | |||
26 | const expect = chai.expect | ||
27 | |||
28 | function checkMagnetWebseeds (file: { magnetUri: string, resolution: { id: number } }, baseWebseeds: string[]) { | ||
29 | const parsed = magnetUtil.decode(file.magnetUri) | ||
30 | |||
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 | ||
34 | } | ||
35 | } | ||
36 | |||
37 | describe('Test videos redundancy', function () { | ||
38 | let servers: ServerInfo[] = [] | ||
39 | let video1Server2UUID: string | ||
40 | let video2Server2UUID: string | ||
41 | |||
42 | before(async function () { | ||
43 | this.timeout(120000) | ||
44 | |||
45 | servers = await flushAndRunMultipleServers(3) | ||
46 | |||
47 | // Get the access tokens | ||
48 | await setAccessTokensToServers(servers) | ||
49 | |||
50 | { | ||
51 | const res = await uploadVideo(servers[ 1 ].url, servers[ 1 ].accessToken, { name: 'video 1 server 2' }) | ||
52 | video1Server2UUID = res.body.video.uuid | ||
53 | |||
54 | await viewVideo(servers[1].url, video1Server2UUID) | ||
55 | } | ||
56 | |||
57 | { | ||
58 | const res = await uploadVideo(servers[ 1 ].url, servers[ 1 ].accessToken, { name: 'video 2 server 2' }) | ||
59 | video2Server2UUID = res.body.video.uuid | ||
60 | } | ||
61 | |||
62 | await waitJobs(servers) | ||
63 | |||
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]) | ||
70 | |||
71 | await waitJobs(servers) | ||
72 | }) | ||
73 | |||
74 | it('Should have 1 webseed on the first video', async function () { | ||
75 | const webseeds = [ | ||
76 | 'http://localhost:9002/static/webseed/' + video1Server2UUID | ||
77 | ] | ||
78 | |||
79 | for (const server of servers) { | ||
80 | const res = await getVideo(server.url, video1Server2UUID) | ||
81 | |||
82 | const video: VideoDetails = res.body | ||
83 | video.files.forEach(f => checkMagnetWebseeds(f, webseeds)) | ||
84 | } | ||
85 | }) | ||
86 | |||
87 | it('Should enable redundancy on server 1', async function () { | ||
88 | await updateRedundancy(servers[0].url, servers[0].accessToken, servers[1].host, true) | ||
89 | |||
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') | ||
94 | |||
95 | expect(server3).to.not.be.undefined | ||
96 | expect(server3.following.hostRedundancyAllowed).to.be.false | ||
97 | |||
98 | expect(server2).to.not.be.undefined | ||
99 | expect(server2.following.hostRedundancyAllowed).to.be.true | ||
100 | }) | ||
101 | |||
102 | it('Should have 2 webseed on the first video', async function () { | ||
103 | this.timeout(40000) | ||
104 | |||
105 | await waitJobs(servers) | ||
106 | await wait(15000) | ||
107 | await waitJobs(servers) | ||
108 | |||
109 | const webseeds = [ | ||
110 | 'http://localhost:9001/static/webseed/' + video1Server2UUID, | ||
111 | 'http://localhost:9002/static/webseed/' + video1Server2UUID | ||
112 | ] | ||
113 | |||
114 | for (const server of servers) { | ||
115 | const res = await getVideo(server.url, video1Server2UUID) | ||
116 | |||
117 | const video: VideoDetails = res.body | ||
118 | |||
119 | for (const file of video.files) { | ||
120 | checkMagnetWebseeds(file, webseeds) | ||
121 | } | ||
122 | } | ||
123 | |||
124 | const files = await readdir(join(root(), 'test1', 'videos')) | ||
125 | expect(files).to.have.lengthOf(4) | ||
126 | |||
127 | for (const resolution of [ 240, 360, 480, 720 ]) { | ||
128 | expect(files.find(f => f === `${video1Server2UUID}-${resolution}.mp4`)).to.not.be.undefined | ||
129 | } | ||
130 | }) | ||
131 | |||
132 | after(async function () { | ||
133 | killallServers(servers) | ||
134 | |||
135 | // Keep the logs if the test failed | ||
136 | if (this['ok']) { | ||
137 | await flushTests() | ||
138 | } | ||
139 | }) | ||
140 | }) | ||