Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ulixee
GitHub Repository: ulixee/secret-agent
Path: blob/main/puppet/test/load.test.ts
1030 views
1
import Log from '@secret-agent/commons/Logger';
2
import IPuppetContext from '@secret-agent/interfaces/IPuppetContext';
3
import CorePlugins from '@secret-agent/core/lib/CorePlugins';
4
import { IBoundLog } from '@secret-agent/interfaces/ILog';
5
import Core from '@secret-agent/core';
6
import { TestServer } from './server';
7
import Puppet from '../index';
8
import { capturePuppetContextLogs, createTestPage, ITestPage } from './TestPage';
9
import CustomBrowserEmulator from './_CustomBrowserEmulator';
10
11
const { log } = Log(module);
12
const browserEmulatorId = CustomBrowserEmulator.id;
13
14
describe('Load test', () => {
15
let server: TestServer;
16
let puppet: Puppet;
17
let context: IPuppetContext;
18
19
beforeAll(async () => {
20
Core.use(CustomBrowserEmulator);
21
const browserEngine = CustomBrowserEmulator.selectBrowserMeta().browserEngine;
22
const plugins = new CorePlugins({ browserEmulatorId }, log as IBoundLog);
23
server = await TestServer.create(0);
24
puppet = new Puppet(browserEngine);
25
await puppet.start();
26
context = await puppet.newContext(plugins, log);
27
capturePuppetContextLogs(context, `${browserEngine.fullVersion}-load-test`);
28
server.setRoute('/link.html', async (req, res) => {
29
res.setHeader('Content-Type', 'text/html');
30
res.end(`
31
<body>
32
<a href="${server.crossProcessBaseUrl}/empty.html">This is a link</a>
33
</body>
34
`);
35
});
36
});
37
38
afterAll(async () => {
39
try {
40
await server.stop();
41
} catch (err) {
42
// no action
43
}
44
45
try {
46
await context.close();
47
} catch (err) {
48
// no action
49
}
50
51
try {
52
await puppet.close();
53
} catch (err) {
54
// no action
55
}
56
}, 30e3);
57
58
it('should be able to capture navigation events under load', async () => {
59
const concurrent = new Array(50).fill(0).map(async () => {
60
let page: ITestPage;
61
try {
62
page = createTestPage(await context.newPage());
63
await page.goto(server.url('link.html'));
64
65
const navigate = page.mainFrame.waitOn('frame-navigated', null, 75e3);
66
await page.click('a');
67
await navigate;
68
expect(page.mainFrame.url).toBe(`${server.crossProcessBaseUrl}/empty.html`);
69
} finally {
70
await page.close();
71
}
72
});
73
await Promise.all(concurrent);
74
}, 75e3);
75
});
76
77