]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/tests/cli/prune-storage.ts
Fix comments SQL pagination
[github/Chocobozzz/PeerTube.git] / server / tests / cli / prune-storage.ts
CommitLineData
a1587156 1/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
e2600d8b 2
86347717 3import { expect } from 'chai'
d4a8e7a6
C
4import { createFile, readdir } from 'fs-extra'
5import { join } from 'path'
0628157f
C
6import { wait } from '@shared/core-utils'
7import { buildUUID } from '@shared/extra-utils'
3545e72c 8import { HttpStatusCode, VideoPlaylistPrivacy, VideoPrivacy } from '@shared/models'
e2600d8b 9import {
e2600d8b 10 cleanupTests,
329619b3 11 CLICommand,
254d3579 12 createMultipleServers,
4c7e60bc 13 doubleFollow,
52fb1d97 14 killallServers,
a1587156 15 makeGetRequest,
254d3579 16 PeerTubeServer,
a1587156
C
17 setAccessTokensToServers,
18 setDefaultVideoChannel,
9fff08cf 19 waitJobs
bf54587a 20} from '@shared/server-commands'
e2600d8b 21
254d3579 22async function countFiles (server: PeerTubeServer, directory: string) {
89d241a7 23 const files = await readdir(server.servers.buildDirectory(directory))
e2600d8b
C
24
25 return files.length
26}
27
254d3579 28async function assertNotExists (server: PeerTubeServer, directory: string, substring: string) {
89d241a7 29 const files = await readdir(server.servers.buildDirectory(directory))
e2600d8b
C
30
31 for (const f of files) {
32 expect(f).to.not.contain(substring)
33 }
34}
35
90701ec1 36async function assertCountAreOkay (servers: PeerTubeServer[]) {
e2600d8b 37 for (const server of servers) {
6c5065a0 38 const videosCount = await countFiles(server, 'videos')
3545e72c
C
39 expect(videosCount).to.equal(9) // 2 videos with 4 resolutions + private directory
40
41 const privateVideosCount = await countFiles(server, 'videos/private')
42 expect(privateVideosCount).to.equal(4)
e2600d8b 43
6c5065a0 44 const torrentsCount = await countFiles(server, 'torrents')
3545e72c 45 expect(torrentsCount).to.equal(24)
e2600d8b 46
6c5065a0 47 const previewsCount = await countFiles(server, 'previews')
3545e72c 48 expect(previewsCount).to.equal(3)
e2600d8b 49
6c5065a0 50 const thumbnailsCount = await countFiles(server, 'thumbnails')
3545e72c 51 expect(thumbnailsCount).to.equal(7) // 3 local videos, 1 local playlist, 2 remotes videos and 1 remote playlist
e2600d8b 52
6c5065a0 53 const avatarsCount = await countFiles(server, 'avatars')
d0800f76 54 expect(avatarsCount).to.equal(4)
764b1a14 55
3545e72c
C
56 const hlsRootCount = await countFiles(server, join('streaming-playlists', 'hls'))
57 expect(hlsRootCount).to.equal(3) // 2 videos + private directory
58
59 const hlsPrivateRootCount = await countFiles(server, join('streaming-playlists', 'hls', 'private'))
60 expect(hlsPrivateRootCount).to.equal(1)
90701ec1 61 }
e2600d8b
C
62}
63
64describe('Test prune storage scripts', function () {
254d3579 65 let servers: PeerTubeServer[]
a1587156 66 const badNames: { [directory: string]: string[] } = {}
e2600d8b
C
67
68 before(async function () {
69 this.timeout(120000)
70
254d3579 71 servers = await createMultipleServers(2, { transcoding: { enabled: true } })
e2600d8b
C
72 await setAccessTokensToServers(servers)
73 await setDefaultVideoChannel(servers)
74
75 for (const server of servers) {
3545e72c
C
76 await server.videos.upload({ attributes: { name: 'video 1', privacy: VideoPrivacy.PUBLIC } })
77 await server.videos.upload({ attributes: { name: 'video 2', privacy: VideoPrivacy.PUBLIC } })
78
79 await server.videos.upload({ attributes: { name: 'video 3', privacy: VideoPrivacy.PRIVATE } })
e2600d8b 80
89d241a7 81 await server.users.updateMyAvatar({ fixture: 'avatar.png' })
e2600d8b 82
89d241a7 83 await server.playlists.create({
e6346d59 84 attributes: {
e2600d8b
C
85 displayName: 'playlist',
86 privacy: VideoPlaylistPrivacy.PUBLIC,
89d241a7 87 videoChannelId: server.store.channel.id,
e2600d8b
C
88 thumbnailfile: 'thumbnail.jpg'
89 }
90 })
91 }
92
93 await doubleFollow(servers[0], servers[1])
94
d0800f76 95 // Lazy load the remote avatars
e2600d8b 96 {
2732eeff 97 const account = await servers[0].accounts.get({ accountName: 'root@' + servers[1].host })
d0800f76 98
99 for (const avatar of account.avatars) {
100 await makeGetRequest({
101 url: servers[0].url,
102 path: avatar.path,
103 expectedStatus: HttpStatusCode.OK_200
104 })
105 }
e2600d8b
C
106 }
107
108 {
2732eeff 109 const account = await servers[1].accounts.get({ accountName: 'root@' + servers[0].host })
d0800f76 110 for (const avatar of account.avatars) {
111 await makeGetRequest({
112 url: servers[1].url,
113 path: avatar.path,
114 expectedStatus: HttpStatusCode.OK_200
115 })
116 }
e2600d8b
C
117 }
118
119 await wait(1000)
120
121 await waitJobs(servers)
9293139f 122 await killallServers(servers)
52fb1d97
C
123
124 await wait(1000)
e2600d8b
C
125 })
126
127 it('Should have the files on the disk', async function () {
90701ec1 128 await assertCountAreOkay(servers)
e2600d8b
C
129 })
130
131 it('Should create some dirty files', async function () {
132 for (let i = 0; i < 2; i++) {
133 {
3545e72c
C
134 const basePublic = servers[0].servers.buildDirectory('videos')
135 const basePrivate = servers[0].servers.buildDirectory(join('videos', 'private'))
e2600d8b 136
d4a8e7a6
C
137 const n1 = buildUUID() + '.mp4'
138 const n2 = buildUUID() + '.webm'
e2600d8b 139
3545e72c
C
140 await createFile(join(basePublic, n1))
141 await createFile(join(basePublic, n2))
142 await createFile(join(basePrivate, n1))
143 await createFile(join(basePrivate, n2))
e2600d8b
C
144
145 badNames['videos'] = [ n1, n2 ]
146 }
147
148 {
89d241a7 149 const base = servers[0].servers.buildDirectory('torrents')
e2600d8b 150
d4a8e7a6
C
151 const n1 = buildUUID() + '-240.torrent'
152 const n2 = buildUUID() + '-480.torrent'
e2600d8b
C
153
154 await createFile(join(base, n1))
155 await createFile(join(base, n2))
156
157 badNames['torrents'] = [ n1, n2 ]
158 }
159
160 {
89d241a7 161 const base = servers[0].servers.buildDirectory('thumbnails')
e2600d8b 162
d4a8e7a6
C
163 const n1 = buildUUID() + '.jpg'
164 const n2 = buildUUID() + '.jpg'
e2600d8b
C
165
166 await createFile(join(base, n1))
167 await createFile(join(base, n2))
168
169 badNames['thumbnails'] = [ n1, n2 ]
170 }
171
172 {
89d241a7 173 const base = servers[0].servers.buildDirectory('previews')
e2600d8b 174
d4a8e7a6
C
175 const n1 = buildUUID() + '.jpg'
176 const n2 = buildUUID() + '.jpg'
e2600d8b
C
177
178 await createFile(join(base, n1))
179 await createFile(join(base, n2))
180
181 badNames['previews'] = [ n1, n2 ]
182 }
183
184 {
89d241a7 185 const base = servers[0].servers.buildDirectory('avatars')
e2600d8b 186
d4a8e7a6
C
187 const n1 = buildUUID() + '.png'
188 const n2 = buildUUID() + '.jpg'
e2600d8b
C
189
190 await createFile(join(base, n1))
191 await createFile(join(base, n2))
192
193 badNames['avatars'] = [ n1, n2 ]
194 }
764b1a14 195
90701ec1
C
196 {
197 const directory = join('streaming-playlists', 'hls')
3545e72c
C
198 const basePublic = servers[0].servers.buildDirectory(directory)
199 const basePrivate = servers[0].servers.buildDirectory(join(directory, 'private'))
764b1a14 200
90701ec1 201 const n1 = buildUUID()
3545e72c
C
202 await createFile(join(basePublic, n1))
203 await createFile(join(basePrivate, n1))
90701ec1
C
204 badNames[directory] = [ n1 ]
205 }
e2600d8b
C
206 }
207 })
208
209 it('Should run prune storage', async function () {
210 this.timeout(30000)
211
89d241a7 212 const env = servers[0].cli.getEnv()
329619b3 213 await CLICommand.exec(`echo y | ${env} npm run prune-storage`)
e2600d8b
C
214 })
215
216 it('Should have removed files', async function () {
90701ec1 217 await assertCountAreOkay(servers)
e2600d8b
C
218
219 for (const directory of Object.keys(badNames)) {
220 for (const name of badNames[directory]) {
6c5065a0 221 await assertNotExists(servers[0], directory, name)
e2600d8b
C
222 }
223 }
224 })
225
226 after(async function () {
227 await cleanupTests(servers)
228 })
229})