Merge pull request #1804 from github/koesie10/stop-monitor-after-remove

Stop variant analysis monitor after removing the variant analysis from the query history
This commit is contained in:
Koen Vlaswinkel
2022-12-01 09:38:23 +01:00
committed by GitHub
4 changed files with 49 additions and 4 deletions

View File

@@ -94,7 +94,12 @@ export class VariantAnalysisManager
private readonly variantAnalysisResultsManager: VariantAnalysisResultsManager, private readonly variantAnalysisResultsManager: VariantAnalysisResultsManager,
) { ) {
super(); super();
this.variantAnalysisMonitor = this.push(new VariantAnalysisMonitor(ctx)); this.variantAnalysisMonitor = this.push(
new VariantAnalysisMonitor(
ctx,
this.shouldCancelMonitorVariantAnalysis.bind(this),
),
);
this.variantAnalysisMonitor.onVariantAnalysisChange( this.variantAnalysisMonitor.onVariantAnalysisChange(
this.onVariantAnalysisUpdated.bind(this), this.onVariantAnalysisUpdated.bind(this),
); );
@@ -319,6 +324,12 @@ export class VariantAnalysisManager
return await fs.pathExists(filePath); return await fs.pathExists(filePath);
} }
private async shouldCancelMonitorVariantAnalysis(
variantAnalysisId: number,
): Promise<boolean> {
return !this.variantAnalyses.has(variantAnalysisId);
}
public async onVariantAnalysisUpdated( public async onVariantAnalysisUpdated(
variantAnalysis: VariantAnalysis | undefined, variantAnalysis: VariantAnalysis | undefined,
): Promise<void> { ): Promise<void> {
@@ -326,6 +337,10 @@ export class VariantAnalysisManager
return; return;
} }
if (!this.variantAnalyses.has(variantAnalysis.id)) {
return;
}
await this.setVariantAnalysis(variantAnalysis); await this.setVariantAnalysis(variantAnalysis);
this._onVariantAnalysisStatusUpdated.fire(variantAnalysis); this._onVariantAnalysisStatusUpdated.fire(variantAnalysis);
} }

View File

@@ -28,7 +28,12 @@ export class VariantAnalysisMonitor extends DisposableObject {
); );
readonly onVariantAnalysisChange = this._onVariantAnalysisChange.event; readonly onVariantAnalysisChange = this._onVariantAnalysisChange.event;
constructor(private readonly extensionContext: ExtensionContext) { constructor(
private readonly extensionContext: ExtensionContext,
private readonly shouldCancelMonitor: (
variantAnalysisId: number,
) => Promise<boolean>,
) {
super(); super();
} }
@@ -51,6 +56,10 @@ export class VariantAnalysisMonitor extends DisposableObject {
return; return;
} }
if (await this.shouldCancelMonitor(variantAnalysis.id)) {
return;
}
const variantAnalysisSummary = await ghApiClient.getVariantAnalysis( const variantAnalysisSummary = await ghApiClient.getVariantAnalysis(
credentials, credentials,
variantAnalysis.controllerRepo.id, variantAnalysis.controllerRepo.id,

View File

@@ -748,9 +748,13 @@ describe("Variant Analysis Manager", () => {
}); });
it("should remove variant analysis", async () => { it("should remove variant analysis", async () => {
await variantAnalysisManager.onVariantAnalysisUpdated( pathExistsStub.mockImplementation(() => true);
await variantAnalysisManager.rehydrateVariantAnalysis(
dummyVariantAnalysis, dummyVariantAnalysis,
); );
expect(pathExistsStub).toBeCalledWith(
path.join(storagePath, dummyVariantAnalysis.id.toString()),
);
expect(variantAnalysisManager.variantAnalysesSize).toBe(1); expect(variantAnalysisManager.variantAnalysesSize).toBe(1);
await variantAnalysisManager.removeVariantAnalysis( await variantAnalysisManager.removeVariantAnalysis(

View File

@@ -36,6 +36,7 @@ describe("Variant Analysis Monitor", () => {
>; >;
let cancellationTokenSource: CancellationTokenSource; let cancellationTokenSource: CancellationTokenSource;
let variantAnalysisMonitor: VariantAnalysisMonitor; let variantAnalysisMonitor: VariantAnalysisMonitor;
let shouldCancelMonitor: jest.Mock<Promise<boolean>, [number]>;
let variantAnalysis: VariantAnalysis; let variantAnalysis: VariantAnalysis;
let variantAnalysisManager: VariantAnalysisManager; let variantAnalysisManager: VariantAnalysisManager;
let mockGetDownloadResult: jest.SpiedFunction< let mockGetDownloadResult: jest.SpiedFunction<
@@ -53,12 +54,17 @@ describe("Variant Analysis Monitor", () => {
variantAnalysis = createMockVariantAnalysis({}); variantAnalysis = createMockVariantAnalysis({});
shouldCancelMonitor = jest.fn();
extension = await extensions extension = await extensions
.getExtension<CodeQLExtensionInterface | Record<string, never>>( .getExtension<CodeQLExtensionInterface | Record<string, never>>(
"GitHub.vscode-codeql", "GitHub.vscode-codeql",
)! )!
.activate(); .activate();
variantAnalysisMonitor = new VariantAnalysisMonitor(extension.ctx); variantAnalysisMonitor = new VariantAnalysisMonitor(
extension.ctx,
shouldCancelMonitor,
);
variantAnalysisMonitor.onVariantAnalysisChange(onVariantAnalysisChangeSpy); variantAnalysisMonitor.onVariantAnalysisChange(onVariantAnalysisChangeSpy);
variantAnalysisManager = extension.variantAnalysisManager; variantAnalysisManager = extension.variantAnalysisManager;
@@ -114,6 +120,17 @@ describe("Variant Analysis Monitor", () => {
expect(onVariantAnalysisChangeSpy).not.toHaveBeenCalled(); expect(onVariantAnalysisChangeSpy).not.toHaveBeenCalled();
}); });
it("should return early if variant analysis should be cancelled", async () => {
shouldCancelMonitor.mockResolvedValue(true);
await variantAnalysisMonitor.monitorVariantAnalysis(
variantAnalysis,
cancellationTokenSource.token,
);
expect(onVariantAnalysisChangeSpy).not.toHaveBeenCalled();
});
describe("when the variant analysis fails", () => { describe("when the variant analysis fails", () => {
let mockFailedApiResponse: VariantAnalysisApiResponse; let mockFailedApiResponse: VariantAnalysisApiResponse;