Codegen: make missing codeql error clearer

This commit is contained in:
Paolo Tranquilli
2025-04-30 11:38:07 +02:00
parent 2c95f00432
commit ba89a5de6f
2 changed files with 31 additions and 3 deletions

View File

@@ -24,6 +24,7 @@ Moreover in the test directory for each <Class> in <group> it will generate bene
import logging import logging
import pathlib import pathlib
import re import re
import shutil
import subprocess import subprocess
import typing import typing
import itertools import itertools
@@ -257,6 +258,15 @@ def format(codeql, files):
if not ql_files: if not ql_files:
return return
format_cmd = [codeql, "query", "format", "--in-place", "--"] + ql_files format_cmd = [codeql, "query", "format", "--in-place", "--"] + ql_files
if "/" in codeql:
if not pathlib.Path(codeql).exists():
raise FormatError(f"Provided CodeQL binary `{codeql}` does not exist")
else:
codeql_path = shutil.which(codeql)
if not codeql_path:
raise FormatError(
f"`{codeql}` not found in PATH. Either install it, or pass `-- --codeql-binary` with a full path")
codeql = codeql_path
res = subprocess.run(format_cmd, stderr=subprocess.PIPE, text=True) res = subprocess.run(format_cmd, stderr=subprocess.PIPE, text=True)
if res.returncode: if res.returncode:
for line in res.stderr.splitlines(): for line in res.stderr.splitlines():

View File

@@ -52,6 +52,8 @@ def qlgen_opts(opts):
opts.ql_format = True opts.ql_format = True
opts.root_dir = paths.root_dir opts.root_dir = paths.root_dir
opts.force = False opts.force = False
opts.codeql_binary = "./my_fake_codeql"
pathlib.Path(opts.codeql_binary).touch()
return opts return opts
@@ -499,7 +501,6 @@ def test_class_dir_imports(generate_import_list):
def test_format(opts, generate, render_manager, run_mock): def test_format(opts, generate, render_manager, run_mock):
opts.codeql_binary = "my_fake_codeql"
run_mock.return_value.stderr = "some\nlines\n" run_mock.return_value.stderr = "some\nlines\n"
render_manager.written = [ render_manager.written = [
pathlib.Path("x", "foo.ql"), pathlib.Path("x", "foo.ql"),
@@ -508,13 +509,12 @@ def test_format(opts, generate, render_manager, run_mock):
] ]
generate([schema.Class('A')]) generate([schema.Class('A')])
assert run_mock.mock_calls == [ assert run_mock.mock_calls == [
mock.call(["my_fake_codeql", "query", "format", "--in-place", "--", "x/foo.ql", "bar.qll"], mock.call([opts.codeql_binary, "query", "format", "--in-place", "--", "x/foo.ql", "bar.qll"],
stderr=subprocess.PIPE, text=True), stderr=subprocess.PIPE, text=True),
] ]
def test_format_error(opts, generate, render_manager, run_mock): def test_format_error(opts, generate, render_manager, run_mock):
opts.codeql_binary = "my_fake_codeql"
run_mock.return_value.stderr = "some\nlines\n" run_mock.return_value.stderr = "some\nlines\n"
run_mock.return_value.returncode = 1 run_mock.return_value.returncode = 1
render_manager.written = [ render_manager.written = [
@@ -526,6 +526,24 @@ def test_format_error(opts, generate, render_manager, run_mock):
generate([schema.Class('A')]) generate([schema.Class('A')])
def test_format_no_codeql(opts, generate, render_manager, run_mock):
pathlib.Path(opts.codeql_binary).unlink()
render_manager.written = [
pathlib.Path("bar.qll"),
]
with pytest.raises(qlgen.FormatError):
generate([schema.Class('A')])
def test_format_no_codeql_in_path(opts, generate, render_manager, run_mock):
opts.codeql_binary = "my_fake_codeql"
render_manager.written = [
pathlib.Path("bar.qll"),
]
with pytest.raises(qlgen.FormatError):
generate([schema.Class('A')])
@pytest.mark.parametrize("force", [False, True]) @pytest.mark.parametrize("force", [False, True])
def test_manage_parameters(opts, generate, renderer, force): def test_manage_parameters(opts, generate, renderer, force):
opts.force = force opts.force = force