Fix test code

This commit is contained in:
Dave Bartolomeo
2023-03-27 13:20:29 -04:00
parent 4ddf1c2c1a
commit 8c3fbb80b5
6 changed files with 110 additions and 102 deletions

View File

@@ -27,7 +27,7 @@ import { redactableError } from "../pure/errors";
import { CoreQueryResults, CoreQueryTarget } from "../queryRunner"; import { CoreQueryResults, CoreQueryTarget } from "../queryRunner";
import { Position } from "../pure/messages-shared"; import { Position } from "../pure/messages-shared";
async function compileQuery( export async function compileQuery(
qs: qsClient.QueryServerClient, qs: qsClient.QueryServerClient,
program: messages.QlProgram, program: messages.QlProgram,
quickEvalPosition: Position | undefined, quickEvalPosition: Position | undefined,
@@ -185,7 +185,7 @@ export class QueryInProgress {
readonly querySaveDir: string, readonly querySaveDir: string,
readonly dbItemPath: string, readonly dbItemPath: string,
databaseHasMetadataFile: boolean, databaseHasMetadataFile: boolean,
readonly queryDbscheme: string, // the dbscheme file the query expects, based on library path resolution readonly queryDbscheme: string, // the dbscheme file the query expects, ba`sed on library path resolution
readonly quickEvalPosition?: messages.Position, readonly quickEvalPosition?: messages.Position,
readonly metadata?: QueryMetadata, readonly metadata?: QueryMetadata,
readonly templates?: Record<string, string>, readonly templates?: Record<string, string>,

View File

@@ -22,7 +22,11 @@ import {
tryGetQueryMetadata, tryGetQueryMetadata,
} from "./helpers"; } from "./helpers";
import { displayQuickQuery } from "./quick-query"; import { displayQuickQuery } from "./quick-query";
import { CoreQueryResults, QueryRunner } from "./queryRunner"; import {
CoreCompletedQuery,
CoreQueryResults,
QueryRunner,
} from "./queryRunner";
import { QueryHistoryManager } from "./query-history/query-history-manager"; import { QueryHistoryManager } from "./query-history/query-history-manager";
import { DatabaseUI } from "./local-databases-ui"; import { DatabaseUI } from "./local-databases-ui";
import { ResultsView } from "./interface"; import { ResultsView } from "./interface";
@@ -406,64 +410,82 @@ export class LocalQueries extends DisposableObject {
databaseItem: DatabaseItem | undefined, databaseItem: DatabaseItem | undefined,
range?: Range, range?: Range,
): Promise<void> { ): Promise<void> {
if (this.queryRunner !== undefined) { await this.compileAndRunQueryInternal(
const selectedQuery = await determineSelectedQuery( quickEval,
queryUri, queryUri,
quickEval, progress,
range, token,
databaseItem,
range,
);
}
/** Used by tests */
public async compileAndRunQueryInternal(
quickEval: boolean,
queryUri: Uri | undefined,
progress: ProgressCallback,
token: CancellationToken,
databaseItem: DatabaseItem | undefined,
range?: Range,
): Promise<CoreCompletedQuery> {
const selectedQuery = await determineSelectedQuery(
queryUri,
quickEval,
range,
);
// If no databaseItem is specified, use the database currently selected in the Databases UI
databaseItem =
databaseItem || (await this.databaseUI.getDatabaseItem(progress, token));
if (databaseItem === undefined) {
throw new Error("Can't run query without a selected database");
}
const coreQueryRun = this.queryRunner.createQueryRun(
databaseItem.databaseUri.fsPath,
{
queryPath: selectedQuery.queryPath,
quickEvalPosition: selectedQuery.quickEvalPosition,
},
true,
getOnDiskWorkspaceFolders(),
this.queryStorageDir,
undefined,
undefined,
);
// handle cancellation from the history view.
const source = new CancellationTokenSource();
try {
token.onCancellationRequested(() => source.cancel());
const localQueryRun = await this.createLocalQueryRun(
selectedQuery,
databaseItem,
coreQueryRun.outputDir,
source,
); );
// If no databaseItem is specified, use the database currently selected in the Databases UI
databaseItem =
databaseItem ||
(await this.databaseUI.getDatabaseItem(progress, token));
if (databaseItem === undefined) {
throw new Error("Can't run query without a selected database");
}
const coreQueryRun = this.queryRunner.createQueryRun(
databaseItem.databaseUri.fsPath,
{
queryPath: selectedQuery.queryPath,
quickEvalPosition: selectedQuery.quickEvalPosition,
},
true,
getOnDiskWorkspaceFolders(),
this.queryStorageDir,
undefined,
undefined,
);
// handle cancellation from the history view.
const source = new CancellationTokenSource();
try { try {
token.onCancellationRequested(() => source.cancel()); const results = await coreQueryRun.evaluate(
progress,
const localQueryRun = await this.createLocalQueryRun( source.token,
selectedQuery, localQueryRun.logger,
databaseItem,
coreQueryRun.outputDir,
source,
); );
try { await localQueryRun.complete(results);
const results = await coreQueryRun.evaluate(
progress,
source.token,
localQueryRun.logger,
);
await localQueryRun.complete(results); return results;
} catch (e) { } catch (e) {
const err = asError(e); const err = asError(e);
err.message = `Error running query: ${err.message}`; err.message = `Error running query: ${err.message}`;
localQueryRun.queryInfo.failureReason = err.message; localQueryRun.queryInfo.failureReason = err.message;
throw e; throw e;
}
} finally {
await this.queryHistoryManager.refreshTreeView();
source.dispose();
} }
} finally {
await this.queryHistoryManager.refreshTreeView();
source.dispose();
} }
} }

View File

@@ -19,13 +19,11 @@ import {
import { importArchiveDatabase } from "../../../src/databaseFetcher"; import { importArchiveDatabase } from "../../../src/databaseFetcher";
import { CliVersionConstraint, CodeQLCliServer } from "../../../src/cli"; import { CliVersionConstraint, CodeQLCliServer } from "../../../src/cli";
import { describeWithCodeQL } from "../cli"; import { describeWithCodeQL } from "../cli";
import { tmpDir } from "../../../src/helpers";
import { createInitialQueryInfo } from "../../../src/run-queries-shared";
import { QueryRunner } from "../../../src/queryRunner"; import { QueryRunner } from "../../../src/queryRunner";
import { CompletedQueryInfo } from "../../../src/query-results";
import { SELECT_QUERY_NAME } from "../../../src/contextual/locationFinder"; import { SELECT_QUERY_NAME } from "../../../src/contextual/locationFinder";
import { createMockCommandManager } from "../../__mocks__/commandsMock"; import { createMockCommandManager } from "../../__mocks__/commandsMock";
import { LocalQueries } from "../../../src/local-queries"; import { LocalQueries } from "../../../src/local-queries";
import { QueryResultType } from "../../../src/pure/new-messages";
jest.setTimeout(20_000); jest.setTimeout(20_000);
@@ -134,22 +132,21 @@ describeWithCodeQL()("Queries", () => {
} }
async function runQueryWithExtensions() { async function runQueryWithExtensions() {
const result = new CompletedQueryInfo( const result = await localQueries.compileAndRunQueryInternal(
await localQueries.compileAndRunQueryAgainstDatabase( false,
dbItem, Uri.file(queryUsingExtensionPath),
await mockInitialQueryInfo(queryUsingExtensionPath), progress,
join(tmpDir.name, "mock-storage-path"), token,
progress, dbItem,
token, undefined,
),
); );
// Check that query was successful // Check that query was successful
expect(result.successful).toBe(true); expect(result.resultType).toBe(QueryResultType.SUCCESS);
// Load query results // Load query results
const chunk = await qs.cliServer.bqrsDecode( const chunk = await qs.cliServer.bqrsDecode(
result.getResultsPath(SELECT_QUERY_NAME, true), result.outputDir.bqrsPath,
SELECT_QUERY_NAME, SELECT_QUERY_NAME,
{ {
// there should only be one result // there should only be one result
@@ -165,31 +162,33 @@ describeWithCodeQL()("Queries", () => {
it("should run a query", async () => { it("should run a query", async () => {
const queryPath = join(__dirname, "data", "simple-query.ql"); const queryPath = join(__dirname, "data", "simple-query.ql");
const result = localQueries.compileAndRunQueryAgainstDatabase( const result = await localQueries.compileAndRunQueryInternal(
dbItem, false,
await mockInitialQueryInfo(queryPath), Uri.file(queryPath),
join(tmpDir.name, "mock-storage-path"),
progress, progress,
token, token,
dbItem,
undefined,
); );
// just check that the query was successful // just check that the query was successful
expect((await result).successful).toBe(true); expect(result.resultType).toBe(QueryResultType.SUCCESS);
}); });
// Asserts a fix for bug https://github.com/github/vscode-codeql/issues/733 // Asserts a fix for bug https://github.com/github/vscode-codeql/issues/733
it("should restart the database and run a query", async () => { it("should restart the database and run a query", async () => {
await commands.executeCommand("codeQL.restartQueryServer"); await commands.executeCommand("codeQL.restartQueryServer");
const queryPath = join(__dirname, "data", "simple-query.ql"); const queryPath = join(__dirname, "data", "simple-query.ql");
const result = await localQueries.compileAndRunQueryAgainstDatabase( const result = await localQueries.compileAndRunQueryInternal(
dbItem, false,
await mockInitialQueryInfo(queryPath), Uri.file(queryPath),
join(tmpDir.name, "mock-storage-path"),
progress, progress,
token, token,
dbItem,
undefined,
); );
expect(result.successful).toBe(true); expect(result.resultType).toBe(QueryResultType.SUCCESS);
}); });
it("should create a quick query", async () => { it("should create a quick query", async () => {
@@ -239,15 +238,4 @@ describeWithCodeQL()("Queries", () => {
// ignore // ignore
} }
} }
async function mockInitialQueryInfo(queryPath: string) {
return await createInitialQueryInfo(
Uri.file(queryPath),
{
name: dbItem.name,
databaseUri: dbItem.databaseUri.toString(),
},
false,
);
}
}); });

View File

@@ -5,6 +5,7 @@ import { CancellationToken, ExtensionContext, Uri, workspace } from "vscode";
import { import {
DatabaseContents, DatabaseContents,
DatabaseContentsWithDbScheme,
DatabaseEventKind, DatabaseEventKind,
DatabaseItemImpl, DatabaseItemImpl,
DatabaseManager, DatabaseManager,
@@ -687,7 +688,7 @@ describe("local databases", () => {
resolveDatabaseContentsSpy = jest resolveDatabaseContentsSpy = jest
.spyOn(DatabaseResolver, "resolveDatabaseContents") .spyOn(DatabaseResolver, "resolveDatabaseContents")
.mockResolvedValue({} as DatabaseContents); .mockResolvedValue({} as DatabaseContentsWithDbScheme);
addDatabaseSourceArchiveFolderSpy = jest.spyOn( addDatabaseSourceArchiveFolderSpy = jest.spyOn(
databaseManager, databaseManager,

View File

@@ -3,7 +3,7 @@ import { readFileSync } from "fs-extra";
import AstBuilder from "../../../../src/contextual/astBuilder"; import AstBuilder from "../../../../src/contextual/astBuilder";
import { CodeQLCliServer } from "../../../../src/cli"; import { CodeQLCliServer } from "../../../../src/cli";
import { Uri } from "vscode"; import { Uri } from "vscode";
import { QueryWithResults } from "../../../../src/run-queries-shared"; import { QueryOutputDir } from "../../../../src/run-queries-shared";
import { mockDatabaseItem, mockedObject } from "../../utils/mocking.helpers"; import { mockDatabaseItem, mockedObject } from "../../utils/mocking.helpers";
/** /**
@@ -137,13 +137,7 @@ describe("AstBuilder", () => {
function createAstBuilder() { function createAstBuilder() {
return new AstBuilder( return new AstBuilder(
{ new QueryOutputDir("/a/b/c"),
query: {
resultsPaths: {
resultsPath: "/a/b/c",
},
},
} as QueryWithResults,
mockCli, mockCli,
mockDatabaseItem({ mockDatabaseItem({
resolveSourceFile: undefined, resolveSourceFile: undefined,

View File

@@ -13,7 +13,10 @@ import { tmpDir } from "../../../src/helpers";
import { QueryServerClient } from "../../../src/legacy-query-server/queryserver-client"; import { QueryServerClient } from "../../../src/legacy-query-server/queryserver-client";
import { CodeQLCliServer } from "../../../src/cli"; import { CodeQLCliServer } from "../../../src/cli";
import { SELECT_QUERY_NAME } from "../../../src/contextual/locationFinder"; import { SELECT_QUERY_NAME } from "../../../src/contextual/locationFinder";
import { QueryInProgress } from "../../../src/legacy-query-server/run-queries"; import {
QueryInProgress,
compileQuery as compileQueryLegacy,
} from "../../../src/legacy-query-server/run-queries";
import { LegacyQueryRunner } from "../../../src/legacy-query-server/legacyRunner"; import { LegacyQueryRunner } from "../../../src/legacy-query-server/legacyRunner";
import { DatabaseItem } from "../../../src/local-databases"; import { DatabaseItem } from "../../../src/local-databases";
import { DeepPartial, mockedObject } from "../utils/mocking.helpers"; import { DeepPartial, mockedObject } from "../utils/mocking.helpers";
@@ -30,7 +33,6 @@ describe("run-queries", () => {
const saveDir = "query-save-dir"; const saveDir = "query-save-dir";
const info = createMockQueryInfo(true, saveDir); const info = createMockQueryInfo(true, saveDir);
expect(info.compiledQueryPath).toBe(join(saveDir, "compiledQuery.qlo"));
expect(info.queryEvalInfo.dilPath).toBe(join(saveDir, "results.dil")); expect(info.queryEvalInfo.dilPath).toBe(join(saveDir, "results.dil"));
expect(info.queryEvalInfo.resultsPaths.resultsPath).toBe( expect(info.queryEvalInfo.resultsPaths.resultsPath).toBe(
join(saveDir, "results.bqrs"), join(saveDir, "results.bqrs"),
@@ -185,14 +187,15 @@ describe("run-queries", () => {
queryPath: "", queryPath: "",
}; };
const results = await info.compile( const results = await compileQueryLegacy(
qs as any, qs as any,
mockQlProgram, mockQlProgram,
undefined,
info.queryEvalInfo,
mockProgress as any, mockProgress as any,
mockCancel as any, mockCancel as any,
qs.logger, qs.logger,
); );
expect(results).toEqual([{ message: "err", severity: Severity.ERROR }]); expect(results).toEqual([{ message: "err", severity: Severity.ERROR }]);
expect(qs.sendRequest).toHaveBeenCalledTimes(1); expect(qs.sendRequest).toHaveBeenCalledTimes(1);
@@ -214,7 +217,7 @@ describe("run-queries", () => {
timeoutSecs: 5, timeoutSecs: 5,
}, },
queryToCheck: mockQlProgram, queryToCheck: mockQlProgram,
resultPath: info.compiledQueryPath, resultPath: info.queryEvalInfo.compileQueryPath,
target: { query: {} }, target: { query: {} },
}, },
mockCancel, mockCancel,