|
1 | | -import type { NodeId, SeedNodes } from '@/nodes/types'; |
| 1 | +import type { NodeId, NodeIdEncoded, SeedNodes } from '@/nodes/types'; |
2 | 2 | import type { Host, Port } from '@/network/types'; |
3 | 3 | import type { Sigchain } from '@/sigchain'; |
4 | 4 | import fs from 'fs'; |
@@ -123,6 +123,13 @@ describe(`${NodeConnectionManager.name} seed nodes test`, () => { |
123 | 123 | }); |
124 | 124 |
|
125 | 125 | beforeEach(async () => { |
| 126 | + // Clearing nodes from graphs |
| 127 | + for await (const [nodeId] of remoteNode1.nodeGraph.getNodes()) { |
| 128 | + await remoteNode1.nodeGraph.unsetNode(nodeId); |
| 129 | + } |
| 130 | + for await (const [nodeId] of remoteNode2.nodeGraph.getNodes()) { |
| 131 | + await remoteNode2.nodeGraph.unsetNode(nodeId); |
| 132 | + } |
126 | 133 | dataDir = await fs.promises.mkdtemp( |
127 | 134 | path.join(os.tmpdir(), 'polykey-test-'), |
128 | 135 | ); |
@@ -417,4 +424,84 @@ describe(`${NodeConnectionManager.name} seed nodes test`, () => { |
417 | 424 | await queue?.stop(); |
418 | 425 | } |
419 | 426 | }); |
| 427 | + test('should expand the network when nodes enter', async () => { |
| 428 | + // Using a single seed node we need to check that each entering node adds itself to the seed node. |
| 429 | + // Also need to check that the new nodes can be seen in the network. |
| 430 | + let node1: PolykeyAgent | undefined; |
| 431 | + let node2: PolykeyAgent | undefined; |
| 432 | + const seedNodes: SeedNodes = {}; |
| 433 | + seedNodes[nodesUtils.encodeNodeId(remoteNodeId1)] = { |
| 434 | + host: remoteNode1.proxy.getProxyHost(), |
| 435 | + port: remoteNode1.proxy.getProxyPort(), |
| 436 | + }; |
| 437 | + seedNodes[nodesUtils.encodeNodeId(remoteNodeId2)] = { |
| 438 | + host: remoteNode2.proxy.getProxyHost(), |
| 439 | + port: remoteNode2.proxy.getProxyPort(), |
| 440 | + }; |
| 441 | + try { |
| 442 | + logger.setLevel(LogLevel.WARN); |
| 443 | + node1 = await PolykeyAgent.createPolykeyAgent({ |
| 444 | + nodePath: path.join(dataDir, 'node1'), |
| 445 | + password: 'password', |
| 446 | + networkConfig: { |
| 447 | + proxyHost: localHost, |
| 448 | + agentHost: localHost, |
| 449 | + clientHost: localHost, |
| 450 | + forwardHost: localHost, |
| 451 | + }, |
| 452 | + seedNodes, |
| 453 | + logger, |
| 454 | + }); |
| 455 | + node2 = await PolykeyAgent.createPolykeyAgent({ |
| 456 | + nodePath: path.join(dataDir, 'node2'), |
| 457 | + password: 'password', |
| 458 | + networkConfig: { |
| 459 | + proxyHost: localHost, |
| 460 | + agentHost: localHost, |
| 461 | + clientHost: localHost, |
| 462 | + forwardHost: localHost, |
| 463 | + }, |
| 464 | + seedNodes, |
| 465 | + logger, |
| 466 | + }); |
| 467 | + |
| 468 | + await node1.queue.drained(); |
| 469 | + await node1.nodeManager.refreshBucketQueueDrained(); |
| 470 | + await node2.queue.drained(); |
| 471 | + await node2.nodeManager.refreshBucketQueueDrained(); |
| 472 | + |
| 473 | + const getAllNodes = async (node: PolykeyAgent) => { |
| 474 | + const nodes: Array<NodeIdEncoded> = []; |
| 475 | + for await (const [nodeId] of node.nodeGraph.getNodes()) { |
| 476 | + nodes.push(nodesUtils.encodeNodeId(nodeId)); |
| 477 | + } |
| 478 | + return nodes; |
| 479 | + }; |
| 480 | + const rNode1Nodes = await getAllNodes(remoteNode1); |
| 481 | + const rNode2Nodes = await getAllNodes(remoteNode2); |
| 482 | + const node1Nodes = await getAllNodes(node1); |
| 483 | + const node2Nodes = await getAllNodes(node2); |
| 484 | + |
| 485 | + const nodeIdR1 = nodesUtils.encodeNodeId(remoteNodeId1); |
| 486 | + const nodeIdR2 = nodesUtils.encodeNodeId(remoteNodeId2); |
| 487 | + const nodeId1 = nodesUtils.encodeNodeId(node1.keyManager.getNodeId()); |
| 488 | + const nodeId2 = nodesUtils.encodeNodeId(node2.keyManager.getNodeId()); |
| 489 | + expect(rNode1Nodes).toContain(nodeId1); |
| 490 | + expect(rNode1Nodes).toContain(nodeId2); |
| 491 | + expect(rNode2Nodes).toContain(nodeId1); |
| 492 | + expect(rNode2Nodes).toContain(nodeId2); |
| 493 | + expect(node1Nodes).toContain(nodeIdR1); |
| 494 | + expect(node1Nodes).toContain(nodeIdR2); |
| 495 | + expect(node1Nodes).toContain(nodeId2); |
| 496 | + expect(node2Nodes).toContain(nodeIdR1); |
| 497 | + expect(node2Nodes).toContain(nodeIdR2); |
| 498 | + expect(node2Nodes).toContain(nodeId1); |
| 499 | + } finally { |
| 500 | + logger.setLevel(LogLevel.WARN); |
| 501 | + await node1?.stop(); |
| 502 | + await node1?.destroy(); |
| 503 | + await node2?.stop(); |
| 504 | + await node2?.destroy(); |
| 505 | + } |
| 506 | + }); |
420 | 507 | }); |
0 commit comments