diff --git a/extension/src/test/outdatedCliSuppressionStore.test.ts b/extension/src/test/outdatedCliSuppressionStore.test.ts index b1c0dfbb88a..1d4d2b79ff1 100644 --- a/extension/src/test/outdatedCliSuppressionStore.test.ts +++ b/extension/src/test/outdatedCliSuppressionStore.test.ts @@ -3,7 +3,11 @@ import { spawn } from 'child_process'; import * as fs from 'fs'; import * as os from 'os'; import * as path from 'path'; -import { FileSystemOutdatedCliSuppressionStore } from '../utils/outdatedCliSuppressionStore'; +import * as sinon from 'sinon'; +import { + FileSystemOutdatedCliSuppressionStore, + OutdatedCliNotificationClaim, +} from '../utils/outdatedCliSuppressionStore'; suite('outdatedCliSuppressionStore', () => { let directory: string; @@ -30,6 +34,31 @@ suite('outdatedCliSuppressionStore', () => { ['/cli/a\u000013.5.0', '/cli/b\u000013.5.0']); }); + test('uses one timestamp for a claim marker and payload', async () => { + const nowStub = sinon.stub(Date, 'now'); + nowStub.onFirstCall().returns(1_000); + nowStub.returns(1_001); + const first = new FileSystemOutdatedCliSuppressionStore(directory); + const second = new FileSystemOutdatedCliSuppressionStore(directory); + let claim: OutdatedCliNotificationClaim | undefined; + + try { + claim = await first.tryClaimNotification('/cli/a\u000013.5.0'); + assert.ok(claim); + const storageDirectory = path.join(directory, 'outdated-cli-suppressions'); + const claimMarker = fs.readdirSync(storageDirectory) + .find(entry => entry.startsWith('notification-claim-')); + assert.ok(claimMarker?.startsWith('notification-claim-1000-')); + + await second.add('/cli/b\u000013.5.0'); + assert.deepStrictEqual(await second.readAll(), ['/cli/b\u000013.5.0']); + } + finally { + await claim?.release(); + nowStub.restore(); + } + }); + test('serializes a suppression written after the final notification check', async () => { const first = new FileSystemOutdatedCliSuppressionStore(directory); const second = new FileSystemOutdatedCliSuppressionStore(directory); diff --git a/extension/src/utils/outdatedCliSuppressionStore.ts b/extension/src/utils/outdatedCliSuppressionStore.ts index d1ade9071a3..8ddeeda57f7 100644 --- a/extension/src/utils/outdatedCliSuppressionStore.ts +++ b/extension/src/utils/outdatedCliSuppressionStore.ts @@ -56,7 +56,7 @@ export class FileSystemOutdatedCliSuppressionStore implements OutdatedCliSuppres notificationKey, processId: process.pid, createdAt, - }); + }, createdAt); let released = false; const claim: OutdatedCliNotificationClaim = { isValid: () => isLeaseCurrent(createdAt), @@ -178,9 +178,13 @@ export class FileSystemOutdatedCliSuppressionStore implements OutdatedCliSuppres } } - private async _publishMarker(prefix: string, value: unknown): Promise { + private async _publishMarker( + prefix: string, + value: unknown, + createdAt = Date.now(), + ): Promise { await mkdir(this._directoryPath, { recursive: true }); - const generation = `${Date.now()}-${process.pid}-${markerSequence++}`; + const generation = `${createdAt}-${process.pid}-${markerSequence++}`; const fileName = `${prefix}${generation}${markerFileSuffix}`; const temporaryPath = path.join(this._directoryPath, `.${fileName}.tmp`); const finalPath = path.join(this._directoryPath, fileName);