Skip to content

Commit d28b9e0

Browse files
committed
tests: Added agent service tests for nodesChainDataGet, nodesClosestLocalNode and nodesHolePunchMessage
1 parent 3950871 commit d28b9e0

3 files changed

Lines changed: 329 additions & 0 deletions

File tree

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
import type { Host, Port } from '@/network/types';
2+
import type { NodeIdEncoded } from '@/nodes/types';
3+
import fs from 'fs';
4+
import path from 'path';
5+
import os from 'os';
6+
import Logger, { LogLevel, StreamHandler } from '@matrixai/logger';
7+
import PolykeyAgent from '@/PolykeyAgent';
8+
import GRPCServer from '@/grpc/GRPCServer';
9+
import GRPCClientAgent from '@/agent/GRPCClientAgent';
10+
import { AgentServiceService } from '@/proto/js/polykey/v1/agent_service_grpc_pb';
11+
import * as nodesPB from '@/proto/js/polykey/v1/nodes/nodes_pb';
12+
import * as keysUtils from '@/keys/utils';
13+
import * as nodesUtils from '@/nodes/utils';
14+
import nodesClosestLocalNodesGet from '@/agent/service/nodesClosestLocalNodesGet';
15+
import * as testNodesUtils from '../../nodes/utils';
16+
import * as testUtils from '../../utils';
17+
18+
describe('nodesClosestLocalNode', () => {
19+
const logger = new Logger('nodesClosestLocalNode test', LogLevel.WARN, [
20+
new StreamHandler(),
21+
]);
22+
const password = 'helloworld';
23+
let dataDir: string;
24+
let nodePath: string;
25+
let grpcServer: GRPCServer;
26+
let grpcClient: GRPCClientAgent;
27+
let pkAgent: PolykeyAgent;
28+
let mockedGenerateKeyPair: jest.SpyInstance;
29+
let mockedGenerateDeterministicKeyPair: jest.SpyInstance;
30+
beforeAll(async () => {
31+
const globalKeyPair = await testUtils.setupGlobalKeypair();
32+
mockedGenerateKeyPair = jest
33+
.spyOn(keysUtils, 'generateKeyPair')
34+
.mockResolvedValueOnce(globalKeyPair);
35+
mockedGenerateDeterministicKeyPair = jest
36+
.spyOn(keysUtils, 'generateDeterministicKeyPair')
37+
.mockResolvedValueOnce(globalKeyPair);
38+
dataDir = await fs.promises.mkdtemp(
39+
path.join(os.tmpdir(), 'polykey-test-'),
40+
);
41+
nodePath = path.join(dataDir, 'keynode');
42+
pkAgent = await PolykeyAgent.createPolykeyAgent({
43+
password,
44+
nodePath,
45+
keysConfig: {
46+
rootKeyPairBits: 2048,
47+
},
48+
seedNodes: {}, // Explicitly no seed nodes on startup
49+
networkConfig: {
50+
proxyHost: '127.0.0.1' as Host,
51+
},
52+
logger,
53+
});
54+
// Setting up a remote keynode
55+
const agentService = {
56+
nodesClosestLocalNodesGet: nodesClosestLocalNodesGet({
57+
nodeGraph: pkAgent.nodeGraph,
58+
}),
59+
};
60+
grpcServer = new GRPCServer({ logger });
61+
await grpcServer.start({
62+
services: [[AgentServiceService, agentService]],
63+
host: '127.0.0.1' as Host,
64+
port: 0 as Port,
65+
});
66+
grpcClient = await GRPCClientAgent.createGRPCClientAgent({
67+
nodeId: pkAgent.keyManager.getNodeId(),
68+
host: '127.0.0.1' as Host,
69+
port: grpcServer.getPort(),
70+
logger,
71+
});
72+
}, global.defaultTimeout);
73+
afterAll(async () => {
74+
await grpcClient.destroy();
75+
await grpcServer.stop();
76+
await pkAgent.stop();
77+
await pkAgent.destroy();
78+
await fs.promises.rm(dataDir, {
79+
force: true,
80+
recursive: true,
81+
});
82+
mockedGenerateKeyPair.mockRestore();
83+
mockedGenerateDeterministicKeyPair.mockRestore();
84+
});
85+
test('should get closest local nodes', async () => {
86+
// Adding 10 nodes
87+
const nodes: Array<NodeIdEncoded> = [];
88+
for (let i = 0; i < 10; i++) {
89+
const nodeId = testNodesUtils.generateRandomNodeId();
90+
await pkAgent.nodeGraph.setNode(nodeId, {
91+
host: 'localhost' as Host,
92+
port: 55555 as Port,
93+
});
94+
nodes.push(nodesUtils.encodeNodeId(nodeId));
95+
}
96+
const nodeIdEncoded = nodesUtils.encodeNodeId(
97+
testNodesUtils.generateRandomNodeId(),
98+
);
99+
const nodeMessage = new nodesPB.Node();
100+
nodeMessage.setNodeId(nodeIdEncoded);
101+
const result = await grpcClient.nodesClosestLocalNodesGet(nodeMessage);
102+
const resultNodes: Array<NodeIdEncoded> = [];
103+
for (const [resultNode] of result.toObject().nodeTableMap) {
104+
resultNodes.push(resultNode as NodeIdEncoded);
105+
}
106+
expect(nodes.sort()).toEqual(resultNodes.sort());
107+
});
108+
});
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
import type { Host, Port } from '@/network/types';
2+
import type { ClaimData } from '@/claims/types';
3+
import type { IdentityId, ProviderId } from '@/identities/types';
4+
import fs from 'fs';
5+
import path from 'path';
6+
import os from 'os';
7+
import Logger, { LogLevel, StreamHandler } from '@matrixai/logger';
8+
import PolykeyAgent from '@/PolykeyAgent';
9+
import GRPCServer from '@/grpc/GRPCServer';
10+
import GRPCClientAgent from '@/agent/GRPCClientAgent';
11+
import { AgentServiceService } from '@/proto/js/polykey/v1/agent_service_grpc_pb';
12+
import * as utilsPB from '@/proto/js/polykey/v1/utils/utils_pb';
13+
import * as keysUtils from '@/keys/utils';
14+
import * as nodesUtils from '@/nodes/utils';
15+
import nodesChainDataGet from '@/agent/service/nodesChainDataGet';
16+
import * as testUtils from '../../utils';
17+
import * as testNodesUtils from '../../nodes/utils';
18+
19+
describe('nodesChainDataGet', () => {
20+
const logger = new Logger('nodesChainDataGet test', LogLevel.WARN, [
21+
new StreamHandler(),
22+
]);
23+
const password = 'helloworld';
24+
let dataDir: string;
25+
let nodePath: string;
26+
let grpcServer: GRPCServer;
27+
let grpcClient: GRPCClientAgent;
28+
let pkAgent: PolykeyAgent;
29+
let mockedGenerateKeyPair: jest.SpyInstance;
30+
let mockedGenerateDeterministicKeyPair: jest.SpyInstance;
31+
beforeAll(async () => {
32+
const globalKeyPair = await testUtils.setupGlobalKeypair();
33+
mockedGenerateKeyPair = jest
34+
.spyOn(keysUtils, 'generateKeyPair')
35+
.mockResolvedValueOnce(globalKeyPair);
36+
mockedGenerateDeterministicKeyPair = jest
37+
.spyOn(keysUtils, 'generateDeterministicKeyPair')
38+
.mockResolvedValueOnce(globalKeyPair);
39+
dataDir = await fs.promises.mkdtemp(
40+
path.join(os.tmpdir(), 'polykey-test-'),
41+
);
42+
nodePath = path.join(dataDir, 'keynode');
43+
pkAgent = await PolykeyAgent.createPolykeyAgent({
44+
password,
45+
nodePath,
46+
keysConfig: {
47+
rootKeyPairBits: 2048,
48+
},
49+
seedNodes: {}, // Explicitly no seed nodes on startup
50+
networkConfig: {
51+
proxyHost: '127.0.0.1' as Host,
52+
},
53+
logger,
54+
});
55+
const agentService = {
56+
nodesChainDataGet: nodesChainDataGet({
57+
sigchain: pkAgent.sigchain,
58+
}),
59+
};
60+
grpcServer = new GRPCServer({ logger });
61+
await grpcServer.start({
62+
services: [[AgentServiceService, agentService]],
63+
host: '127.0.0.1' as Host,
64+
port: 0 as Port,
65+
});
66+
grpcClient = await GRPCClientAgent.createGRPCClientAgent({
67+
nodeId: pkAgent.keyManager.getNodeId(),
68+
host: '127.0.0.1' as Host,
69+
port: grpcServer.getPort(),
70+
logger,
71+
});
72+
}, global.defaultTimeout);
73+
afterAll(async () => {
74+
await grpcClient.destroy();
75+
await grpcServer.stop();
76+
await pkAgent.stop();
77+
await pkAgent.destroy();
78+
await fs.promises.rm(dataDir, {
79+
force: true,
80+
recursive: true,
81+
});
82+
mockedGenerateKeyPair.mockRestore();
83+
mockedGenerateDeterministicKeyPair.mockRestore();
84+
});
85+
test('should get closest nodes', async () => {
86+
const srcNodeIdEncoded = nodesUtils.encodeNodeId(
87+
pkAgent.keyManager.getNodeId(),
88+
);
89+
// Add 10 claims
90+
for (let i = 1; i <= 5; i++) {
91+
const node2 = nodesUtils.encodeNodeId(
92+
testNodesUtils.generateRandomNodeId(),
93+
);
94+
const nodeLink: ClaimData = {
95+
type: 'node',
96+
node1: srcNodeIdEncoded,
97+
node2: node2,
98+
};
99+
await pkAgent.sigchain.addClaim(nodeLink);
100+
}
101+
for (let i = 6; i <= 10; i++) {
102+
const identityLink: ClaimData = {
103+
type: 'identity',
104+
node: srcNodeIdEncoded,
105+
provider: ('ProviderId' + i.toString()) as ProviderId,
106+
identity: ('IdentityId' + i.toString()) as IdentityId,
107+
};
108+
await pkAgent.sigchain.addClaim(identityLink);
109+
}
110+
111+
const response = await grpcClient.nodesChainDataGet(
112+
new utilsPB.EmptyMessage(),
113+
);
114+
const chainIds: Array<string> = [];
115+
for (const [id] of response.toObject().chainDataMap) chainIds.push(id);
116+
expect(chainIds).toHaveLength(10);
117+
});
118+
});
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
import type { Host, Port } from '@/network/types';
2+
import fs from 'fs';
3+
import path from 'path';
4+
import os from 'os';
5+
import Logger, { LogLevel, StreamHandler } from '@matrixai/logger';
6+
import PolykeyAgent from '@/PolykeyAgent';
7+
import GRPCServer from '@/grpc/GRPCServer';
8+
import GRPCClientAgent from '@/agent/GRPCClientAgent';
9+
import { AgentServiceService } from '@/proto/js/polykey/v1/agent_service_grpc_pb';
10+
import * as nodesPB from '@/proto/js/polykey/v1/nodes/nodes_pb';
11+
import * as keysUtils from '@/keys/utils';
12+
import * as nodesUtils from '@/nodes/utils';
13+
import nodesHolePunchMessageSend from '@/agent/service/nodesHolePunchMessageSend';
14+
import * as networkUtils from '@/network/utils';
15+
import * as testUtils from '../../utils';
16+
17+
describe('nodesHolePunchMessage', () => {
18+
const logger = new Logger('nodesHolePunchMessage test', LogLevel.WARN, [
19+
new StreamHandler(),
20+
]);
21+
const password = 'helloworld';
22+
let dataDir: string;
23+
let nodePath: string;
24+
let grpcServer: GRPCServer;
25+
let grpcClient: GRPCClientAgent;
26+
let pkAgent: PolykeyAgent;
27+
let mockedGenerateKeyPair: jest.SpyInstance;
28+
let mockedGenerateDeterministicKeyPair: jest.SpyInstance;
29+
beforeAll(async () => {
30+
const globalKeyPair = await testUtils.setupGlobalKeypair();
31+
mockedGenerateKeyPair = jest
32+
.spyOn(keysUtils, 'generateKeyPair')
33+
.mockResolvedValueOnce(globalKeyPair);
34+
mockedGenerateDeterministicKeyPair = jest
35+
.spyOn(keysUtils, 'generateDeterministicKeyPair')
36+
.mockResolvedValueOnce(globalKeyPair);
37+
dataDir = await fs.promises.mkdtemp(
38+
path.join(os.tmpdir(), 'polykey-test-'),
39+
);
40+
nodePath = path.join(dataDir, 'keynode');
41+
pkAgent = await PolykeyAgent.createPolykeyAgent({
42+
password,
43+
nodePath,
44+
keysConfig: {
45+
rootKeyPairBits: 2048,
46+
},
47+
seedNodes: {}, // Explicitly no seed nodes on startup
48+
networkConfig: {
49+
proxyHost: '127.0.0.1' as Host,
50+
},
51+
logger,
52+
});
53+
const agentService = {
54+
nodesHolePunchMessageSend: nodesHolePunchMessageSend({
55+
keyManager: pkAgent.keyManager,
56+
nodeConnectionManager: pkAgent.nodeConnectionManager,
57+
nodeManager: pkAgent.nodeManager,
58+
}),
59+
};
60+
grpcServer = new GRPCServer({ logger });
61+
await grpcServer.start({
62+
services: [[AgentServiceService, agentService]],
63+
host: '127.0.0.1' as Host,
64+
port: 0 as Port,
65+
});
66+
grpcClient = await GRPCClientAgent.createGRPCClientAgent({
67+
nodeId: pkAgent.keyManager.getNodeId(),
68+
host: '127.0.0.1' as Host,
69+
port: grpcServer.getPort(),
70+
logger,
71+
});
72+
}, global.defaultTimeout);
73+
afterAll(async () => {
74+
await grpcClient.destroy();
75+
await grpcServer.stop();
76+
await pkAgent.stop();
77+
await pkAgent.destroy();
78+
await fs.promises.rm(dataDir, {
79+
force: true,
80+
recursive: true,
81+
});
82+
mockedGenerateKeyPair.mockRestore();
83+
mockedGenerateDeterministicKeyPair.mockRestore();
84+
});
85+
test('should get the chain data', async () => {
86+
const nodeId = nodesUtils.encodeNodeId(pkAgent.keyManager.getNodeId());
87+
const proxyAddress = networkUtils.buildAddress(
88+
pkAgent.proxy.getProxyHost(),
89+
pkAgent.proxy.getProxyPort(),
90+
);
91+
const signature = await pkAgent.keyManager.signWithRootKeyPair(
92+
Buffer.from(proxyAddress),
93+
);
94+
const relayMessage = new nodesPB.Relay();
95+
relayMessage
96+
.setTargetId(nodeId)
97+
.setSrcId(nodeId)
98+
.setSignature(signature.toString())
99+
.setProxyAddress(proxyAddress);
100+
await grpcClient.nodesHolePunchMessageSend(relayMessage);
101+
// TODO: check if the ping was sent
102+
});
103+
});

0 commit comments

Comments
 (0)