Skip to content

Commit 8236c6c

Browse files
committed
Add separate heartbeat e2e test
1 parent b0f5a17 commit 8236c6c

File tree

3 files changed

+155
-86
lines changed

3 files changed

+155
-86
lines changed
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
import { spawn } from "child_process";
2+
import { resolve } from "path";
3+
import { test } from "node:test";
4+
import { equal, fail, partialDeepStrictEqual } from "node:assert";
5+
import { getRandomPort } from "./utils/get-port.mjs";
6+
import { timeout } from "./utils/timeout.mjs";
7+
8+
const pathToAppDir = resolve(
9+
import.meta.dirname,
10+
"../../sample-apps/hono-pg-ts-esm"
11+
);
12+
13+
const port = await getRandomPort();
14+
15+
const testServerUrl = "http://localhost:5874";
16+
17+
test("It reports own http requests in heartbeat events", async () => {
18+
const response = await fetch(`${testServerUrl}/api/runtime/apps`, {
19+
method: "POST",
20+
});
21+
const body = await response.json();
22+
const token = body.token;
23+
24+
const server = spawn(
25+
`node`,
26+
[
27+
"--require",
28+
"@aikidosec/firewall/instrument",
29+
"--experimental-strip-types",
30+
"./app.ts",
31+
port,
32+
],
33+
{
34+
cwd: pathToAppDir,
35+
env: {
36+
...process.env,
37+
AIKIDO_TOKEN: token,
38+
AIKIDO_ENDPOINT: testServerUrl,
39+
AIKIDO_REALTIME_ENDPOINT: testServerUrl,
40+
AIKIDO_DEBUG: "true",
41+
AIKIDO_BLOCK: "true",
42+
},
43+
}
44+
);
45+
46+
try {
47+
server.on("error", (err) => {
48+
fail(err);
49+
});
50+
51+
let stdout = "";
52+
server.stdout.on("data", (data) => {
53+
stdout += data.toString();
54+
});
55+
56+
let stderr = "";
57+
server.stderr.on("data", (data) => {
58+
stderr += data.toString();
59+
});
60+
61+
// Wait for the server to start
62+
await timeout(2000);
63+
64+
await fetch(`http://127.0.0.1:${port}/`, {
65+
method: "GET",
66+
signal: AbortSignal.timeout(5000),
67+
});
68+
69+
// Wait for first heartbeat to be sent
70+
await timeout(31000);
71+
72+
const eventsResponse = await fetch(`${testServerUrl}/api/runtime/events`, {
73+
method: "GET",
74+
headers: {
75+
Authorization: token,
76+
},
77+
signal: AbortSignal.timeout(5000),
78+
});
79+
80+
const events = await eventsResponse.json();
81+
const heartbeatEvents = events.filter(
82+
(event) => event.type === "heartbeat"
83+
);
84+
85+
equal(heartbeatEvents.length, 1);
86+
partialDeepStrictEqual(heartbeatEvents, [
87+
{
88+
type: "heartbeat",
89+
hostnames: [
90+
{
91+
hostname: "localhost",
92+
port: 5874,
93+
hits: 2,
94+
},
95+
],
96+
agent: {
97+
dryMode: false,
98+
library: "firewall-node",
99+
preventedPrototypePollution: false,
100+
serverless: false,
101+
},
102+
packages: [
103+
{
104+
name: "@aikidosec/firewall",
105+
},
106+
{
107+
name: "hono",
108+
},
109+
{
110+
name: "pg",
111+
},
112+
],
113+
stats: {
114+
operations: {
115+
"pg.query": {
116+
attacksDetected: {
117+
blocked: 0,
118+
total: 0,
119+
},
120+
kind: "sql_op",
121+
},
122+
},
123+
requests: {
124+
aborted: 0,
125+
attackWaves: {
126+
blocked: 0,
127+
total: 0,
128+
},
129+
attacksDetected: {
130+
blocked: 0,
131+
total: 0,
132+
},
133+
rateLimited: 0,
134+
total: 1,
135+
},
136+
sqlTokenizationFailures: 0,
137+
},
138+
routes: [
139+
{
140+
hits: 1,
141+
method: "GET",
142+
path: "/",
143+
rateLimitedCount: 0,
144+
},
145+
],
146+
users: [],
147+
},
148+
]);
149+
} catch (err) {
150+
fail(err);
151+
} finally {
152+
server.kill();
153+
}
154+
});

