67 lines
2.1 KiB
JavaScript
67 lines
2.1 KiB
JavaScript
'use strict';
|
|
|
|
const { test } = require('node:test');
|
|
const assert = require('node:assert');
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
const os = require('os');
|
|
|
|
const Store = require('../../lib/store');
|
|
const DB = require('../../lib/db');
|
|
|
|
const KEY_A = '00000000-0000-4000-8000-00000000000a';
|
|
const KEY_B = '00000000-0000-4000-8000-00000000000b';
|
|
|
|
function setup() {
|
|
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'psi-db-'));
|
|
const db = new DB(dir, new Store(dir));
|
|
db.init();
|
|
fs.mkdirSync(path.join(dir, 'bucket'));
|
|
for (const key of [KEY_A, KEY_B]) {
|
|
fs.writeFileSync(path.join(dir, 'bucket', key), 'x');
|
|
fs.writeFileSync(path.join(dir, 'bucket', `${ key }.json`), '{}');
|
|
db.add('bucket', key, { metadata: { sid: 'bucket', key } });
|
|
}
|
|
return { dir, db };
|
|
}
|
|
|
|
test('concurrent remove of the same file neither throws nor removes other files', async () => {
|
|
const { dir, db } = setup();
|
|
try {
|
|
await Promise.all([db.remove('bucket', KEY_A), db.remove('bucket', KEY_A)]);
|
|
assert.deepStrictEqual(db.get('bucket').map(f => f.key), [KEY_B]);
|
|
} finally {
|
|
fs.rmSync(dir, { recursive: true, force: true });
|
|
}
|
|
});
|
|
|
|
test('remove tolerates an already deleted bucket', async () => {
|
|
const { dir, db } = setup();
|
|
try {
|
|
await Promise.all([
|
|
db.remove('bucket', KEY_A),
|
|
db.remove('bucket', KEY_B),
|
|
db.remove('bucket', KEY_B),
|
|
]);
|
|
assert.strictEqual(db.get('bucket'), undefined);
|
|
await db.remove('bucket', KEY_A);
|
|
} finally {
|
|
fs.rmSync(dir, { recursive: true, force: true });
|
|
}
|
|
});
|
|
|
|
test('claim is exclusive until released', () => {
|
|
const { dir, db } = setup();
|
|
try {
|
|
assert.strictEqual(db.claim('bucket', KEY_A), true);
|
|
assert.strictEqual(db.claim('bucket', KEY_A), false);
|
|
assert.strictEqual(db.isClaimed('bucket', KEY_A), true);
|
|
db.release('bucket', KEY_A);
|
|
assert.strictEqual(db.claim('bucket', KEY_A), true);
|
|
assert.strictEqual(db.claim('bucket', 'unknown'), false);
|
|
assert.strictEqual(db.claim('nobucket', KEY_A), false);
|
|
} finally {
|
|
fs.rmSync(dir, { recursive: true, force: true });
|
|
}
|
|
});
|