Skip to content

Commit 09065aa

Browse files
committed
wip: creating nodesAuditsGet tests
1 parent 24f9a62 commit 09065aa

File tree

5 files changed

+220
-0
lines changed

5 files changed

+220
-0
lines changed

src/nodes/agent/callers/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@ import notificationsSend from './notificationsSend';
1010
import vaultsGitInfoGet from './vaultsGitInfoGet';
1111
import vaultsGitPackGet from './vaultsGitPackGet';
1212
import vaultsScan from './vaultsScan';
13+
import nodesAuditEventsGet from './nodesAuditEventsGet';
1314

1415
/**
1516
* Client manifest
1617
*/
1718
const manifestClient = {
19+
nodesAuditEventsGet,
1820
nodesClaimsGet,
1921
nodesClosestActiveConnectionsGet,
2022
nodesClosestLocalNodesGet,
@@ -34,6 +36,7 @@ type AgentClientManifest = typeof manifestClient;
3436
export default manifestClient;
3537

3638
export {
39+
nodesAuditEventsGet,
3740
nodesClaimsGet,
3841
nodesClosestActiveConnectionsGet,
3942
nodesClosestLocalNodesGet,
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import type { HandlerTypes } from '@matrixai/rpc';
2+
import type NodesAuditEventsGet from '../handlers/NodesAuditEventsGet';
3+
import { ServerCaller } from '@matrixai/rpc';
4+
5+
type CallerTypes = HandlerTypes<NodesAuditEventsGet>;
6+
7+
const nodesAuditEventsGet = new ServerCaller<
8+
CallerTypes['input'],
9+
CallerTypes['output']
10+
>();
11+
12+
export default nodesAuditEventsGet;
File renamed without changes.

src/nodes/agent/handlers/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import type NodeManager from '../../../nodes/NodeManager';
88
import type NodeConnectionManager from '../../../nodes/NodeConnectionManager';
99
import type NotificationsManager from '../../../notifications/NotificationsManager';
1010
import type VaultManager from '../../../vaults/VaultManager';
11+
import NodesAuditEventsGet from './NodesAuditEventsGet';
1112
import NodesClaimsGet from './NodesClaimsGet';
1213
import NodesClosestActiveConnectionsGet from './NodesClosestActiveConnectionsGet';
1314
import NodesClosestLocalNodesGet from './NodesClosestLocalNodesGet';
@@ -36,6 +37,7 @@ const manifestServer = (container: {
3637
vaultManager: VaultManager;
3738
}) => {
3839
return {
40+
nodesAuditEventsGet: new NodesAuditEventsGet(container),
3941
nodesClaimsGet: new NodesClaimsGet(container),
4042
nodesClosestActiveConnectionsGet: new NodesClosestActiveConnectionsGet(
4143
container,
@@ -57,6 +59,7 @@ type AgentServerManifest = ReturnType<typeof manifestServer>;
5759
export default manifestServer;
5860

5961
export {
62+
NodesAuditEventsGet,
6063
NodesClaimsGet,
6164
NodesClosestActiveConnectionsGet,
6265
NodesClosestLocalNodesGet,
Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
import fs from 'fs';
2+
import path from 'path';
3+
import os from 'os';
4+
import Logger, { LogLevel, StreamHandler } from '@matrixai/logger';
5+
import { QUICClient, QUICServer, events as quicEvents } from '@matrixai/quic';
6+
import { DB } from '@matrixai/db';
7+
import { RPCClient, RPCServer } from '@matrixai/rpc';
8+
import NodesAuditEventsGet from '@/nodes/agent/handlers/NodesAuditEventsGet';
9+
import { nodesAuditEventsGet } from '@/nodes/agent/callers';
10+
import * as nodesUtils from '@/nodes/utils';
11+
12+
import KeyRing from '@/keys/KeyRing';
13+
import Audit from '@/audit/Audit';
14+
import * as keysUtils from '@/keys/utils';
15+
import * as networkUtils from '@/network/utils';
16+
import * as tlsTestsUtils from '../../../utils/tls';
17+
import * as auditUtils from '@/audit/utils';
18+
import NodeConnectionManager from '@/nodes/NodeConnectionManager';
19+
import Discovery from '@/discovery/Discovery';
20+
21+
describe('nodesAuditEventsGet', () => {
22+
const logger = new Logger('nodesAuditEventsGet test', LogLevel.WARN, [
23+
new StreamHandler(),
24+
]);
25+
const password = 'password';
26+
const localHost = '127.0.0.1';
27+
28+
let dataDir: string;
29+
30+
let keyRing: KeyRing;
31+
let db: DB;
32+
let audit: Audit;
33+
let rpcServer: RPCServer;
34+
let quicServer: QUICServer;
35+
36+
const clientManifest = {
37+
nodesAuditEventsGet: nodesAuditEventsGet,
38+
};
39+
type ClientManifest = typeof clientManifest;
40+
let rpcClient: RPCClient<ClientManifest>;
41+
let quicClient: QUICClient;
42+
43+
beforeEach(async () => {
44+
dataDir = await fs.promises.mkdtemp(
45+
path.join(os.tmpdir(), 'polykey-test-'),
46+
);
47+
48+
// Handler dependencies
49+
const keysPath = path.join(dataDir, 'keys');
50+
keyRing = await KeyRing.createKeyRing({
51+
keysPath,
52+
password,
53+
passwordOpsLimit: keysUtils.passwordOpsLimits.min,
54+
passwordMemLimit: keysUtils.passwordMemLimits.min,
55+
strictMemoryLock: false,
56+
logger,
57+
});
58+
const dbPath = path.join(dataDir, 'db');
59+
db = await DB.createDB({
60+
dbPath,
61+
logger,
62+
});
63+
audit = await Audit.createAudit({
64+
db,
65+
nodeConnectionManager: new EventTarget() as NodeConnectionManager,
66+
discovery: new EventTarget() as Discovery,
67+
logger,
68+
});
69+
70+
// Setting up server
71+
const serverManifest = {
72+
nodesAuditEventsGet: new NodesAuditEventsGet({
73+
db,
74+
sigchain: {} as any, // Mock sigchain if needed
75+
}),
76+
};
77+
rpcServer = new RPCServer({
78+
fromError: networkUtils.fromError,
79+
logger,
80+
});
81+
await rpcServer.start({ manifest: serverManifest });
82+
const tlsConfig = await tlsTestsUtils.createTLSConfig(keyRing.keyPair);
83+
quicServer = new QUICServer({
84+
config: {
85+
key: tlsConfig.keyPrivatePem,
86+
cert: tlsConfig.certChainPem,
87+
verifyPeer: false,
88+
},
89+
crypto: nodesUtils.quicServerCrypto,
90+
logger,
91+
});
92+
const handleStream = async (
93+
event: quicEvents.EventQUICConnectionStream,
94+
) => {
95+
// Streams are handled via the RPCServer.
96+
const stream = event.detail;
97+
logger.info('Handling new stream');
98+
rpcServer.handleStream(stream);
99+
};
100+
const handleConnection = async (
101+
event: quicEvents.EventQUICServerConnection,
102+
) => {
103+
// Needs to setup stream handler
104+
const conn = event.detail;
105+
logger.info('Handling new connection');
106+
conn.addEventListener(
107+
quicEvents.EventQUICConnectionStream.name,
108+
handleStream,
109+
);
110+
conn.addEventListener(
111+
quicEvents.EventQUICConnectionStopped.name,
112+
() => {
113+
conn.removeEventListener(
114+
quicEvents.EventQUICConnectionStream.name,
115+
handleStream,
116+
);
117+
},
118+
{ once: true },
119+
);
120+
};
121+
quicServer.addEventListener(
122+
quicEvents.EventQUICServerConnection.name,
123+
handleConnection,
124+
);
125+
quicServer.addEventListener(
126+
quicEvents.EventQUICConnectionStopped.name,
127+
() => {
128+
quicServer.removeEventListener(
129+
quicEvents.EventQUICServerConnection.name,
130+
handleConnection,
131+
);
132+
},
133+
{ once: true },
134+
);
135+
await quicServer.start({
136+
host: localHost,
137+
});
138+
139+
// Setting up client
140+
rpcClient = new RPCClient({
141+
manifest: clientManifest,
142+
streamFactory: async () => {
143+
return quicClient.connection.newStream();
144+
},
145+
toError: networkUtils.toError,
146+
logger,
147+
});
148+
quicClient = await QUICClient.createQUICClient({
149+
crypto: nodesUtils.quicClientCrypto,
150+
config: {
151+
verifyPeer: false,
152+
},
153+
host: localHost,
154+
port: quicServer.port,
155+
localHost: localHost,
156+
logger,
157+
});
158+
});
159+
160+
afterEach(async () => {
161+
await rpcServer.stop({ force: true });
162+
await quicServer.stop({ force: true });
163+
await audit.stop();
164+
await db.stop();
165+
await keyRing.stop();
166+
});
167+
168+
test('should get audit events', async () => {
169+
// Add mock audit events
170+
const mockAuditEvents = [
171+
{ id: new Uint8Array([1, 2, 3]) },
172+
{ id: new Uint8Array([4, 5, 6]) },
173+
];
174+
for (const event of mockAuditEvents) {
175+
await audit.setAuditEvent(['node', 'connection', 'reverse'], {
176+
id: event.id,
177+
path: ['node', 'connection'],
178+
data: { type: 'reverse' },
179+
});
180+
}
181+
182+
// Call the RPC method
183+
const response = await rpcClient.methods.nodesAuditEventsGet({
184+
seek: 0, // Example seek value
185+
seekEnd: Date.now(), // Example seekEnd value
186+
limit: 10,
187+
auditIdEncoded: undefined
188+
});
189+
190+
// Collect results
191+
const auditIds: Array<string> = [];
192+
for await (const result of response) {
193+
auditIds.push(result.auditIdEncoded ?? '');
194+
}
195+
196+
// Assertions
197+
expect(auditIds).toHaveLength(mockAuditEvents.length);
198+
expect(auditIds).toEqual(
199+
mockAuditEvents.map((event) => auditUtils.encodeAuditEventId(event.id)),
200+
);
201+
});
202+
});

0 commit comments

Comments
 (0)