end2end/tests-new/hono-pg-esm.test.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,7 @@ test("if bypass IP is set, attack waves are ignored for that IP", async () => {
266266
...process.env,
267267
AIKIDO_TOKEN: token,
268268
AIKIDO_ENDPOINT: testServerUrl,
269+
AIKIDO_REALTIME_ENDPOINT: testServerUrl,
269270
AIKIDO_DEBUG: "true",
270271
},
271272
}

end2end/tests-new/hono-pg-ts-esm.test.mjs

Lines changed: 0 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,6 @@ const pathToAppDir = resolve(
1111
);
1212
const port = await getRandomPort();
1313
const port2 = await getRandomPort();
14-
const port3 = await getRandomPort();
15-
16-
const testServerUrl = "http://localhost:5874";
1714

1815
test("it blocks request in blocking mode", async () => {
1916
const server = spawn(
@@ -150,86 +147,3 @@ test("it does not block request in monitoring mode", async () => {
150147
server.kill();
151148
}
152149
});
153-
154-
test("It reports own http requests in heartbeat events", async () => {
155-
const response = await fetch(`${testServerUrl}/api/runtime/apps`, {
156-
method: "POST",
157-
});
158-
const body = await response.json();
159-
const token = body.token;
160-
161-
const server = spawn(
162-
`node`,
163-
[
164-
"--require",
165-
"@aikidosec/firewall/instrument",
166-
"--experimental-strip-types",
167-
"./app.ts",
168-
port3,
169-
],
170-
{
171-
cwd: pathToAppDir,
172-
env: {
173-
...process.env,
174-
AIKIDO_TOKEN: token,
175-
AIKIDO_ENDPOINT: testServerUrl,
176-
AIKIDO_DEBUG: "true",
177-
},
178-
}
179-
);
180-
181-
try {
182-
server.on("error", (err) => {
183-
fail(err);
184-
});
185-
186-
let stdout = "";
187-
server.stdout.on("data", (data) => {
188-
stdout += data.toString();
189-
});
190-
191-
let stderr = "";
192-
server.stderr.on("data", (data) => {
193-
stderr += data.toString();
194-
});
195-
196-
// Wait for the server to start
197-
await timeout(2000);
198-
199-
await fetch(`http://127.0.0.1:${port3}/`, {
200-
method: "GET",
201-
signal: AbortSignal.timeout(5000),
202-
});
203-
204-
// Wait for heartbeat to be sent
205-
await timeout(35000);
206-
207-
const eventsResponse = await fetch(`${testServerUrl}/api/runtime/events`, {
208-
method: "GET",
209-
headers: {
210-
Authorization: token,
211-
},
212-
signal: AbortSignal.timeout(5000),
213-
});
214-
215-
const events = await eventsResponse.json();
216-
const heartbeatEvents = events.filter(
217-
(event) => event.type === "heartbeat"
218-
);
219-
equal(heartbeatEvents.length, 1);
220-
221-
const heartbeatEvent = heartbeatEvents[0];
222-
223-
equal(heartbeatEvent.hostnames.length, 1);
224-
225-
const hostname = heartbeatEvent.hostnames[0];
226-
227-
equal(hostname.hostname, "localhost");
228-
equal(hostname.hits, 2);
229-
equal(hostname.port, 5874);
230-
} catch (err) {
231-
fail(err);
232-
} finally {
233-
server.kill();
234-
}
235-
});

0 commit comments

Comments
 (0)