Attempt to fix tests

This commit is contained in:
shati-patel
2021-11-11 17:53:32 +00:00
committed by Shati Patel
parent c1fceab8d9
commit 38e5d8babc
4 changed files with 45 additions and 21 deletions

View File

@@ -17,6 +17,7 @@ import { assertNever } from './pure/helpers-pure';
import { QueryMetadata, SortDirection } from './pure/interface-types';
import { Logger, ProgressReporter } from './logging';
import { CompilationMessage } from './pure/messages';
import { dbSchemeToLanguage } from './helpers';
/**
* The version of the SARIF format that we are using.
@@ -159,6 +160,11 @@ export class CodeQLCliServer implements Disposable {
/** Version of current cli, lazily computed by the `getVersion()` method */
private _version: SemVer | undefined;
/**
* The languages supported by the current version of the CLI, computed by `getSupportedLanguages()`.
*/
private _supportedLanguages: string[] | undefined;
/** Path to current codeQL executable, or undefined if not running yet. */
codeQlPath: string | undefined;
@@ -181,12 +187,14 @@ export class CodeQLCliServer implements Disposable {
this.distributionProvider.onDidChangeDistribution(() => {
this.restartCliServer();
this._version = undefined;
this._supportedLanguages = undefined;
});
}
if (this.cliConfig.onDidChangeConfiguration) {
this.cliConfig.onDidChangeConfiguration(() => {
this.restartCliServer();
this._version = undefined;
this._supportedLanguages = undefined;
});
}
}
@@ -781,6 +789,23 @@ export class CodeQLCliServer implements Disposable {
return await this.runJsonCodeQlCliCommand<LanguagesInfo>(['resolve', 'languages'], [], 'Resolving languages');
}
/**
* Gets the list of available languages. Refines the result of `resolveLanguages()`, by excluding
* extra things like "xml" and "properties".
*
* @returns An array of languages that are supported by the current version of the CodeQL CLI.
*/
public async getSupportedLanguages(): Promise<string[]> {
if (!this._supportedLanguages) {
// Get the intersection of resolveLanguages with the list of hardcoded languages in dbSchemeToLanguage.
const resolvedLanguages = Object.keys(await this.resolveLanguages());
const hardcodedLanguages = Object.values(dbSchemeToLanguage);
this._supportedLanguages = resolvedLanguages.filter(lang => hardcodedLanguages.includes(lang));
}
return this._supportedLanguages;
}
/**
* Gets information about queries in a query suite.
* @param suite The suite to resolve.

View File

@@ -415,7 +415,7 @@ export class CachedOperation<U> {
* @see cli.CliVersionConstraint.supportsLanguageName
* @see cli.CodeQLCliServer.resolveDatabase
*/
const dbSchemeToLanguage = {
export const dbSchemeToLanguage = {
'semmlecode.javascript.dbscheme': 'javascript',
'semmlecode.cpp.dbscheme': 'cpp',
'semmlecode.dbscheme': 'java',
@@ -498,14 +498,12 @@ export async function findLanguage(
}
// will be undefined if user cancels the quick pick.
return await askForLanguage(false);
return await askForLanguage(cliServer, false);
}
export const supportedLanguages = Object.values(dbSchemeToLanguage).sort();
export async function askForLanguage(throwOnEmpty = true): Promise<string | undefined> {
export async function askForLanguage(cliServer: CodeQLCliServer, throwOnEmpty = true): Promise<string | undefined> {
const language = await Window.showQuickPick(
supportedLanguages,
await cliServer.getSupportedLanguages(),
{ placeHolder: 'Select target language for your query', ignoreFocusOut: true }
);
if (!language) {

View File

@@ -134,7 +134,7 @@ async function generateQueryPack(cliServer: cli.CodeQLCliServer, queryFile: stri
} else {
// open popup to ask for language if not already hardcoded
language = fallbackLanguage || await askForLanguage();
language = fallbackLanguage || await askForLanguage(cliServer);
// copy only the query file to the query pack directory
// and generate a synthetic query pack

View File

@@ -6,7 +6,7 @@ import { SemVer } from 'semver';
import { CodeQLCliServer, QueryInfoByLanguage } from '../../cli';
import { CodeQLExtensionInterface } from '../../extension';
import { skipIfNoCodeQL } from '../ensureCli';
import { getOnDiskWorkspaceFolders, getQlPackForDbscheme, languageToDbScheme, supportedLanguages } from '../../helpers';
import { getOnDiskWorkspaceFolders, getQlPackForDbscheme, languageToDbScheme } from '../../helpers';
import { resolveQueries } from '../../contextual/queryResolver';
import { KeyType } from '../../contextual/keyType';
@@ -17,11 +17,13 @@ describe('Use cli', function() {
this.timeout(60000);
let cli: CodeQLCliServer;
let supportedLanguages: string[];
beforeEach(async () => {
const extension = await extensions.getExtension<CodeQLExtensionInterface | Record<string, never>>('GitHub.vscode-codeql')!.activate();
if ('cliServer' in extension) {
cli = extension.cliServer;
supportedLanguages = await cli.getSupportedLanguages();
} else {
throw new Error('Extension not initialized. Make sure cli is downloaded and installed properly.');
}
@@ -56,12 +58,11 @@ describe('Use cli', function() {
}
});
it('should resolve languages', async function() {
it('should support the expected languages', async function() {
skipIfNoCodeQL(this);
const languages = await cli.resolveLanguages();
for (const expectedLanguage of supportedLanguages) {
expect(languages).to.have.property(expectedLanguage).that.is.not.undefined;
}
// Just check a few examples that definitely are/aren't supported.
expect(supportedLanguages).to.include.members(['go', 'javascript', 'python']);
expect(supportedLanguages).to.not.include.members(['xml', 'properties']);
});
it('should resolve query by language', async function() {
@@ -71,15 +72,15 @@ describe('Use cli', function() {
expect((Object.keys(queryInfo.byLanguage))[0]).to.eql('javascript');
});
it('should resolve printAST queries for supported languages', async function() {
skipIfNoCodeQL(this);
supportedLanguages.forEach(async lang => {
if (lang === 'go') {
// The codeql-go submodule is not available in the integration tests.
return;
}
supportedLanguages.forEach(lang => {
if (lang === 'go') {
// The codeql-go submodule is not available in the integration tests.
return;
}
it(`should resolve printAST queries for ${lang}`, async function() {
skipIfNoCodeQL(this);
console.log(`resolving printAST queries for ${lang}`);
const pack = await getQlPackForDbscheme(cli, languageToDbScheme[lang]);
expect(pack.dbschemePack).to.contain(lang);
if (pack.dbschemePackIsLibraryPack) {