-import * as autocannon from 'autocannon'
+import autocannon, { printResult } from 'autocannon'
+import { program } from 'commander'
import { writeJson } from 'fs-extra'
-import { flushAndRunServer, getVideosList, killallServers, ServerInfo, setAccessTokensToServers, uploadVideo } from '@shared/extra-utils'
import { Video, VideoPrivacy } from '@shared/models'
-import { registerTSPaths } from '../server/helpers/register-ts-paths'
+import { createMultipleServers, doubleFollow, killallServers, PeerTubeServer, setAccessTokensToServers } from '@shared/server-commands'
-registerTSPaths()
-
-let server: ServerInfo
+let servers: PeerTubeServer[]
+// First server
+let server: PeerTubeServer
let video: Video
let threadId: number
-const outfile = process.argv[2]
+program
+ .option('-o, --outfile [outfile]', 'Outfile')
+ .option('--grep [string]', 'Filter tests you want to execute')
+ .description('Run API REST benchmark')
+ .parse(process.argv)
+
+const options = program.opts()
+
+const outfile = options.outfile
run()
.catch(err => console.error(err))
.finally(() => {
- if (server) killallServers([ server ])
+ if (servers) return killallServers(servers)
})
function buildAuthorizationHeader () {
}
}
+function buildJSONHeader () {
+ return {
+ 'Content-Type': 'application/json'
+ }
+}
+
async function run () {
console.log('Preparing server...')
path: '/accounts/peertube',
headers: buildAPHeader(),
expecter: (body, status) => {
- return status === 200 && body.startsWith('{"type":')
+ return status === 200 && body.startsWith('{"@context":')
}
},
{
path: '/videos/watch/' + video.uuid,
headers: buildAPHeader(),
expecter: (body, status) => {
- return status === 200 && body.startsWith('{"type":"Video"')
+ return status === 200 && body.startsWith('{"@context":')
}
},
{
title: 'API - config',
path: '/api/v1/config',
expecter: (body, status) => {
- return status === 200 && body.startsWith('{"instance":')
+ return status === 200 && body.startsWith('{"client":')
+ }
+ },
+ {
+ title: 'API - views with token',
+ method: 'PUT',
+ headers: {
+ ...buildAuthorizationHeader(),
+ ...buildJSONHeader()
+ },
+ body: JSON.stringify({ currentTime: 2 }),
+ path: '/api/v1/videos/' + video.uuid + '/views',
+ expecter: (body, status) => {
+ return status === 204
+ }
+ },
+ {
+ title: 'API - views without token',
+ method: 'POST',
+ headers: buildJSONHeader(),
+ body: JSON.stringify({ currentTime: 2 }),
+ path: '/api/v1/videos/' + video.uuid + '/views',
+ expecter: (body, status) => {
+ return status === 204
}
}
- ]
+ ].filter(t => {
+ if (!options.grep) return true
+
+ return t.title.includes(options.grep)
+ })
const finalResult: any[] = []
Object.assign(testResult, { title: test.title, path: test.path })
finalResult.push(testResult)
- console.log(autocannon.printResult(testResult))
+ console.log(printResult(testResult))
}
if (outfile) await writeJson(outfile, finalResult)
function runBenchmark (options: {
path: string
+ method?: string
+ body?: string
headers?: { [ id: string ]: string }
expecter: Function
}) {
- const { path, expecter, headers } = options
+ const { method = 'GET', path, body, expecter, headers } = options
return new Promise((res, rej) => {
autocannon({
url: server.url + path,
+ method: method,
+ body,
connections: 20,
headers,
pipelining: 1,
}
async function prepare () {
- server = await flushAndRunServer(1, {
+ servers = await createMultipleServers(3, {
rates_limit: {
api: {
max: 5_000_000
}
}
})
- await setAccessTokensToServers([ server ])
+ server = servers[0]
- const videoAttributes = {
+ await setAccessTokensToServers(servers)
+ await doubleFollow(servers[0], servers[1])
+ await doubleFollow(servers[0], servers[2])
+
+ const attributes = {
name: 'my super video',
category: 2,
nsfw: true,
language: 'fr',
privacy: VideoPrivacy.PUBLIC,
support: 'please give me a coffee',
- description: 'my super description'.repeat(10),
+ description: 'my super description\n'.repeat(10) + ' * list1\n * list 2\n * list 3',
tags: [ 'tag1', 'tag2', 'tag3' ]
}
for (let i = 0; i < 10; i++) {
- Object.assign(videoAttributes, { name: 'my super video ' + i })
- await uploadVideo(server.url, server.accessToken, videoAttributes)
+ await server.videos.upload({ attributes: { ...attributes, name: 'my super video ' + i } })
}
- const resVideos = await getVideosList(server.url)
- video = resVideos.body.data.find(v => v.name === 'my super video 1')
+ const { data } = await server.videos.list()
+ video = data.find(v => v.name === 'my super video 1')
for (let i = 0; i < 10; i++) {
const text = 'my super first comment'
- const created = await server.commentsCommand.createThread({ videoId: video.id, text })
+ const created = await server.comments.createThread({ videoId: video.id, text })
threadId = created.id
const text1 = 'my super answer to thread 1'
- const child = await server.commentsCommand.addReply({ videoId: video.id, toCommentId: threadId, text: text1 })
+ const child = await server.comments.addReply({ videoId: video.id, toCommentId: threadId, text: text1 })
const text2 = 'my super answer to answer of thread 1'
- await server.commentsCommand.addReply({ videoId: video.id, toCommentId: child.id, text: text2 })
+ await server.comments.addReply({ videoId: video.id, toCommentId: child.id, text: text2 })
const text3 = 'my second answer to thread 1'
- await server.commentsCommand.addReply({ videoId: video.id, toCommentId: threadId, text: text3 })
+ await server.comments.addReply({ videoId: video.id, toCommentId: threadId, text: text3 })
}
for (const caption of [ 'ar', 'fr', 'en', 'zh' ]) {
- await server.captionsCommand.createVideoCaption({
+ await server.captions.add({
language: caption,
videoId: video.id,
fixture: 'subtitle-good2.vtt'
})
}
-
- return { server, video, threadId }
}