diff --git a/tests/bin/agent/lock.test.ts b/tests/bin/agent/lock.test.ts index e95ec314a..eee8239c4 100644 --- a/tests/bin/agent/lock.test.ts +++ b/tests/bin/agent/lock.test.ts @@ -6,23 +6,27 @@ import Logger, { LogLevel, StreamHandler } from '@matrixai/logger'; import Session from '@/sessions/Session'; import config from '@/config'; import * as testBinUtils from '../utils'; -import * as testUtils from '../../utils'; import { runTestIfPlatforms } from '../../utils'; +import { globalRootKeyPems } from '../../globalRootKeyPems'; jest.mock('prompts'); const mockedPrompts = mocked(prompts.prompt); describe('lock', () => { const logger = new Logger('lock test', LogLevel.WARN, [new StreamHandler()]); - let globalAgentDir; - let globalAgentPassword; - let globalAgentClose; - beforeAll(async () => { - ({ globalAgentDir, globalAgentPassword, globalAgentClose } = - await testUtils.setupGlobalAgent(logger)); - }, globalThis.maxTimeout); - afterAll(async () => { - await globalAgentClose(); + let agentDir: string; + let agentPassword: string; + let agentClose: () => Promise; + beforeEach(async () => { + ({ agentDir, agentPassword, agentClose } = + await testBinUtils.setupTestAgent( + global.testCmd, + globalRootKeyPems[0], + logger, + )); + }); + afterEach(async () => { + await agentClose(); }); runTestIfPlatforms('linux', 'docker')( 'lock deletes the session token', @@ -30,21 +34,21 @@ describe('lock', () => { await testBinUtils.pkStdioSwitch(global.testCmd)( ['agent', 'unlock'], { - PK_NODE_PATH: globalAgentDir, - PK_PASSWORD: globalAgentPassword, + PK_NODE_PATH: agentDir, + PK_PASSWORD: agentPassword, }, - globalAgentDir, + agentDir, ); const { exitCode } = await testBinUtils.pkStdioSwitch(global.testCmd)( ['agent', 'lock'], { - PK_NODE_PATH: globalAgentDir, + PK_NODE_PATH: agentDir, }, - globalAgentDir, + agentDir, ); expect(exitCode).toBe(0); const session = await Session.createSession({ - sessionTokenPath: path.join(globalAgentDir, config.defaults.tokenBase), + sessionTokenPath: path.join(agentDir, config.defaults.tokenBase), fs, logger, }); @@ -52,10 +56,10 @@ describe('lock', () => { await session.stop(); }, ); - runTestIfPlatforms('linux')( + runTestIfPlatforms('linux', 'docker')( 'lock ensures re-authentication is required', async () => { - const password = globalAgentPassword; + const password = agentPassword; mockedPrompts.mockClear(); mockedPrompts.mockImplementation(async (_opts: any) => { return { password }; @@ -63,26 +67,26 @@ describe('lock', () => { await testBinUtils.pkStdio( ['agent', 'unlock'], { - PK_NODE_PATH: globalAgentDir, - PK_PASSWORD: globalAgentPassword, + PK_NODE_PATH: agentDir, + PK_PASSWORD: agentPassword, }, - globalAgentDir, + agentDir, ); // Session token is deleted await testBinUtils.pkStdio( ['agent', 'lock'], { - PK_NODE_PATH: globalAgentDir, + PK_NODE_PATH: agentDir, }, - globalAgentDir, + agentDir, ); // Will prompt to reauthenticate await testBinUtils.pkStdio( ['agent', 'status'], { - PK_NODE_PATH: globalAgentDir, + PK_NODE_PATH: agentDir, }, - globalAgentDir, + agentDir, ); // Prompted for password 1 time expect(mockedPrompts.mock.calls.length).toBe(1); diff --git a/tests/bin/agent/lockall.test.ts b/tests/bin/agent/lockall.test.ts index d922d6378..10ae7c653 100644 --- a/tests/bin/agent/lockall.test.ts +++ b/tests/bin/agent/lockall.test.ts @@ -7,8 +7,8 @@ import Session from '@/sessions/Session'; import config from '@/config'; import * as errors from '@/errors'; import * as testBinUtils from '../utils'; -import * as testUtils from '../../utils'; import { runTestIfPlatforms } from '../../utils'; +import { globalRootKeyPems } from '../../globalRootKeyPems'; /** * Mock prompts module which is used prompt for password @@ -20,15 +20,19 @@ describe('lockall', () => { const logger = new Logger('lockall test', LogLevel.WARN, [ new StreamHandler(), ]); - let globalAgentDir; - let globalAgentPassword; - let globalAgentClose; - beforeAll(async () => { - ({ globalAgentDir, globalAgentPassword, globalAgentClose } = - await testUtils.setupGlobalAgent(logger)); - }, globalThis.maxTimeout); - afterAll(async () => { - await globalAgentClose(); + let agentDir; + let agentPassword; + let agentClose; + beforeEach(async () => { + ({ agentDir, agentPassword, agentClose } = + await testBinUtils.setupTestAgent( + global.testCmd, + globalRootKeyPems[0], + logger, + )); + }); + afterEach(async () => { + await agentClose(); }); runTestIfPlatforms('linux', 'docker')( 'lockall deletes the session token', @@ -36,21 +40,21 @@ describe('lockall', () => { await testBinUtils.pkStdioSwitch(global.testCmd)( ['agent', 'unlock'], { - PK_NODE_PATH: globalAgentDir, - PK_PASSWORD: globalAgentPassword, + PK_NODE_PATH: agentDir, + PK_PASSWORD: agentPassword, }, - globalAgentDir, + agentDir, ); const { exitCode } = await testBinUtils.pkStdioSwitch(global.testCmd)( ['agent', 'lockall'], { - PK_NODE_PATH: globalAgentDir, + PK_NODE_PATH: agentDir, }, - globalAgentDir, + agentDir, ); expect(exitCode).toBe(0); const session = await Session.createSession({ - sessionTokenPath: path.join(globalAgentDir, config.defaults.tokenBase), + sessionTokenPath: path.join(agentDir, config.defaults.tokenBase), fs, logger, }); @@ -61,21 +65,21 @@ describe('lockall', () => { runTestIfPlatforms('linux', 'docker')( 'lockall ensures reauthentication is required', async () => { - const password = globalAgentPassword; + const password = agentPassword; await testBinUtils.pkStdioSwitch(global.testCmd)( ['agent', 'unlock'], { - PK_NODE_PATH: globalAgentDir, - PK_PASSWORD: globalAgentPassword, + PK_NODE_PATH: agentDir, + PK_PASSWORD: agentPassword, }, - globalAgentDir, + agentDir, ); await testBinUtils.pkStdioSwitch(global.testCmd)( ['agent', 'lockall'], { - PK_NODE_PATH: globalAgentDir, + PK_NODE_PATH: agentDir, }, - globalAgentDir, + agentDir, ); // Token is deleted, reauthentication is required mockedPrompts.mockClear(); @@ -85,9 +89,9 @@ describe('lockall', () => { await testBinUtils.pkStdio( ['agent', 'status'], { - PK_NODE_PATH: globalAgentDir, + PK_NODE_PATH: agentDir, }, - globalAgentDir, + agentDir, ); // Prompted for password 1 time expect(mockedPrompts.mock.calls.length).toBe(1); @@ -100,13 +104,13 @@ describe('lockall', () => { await testBinUtils.pkStdioSwitch(global.testCmd)( ['agent', 'unlock'], { - PK_NODE_PATH: globalAgentDir, - PK_PASSWORD: globalAgentPassword, + PK_NODE_PATH: agentDir, + PK_PASSWORD: agentPassword, }, - globalAgentDir, + agentDir, ); const session = await Session.createSession({ - sessionTokenPath: path.join(globalAgentDir, config.defaults.tokenBase), + sessionTokenPath: path.join(agentDir, config.defaults.tokenBase), fs, logger, }); @@ -115,10 +119,10 @@ describe('lockall', () => { await testBinUtils.pkStdioSwitch(global.testCmd)( ['agent', 'lockall'], { - PK_NODE_PATH: globalAgentDir, - PK_PASSWORD: globalAgentPassword, + PK_NODE_PATH: agentDir, + PK_PASSWORD: agentPassword, }, - globalAgentDir, + agentDir, ); // Old token is invalid const { exitCode, stderr } = await testBinUtils.pkStdioSwitch( @@ -126,10 +130,10 @@ describe('lockall', () => { )( ['agent', 'status', '--format', 'json'], { - PK_NODE_PATH: globalAgentDir, + PK_NODE_PATH: agentDir, PK_TOKEN: token, }, - globalAgentDir, + agentDir, ); testBinUtils.expectProcessError(exitCode, stderr, [ new errors.ErrorClientAuthDenied(), diff --git a/tests/bin/agent/start.test.ts b/tests/bin/agent/start.test.ts index 850d5eb50..9d97862ac 100644 --- a/tests/bin/agent/start.test.ts +++ b/tests/bin/agent/start.test.ts @@ -832,9 +832,9 @@ describe('start', () => { runDescribeIfPlatforms('linux').only('start with global agent', () => { let agentDataDir; let agent1Status: StatusLive; - let agent1Stop: () => void; + let agent1Close: () => Promise; let agent2Status: StatusLive; - let agent2Stop: () => void; + let agent2Close: () => Promise; let seedNodeId1: NodeId; let seedNodeHost1: Host; let seedNodePort1: Port; @@ -846,21 +846,15 @@ describe('start', () => { agentDataDir = await fs.promises.mkdtemp( path.join(global.tmpDir, 'polykey-test-'), ); - const agent1Path = path.join(agentDataDir, 'agent1'); - await fs.promises.mkdir(agent1Path); - ({ agentStatus: agent1Status, agentStop: agent1Stop } = + ({ agentStatus: agent1Status, agentClose: agent1Close } = await testBinUtils.setupTestAgent( undefined, - agent1Path, globalRootKeyPems[0], logger, )); - const agent2Path = path.join(agentDataDir, 'agent2'); - await fs.promises.mkdir(agent2Path); - ({ agentStatus: agent2Status, agentStop: agent2Stop } = + ({ agentStatus: agent2Status, agentClose: agent2Close } = await testBinUtils.setupTestAgent( undefined, - agent2Path, globalRootKeyPems[1], logger, )); @@ -870,10 +864,10 @@ describe('start', () => { seedNodeId2 = agent2Status.data.nodeId; seedNodeHost2 = agent2Status.data.proxyHost; seedNodePort2 = agent2Status.data.proxyPort; - }, globalThis.maxTimeout); + }); afterEach(async () => { - agent1Stop(); - agent2Stop(); + await agent1Close(); + await agent2Close(); await fs.promises.rm(agentDataDir, { force: true, recursive: true, diff --git a/tests/bin/agent/status.test.ts b/tests/bin/agent/status.test.ts index ec2f560b1..502d1454d 100644 --- a/tests/bin/agent/status.test.ts +++ b/tests/bin/agent/status.test.ts @@ -5,8 +5,8 @@ import Status from '@/status/Status'; import * as nodesUtils from '@/nodes/utils'; import config from '@/config'; import * as testBinUtils from '../utils'; -import * as testUtils from '../../utils'; import { runTestIfPlatforms } from '../../utils'; +import { globalRootKeyPems } from '../../globalRootKeyPems'; describe('status', () => { const logger = new Logger('status test', LogLevel.WARN, [ @@ -43,8 +43,6 @@ describe('status', () => { [ 'agent', 'start', - '--root-key-pair-bits', - '1024', '--client-host', '127.0.0.1', '--proxy-host', @@ -56,6 +54,7 @@ describe('status', () => { { PK_NODE_PATH: path.join(dataDir, 'polykey'), PK_PASSWORD: password, + PK_ROOT_KEY: globalRootKeyPems[0], }, dataDir, logger, @@ -123,23 +122,24 @@ describe('status', () => { }); }); describe('status with global agent', () => { - let globalAgentDir; - let globalAgentPassword; - let globalAgentClose; - beforeAll(async () => { - ({ globalAgentDir, globalAgentPassword, globalAgentClose } = - await testUtils.setupGlobalAgent(logger)); - }, globalThis.maxTimeout); - afterAll(async () => { - await globalAgentClose(); + let agentDir; + let agentPassword; + let agentClose; + beforeEach(async () => { + ({ agentDir, agentPassword, agentClose } = + await testBinUtils.setupTestAgent( + global.testCmd, + globalRootKeyPems[1], + logger, + )); + }); + afterEach(async () => { + await agentClose(); }); runTestIfPlatforms('linux', 'docker')('status on LIVE agent', async () => { const status = new Status({ - statusPath: path.join(globalAgentDir, config.defaults.statusBase), - statusLockPath: path.join( - globalAgentDir, - config.defaults.statusLockBase, - ), + statusPath: path.join(agentDir, config.defaults.statusBase), + statusLockPath: path.join(agentDir, config.defaults.statusLockBase), fs, logger, }); @@ -149,10 +149,10 @@ describe('status', () => { )( ['agent', 'status', '--format', 'json', '--verbose'], { - PK_NODE_PATH: globalAgentDir, - PK_PASSWORD: globalAgentPassword, + PK_NODE_PATH: agentDir, + PK_PASSWORD: agentPassword, }, - globalAgentDir, + agentDir, ); expect(exitCode).toBe(0); expect(JSON.parse(stdout)).toMatchObject({ @@ -175,13 +175,10 @@ describe('status', () => { 'status on remote LIVE agent', async () => { const passwordPath = path.join(dataDir, 'password'); - await fs.promises.writeFile(passwordPath, globalAgentPassword); + await fs.promises.writeFile(passwordPath, agentPassword); const status = new Status({ - statusPath: path.join(globalAgentDir, config.defaults.statusBase), - statusLockPath: path.join( - globalAgentDir, - config.defaults.statusLockBase, - ), + statusPath: path.join(agentDir, config.defaults.statusBase), + statusLockPath: path.join(agentDir, config.defaults.statusLockBase), fs, logger, }); diff --git a/tests/bin/agent/stop.test.ts b/tests/bin/agent/stop.test.ts index e7be3e763..493f365c9 100644 --- a/tests/bin/agent/stop.test.ts +++ b/tests/bin/agent/stop.test.ts @@ -8,6 +8,7 @@ import * as binErrors from '@/bin/errors'; import * as clientErrors from '@/client/errors'; import * as testBinUtils from '../utils'; import { runTestIfPlatforms } from '../../utils'; +import { globalRootKeyPems } from '../../globalRootKeyPems'; describe('stop', () => { const logger = new Logger('stop test', LogLevel.WARN, [new StreamHandler()]); @@ -31,9 +32,6 @@ describe('stop', () => { [ 'agent', 'start', - // 1024 is the smallest size and is faster to start - '--root-key-pair-bits', - '1024', '--client-host', '127.0.0.1', '--proxy-host', @@ -44,6 +42,7 @@ describe('stop', () => { { PK_NODE_PATH: path.join(dataDir, 'polykey'), PK_PASSWORD: password, + PK_ROOT_KEY: globalRootKeyPems[0], }, dataDir, logger, @@ -93,9 +92,6 @@ describe('stop', () => { [ 'agent', 'start', - // 1024 is the smallest size and is faster to start - '--root-key-pair-bits', - '1024', '--client-host', '127.0.0.1', '--proxy-host', @@ -106,6 +102,7 @@ describe('stop', () => { { PK_NODE_PATH: path.join(dataDir, 'polykey'), PK_PASSWORD: password, + PK_ROOT_KEY: globalRootKeyPems[0], }, dataDir, logger, @@ -181,9 +178,6 @@ describe('stop', () => { [ 'agent', 'start', - // 1024 is the smallest size and is faster to start - '--root-key-pair-bits', - '1024', '--client-host', '127.0.0.1', '--proxy-host', @@ -195,6 +189,7 @@ describe('stop', () => { { PK_NODE_PATH: path.join(dataDir, 'polykey'), PK_PASSWORD: password, + PK_ROOT_KEY: globalRootKeyPems[0], }, dataDir, logger, @@ -234,9 +229,6 @@ describe('stop', () => { [ 'agent', 'start', - // 1024 is the smallest size and is faster to start - '--root-key-pair-bits', - '1024', '--client-host', '127.0.0.1', '--proxy-host', @@ -247,6 +239,7 @@ describe('stop', () => { { PK_NODE_PATH: path.join(dataDir, 'polykey'), PK_PASSWORD: password, + PK_ROOT_KEY: globalRootKeyPems[0], }, dataDir, logger, diff --git a/tests/bin/agent/unlock.test.ts b/tests/bin/agent/unlock.test.ts index 9dab9d598..8d6a57375 100644 --- a/tests/bin/agent/unlock.test.ts +++ b/tests/bin/agent/unlock.test.ts @@ -4,29 +4,33 @@ import Logger, { LogLevel, StreamHandler } from '@matrixai/logger'; import Session from '@/sessions/Session'; import config from '@/config'; import * as testBinUtils from '../utils'; -import * as testUtils from '../../utils'; import { runTestIfPlatforms } from '../../utils'; +import { globalRootKeyPems } from '../../globalRootKeyPems'; describe('unlock', () => { const logger = new Logger('unlock test', LogLevel.WARN, [ new StreamHandler(), ]); - let globalAgentDir; - let globalAgentPassword; - let globalAgentClose; - beforeAll(async () => { - ({ globalAgentDir, globalAgentPassword, globalAgentClose } = - await testUtils.setupGlobalAgent(logger)); - }, globalThis.maxTimeout); - afterAll(async () => { - await globalAgentClose(); + let agentDir; + let agentPassword; + let agentClose; + beforeEach(async () => { + ({ agentDir, agentPassword, agentClose } = + await testBinUtils.setupTestAgent( + global.testCmd, + globalRootKeyPems[0], + logger, + )); + }); + afterEach(async () => { + await agentClose(); }); runTestIfPlatforms('linux', 'docker')( 'unlock acquires session token', async () => { // Fresh session, to delete the token const session = await Session.createSession({ - sessionTokenPath: path.join(globalAgentDir, config.defaults.tokenBase), + sessionTokenPath: path.join(agentDir, config.defaults.tokenBase), fs, logger, fresh: true, @@ -35,19 +39,19 @@ describe('unlock', () => { ({ exitCode } = await testBinUtils.pkStdioSwitch(global.testCmd)( ['agent', 'unlock'], { - PK_NODE_PATH: globalAgentDir, - PK_PASSWORD: globalAgentPassword, + PK_NODE_PATH: agentDir, + PK_PASSWORD: agentPassword, }, - globalAgentDir, + agentDir, )); expect(exitCode).toBe(0); // Run command without password ({ exitCode, stdout } = await testBinUtils.pkStdioSwitch(global.testCmd)( ['agent', 'status', '--format', 'json'], { - PK_NODE_PATH: globalAgentDir, + PK_NODE_PATH: agentDir, }, - globalAgentDir, + agentDir, )); expect(exitCode).toBe(0); expect(JSON.parse(stdout)).toMatchObject({ status: 'LIVE' }); @@ -55,10 +59,10 @@ describe('unlock', () => { ({ exitCode, stdout } = await testBinUtils.pkStdioSwitch(global.testCmd)( ['agent', 'status', '--format', 'json'], { - PK_NODE_PATH: globalAgentDir, + PK_NODE_PATH: agentDir, PK_TOKEN: await session.readToken(), }, - globalAgentDir, + agentDir, )); expect(exitCode).toBe(0); expect(JSON.parse(stdout)).toMatchObject({ status: 'LIVE' }); diff --git a/tests/bin/identities/allowDisallowPermissions.test.ts b/tests/bin/identities/allowDisallowPermissions.test.ts index ddb6fb765..923354317 100644 --- a/tests/bin/identities/allowDisallowPermissions.test.ts +++ b/tests/bin/identities/allowDisallowPermissions.test.ts @@ -10,15 +10,14 @@ import Logger, { LogLevel, StreamHandler } from '@matrixai/logger'; import PolykeyAgent from '@/PolykeyAgent'; import { poll, sysexits } from '@/utils'; import * as nodesUtils from '@/nodes/utils'; -import * as keysUtils from '@/keys/utils'; import * as claimsUtils from '@/claims/utils'; import * as identitiesUtils from '@/identities/utils'; import * as testBinUtils from '../utils'; -import * as testUtils from '../../utils'; import TestProvider from '../../identities/TestProvider'; +import { globalRootKeyPems } from '../../globalRootKeyPems'; describe('allow/disallow/permissions', () => { - const logger = new Logger('allow/disallow/permissions test', LogLevel.WARN, [ + const logger = new Logger('allow/disallow/permissions test', LogLevel.DEBUG, [ new StreamHandler(), ]); const password = 'password'; @@ -36,20 +35,7 @@ describe('allow/disallow/permissions', () => { let nodeId: NodeId; let nodeHost: Host; let nodePort: Port; - let mockedGenerateKeyPair: jest.SpyInstance; - let mockedGenerateDeterministicKeyPair: jest.SpyInstance; - beforeAll(async () => { - const globalKeyPair = await testUtils.setupGlobalKeypair(); - const nodeKeyPair = await keysUtils.generateKeyPair(2048); - mockedGenerateKeyPair = jest - .spyOn(keysUtils, 'generateKeyPair') - .mockResolvedValueOnce(globalKeyPair) - .mockResolvedValue(nodeKeyPair); - mockedGenerateDeterministicKeyPair = jest - .spyOn(keysUtils, 'generateDeterministicKeyPair') - .mockResolvedValueOnce(globalKeyPair) - .mockResolvedValue(nodeKeyPair); - // Cannot use global shared agent since we need to register a provider + beforeEach(async () => { dataDir = await fs.promises.mkdtemp( path.join(os.tmpdir(), 'polykey-test-'), ); @@ -63,6 +49,9 @@ describe('allow/disallow/permissions', () => { agentHost: '127.0.0.1' as Host, clientHost: '127.0.0.1' as Host, }, + keysConfig: { + privateKeyPemOverride: globalRootKeyPems[0], + }, logger, }); pkAgent.identitiesManager.registerProvider(provider); @@ -77,6 +66,9 @@ describe('allow/disallow/permissions', () => { agentHost: '127.0.0.1' as Host, clientHost: '127.0.0.1' as Host, }, + keysConfig: { + privateKeyPemOverride: globalRootKeyPems[1], + }, logger, }); nodeId = node.keyManager.getNodeId(); @@ -96,18 +88,17 @@ describe('allow/disallow/permissions', () => { const [, claimEncoded] = await node.sigchain.addClaim(identityClaim); const claim = claimsUtils.decodeClaim(claimEncoded); await provider.publishClaim(identity, claim); - }, globalThis.maxTimeout); - afterAll(async () => { + }); + afterEach(async () => { await node.stop(); await pkAgent.stop(); await fs.promises.rm(dataDir, { force: true, recursive: true, }); - mockedGenerateKeyPair.mockRestore(); - mockedGenerateDeterministicKeyPair.mockRestore(); }); test('allows/disallows/gets gestalt permissions by node', async () => { + Error.stackTraceLimit = 100; let exitCode, stdout; // Add the node to our node graph, otherwise we won't be able to contact it await testBinUtils.pkStdio( @@ -203,12 +194,6 @@ describe('allow/disallow/permissions', () => { expect(JSON.parse(stdout)).toEqual({ permissions: [], }); - // Revert side-effects - await pkAgent.gestaltGraph.unsetNode(nodeId); - await pkAgent.gestaltGraph.unsetIdentity(provider.id, identity); - await pkAgent.nodeGraph.unsetNode(nodeId); - // @ts-ignore - get protected property - pkAgent.discovery.visitedVertices.clear(); }); test('allows/disallows/gets gestalt permissions by identity', async () => { let exitCode, stdout; @@ -345,16 +330,6 @@ describe('allow/disallow/permissions', () => { expect(JSON.parse(stdout)).toEqual({ permissions: [], }); - // Revert side effects - await pkAgent.gestaltGraph.unsetNode(nodeId); - await pkAgent.gestaltGraph.unsetIdentity(provider.id, identity); - await pkAgent.nodeGraph.unsetNode(nodeId); - await pkAgent.identitiesManager.delToken( - testToken.providerId, - testToken.identityId, - ); - // @ts-ignore - get protected property - pkAgent.discovery.visitedVertices.clear(); }); test('should fail on invalid inputs', async () => { let exitCode; diff --git a/tests/bin/identities/authenticateAuthenticated.test.ts b/tests/bin/identities/authenticateAuthenticated.test.ts index 71110bb9d..e47dec546 100644 --- a/tests/bin/identities/authenticateAuthenticated.test.ts +++ b/tests/bin/identities/authenticateAuthenticated.test.ts @@ -7,10 +7,9 @@ import Logger, { LogLevel, StreamHandler } from '@matrixai/logger'; import PolykeyAgent from '@/PolykeyAgent'; import { sysexits } from '@/utils'; import * as identitiesUtils from '@/identities/utils'; -import * as keysUtils from '@/keys/utils'; import * as testBinUtils from '../utils'; -import * as testUtils from '../../utils'; import TestProvider from '../../identities/TestProvider'; +import { globalRootKeyPems } from '../../globalRootKeyPems'; describe('authenticate/authenticated', () => { const logger = new Logger('authenticate/authenticated test', LogLevel.WARN, [ @@ -25,16 +24,7 @@ describe('authenticate/authenticated', () => { let nodePath: string; let pkAgent: PolykeyAgent; let testProvider: TestProvider; - let mockedGenerateKeyPair: jest.SpyInstance; - let mockedGenerateDeterministicKeyPair: jest.SpyInstance; - beforeAll(async () => { - const globalKeyPair = await testUtils.setupGlobalKeypair(); - mockedGenerateKeyPair = jest - .spyOn(keysUtils, 'generateKeyPair') - .mockResolvedValue(globalKeyPair); - mockedGenerateDeterministicKeyPair = jest - .spyOn(keysUtils, 'generateDeterministicKeyPair') - .mockResolvedValue(globalKeyPair); + beforeEach(async () => { dataDir = await fs.promises.mkdtemp( path.join(os.tmpdir(), 'polykey-test-'), ); @@ -49,19 +39,20 @@ describe('authenticate/authenticated', () => { agentHost: '127.0.0.1' as Host, clientHost: '127.0.0.1' as Host, }, + keysConfig: { + privateKeyPemOverride: globalRootKeyPems[0], + }, logger, }); testProvider = new TestProvider(); pkAgent.identitiesManager.registerProvider(testProvider); }); - afterAll(async () => { + afterEach(async () => { await pkAgent.stop(); await fs.promises.rm(dataDir, { force: true, recursive: true, }); - mockedGenerateKeyPair.mockRestore(); - mockedGenerateDeterministicKeyPair.mockRestore(); }); test('authenticates identity with a provider and gets authenticated identity', async () => { let exitCode, stdout; @@ -119,11 +110,6 @@ describe('authenticate/authenticated', () => { providerId: testToken.providerId, identityId: testToken.identityId, }); - // Revert side effects - await pkAgent.identitiesManager.delToken( - testToken.providerId, - testToken.identityId, - ); mockedBrowser.mockRestore(); }); test('should fail on invalid inputs', async () => { diff --git a/tests/bin/identities/claim.test.ts b/tests/bin/identities/claim.test.ts index f2e730b9c..05a746d5f 100644 --- a/tests/bin/identities/claim.test.ts +++ b/tests/bin/identities/claim.test.ts @@ -11,10 +11,9 @@ import Logger, { LogLevel, StreamHandler } from '@matrixai/logger'; import PolykeyAgent from '@/PolykeyAgent'; import { sysexits } from '@/utils'; import * as identitiesUtils from '@/identities/utils'; -import * as keysUtils from '@/keys/utils'; import * as testBinUtils from '../utils'; -import * as testUtils from '../../utils'; import TestProvider from '../../identities/TestProvider'; +import { globalRootKeyPems } from '../../globalRootKeyPems'; describe('claim', () => { const logger = new Logger('claim test', LogLevel.WARN, [new StreamHandler()]); @@ -27,16 +26,7 @@ describe('claim', () => { let nodePath: string; let pkAgent: PolykeyAgent; let testProvider: TestProvider; - let mockedGenerateKeyPair: jest.SpyInstance; - let mockedGenerateDeterministicKeyPair: jest.SpyInstance; - beforeAll(async () => { - const globalKeyPair = await testUtils.setupGlobalKeypair(); - mockedGenerateKeyPair = jest - .spyOn(keysUtils, 'generateKeyPair') - .mockResolvedValue(globalKeyPair); - mockedGenerateDeterministicKeyPair = jest - .spyOn(keysUtils, 'generateDeterministicKeyPair') - .mockResolvedValue(globalKeyPair); + beforeEach(async () => { dataDir = await fs.promises.mkdtemp( path.join(os.tmpdir(), 'polykey-test-'), ); @@ -51,19 +41,20 @@ describe('claim', () => { agentHost: '127.0.0.1' as Host, clientHost: '127.0.0.1' as Host, }, + keysConfig: { + privateKeyPemOverride: globalRootKeyPems[0], + }, logger, }); testProvider = new TestProvider(); pkAgent.identitiesManager.registerProvider(testProvider); }); - afterAll(async () => { + afterEach(async () => { await pkAgent.stop(); await fs.promises.rm(dataDir, { force: true, recursive: true, }); - mockedGenerateKeyPair.mockRestore(); - mockedGenerateDeterministicKeyPair.mockRestore(); }); test('claims an identity', async () => { // Need an authenticated identity @@ -109,11 +100,6 @@ describe('claim', () => { expect(claim).toBeDefined(); expect(claim!.id).toBe('0'); expect(claim!.payload.data.type).toBe('identity'); - // Revert side effects - await pkAgent.identitiesManager.delToken( - testToken.providerId, - testToken.identityId, - ); mockedBrowser.mockRestore(); }); test('cannot claim unauthenticated identities', async () => { diff --git a/tests/bin/identities/discoverGet.test.ts b/tests/bin/identities/discoverGet.test.ts index c1e194ab3..106f8ff04 100644 --- a/tests/bin/identities/discoverGet.test.ts +++ b/tests/bin/identities/discoverGet.test.ts @@ -12,11 +12,10 @@ import { poll, sysexits } from '@/utils'; import * as identitiesUtils from '@/identities/utils'; import * as claimsUtils from '@/claims/utils'; import * as nodesUtils from '@/nodes/utils'; -import * as keysUtils from '@/keys/utils'; import * as testBinUtils from '../utils'; -import * as testUtils from '../../utils'; import * as testNodesUtils from '../../nodes/utils'; import TestProvider from '../../identities/TestProvider'; +import { globalRootKeyPems } from '../../globalRootKeyPems'; describe('discover/get', () => { const logger = new Logger('discover/get test', LogLevel.WARN, [ @@ -39,9 +38,7 @@ describe('discover/get', () => { let nodeBId: NodeId; let nodeAHost: Host; let nodeAPort: Port; - let mockedGenerateKeyPair: jest.SpyInstance; - let mockedGenerateDeterministicKeyPair: jest.SpyInstance; - beforeAll(async () => { + beforeEach(async () => { dataDir = await fs.promises.mkdtemp( path.join(os.tmpdir(), 'polykey-test-'), ); @@ -57,7 +54,7 @@ describe('discover/get', () => { clientHost: '127.0.0.1' as Host, }, keysConfig: { - rootKeyPairBits: 2048, + privateKeyPemOverride: globalRootKeyPems[0], }, logger, }); @@ -74,19 +71,12 @@ describe('discover/get', () => { clientHost: '127.0.0.1' as Host, }, keysConfig: { - rootKeyPairBits: 2048, + privateKeyPemOverride: globalRootKeyPems[1], }, logger, }); nodeBId = nodeB.keyManager.getNodeId(); await testNodesUtils.nodesConnect(nodeA, nodeB); - const globalKeyPair = await testUtils.setupGlobalKeypair(); - mockedGenerateKeyPair = jest - .spyOn(keysUtils, 'generateKeyPair') - .mockResolvedValueOnce(globalKeyPair); - mockedGenerateDeterministicKeyPair = jest - .spyOn(keysUtils, 'generateDeterministicKeyPair') - .mockResolvedValueOnce(globalKeyPair); nodePath = path.join(dataDir, 'polykey'); // Cannot use global shared agent since we need to register a provider pkAgent = await PolykeyAgent.createPolykeyAgent({ @@ -98,6 +88,9 @@ describe('discover/get', () => { agentHost: '127.0.0.1' as Host, clientHost: '127.0.0.1' as Host, }, + keysConfig: { + privateKeyPemOverride: globalRootKeyPems[2], + }, logger, }); pkAgent.identitiesManager.registerProvider(testProvider); @@ -118,8 +111,8 @@ describe('discover/get', () => { const [, claimEncoded] = await nodeA.sigchain.addClaim(identityClaim); const claim = claimsUtils.decodeClaim(claimEncoded); await testProvider.publishClaim(identityId, claim); - }, global.maxTimeout); - afterAll(async () => { + }); + afterEach(async () => { await pkAgent.stop(); await nodeB.stop(); await nodeA.stop(); @@ -127,8 +120,6 @@ describe('discover/get', () => { force: true, recursive: true, }); - mockedGenerateKeyPair.mockRestore(); - mockedGenerateDeterministicKeyPair.mockRestore(); }); test('discovers and gets gestalt by node', async () => { // Need an authenticated identity diff --git a/tests/bin/identities/search.test.ts b/tests/bin/identities/search.test.ts index db82c3216..df90221dd 100644 --- a/tests/bin/identities/search.test.ts +++ b/tests/bin/identities/search.test.ts @@ -7,10 +7,9 @@ import Logger, { LogLevel, StreamHandler } from '@matrixai/logger'; import PolykeyAgent from '@/PolykeyAgent'; import { sysexits } from '@/utils'; import * as identitiesUtils from '@/identities/utils'; -import * as keysUtils from '@/keys/utils'; import * as testBinUtils from '../utils'; -import * as testUtils from '../../utils'; import TestProvider from '../../identities/TestProvider'; +import { globalRootKeyPems } from '../../globalRootKeyPems'; describe('search', () => { const logger = new Logger('search test', LogLevel.WARN, [ @@ -109,16 +108,7 @@ describe('search', () => { let dataDir: string; let nodePath: string; let pkAgent: PolykeyAgent; - let mockedGenerateKeyPair: jest.SpyInstance; - let mockedGenerateDeterministicKeyPair: jest.SpyInstance; - beforeAll(async () => { - const globalKeyPair = await testUtils.setupGlobalKeypair(); - mockedGenerateKeyPair = jest - .spyOn(keysUtils, 'generateKeyPair') - .mockResolvedValue(globalKeyPair); - mockedGenerateDeterministicKeyPair = jest - .spyOn(keysUtils, 'generateDeterministicKeyPair') - .mockResolvedValue(globalKeyPair); + beforeEach(async () => { dataDir = await fs.promises.mkdtemp( path.join(os.tmpdir(), 'polykey-test-'), ); @@ -133,20 +123,21 @@ describe('search', () => { agentHost: '127.0.0.1' as Host, clientHost: '127.0.0.1' as Host, }, + keysConfig: { + privateKeyPemOverride: globalRootKeyPems[0], + }, logger, }); pkAgent.identitiesManager.registerProvider(provider1); pkAgent.identitiesManager.registerProvider(provider2); pkAgent.identitiesManager.registerProvider(provider3); }); - afterAll(async () => { + afterEach(async () => { await pkAgent.stop(); await fs.promises.rm(dataDir, { force: true, recursive: true, }); - mockedGenerateKeyPair.mockRestore(); - mockedGenerateDeterministicKeyPair.mockRestore(); }); test('finds connected identities', async () => { let exitCode, stdout; @@ -320,10 +311,6 @@ describe('search', () => { expect(exitCode).toBe(0); searchResults = stdout.split('\n').slice(undefined, -1).map(JSON.parse); expect(searchResults).toHaveLength(2); - // Revert side effects - await pkAgent.identitiesManager.delToken(provider1.id, identityId); - await pkAgent.identitiesManager.delToken(provider2.id, identityId); - await pkAgent.identitiesManager.delToken(provider3.id, identityId); mockedBrowser.mockRestore(); }); test('should fail on invalid inputs', async () => { diff --git a/tests/bin/identities/trustUntrustList.test.ts b/tests/bin/identities/trustUntrustList.test.ts index 4f0816cbe..48fe1cd08 100644 --- a/tests/bin/identities/trustUntrustList.test.ts +++ b/tests/bin/identities/trustUntrustList.test.ts @@ -9,12 +9,11 @@ import Logger, { LogLevel, StreamHandler } from '@matrixai/logger'; import PolykeyAgent from '@/PolykeyAgent'; import { sysexits } from '@/utils'; import * as nodesUtils from '@/nodes/utils'; -import * as keysUtils from '@/keys/utils'; import * as claimsUtils from '@/claims/utils'; import * as identitiesUtils from '@/identities/utils'; import * as testBinUtils from '../utils'; -import * as testUtils from '../../utils'; import TestProvider from '../../identities/TestProvider'; +import { globalRootKeyPems } from '../../globalRootKeyPems'; describe('trust/untrust/list', () => { const logger = new Logger('trust/untrust/list test', LogLevel.WARN, [ @@ -35,20 +34,7 @@ describe('trust/untrust/list', () => { let nodeId: NodeId; let nodeHost: Host; let nodePort: Port; - let mockedGenerateKeyPair: jest.SpyInstance; - let mockedGenerateDeterministicKeyPair: jest.SpyInstance; - beforeAll(async () => { - const globalKeyPair = await testUtils.setupGlobalKeypair(); - const nodeKeyPair = await keysUtils.generateKeyPair(2048); - mockedGenerateKeyPair = jest - .spyOn(keysUtils, 'generateKeyPair') - .mockResolvedValueOnce(globalKeyPair) - .mockResolvedValue(nodeKeyPair); - mockedGenerateDeterministicKeyPair = jest - .spyOn(keysUtils, 'generateDeterministicKeyPair') - .mockResolvedValueOnce(globalKeyPair) - .mockResolvedValue(nodeKeyPair); - // Cannot use global shared agent since we need to register a provider + beforeEach(async () => { dataDir = await fs.promises.mkdtemp( path.join(os.tmpdir(), 'polykey-test-'), ); @@ -62,6 +48,9 @@ describe('trust/untrust/list', () => { agentHost: '127.0.0.1' as Host, clientHost: '127.0.0.1' as Host, }, + keysConfig: { + privateKeyPemOverride: globalRootKeyPems[0], + }, logger, }); pkAgent.identitiesManager.registerProvider(provider); @@ -76,6 +65,9 @@ describe('trust/untrust/list', () => { agentHost: '127.0.0.1' as Host, clientHost: '127.0.0.1' as Host, }, + keysConfig: { + privateKeyPemOverride: globalRootKeyPems[1], + }, logger, }); nodeId = node.keyManager.getNodeId(); @@ -95,16 +87,14 @@ describe('trust/untrust/list', () => { const [, claimEncoded] = await node.sigchain.addClaim(identityClaim); const claim = claimsUtils.decodeClaim(claimEncoded); await provider.publishClaim(identity, claim); - }, globalThis.maxTimeout); - afterAll(async () => { + }); + afterEach(async () => { await node.stop(); await pkAgent.stop(); await fs.promises.rm(dataDir, { force: true, recursive: true, }); - mockedGenerateKeyPair.mockRestore(); - mockedGenerateDeterministicKeyPair.mockRestore(); }); test( 'trusts and untrusts a gestalt by node, adds it to the gestalt graph, and lists the gestalt with notify permission', diff --git a/tests/bin/keys/cert.test.ts b/tests/bin/keys/cert.test.ts index e0411d7fd..1136118a3 100644 --- a/tests/bin/keys/cert.test.ts +++ b/tests/bin/keys/cert.test.ts @@ -1,27 +1,31 @@ import Logger, { LogLevel, StreamHandler } from '@matrixai/logger'; import * as testBinUtils from '../utils'; -import * as testUtils from '../../utils'; +import { globalRootKeyPems } from '../../globalRootKeyPems'; describe('cert', () => { const logger = new Logger('cert test', LogLevel.WARN, [new StreamHandler()]); - let globalAgentDir; - let globalAgentPassword; - let globalAgentClose; - beforeAll(async () => { - ({ globalAgentDir, globalAgentPassword, globalAgentClose } = - await testUtils.setupGlobalAgent(logger)); - }, globalThis.maxTimeout); - afterAll(async () => { - await globalAgentClose(); + let agentDir; + let agentPassword; + let agentClose; + beforeEach(async () => { + ({ agentDir, agentPassword, agentClose } = + await testBinUtils.setupTestAgent( + global.testCmd, + globalRootKeyPems[0], + logger, + )); + }); + afterEach(async () => { + await agentClose(); }); test('cert gets the certificate', async () => { let { exitCode, stdout } = await testBinUtils.pkStdio( ['keys', 'cert', '--format', 'json'], { - PK_NODE_PATH: globalAgentDir, - PK_PASSWORD: globalAgentPassword, + PK_NODE_PATH: agentDir, + PK_PASSWORD: agentPassword, }, - globalAgentDir, + agentDir, ); expect(exitCode).toBe(0); expect(JSON.parse(stdout)).toEqual({ @@ -31,10 +35,10 @@ describe('cert', () => { ({ exitCode, stdout } = await testBinUtils.pkStdio( ['agent', 'status', '--format', 'json'], { - PK_NODE_PATH: globalAgentDir, - PK_PASSWORD: globalAgentPassword, + PK_NODE_PATH: agentDir, + PK_PASSWORD: agentPassword, }, - globalAgentDir, + agentDir, )); expect(exitCode).toBe(0); const certStatus = JSON.parse(stdout).rootCertPem; diff --git a/tests/bin/keys/certchain.test.ts b/tests/bin/keys/certchain.test.ts index e01de8896..476a2443e 100644 --- a/tests/bin/keys/certchain.test.ts +++ b/tests/bin/keys/certchain.test.ts @@ -1,29 +1,33 @@ import Logger, { LogLevel, StreamHandler } from '@matrixai/logger'; import * as testBinUtils from '../utils'; -import * as testUtils from '../../utils'; +import { globalRootKeyPems } from '../../globalRootKeyPems'; describe('certchain', () => { const logger = new Logger('certchain test', LogLevel.WARN, [ new StreamHandler(), ]); - let globalAgentDir; - let globalAgentPassword; - let globalAgentClose; - beforeAll(async () => { - ({ globalAgentDir, globalAgentPassword, globalAgentClose } = - await testUtils.setupGlobalAgent(logger)); - }, globalThis.maxTimeout); - afterAll(async () => { - await globalAgentClose(); + let agentDir; + let agentPassword; + let agentClose; + beforeEach(async () => { + ({ agentDir, agentPassword, agentClose } = + await testBinUtils.setupTestAgent( + global.testCmd, + globalRootKeyPems[0], + logger, + )); + }); + afterEach(async () => { + await agentClose(); }); test('certchain gets the certificate chain', async () => { let { exitCode, stdout } = await testBinUtils.pkStdio( ['keys', 'certchain', '--format', 'json'], { - PK_NODE_PATH: globalAgentDir, - PK_PASSWORD: globalAgentPassword, + PK_NODE_PATH: agentDir, + PK_PASSWORD: agentPassword, }, - globalAgentDir, + agentDir, ); expect(exitCode).toBe(0); expect(JSON.parse(stdout)).toEqual({ @@ -33,10 +37,10 @@ describe('certchain', () => { ({ exitCode, stdout } = await testBinUtils.pkStdio( ['agent', 'status', '--format', 'json'], { - PK_NODE_PATH: globalAgentDir, - PK_PASSWORD: globalAgentPassword, + PK_NODE_PATH: agentDir, + PK_PASSWORD: agentPassword, }, - globalAgentDir, + agentDir, )); expect(exitCode).toBe(0); const certChainStatus = JSON.parse(stdout).rootCertChainPem; diff --git a/tests/bin/keys/encryptDecrypt.test.ts b/tests/bin/keys/encryptDecrypt.test.ts index cae1e0b42..f4ba96ca4 100644 --- a/tests/bin/keys/encryptDecrypt.test.ts +++ b/tests/bin/keys/encryptDecrypt.test.ts @@ -2,35 +2,39 @@ import path from 'path'; import fs from 'fs'; import Logger, { LogLevel, StreamHandler } from '@matrixai/logger'; import * as testBinUtils from '../utils'; -import * as testUtils from '../../utils'; +import { globalRootKeyPems } from '../../globalRootKeyPems'; describe('encrypt-decrypt', () => { const logger = new Logger('encrypt-decrypt test', LogLevel.WARN, [ new StreamHandler(), ]); - let globalAgentDir; - let globalAgentPassword; - let globalAgentClose; - beforeAll(async () => { - ({ globalAgentDir, globalAgentPassword, globalAgentClose } = - await testUtils.setupGlobalAgent(logger)); - }, globalThis.maxTimeout); - afterAll(async () => { - await globalAgentClose(); + let agentDir; + let agentPassword; + let agentClose; + beforeEach(async () => { + ({ agentDir, agentPassword, agentClose } = + await testBinUtils.setupTestAgent( + global.testCmd, + globalRootKeyPems[0], + logger, + )); + }); + afterEach(async () => { + await agentClose(); }); test('encrypts and decrypts data', async () => { let exitCode, stdout; - const dataPath = path.join(globalAgentDir, 'data'); + const dataPath = path.join(agentDir, 'data'); await fs.promises.writeFile(dataPath, 'abc', { encoding: 'binary', }); ({ exitCode, stdout } = await testBinUtils.pkStdio( ['keys', 'encrypt', dataPath, '--format', 'json'], { - PK_NODE_PATH: globalAgentDir, - PK_PASSWORD: globalAgentPassword, + PK_NODE_PATH: agentDir, + PK_PASSWORD: agentPassword, }, - globalAgentDir, + agentDir, )); expect(exitCode).toBe(0); expect(JSON.parse(stdout)).toEqual({ @@ -43,10 +47,10 @@ describe('encrypt-decrypt', () => { ({ exitCode, stdout } = await testBinUtils.pkStdio( ['keys', 'decrypt', dataPath, '--format', 'json'], { - PK_NODE_PATH: globalAgentDir, - PK_PASSWORD: globalAgentPassword, + PK_NODE_PATH: agentDir, + PK_PASSWORD: agentPassword, }, - globalAgentDir, + agentDir, )); expect(exitCode).toBe(0); expect(JSON.parse(stdout)).toEqual({ diff --git a/tests/bin/keys/password.test.ts b/tests/bin/keys/password.test.ts index 83cf8c26f..bfbe29ed1 100644 --- a/tests/bin/keys/password.test.ts +++ b/tests/bin/keys/password.test.ts @@ -2,53 +2,57 @@ import path from 'path'; import fs from 'fs'; import Logger, { LogLevel, StreamHandler } from '@matrixai/logger'; import * as testBinUtils from '../utils'; -import * as testUtils from '../../utils'; +import { globalRootKeyPems } from '../../globalRootKeyPems'; describe('password', () => { const logger = new Logger('password test', LogLevel.WARN, [ new StreamHandler(), ]); - let globalAgentDir; - let globalAgentPassword; - let globalAgentClose; - beforeAll(async () => { - ({ globalAgentDir, globalAgentPassword, globalAgentClose } = - await testUtils.setupGlobalAgent(logger)); - }, globalThis.maxTimeout); - afterAll(async () => { - await globalAgentClose(); + let agentDir; + let agentPassword; + let agentClose; + beforeEach(async () => { + ({ agentDir, agentPassword, agentClose } = + await testBinUtils.setupTestAgent( + global.testCmd, + globalRootKeyPems[0], + logger, + )); + }); + afterEach(async () => { + await agentClose(); }); test('password changes the root password', async () => { - const passPath = path.join(globalAgentDir, 'passwordChange'); + const passPath = path.join(agentDir, 'passwordChange'); await fs.promises.writeFile(passPath, 'password-change'); let { exitCode } = await testBinUtils.pkStdio( ['keys', 'password', '--password-new-file', passPath], { - PK_NODE_PATH: globalAgentDir, - PK_PASSWORD: globalAgentPassword, + PK_NODE_PATH: agentDir, + PK_PASSWORD: agentPassword, }, - globalAgentDir, + agentDir, ); expect(exitCode).toBe(0); // Old password should no longer work ({ exitCode } = await testBinUtils.pkStdio( ['keys', 'root'], { - PK_NODE_PATH: globalAgentDir, - PK_PASSWORD: globalAgentPassword, + PK_NODE_PATH: agentDir, + PK_PASSWORD: agentPassword, }, - globalAgentDir, + agentDir, )); expect(exitCode).not.toBe(0); // Revert side effects using new password - await fs.promises.writeFile(passPath, globalAgentPassword); + await fs.promises.writeFile(passPath, agentPassword); ({ exitCode } = await testBinUtils.pkStdio( ['keys', 'password', '--password-new-file', passPath], { - PK_NODE_PATH: globalAgentDir, + PK_NODE_PATH: agentDir, PK_PASSWORD: 'password-change', }, - globalAgentDir, + agentDir, )); }); }); diff --git a/tests/bin/keys/root.test.ts b/tests/bin/keys/root.test.ts index 3cc9286e6..56f934af6 100644 --- a/tests/bin/keys/root.test.ts +++ b/tests/bin/keys/root.test.ts @@ -1,27 +1,31 @@ import Logger, { LogLevel, StreamHandler } from '@matrixai/logger'; import * as testBinUtils from '../utils'; -import * as testUtils from '../../utils'; +import { globalRootKeyPems } from '../../globalRootKeyPems'; describe('root', () => { const logger = new Logger('root test', LogLevel.WARN, [new StreamHandler()]); - let globalAgentDir; - let globalAgentPassword; - let globalAgentClose; - beforeAll(async () => { - ({ globalAgentDir, globalAgentPassword, globalAgentClose } = - await testUtils.setupGlobalAgent(logger)); - }, globalThis.maxTimeout); - afterAll(async () => { - await globalAgentClose(); + let agentDir; + let agentPassword; + let agentClose; + beforeEach(async () => { + ({ agentDir, agentPassword, agentClose } = + await testBinUtils.setupTestAgent( + global.testCmd, + globalRootKeyPems[0], + logger, + )); + }); + afterEach(async () => { + await agentClose(); }); test('root gets the public key', async () => { const { exitCode, stdout } = await testBinUtils.pkStdio( ['keys', 'root', '--format', 'json'], { - PK_NODE_PATH: globalAgentDir, - PK_PASSWORD: globalAgentPassword, + PK_NODE_PATH: agentDir, + PK_PASSWORD: agentPassword, }, - globalAgentDir, + agentDir, ); expect(exitCode).toBe(0); expect(JSON.parse(stdout)).toEqual({ @@ -32,10 +36,10 @@ describe('root', () => { const { exitCode, stdout } = await testBinUtils.pkStdio( ['keys', 'root', '--private-key', '--format', 'json'], { - PK_NODE_PATH: globalAgentDir, - PK_PASSWORD: globalAgentPassword, + PK_NODE_PATH: agentDir, + PK_PASSWORD: agentPassword, }, - globalAgentDir, + agentDir, ); expect(exitCode).toBe(0); expect(JSON.parse(stdout)).toEqual({ diff --git a/tests/bin/keys/signVerify.test.ts b/tests/bin/keys/signVerify.test.ts index 8a72142a7..6a31cd298 100644 --- a/tests/bin/keys/signVerify.test.ts +++ b/tests/bin/keys/signVerify.test.ts @@ -2,52 +2,56 @@ import path from 'path'; import fs from 'fs'; import Logger, { LogLevel, StreamHandler } from '@matrixai/logger'; import * as testBinUtils from '../utils'; -import * as testUtils from '../../utils'; +import { globalRootKeyPems } from '../../globalRootKeyPems'; describe('sign-verify', () => { const logger = new Logger('sign-verify test', LogLevel.WARN, [ new StreamHandler(), ]); - let globalAgentDir; - let globalAgentPassword; - let globalAgentClose; - beforeAll(async () => { - ({ globalAgentDir, globalAgentPassword, globalAgentClose } = - await testUtils.setupGlobalAgent(logger)); - }, globalThis.maxTimeout); - afterAll(async () => { - await globalAgentClose(); + let agentDir; + let agentPassword; + let agentClose; + beforeEach(async () => { + ({ agentDir, agentPassword, agentClose } = + await testBinUtils.setupTestAgent( + global.testCmd, + globalRootKeyPems[0], + logger, + )); + }); + afterEach(async () => { + await agentClose(); }); test('signs and verifies a file', async () => { let exitCode, stdout; - const dataPath = path.join(globalAgentDir, 'data'); + const dataPath = path.join(agentDir, 'data'); await fs.promises.writeFile(dataPath, 'sign-me', { encoding: 'binary', }); ({ exitCode, stdout } = await testBinUtils.pkStdio( ['keys', 'sign', dataPath, '--format', 'json'], { - PK_NODE_PATH: globalAgentDir, - PK_PASSWORD: globalAgentPassword, + PK_NODE_PATH: agentDir, + PK_PASSWORD: agentPassword, }, - globalAgentDir, + agentDir, )); expect(exitCode).toBe(0); expect(JSON.parse(stdout)).toEqual({ signature: expect.any(String), }); const signed = JSON.parse(stdout).signature; - const signaturePath = path.join(globalAgentDir, 'data2'); + const signaturePath = path.join(agentDir, 'data2'); await fs.promises.writeFile(signaturePath, signed, { encoding: 'binary', }); ({ exitCode, stdout } = await testBinUtils.pkStdio( ['keys', 'verify', dataPath, signaturePath, '--format', 'json'], { - PK_NODE_PATH: globalAgentDir, - PK_PASSWORD: globalAgentPassword, + PK_NODE_PATH: agentDir, + PK_PASSWORD: agentPassword, }, - globalAgentDir, + agentDir, )); expect(exitCode).toBe(0); expect(JSON.parse(stdout)).toEqual({ diff --git a/tests/bin/nodes/add.test.ts b/tests/bin/nodes/add.test.ts index b3bd7cc67..e630c3332 100644 --- a/tests/bin/nodes/add.test.ts +++ b/tests/bin/nodes/add.test.ts @@ -8,11 +8,10 @@ import { IdInternal } from '@matrixai/id'; import { sysexits } from '@/utils'; import PolykeyAgent from '@/PolykeyAgent'; import * as nodesUtils from '@/nodes/utils'; -import * as keysUtils from '@/keys/utils'; import NodeManager from '@/nodes/NodeManager'; import * as testBinUtils from '../utils'; -import * as testUtils from '../../utils'; import * as testNodesUtils from '../../nodes/utils'; +import { globalRootKeyPems } from '../../globalRootKeyPems'; describe('add', () => { const logger = new Logger('add test', LogLevel.WARN, [new StreamHandler()]); @@ -25,17 +24,8 @@ describe('add', () => { let dataDir: string; let nodePath: string; let pkAgent: PolykeyAgent; - let mockedGenerateKeyPair: jest.SpyInstance; - let mockedGenerateDeterministicKeyPair: jest.SpyInstance; let mockedPingNode: jest.SpyInstance; - beforeAll(async () => { - const globalKeyPair = await testUtils.setupGlobalKeypair(); - mockedGenerateKeyPair = jest - .spyOn(keysUtils, 'generateKeyPair') - .mockResolvedValue(globalKeyPair); - mockedGenerateDeterministicKeyPair = jest - .spyOn(keysUtils, 'generateDeterministicKeyPair') - .mockResolvedValue(globalKeyPair); + beforeEach(async () => { dataDir = await fs.promises.mkdtemp( path.join(os.tmpdir(), 'polykey-test-'), ); @@ -51,25 +41,24 @@ describe('add', () => { agentHost: '127.0.0.1' as Host, clientHost: '127.0.0.1' as Host, }, + keysConfig: { + privateKeyPemOverride: globalRootKeyPems[0], + }, logger, }); + await pkAgent.nodeGraph.stop(); + await pkAgent.nodeGraph.start({ fresh: true }); + mockedPingNode.mockImplementation(() => true); }); - afterAll(async () => { + afterEach(async () => { await pkAgent.stop(); await pkAgent.destroy(); await fs.promises.rm(dataDir, { force: true, recursive: true, }); - mockedGenerateKeyPair.mockRestore(); - mockedGenerateDeterministicKeyPair.mockRestore(); mockedPingNode.mockRestore(); }); - beforeEach(async () => { - await pkAgent.nodeGraph.stop(); - await pkAgent.nodeGraph.start({ fresh: true }); - mockedPingNode.mockImplementation(() => true); - }); test('adds a node', async () => { const { exitCode } = await testBinUtils.pkStdio( [ diff --git a/tests/bin/nodes/claim.test.ts b/tests/bin/nodes/claim.test.ts index 5dc9b92f5..471f130de 100644 --- a/tests/bin/nodes/claim.test.ts +++ b/tests/bin/nodes/claim.test.ts @@ -6,16 +6,13 @@ import fs from 'fs'; import Logger, { LogLevel, StreamHandler } from '@matrixai/logger'; import PolykeyAgent from '@/PolykeyAgent'; import * as nodesUtils from '@/nodes/utils'; -import * as keysUtils from '@/keys/utils'; import * as testBinUtils from '../utils'; import * as testNodesUtils from '../../nodes/utils'; -import * as testUtils from '../../utils'; +import { globalRootKeyPems } from '../../globalRootKeyPems'; describe('claim', () => { const logger = new Logger('claim test', LogLevel.WARN, [new StreamHandler()]); const password = 'helloworld'; - let mockedGenerateKeyPair: jest.SpyInstance; - let mockedGenerateDeterministicKeyPair: jest.SpyInstance; let dataDir: string; let nodePath: string; let pkAgent: PolykeyAgent; @@ -23,14 +20,7 @@ describe('claim', () => { let localId: NodeId; let remoteId: NodeId; let remoteIdEncoded: NodeIdEncoded; - beforeAll(async () => { - const globalKeyPair = await testUtils.setupGlobalKeypair(); - mockedGenerateKeyPair = jest - .spyOn(keysUtils, 'generateKeyPair') - .mockResolvedValueOnce(globalKeyPair); - mockedGenerateDeterministicKeyPair = jest - .spyOn(keysUtils, 'generateDeterministicKeyPair') - .mockResolvedValueOnce(globalKeyPair); + beforeEach(async () => { dataDir = await fs.promises.mkdtemp( path.join(os.tmpdir(), 'polykey-test-'), ); @@ -45,7 +35,7 @@ describe('claim', () => { clientHost: '127.0.0.1' as Host, }, keysConfig: { - rootKeyPairBits: 2048, + privateKeyPemOverride: globalRootKeyPems[0], }, seedNodes: {}, // Explicitly no seed nodes on startup logger, @@ -62,7 +52,7 @@ describe('claim', () => { clientHost: '127.0.0.1' as Host, }, keysConfig: { - rootKeyPairBits: 2048, + privateKeyPemOverride: globalRootKeyPems[1], }, seedNodes: {}, // Explicitly no seed nodes on startup logger, @@ -82,8 +72,8 @@ describe('claim', () => { }, vaults: {}, }); - }, global.defaultTimeout * 2); - afterAll(async () => { + }); + afterEach(async () => { await pkAgent.stop(); await pkAgent.destroy(); await remoteNode.stop(); @@ -92,8 +82,6 @@ describe('claim', () => { force: true, recursive: true, }); - mockedGenerateKeyPair.mockRestore(); - mockedGenerateDeterministicKeyPair.mockRestore(); }); test('sends a gestalt invite', async () => { const { exitCode, stdout } = await testBinUtils.pkStdio( @@ -107,8 +95,6 @@ describe('claim', () => { expect(exitCode).toBe(0); expect(stdout).toContain('Gestalt Invite'); expect(stdout).toContain(remoteIdEncoded); - // Clear side-effects - await remoteNode.notificationsManager.clearNotifications(); }); test('sends a gestalt invite (force invite)', async () => { await remoteNode.notificationsManager.sendNotification(localId, { @@ -125,9 +111,6 @@ describe('claim', () => { expect(exitCode).toBe(0); expect(stdout).toContain('Gestalt Invite'); expect(stdout).toContain(nodesUtils.encodeNodeId(remoteId)); - // Clear side effects - await pkAgent.notificationsManager.clearNotifications(); - await remoteNode.notificationsManager.clearNotifications(); }); test('claims a node', async () => { await remoteNode.notificationsManager.sendNotification(localId, { @@ -144,9 +127,5 @@ describe('claim', () => { expect(exitCode).toBe(0); expect(stdout).toContain('cryptolink claim'); expect(stdout).toContain(remoteIdEncoded); - // Clear side effects - await pkAgent.notificationsManager.clearNotifications(); - await pkAgent.sigchain.stop(); - await pkAgent.sigchain.start({ fresh: true }); }); }); diff --git a/tests/bin/nodes/find.test.ts b/tests/bin/nodes/find.test.ts index b60804c64..cd6726e16 100644 --- a/tests/bin/nodes/find.test.ts +++ b/tests/bin/nodes/find.test.ts @@ -6,17 +6,14 @@ import fs from 'fs'; import Logger, { LogLevel, StreamHandler } from '@matrixai/logger'; import PolykeyAgent from '@/PolykeyAgent'; import * as nodesUtils from '@/nodes/utils'; -import * as keysUtils from '@/keys/utils'; import { sysexits } from '@/errors'; import * as testBinUtils from '../utils'; import * as testNodesUtils from '../../nodes/utils'; -import * as testUtils from '../../utils'; +import { globalRootKeyPems } from '../../globalRootKeyPems'; describe('find', () => { const logger = new Logger('find test', LogLevel.WARN, [new StreamHandler()]); const password = 'helloworld'; - let mockedGenerateKeyPair: jest.SpyInstance; - let mockedGenerateDeterministicKeyPair: jest.SpyInstance; let dataDir: string; let nodePath: string; let polykeyAgent: PolykeyAgent; @@ -28,14 +25,7 @@ describe('find', () => { let remoteOnlinePort: Port; let remoteOfflineHost: Host; let remoteOfflinePort: Port; - beforeAll(async () => { - const globalKeyPair = await testUtils.setupGlobalKeypair(); - mockedGenerateKeyPair = jest - .spyOn(keysUtils, 'generateKeyPair') - .mockResolvedValueOnce(globalKeyPair); - mockedGenerateDeterministicKeyPair = jest - .spyOn(keysUtils, 'generateDeterministicKeyPair') - .mockResolvedValueOnce(globalKeyPair); + beforeEach(async () => { dataDir = await fs.promises.mkdtemp( path.join(os.tmpdir(), 'polykey-test-'), ); @@ -53,6 +43,9 @@ describe('find', () => { connConnectTime: 2000, connTimeoutTime: 2000, }, + keysConfig: { + privateKeyPemOverride: globalRootKeyPems[0], + }, seedNodes: {}, // Explicitly no seed nodes on startup logger, }); @@ -67,7 +60,7 @@ describe('find', () => { clientHost: '127.0.0.1' as Host, }, keysConfig: { - rootKeyPairBits: 1024, + privateKeyPemOverride: globalRootKeyPems[1], }, logger, }); @@ -86,7 +79,7 @@ describe('find', () => { clientHost: '127.0.0.1' as Host, }, keysConfig: { - rootKeyPairBits: 1024, + privateKeyPemOverride: globalRootKeyPems[2], }, logger, }); @@ -95,8 +88,8 @@ describe('find', () => { remoteOfflinePort = remoteOffline.proxy.getProxyPort(); await testNodesUtils.nodesConnect(polykeyAgent, remoteOffline); await remoteOffline.stop(); - }, global.defaultTimeout * 3); - afterAll(async () => { + }); + afterEach(async () => { await polykeyAgent.stop(); await polykeyAgent.destroy(); await remoteOnline.stop(); @@ -107,8 +100,6 @@ describe('find', () => { force: true, recursive: true, }); - mockedGenerateKeyPair.mockRestore(); - mockedGenerateDeterministicKeyPair.mockRestore(); }); test('finds an online node', async () => { const { exitCode, stdout } = await testBinUtils.pkStdio( diff --git a/tests/bin/nodes/ping.test.ts b/tests/bin/nodes/ping.test.ts index f531a04d2..af8f678c9 100644 --- a/tests/bin/nodes/ping.test.ts +++ b/tests/bin/nodes/ping.test.ts @@ -6,17 +6,14 @@ import fs from 'fs'; import Logger, { LogLevel, StreamHandler } from '@matrixai/logger'; import PolykeyAgent from '@/PolykeyAgent'; import * as nodesUtils from '@/nodes/utils'; -import * as keysUtils from '@/keys/utils'; import { sysexits } from '@/errors'; import * as testBinUtils from '../utils'; import * as testNodesUtils from '../../nodes/utils'; -import * as testUtils from '../../utils'; +import { globalRootKeyPems } from '../../globalRootKeyPems'; describe('ping', () => { const logger = new Logger('ping test', LogLevel.WARN, [new StreamHandler()]); const password = 'helloworld'; - let mockedGenerateKeyPair: jest.SpyInstance; - let mockedGenerateDeterministicKeyPair: jest.SpyInstance; let dataDir: string; let nodePath: string; let polykeyAgent: PolykeyAgent; @@ -24,14 +21,7 @@ describe('ping', () => { let remoteOffline: PolykeyAgent; let remoteOnlineNodeId: NodeId; let remoteOfflineNodeId: NodeId; - beforeAll(async () => { - const globalKeyPair = await testUtils.setupGlobalKeypair(); - mockedGenerateKeyPair = jest - .spyOn(keysUtils, 'generateKeyPair') - .mockResolvedValueOnce(globalKeyPair); - mockedGenerateDeterministicKeyPair = jest - .spyOn(keysUtils, 'generateDeterministicKeyPair') - .mockResolvedValueOnce(globalKeyPair); + beforeEach(async () => { dataDir = await fs.promises.mkdtemp( path.join(os.tmpdir(), 'polykey-test-'), ); @@ -52,6 +42,9 @@ describe('ping', () => { connConnectTime: 2000, connTimeoutTime: 1000, }, + keysConfig: { + privateKeyPemOverride: globalRootKeyPems[0], + }, seedNodes: {}, // Explicitly no seed nodes on startup logger, }); @@ -66,7 +59,7 @@ describe('ping', () => { clientHost: '127.0.0.1' as Host, }, keysConfig: { - rootKeyPairBits: 1024, + privateKeyPemOverride: globalRootKeyPems[1], }, logger, }); @@ -83,15 +76,15 @@ describe('ping', () => { clientHost: '127.0.0.1' as Host, }, keysConfig: { - rootKeyPairBits: 1024, + privateKeyPemOverride: globalRootKeyPems[2], }, logger, }); remoteOfflineNodeId = remoteOffline.keyManager.getNodeId(); await testNodesUtils.nodesConnect(polykeyAgent, remoteOffline); await remoteOffline.stop(); - }, global.defaultTimeout * 3); - afterAll(async () => { + }); + afterEach(async () => { await polykeyAgent.stop(); await polykeyAgent.destroy(); await remoteOnline.stop(); @@ -102,8 +95,6 @@ describe('ping', () => { force: true, recursive: true, }); - mockedGenerateKeyPair.mockRestore(); - mockedGenerateDeterministicKeyPair.mockRestore(); }); test('fails when pinging an offline node', async () => { const { exitCode, stdout, stderr } = await testBinUtils.pkStdio( diff --git a/tests/bin/notifications/sendReadClear.test.ts b/tests/bin/notifications/sendReadClear.test.ts index eb97e4390..ec310c842 100644 --- a/tests/bin/notifications/sendReadClear.test.ts +++ b/tests/bin/notifications/sendReadClear.test.ts @@ -7,9 +7,8 @@ import fs from 'fs'; import Logger, { LogLevel, StreamHandler } from '@matrixai/logger'; import PolykeyAgent from '@/PolykeyAgent'; import * as nodesUtils from '@/nodes/utils'; -import * as keysUtils from '@/keys/utils'; import * as testBinUtils from '../utils'; -import * as testUtils from '../../utils'; +import { globalRootKeyPems } from '../../globalRootKeyPems'; describe('send/read/claim', () => { const logger = new Logger('send/read/clear test', LogLevel.WARN, [ @@ -27,19 +26,7 @@ describe('send/read/claim', () => { let receiverId: NodeId; let receiverHost: Host; let receiverPort: Port; - let mockedGenerateKeyPair: jest.SpyInstance; - let mockedGenerateDeterministicKeyPair: jest.SpyInstance; - beforeAll(async () => { - const globalKeyPair = await testUtils.setupGlobalKeypair(); - const otherKeyPair = await keysUtils.generateKeyPair(1024); - mockedGenerateKeyPair = jest - .spyOn(keysUtils, 'generateKeyPair') - .mockResolvedValueOnce(globalKeyPair) - .mockResolvedValue(otherKeyPair); - mockedGenerateDeterministicKeyPair = jest - .spyOn(keysUtils, 'generateDeterministicKeyPair') - .mockResolvedValueOnce(globalKeyPair) - .mockResolvedValue(otherKeyPair); + beforeEach(async () => { dataDir = await fs.promises.mkdtemp( path.join(os.tmpdir(), 'polykey-test-'), ); @@ -56,6 +43,9 @@ describe('send/read/claim', () => { agentHost: '127.0.0.1' as Host, clientHost: '127.0.0.1' as Host, }, + keysConfig: { + privateKeyPemOverride: globalRootKeyPems[0], + }, logger, }); senderId = sender.keyManager.getNodeId(); @@ -70,21 +60,22 @@ describe('send/read/claim', () => { agentHost: '127.0.0.1' as Host, clientHost: '127.0.0.1' as Host, }, + keysConfig: { + privateKeyPemOverride: globalRootKeyPems[1], + }, logger, }); receiverId = receiver.keyManager.getNodeId(); receiverHost = receiver.proxy.getProxyHost(); receiverPort = receiver.proxy.getProxyPort(); }); - afterAll(async () => { + afterEach(async () => { await receiver.stop(); await sender.stop(); await fs.promises.rm(dataDir, { force: true, recursive: true, }); - mockedGenerateKeyPair.mockRestore(); - mockedGenerateDeterministicKeyPair.mockRestore(); }); test('sends, receives, and clears notifications', async () => { let exitCode, stdout; diff --git a/tests/bin/secrets/secrets.test.ts b/tests/bin/secrets/secrets.test.ts index aeee174d9..0f61edf01 100644 --- a/tests/bin/secrets/secrets.test.ts +++ b/tests/bin/secrets/secrets.test.ts @@ -5,8 +5,8 @@ import fs from 'fs'; import Logger, { LogLevel, StreamHandler } from '@matrixai/logger'; import PolykeyAgent from '@/PolykeyAgent'; import { vaultOps } from '@/vaults'; -import * as keysUtils from '@/keys/utils'; import * as testBinUtils from '../utils'; +import { globalRootKeyPems } from '../../globalRootKeyPems'; describe('CLI secrets', () => { const password = 'password'; @@ -16,15 +16,7 @@ describe('CLI secrets', () => { let passwordFile: string; let command: Array; - const mockedGenerateDeterministicKeyPair = jest.spyOn( - keysUtils, - 'generateDeterministicKeyPair', - ); - - beforeAll(async () => { - mockedGenerateDeterministicKeyPair.mockImplementation((bits, _) => { - return keysUtils.generateKeyPair(bits); - }); + beforeEach(async () => { dataDir = await fs.promises.mkdtemp( path.join(os.tmpdir(), 'polykey-test-'), ); @@ -34,6 +26,9 @@ describe('CLI secrets', () => { password, nodePath: dataDir, logger: logger, + keysConfig: { + privateKeyPemOverride: globalRootKeyPems[0], + }, }); // Authorize session await testBinUtils.pkStdio( @@ -41,8 +36,8 @@ describe('CLI secrets', () => { {}, dataDir, ); - }, global.polykeyStartupTimeout); - afterAll(async () => { + }); + afterEach(async () => { await polykeyAgent.stop(); await polykeyAgent.destroy(); await fs.promises.rm(dataDir, { diff --git a/tests/bin/sessions.test.ts b/tests/bin/sessions.test.ts index f494a28b0..be9015690 100644 --- a/tests/bin/sessions.test.ts +++ b/tests/bin/sessions.test.ts @@ -14,7 +14,7 @@ import { sleep } from '@/utils'; import config from '@/config'; import * as clientErrors from '@/client/errors'; import * as testBinUtils from './utils'; -import * as testUtils from '../utils'; +import { globalRootKeyPems } from '../globalRootKeyPems'; jest.mock('prompts'); const mockedPrompts = mocked(prompts.prompt); @@ -23,31 +23,32 @@ describe('sessions', () => { const logger = new Logger('sessions test', LogLevel.WARN, [ new StreamHandler(), ]); - let globalAgentDir; - let globalAgentPassword; - let globalAgentClose; - beforeAll(async () => { - ({ globalAgentDir, globalAgentPassword, globalAgentClose } = - await testUtils.setupGlobalAgent(logger)); - }, globalThis.maxTimeout); - afterAll(async () => { - await globalAgentClose(); - }); + let agentDir; + let agentPassword; + let agentClose; let dataDir: string; beforeEach(async () => { + ({ agentDir, agentPassword, agentClose } = + await testBinUtils.setupTestAgent( + global.testCmd, + globalRootKeyPems[0], + logger, + )); dataDir = await fs.promises.mkdtemp( path.join(os.tmpdir(), 'polykey-test-'), ); }); afterEach(async () => { + await sleep(1000); await fs.promises.rm(dataDir, { force: true, recursive: true, }); + await agentClose(); }); test('serial commands refresh the session token', async () => { const session = await Session.createSession({ - sessionTokenPath: path.join(globalAgentDir, config.defaults.tokenBase), + sessionTokenPath: path.join(agentDir, config.defaults.tokenBase), fs, logger, }); @@ -55,10 +56,10 @@ describe('sessions', () => { ({ exitCode } = await testBinUtils.pkStdio( ['agent', 'status'], { - PK_NODE_PATH: globalAgentDir, - PK_PASSWORD: globalAgentPassword, + PK_NODE_PATH: agentDir, + PK_PASSWORD: agentPassword, }, - globalAgentDir, + agentDir, )); expect(exitCode).toBe(0); const token1 = await session.readToken(); @@ -69,10 +70,10 @@ describe('sessions', () => { ({ exitCode } = await testBinUtils.pkStdio( ['agent', 'status'], { - PK_NODE_PATH: globalAgentDir, - PK_PASSWORD: globalAgentPassword, + PK_NODE_PATH: agentDir, + PK_PASSWORD: agentPassword, }, - globalAgentDir, + agentDir, )); expect(exitCode).toBe(0); const token2 = await session.readToken(); @@ -85,11 +86,11 @@ describe('sessions', () => { ({ exitCode, stderr } = await testBinUtils.pkStdio( ['agent', 'status', '--format', 'json'], { - PK_NODE_PATH: globalAgentDir, + PK_NODE_PATH: agentDir, PK_PASSWORD: 'invalid', PK_TOKEN: 'token', }, - globalAgentDir, + agentDir, )); testBinUtils.expectProcessError(exitCode, stderr, [ new clientErrors.ErrorClientAuthDenied(), @@ -98,11 +99,11 @@ describe('sessions', () => { ({ exitCode, stderr } = await testBinUtils.pkStdio( ['agent', 'status', '--format', 'json'], { - PK_NODE_PATH: globalAgentDir, + PK_NODE_PATH: agentDir, PK_PASSWORD: 'invalid', PK_TOKEN: undefined, }, - globalAgentDir, + agentDir, )); testBinUtils.expectProcessError(exitCode, stderr, [ new clientErrors.ErrorClientAuthDenied(), @@ -111,24 +112,24 @@ describe('sessions', () => { ({ exitCode, stderr } = await testBinUtils.pkStdio( ['agent', 'status', '--format', 'json'], { - PK_NODE_PATH: globalAgentDir, + PK_NODE_PATH: agentDir, PK_PASSWORD: undefined, PK_TOKEN: 'token', }, - globalAgentDir, + agentDir, )); testBinUtils.expectProcessError(exitCode, stderr, [ new clientErrors.ErrorClientAuthDenied(), ]); }); test('prompt for password to authenticate attended commands', async () => { - const password = globalAgentPassword; + const password = agentPassword; await testBinUtils.pkStdio( ['agent', 'lock'], { - PK_NODE_PATH: globalAgentDir, + PK_NODE_PATH: agentDir, }, - globalAgentDir, + agentDir, ); mockedPrompts.mockClear(); mockedPrompts.mockImplementation(async (_opts: any) => { @@ -137,9 +138,9 @@ describe('sessions', () => { const { exitCode } = await testBinUtils.pkStdio( ['agent', 'status'], { - PK_NODE_PATH: globalAgentDir, + PK_NODE_PATH: agentDir, }, - globalAgentDir, + agentDir, ); expect(exitCode).toBe(0); // Prompted for password 1 time @@ -150,11 +151,11 @@ describe('sessions', () => { await testBinUtils.pkStdio( ['agent', 'lock'], { - PK_NODE_PATH: globalAgentDir, + PK_NODE_PATH: agentDir, }, - globalAgentDir, + agentDir, ); - const validPassword = globalAgentPassword; + const validPassword = agentPassword; const invalidPassword = 'invalid'; mockedPrompts.mockClear(); mockedPrompts @@ -163,9 +164,9 @@ describe('sessions', () => { const { exitCode } = await testBinUtils.pkStdio( ['agent', 'status'], { - PK_NODE_PATH: globalAgentDir, + PK_NODE_PATH: agentDir, }, - globalAgentDir, + agentDir, ); expect(exitCode).toBe(0); // Prompted for password 2 times diff --git a/tests/bin/utils.ts b/tests/bin/utils.ts index 5b3b02a07..e1038d5d4 100644 --- a/tests/bin/utils.ts +++ b/tests/bin/utils.ts @@ -537,17 +537,18 @@ function expectProcessError( /** * * @param cmd - Optional target command to run, usually `global.testCmd` - * @param agentDir - Directory to run the agent in, must exist * @param privateKeyPem - Optional root key override to skip key generation * @param logger */ async function setupTestAgent( cmd: string | undefined, - agentDir: string, privateKeyPem: PrivateKeyPem, logger: Logger, -): Promise<{ agentStatus: StatusLive; agentStop: () => void }> { - const password = 'password'; +) { + const agentDir = await fs.promises.mkdtemp( + path.join(global.tmpDir, 'polykey-test-'), + ); + const agentPassword = 'password'; const agentProcess = await pkSpawnSwitch(cmd)( [ 'agent', @@ -565,7 +566,7 @@ async function setupTestAgent( '--verbose', ], { - PK_PASSWORD: password, + PK_PASSWORD: agentPassword, PK_ROOT_KEY: privateKeyPem, }, agentDir, @@ -581,9 +582,26 @@ async function setupTestAgent( data: { ...data, nodeId: validationUtils.parseNodeId(data.nodeId) }, }; try { - return { agentStatus, agentStop: () => agentProcess.kill('SIGINT') }; + return { + agentStatus, + agentClose: async () => { + agentProcess.kill(); + await fs.promises.rm(agentDir, { + recursive: true, + force: true, + maxRetries: 10, + }); + }, + agentDir, + agentPassword, + }; } catch (e) { - agentProcess.kill('SIGINT'); + agentProcess.kill(); + await fs.promises.rm(agentDir, { + recursive: true, + force: true, + maxRetries: 10, + }); throw e; } } diff --git a/tests/bin/vaults/vaults.test.ts b/tests/bin/vaults/vaults.test.ts index 949f208ee..ac7c9fd3d 100644 --- a/tests/bin/vaults/vaults.test.ts +++ b/tests/bin/vaults/vaults.test.ts @@ -12,12 +12,7 @@ import sysexits from '@/utils/sysexits'; import NotificationsManager from '@/notifications/NotificationsManager'; import * as testBinUtils from '../utils'; import * as testNodesUtils from '../../nodes/utils'; - -jest.mock('@/keys/utils', () => ({ - ...jest.requireActual('@/keys/utils'), - generateDeterministicKeyPair: - jest.requireActual('@/keys/utils').generateKeyPair, -})); +import { globalRootKeyPems } from '../../globalRootKeyPems'; /** * This test file has been optimised to use only one instance of PolykeyAgent where possible. @@ -68,7 +63,7 @@ describe('CLI vaults', () => { return `vault-${vaultNumber}` as VaultName; } - beforeAll(async () => { + beforeEach(async () => { dataDir = await fs.promises.mkdtemp( path.join(os.tmpdir(), 'polykey-test-'), ); @@ -78,6 +73,9 @@ describe('CLI vaults', () => { password, nodePath: dataDir, logger: logger, + keysConfig: { + privateKeyPemOverride: globalRootKeyPems[0], + }, }); await polykeyAgent.gestaltGraph.setNode(node1); await polykeyAgent.gestaltGraph.setNode(node2); @@ -91,8 +89,10 @@ describe('CLI vaults', () => { {}, dataDir, ); - }, global.polykeyStartupTimeout); - afterAll(async () => { + vaultName = genVaultName(); + command = []; + }); + afterEach(async () => { await polykeyAgent.stop(); await polykeyAgent.destroy(); await fs.promises.rm(dataDir, { @@ -100,10 +100,6 @@ describe('CLI vaults', () => { recursive: true, }); }); - beforeEach(async () => { - vaultName = genVaultName(); - command = []; - }); describe('commandListVaults', () => { test('should list all vaults', async () => { @@ -211,6 +207,9 @@ describe('CLI vaults', () => { networkConfig: { proxyHost: '127.0.0.1' as Host, }, + keysConfig: { + privateKeyPemOverride: globalRootKeyPems[1], + }, logger: logger, }); const vaultId = await targetPolykeyAgent.vaultManager.createVault( @@ -708,6 +707,9 @@ describe('CLI vaults', () => { networkConfig: { proxyHost: '127.0.0.1' as Host, }, + keysConfig: { + privateKeyPemOverride: globalRootKeyPems[2], + }, }); const remoteOnlineNodeId = remoteOnline.keyManager.getNodeId(); const remoteOnlineNodeIdEncoded =