61 lines
2.1 KiB
TypeScript
61 lines
2.1 KiB
TypeScript
/// <reference types="jest" />
|
|
import * as fs from 'fs';
|
|
import * as path from 'path';
|
|
import * as os from 'os';
|
|
import { AsyncLockManager } from '../src/core/lock';
|
|
import { TransactionManager } from '../src/core/transaction';
|
|
|
|
describe('System Vulnerability Tests', () => {
|
|
let testDir: string;
|
|
|
|
beforeEach(() => {
|
|
testDir = path.join(os.tmpdir(), `g1-vulnerability-test-${Date.now()}`);
|
|
if (!fs.existsSync(testDir)) {
|
|
fs.mkdirSync(testDir, { recursive: true });
|
|
}
|
|
});
|
|
|
|
afterEach(() => {
|
|
if (fs.existsSync(testDir)) {
|
|
fs.rmSync(testDir, { recursive: true, force: true });
|
|
}
|
|
});
|
|
|
|
test('AsyncLockManager should prevent race conditions on the same file', async () => {
|
|
const lockManager = new AsyncLockManager();
|
|
const testFile = path.join(testDir, 'race_condition.txt');
|
|
fs.writeFileSync(testFile, '0');
|
|
|
|
// Simulate 10 concurrent increments
|
|
const tasks = Array.from({ length: 10 }).map(async (_, i) => {
|
|
const release = await lockManager.acquire(testFile);
|
|
try {
|
|
const current = parseInt(fs.readFileSync(testFile, 'utf-8'));
|
|
// Artificial delay to increase race condition probability
|
|
await new Promise(r => setTimeout(r, 10));
|
|
fs.writeFileSync(testFile, (current + 1).toString());
|
|
} finally {
|
|
release();
|
|
}
|
|
});
|
|
|
|
await Promise.all(tasks);
|
|
|
|
const finalValue = fs.readFileSync(testFile, 'utf-8');
|
|
expect(finalValue).toBe('10'); // If race condition occurs, it will be < 10
|
|
});
|
|
|
|
test('TransactionManager should support external verification hooks', () => {
|
|
const tm = new TransactionManager();
|
|
tm.begin();
|
|
|
|
tm.recordExternalAction('DB_COMMIT', true);
|
|
tm.recordExternalAction('API_PUSH', true);
|
|
|
|
expect(tm.isFullyVerified()).toBe(true);
|
|
|
|
tm.recordExternalAction('WIKI_SYNC', false);
|
|
expect(tm.isFullyVerified()).toBe(false);
|
|
});
|
|
});
|