]>
Commit | Line | Data |
---|---|---|
a1587156 | 1 | /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ |
e2600d8b C |
2 | |
3 | import 'mocha' | |
4 | import * as chai from 'chai' | |
d4a8e7a6 C |
5 | import { createFile, readdir } from 'fs-extra' |
6 | import { join } from 'path' | |
7 | import { buildUUID } from '@server/helpers/uuid' | |
8 | import { HttpStatusCode } from '../../../shared/core-utils/miscs/http-error-codes' | |
e2600d8b C |
9 | import { |
10 | buildServerDirectory, | |
11 | cleanupTests, | |
329619b3 | 12 | CLICommand, |
e2600d8b C |
13 | createVideoPlaylist, |
14 | doubleFollow, | |
e2600d8b C |
15 | flushAndRunMultipleServers, |
16 | getAccount, | |
52fb1d97 | 17 | killallServers, |
a1587156 | 18 | makeGetRequest, |
e2600d8b | 19 | ServerInfo, |
a1587156 C |
20 | setAccessTokensToServers, |
21 | setDefaultVideoChannel, | |
e2600d8b C |
22 | updateMyAvatar, |
23 | uploadVideo, | |
24 | wait | |
25 | } from '../../../shared/extra-utils' | |
d4a8e7a6 | 26 | import { waitJobs } from '../../../shared/extra-utils/server/jobs' |
e2600d8b | 27 | import { Account, VideoPlaylistPrivacy } from '../../../shared/models' |
e2600d8b C |
28 | |
29 | const expect = chai.expect | |
30 | ||
31 | async function countFiles (internalServerNumber: number, directory: string) { | |
ca5c612b | 32 | const files = await readdir(buildServerDirectory({ internalServerNumber }, directory)) |
e2600d8b C |
33 | |
34 | return files.length | |
35 | } | |
36 | ||
37 | async function assertNotExists (internalServerNumber: number, directory: string, substring: string) { | |
ca5c612b | 38 | const files = await readdir(buildServerDirectory({ internalServerNumber }, directory)) |
e2600d8b C |
39 | |
40 | for (const f of files) { | |
41 | expect(f).to.not.contain(substring) | |
42 | } | |
43 | } | |
44 | ||
45 | async function assertCountAreOkay (servers: ServerInfo[]) { | |
46 | for (const server of servers) { | |
47 | const videosCount = await countFiles(server.internalServerNumber, 'videos') | |
48 | expect(videosCount).to.equal(8) | |
49 | ||
50 | const torrentsCount = await countFiles(server.internalServerNumber, 'torrents') | |
66fb2aa3 | 51 | expect(torrentsCount).to.equal(16) |
e2600d8b C |
52 | |
53 | const previewsCount = await countFiles(server.internalServerNumber, 'previews') | |
54 | expect(previewsCount).to.equal(2) | |
55 | ||
56 | const thumbnailsCount = await countFiles(server.internalServerNumber, 'thumbnails') | |
57 | expect(thumbnailsCount).to.equal(6) | |
58 | ||
59 | const avatarsCount = await countFiles(server.internalServerNumber, 'avatars') | |
60 | expect(avatarsCount).to.equal(2) | |
61 | } | |
62 | } | |
63 | ||
64 | describe('Test prune storage scripts', function () { | |
65 | let servers: ServerInfo[] | |
a1587156 | 66 | const badNames: { [directory: string]: string[] } = {} |
e2600d8b C |
67 | |
68 | before(async function () { | |
69 | this.timeout(120000) | |
70 | ||
71 | servers = await flushAndRunMultipleServers(2, { transcoding: { enabled: true } }) | |
72 | await setAccessTokensToServers(servers) | |
73 | await setDefaultVideoChannel(servers) | |
74 | ||
75 | for (const server of servers) { | |
76 | await uploadVideo(server.url, server.accessToken, { name: 'video 1' }) | |
77 | await uploadVideo(server.url, server.accessToken, { name: 'video 2' }) | |
78 | ||
79 | await updateMyAvatar({ url: server.url, accessToken: server.accessToken, fixture: 'avatar.png' }) | |
80 | ||
81 | await createVideoPlaylist({ | |
82 | url: server.url, | |
83 | token: server.accessToken, | |
84 | playlistAttrs: { | |
85 | displayName: 'playlist', | |
86 | privacy: VideoPlaylistPrivacy.PUBLIC, | |
87 | videoChannelId: server.videoChannel.id, | |
88 | thumbnailfile: 'thumbnail.jpg' | |
89 | } | |
90 | }) | |
91 | } | |
92 | ||
93 | await doubleFollow(servers[0], servers[1]) | |
94 | ||
95 | // Lazy load the remote avatar | |
96 | { | |
a1587156 | 97 | const res = await getAccount(servers[0].url, 'root@localhost:' + servers[1].port) |
e2600d8b | 98 | const account: Account = res.body |
66fb2aa3 | 99 | await makeGetRequest({ |
a1587156 | 100 | url: servers[0].url, |
66fb2aa3 | 101 | path: account.avatar.path, |
2d53be02 | 102 | statusCodeExpected: HttpStatusCode.OK_200 |
66fb2aa3 | 103 | }) |
e2600d8b C |
104 | } |
105 | ||
106 | { | |
a1587156 | 107 | const res = await getAccount(servers[1].url, 'root@localhost:' + servers[0].port) |
e2600d8b | 108 | const account: Account = res.body |
66fb2aa3 | 109 | await makeGetRequest({ |
a1587156 | 110 | url: servers[1].url, |
66fb2aa3 | 111 | path: account.avatar.path, |
2d53be02 | 112 | statusCodeExpected: HttpStatusCode.OK_200 |
66fb2aa3 | 113 | }) |
e2600d8b C |
114 | } |
115 | ||
116 | await wait(1000) | |
117 | ||
118 | await waitJobs(servers) | |
52fb1d97 C |
119 | killallServers(servers) |
120 | ||
121 | await wait(1000) | |
e2600d8b C |
122 | }) |
123 | ||
124 | it('Should have the files on the disk', async function () { | |
125 | await assertCountAreOkay(servers) | |
126 | }) | |
127 | ||
128 | it('Should create some dirty files', async function () { | |
129 | for (let i = 0; i < 2; i++) { | |
130 | { | |
ca5c612b | 131 | const base = buildServerDirectory(servers[0], 'videos') |
e2600d8b | 132 | |
d4a8e7a6 C |
133 | const n1 = buildUUID() + '.mp4' |
134 | const n2 = buildUUID() + '.webm' | |
e2600d8b C |
135 | |
136 | await createFile(join(base, n1)) | |
137 | await createFile(join(base, n2)) | |
138 | ||
139 | badNames['videos'] = [ n1, n2 ] | |
140 | } | |
141 | ||
142 | { | |
ca5c612b | 143 | const base = buildServerDirectory(servers[0], 'torrents') |
e2600d8b | 144 | |
d4a8e7a6 C |
145 | const n1 = buildUUID() + '-240.torrent' |
146 | const n2 = buildUUID() + '-480.torrent' | |
e2600d8b C |
147 | |
148 | await createFile(join(base, n1)) | |
149 | await createFile(join(base, n2)) | |
150 | ||
151 | badNames['torrents'] = [ n1, n2 ] | |
152 | } | |
153 | ||
154 | { | |
ca5c612b | 155 | const base = buildServerDirectory(servers[0], 'thumbnails') |
e2600d8b | 156 | |
d4a8e7a6 C |
157 | const n1 = buildUUID() + '.jpg' |
158 | const n2 = buildUUID() + '.jpg' | |
e2600d8b C |
159 | |
160 | await createFile(join(base, n1)) | |
161 | await createFile(join(base, n2)) | |
162 | ||
163 | badNames['thumbnails'] = [ n1, n2 ] | |
164 | } | |
165 | ||
166 | { | |
ca5c612b | 167 | const base = buildServerDirectory(servers[0], 'previews') |
e2600d8b | 168 | |
d4a8e7a6 C |
169 | const n1 = buildUUID() + '.jpg' |
170 | const n2 = buildUUID() + '.jpg' | |
e2600d8b C |
171 | |
172 | await createFile(join(base, n1)) | |
173 | await createFile(join(base, n2)) | |
174 | ||
175 | badNames['previews'] = [ n1, n2 ] | |
176 | } | |
177 | ||
178 | { | |
ca5c612b | 179 | const base = buildServerDirectory(servers[0], 'avatars') |
e2600d8b | 180 | |
d4a8e7a6 C |
181 | const n1 = buildUUID() + '.png' |
182 | const n2 = buildUUID() + '.jpg' | |
e2600d8b C |
183 | |
184 | await createFile(join(base, n1)) | |
185 | await createFile(join(base, n2)) | |
186 | ||
187 | badNames['avatars'] = [ n1, n2 ] | |
188 | } | |
189 | } | |
190 | }) | |
191 | ||
192 | it('Should run prune storage', async function () { | |
193 | this.timeout(30000) | |
194 | ||
329619b3 C |
195 | const env = servers[0].cliCommand.getEnv() |
196 | await CLICommand.exec(`echo y | ${env} npm run prune-storage`) | |
e2600d8b C |
197 | }) |
198 | ||
199 | it('Should have removed files', async function () { | |
200 | await assertCountAreOkay(servers) | |
201 | ||
202 | for (const directory of Object.keys(badNames)) { | |
203 | for (const name of badNames[directory]) { | |
204 | await assertNotExists(servers[0].internalServerNumber, directory, name) | |
205 | } | |
206 | } | |
207 | }) | |
208 | ||
209 | after(async function () { | |
210 | await cleanupTests(servers) | |
211 | }) | |
212 | }) |