Skip to content

Commit 39e6652

Browse files
committed
tests: fixed up tests using workers
1 parent 4b8285e commit 39e6652

File tree

6 files changed

+123
-66
lines changed

6 files changed

+123
-66
lines changed

Diff for: src/DB.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -695,10 +695,10 @@ class DB {
695695
const cipherText = utils.toArrayBuffer(cipherTextBuf);
696696
const result = await this.workerManager.methods.decrypt(
697697
{
698-
key: this.crypto.key,
699-
cipherText: cipherTextBuf,
698+
key,
699+
cipherText,
700700
},
701-
[this.crypto.key, cipherTextBuf],
701+
[key, cipherText],
702702
);
703703
decrypted = result.data;
704704
} else {

Diff for: src/exampleDbWorker.ts

+99
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import type { Crypto } from '#types.js';
2+
import type { WorkerManifest } from '@matrixai/workers';
3+
import { expose } from '@matrixai/workers';
4+
import nodeForge from 'node-forge';
5+
6+
const { random, cipher, util: forgeUtil } = nodeForge;
7+
const ivSize = 16;
8+
const authTagSize = 16;
9+
10+
function getRandomBytesSync(size: number): Buffer {
11+
return Buffer.from(random.getBytesSync(size), 'binary');
12+
}
13+
14+
async function encrypt(
15+
key: ArrayBuffer,
16+
plainText: ArrayBuffer,
17+
): Promise<ArrayBuffer> {
18+
const iv = getRandomBytesSync(ivSize);
19+
const c = cipher.createCipher('AES-GCM', Buffer.from(key).toString('binary'));
20+
c.start({ iv: iv.toString('binary'), tagLength: authTagSize * 8 });
21+
c.update(forgeUtil.createBuffer(plainText));
22+
c.finish();
23+
const cipherText = Buffer.from(c.output.getBytes(), 'binary');
24+
const authTag = Buffer.from(c.mode.tag.getBytes(), 'binary');
25+
const data = Buffer.concat([iv, authTag, cipherText]);
26+
return data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength);
27+
}
28+
29+
async function decrypt(
30+
key: ArrayBuffer,
31+
cipherText: ArrayBuffer,
32+
): Promise<ArrayBuffer | undefined> {
33+
const cipherTextBuf = Buffer.from(cipherText);
34+
if (cipherTextBuf.byteLength < 32) {
35+
return;
36+
}
37+
const iv = cipherTextBuf.subarray(0, ivSize);
38+
const authTag = cipherTextBuf.subarray(ivSize, ivSize + authTagSize);
39+
const cipherText_ = cipherTextBuf.subarray(ivSize + authTagSize);
40+
const d = cipher.createDecipher(
41+
'AES-GCM',
42+
Buffer.from(key).toString('binary'),
43+
);
44+
d.start({
45+
iv: iv.toString('binary'),
46+
tagLength: authTagSize * 8,
47+
tag: forgeUtil.createBuffer(authTag),
48+
});
49+
d.update(forgeUtil.createBuffer(cipherText_));
50+
if (!d.finish()) {
51+
return;
52+
}
53+
const data = Buffer.from(d.output.getBytes(), 'binary');
54+
return data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength);
55+
}
56+
57+
const exampleDbWorker: Crypto = {
58+
async encrypt(
59+
{
60+
key,
61+
plainText,
62+
}: {
63+
key: ArrayBuffer;
64+
plainText: ArrayBuffer;
65+
},
66+
transferList: [ArrayBuffer, ArrayBuffer], // eslint-disable-line @typescript-eslint/no-unused-vars
67+
): Promise<{ data: ArrayBuffer; transferList: [ArrayBuffer] }> {
68+
const cipherText = await encrypt(key, plainText);
69+
return { data: cipherText, transferList: [cipherText] };
70+
},
71+
async decrypt(
72+
{
73+
key,
74+
cipherText,
75+
}: {
76+
key: ArrayBuffer;
77+
cipherText: ArrayBuffer;
78+
},
79+
transferList: [ArrayBuffer, ArrayBuffer], // eslint-disable-line @typescript-eslint/no-unused-vars
80+
): Promise<
81+
| { data: ArrayBuffer; transferList: [ArrayBuffer] }
82+
| { data: undefined; transferList: [] }
83+
> {
84+
const plainText = await decrypt(key, cipherText);
85+
if (plainText != null) {
86+
return { data: plainText, transferList: [plainText] };
87+
} else {
88+
return { data: undefined, transferList: [] };
89+
}
90+
},
91+
} satisfies WorkerManifest;
92+
93+
expose(exampleDbWorker);
94+
95+
type ExampleDBWorker = typeof exampleDbWorker;
96+
97+
export type { ExampleDBWorker };
98+
99+
export default exampleDbWorker;

Diff for: tests/DB.test.ts

