import autocannon, { printResult } from 'autocannon' import { program } from 'commander' import { writeJson } from 'fs-extra' import { Video, VideoPrivacy } from '@shared/models' import { createSingleServer, killallServers, PeerTubeServer, setAccessTokensToServers } from '@shared/server-commands' let server: PeerTubeServer let video: Video let threadId: number 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) return killallServers([ server ]) }) function buildAuthorizationHeader () { return { Authorization: 'Bearer ' + server.accessToken } } function buildAPHeader () { return { Accept: 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"' } } async function run () { console.log('Preparing server...') await prepare() const tests = [ { title: 'AP - account peertube', path: '/accounts/peertube', headers: buildAPHeader(), expecter: (body, status) => { return status === 200 && body.startsWith('{"type":') } }, { title: 'AP - video', path: '/videos/watch/' + video.uuid, headers: buildAPHeader(), expecter: (body, status) => { return status === 200 && body.startsWith('{"type":"Video"') } }, { title: 'Misc - webfinger peertube', path: '/.well-known/webfinger?resource=acct:peertube@' + server.host, expecter: (body, status) => { return status === 200 && body.startsWith('{"subject":') } }, { title: 'API - unread notifications', path: '/api/v1/users/me/notifications?start=0&count=0&unread=true', headers: buildAuthorizationHeader(), expecter: (_body, status) => { return status === 200 } }, { title: 'API - me', path: '/api/v1/users/me', headers: buildAuthorizationHeader(), expecter: (body, status) => { return status === 200 && body.startsWith('{"id":') } }, { title: 'API - videos list', path: '/api/v1/videos', expecter: (body, status) => { return status === 200 && body.startsWith('{"total":10') } }, { title: 'API - video get', path: '/api/v1/videos/' + video.uuid, expecter: (body, status) => { return status === 200 && body.startsWith('{"id":') } }, { title: 'API - video captions', path: '/api/v1/videos/' + video.uuid + '/captions', expecter: (body, status) => { return status === 200 && body.startsWith('{"total":4') } }, { title: 'API - video threads', path: '/api/v1/videos/' + video.uuid + '/comment-threads', expecter: (body, status) => { return status === 200 && body.startsWith('{"total":10') } }, { title: 'API - video replies', path: '/api/v1/videos/' + video.uuid + '/comment-threads/' + threadId, expecter: (body, status) => { return status === 200 && body.startsWith('{"comment":{') } }, { title: 'HTML - video watch', path: '/videos/watch/' + video.uuid, expecter: (body, status) => { return status === 200 && body.includes('