+17-9
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,40 @@
11
import type DBTransaction from '#DBTransaction.js';
22
import type { KeyPath } from '#types.js';
33
import type { ResourceRelease } from '@matrixai/resources';
4-
import type { DBWorker } from './workers/dbWorker.js';
4+
import type { ExampleDBWorker } from '#exampleDbWorker.js';
55
import os from 'node:os';
66
import path from 'node:path';
77
import fs from 'node:fs';
88
import nodeCrypto from 'node:crypto';
99
import { Worker } from 'node:worker_threads';
10+
import url from 'node:url';
1011
import Logger, { LogLevel, StreamHandler } from '@matrixai/logger';
1112
import { WorkerManager } from '@matrixai/workers';
1213
import { withF } from '@matrixai/resources';
1314
import * as testsUtils from './utils.js';
14-
import dbWorker from './workers/dbWorker.js';
15+
import exampleDbWorker from '#exampleDbWorker.js';
1516
import DB from '#DB.js';
1617
import * as errors from '#errors.js';
1718
import * as utils from '#utils.js';
1819

20+
const dirname = url.fileURLToPath(new URL('.', import.meta.url));
21+
1922
describe(DB.name, () => {
2023
const logger = new Logger(`${DB.name} Test`, LogLevel.WARN, [
2124
new StreamHandler(),
2225
]);
2326
const crypto = {
2427
key: testsUtils.generateKeySync(256),
25-
ops: dbWorker,
28+
ops: exampleDbWorker,
2629
};
2730
let dataDir: string;
31+
let workerManager: WorkerManager<ExampleDBWorker>;
32+
2833
beforeEach(async () => {
2934
dataDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'db-test-'));
3035
});
3136
afterEach(async () => {
37+
await workerManager?.destroy({ force: true });
3238
await fs.promises.rm(dataDir, {
3339
force: true,
3440
recursive: true,
@@ -341,10 +347,11 @@ describe(DB.name, () => {
341347
test('parallelized get and put and del', async () => {
342348
const dbPath = `${dataDir}/db`;
343349
const db = await DB.createDB({ dbPath, crypto, logger });
344-
const workerManager = await WorkerManager.createWorkerManager<DBWorker>({
345-
workerFactory: () => new Worker('./workers/dbWorker'),
350+
workerManager = await WorkerManager.createWorkerManager({
351+
workerFactory: () =>
352+
new Worker(path.join(dirname, '../dist/exampleDbWorker')),
346353
cores: 1,
347-
manifest: dbWorker,
354+
manifest: exampleDbWorker,
348355
logger,
349356
});
350357
db.setWorkerManager(workerManager);
@@ -403,10 +410,11 @@ describe(DB.name, () => {
403410
test('parallelized batch put and del', async () => {
404411
const dbPath = `${dataDir}/db`;
405412
const db = await DB.createDB({ dbPath, crypto, logger });
406-
const workerManager = await WorkerManager.createWorkerManager<DBWorker>({
407-
workerFactory: () => new Worker('./workers/dbWorker'),
413+
const workerManager = await WorkerManager.createWorkerManager({
414+
workerFactory: () =>
415+
new Worker(path.join(dirname, '../dist/exampleDbWorker')),
408416
cores: 4,
409-
manifest: dbWorker,
417+
manifest: exampleDbWorker,
410418
logger,
411419
});
412420
db.setWorkerManager(workerManager);

Diff for: tests/DBIterator.test.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import nodeUtil from 'util';
77
import lexi from 'lexicographic-integer';
88
import Logger, { LogLevel, StreamHandler } from '@matrixai/logger';
99
import * as testsUtils from './utils.js';
10-
import dbWorker from './workers/dbWorker.js';
10+
import exampleDbWorker from '#exampleDbWorker.js';
1111
import DB from '#DB.js';
1212
import DBIterator from '#DBIterator.js';
1313
import rocksdbP from '#native/rocksdbP.js';
@@ -18,7 +18,7 @@ describe(DBIterator.name, () => {
1818
]);
1919
const crypto = {
2020
key: testsUtils.generateKeySync(256),
21-
ops: dbWorker,
21+
ops: exampleDbWorker,
2222
};
2323
let dataDir: string;
2424
let db: DB;

Diff for: tests/DBTransaction.test.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import Logger, { LogLevel, StreamHandler } from '@matrixai/logger';
66
import { withF } from '@matrixai/resources';
77
import { Barrier, errors as locksErrors } from '@matrixai/async-locks';
88
import * as testsUtils from './utils.js';
9-
import dbWorker from './workers/dbWorker.js';
9+
import exampleDbWorker from '#exampleDbWorker.js';
1010
import DB from '#DB.js';
1111
import DBTransaction from '#DBTransaction.js';
1212
import * as errors from '#errors.js';
@@ -17,7 +17,7 @@ describe(DBTransaction.name, () => {
1717
]);
1818
const crypto = {
1919
key: testsUtils.generateKeySync(256),
20-
ops: dbWorker,
20+
ops: exampleDbWorker,
2121
};
2222
let dataDir: string;
2323
let db: DB;

Diff for: tests/workers/dbWorker.ts

-50
This file was deleted.

0 commit comments

Comments
 (0)