|
24 | 24 |
|
25 | 25 | If --force is present, existing files may be overwritten.
|
26 | 26 |
|
27 |
| -Requirements: `mvn` and `codeql` should both appear on your path. |
| 27 | +Requirements: |
| 28 | + - `mvn` and `codeql` should both appear on your path. |
| 29 | + - `--additional-packs /path/to/semmle-code/ql` should be added to your `.config/codeql/config` file. |
28 | 30 |
|
29 | 31 | After test generation completes, any lines in specsToTest.csv that didn't produce tests are output.
|
30 | 32 | If this happens, check the spelling of class and method names, and the syntax of input and output specifications.
|
|
52 | 54 |
|
53 | 55 | resultJava = os.path.join(sys.argv[3], "Test.java")
|
54 | 56 | resultQl = os.path.join(sys.argv[3], "test.ql")
|
| 57 | +resultYml = os.path.join(sys.argv[3], "test.model.yml") |
| 58 | +resultPack = os.path.join(sys.argv[3], "qlpack.yml") |
55 | 59 |
|
56 |
| -if not force and (os.path.exists(resultJava) or os.path.exists(resultQl)): |
57 |
| - print("Won't overwrite existing files '%s' or '%s'" % |
58 |
| - (resultJava, resultQl), file=sys.stderr) |
| 60 | +if not force and (os.path.exists(resultJava) or os.path.exists(resultQl) or os.path.exists(resultYml) or os.path.exists(resultPack)): |
| 61 | + print("Won't overwrite existing files '%s', '%s', '%s' or '%s'." % |
| 62 | + (resultJava, resultQl, resultYml, resultPack), file=sys.stderr) |
59 | 63 | sys.exit(1)
|
60 | 64 |
|
61 | 65 | workDir = tempfile.mkdtemp()
|
@@ -127,7 +131,13 @@ def qualifiedOuterNameFromCsvRow(row):
|
127 | 131 | os.makedirs(queryDir)
|
128 | 132 | qlFile = os.path.join(queryDir, "gen.ql")
|
129 | 133 | with open(os.path.join(queryDir, "qlpack.yml"), "w") as f:
|
130 |
| - f.write("name: test-generation-query\nversion: 0.0.0\nlibraryPathDependencies: codeql/java-queries") |
| 134 | + f.write(f"""name: test-generation-query |
| 135 | +version: 0.0.0 |
| 136 | +dependencies: |
| 137 | + codeql/java-all: '*' |
| 138 | + codeql/java-queries: '*' |
| 139 | +""") |
| 140 | + |
131 | 141 | with open(qlFile, "w") as f:
|
132 | 142 | f.write(
|
133 | 143 | "import java\nimport utils.flowtestcasegenerator.GenerateFlowTestCase\n\nclass GenRow extends TargetSummaryModelCsv {\n\n\toverride predicate row(string r) {\n\t\tr = [\n")
|
@@ -207,11 +217,32 @@ def copyfile(fromName, toFileHandle):
|
207 | 217 |
|
208 | 218 | with open(resultQl, "w") as f:
|
209 | 219 | copyfile("testHeader.qlfrag", f)
|
210 |
| - if len(supportModelRows) != 0: |
211 |
| - copyfile("testModelsHeader.qlfrag", f) |
212 |
| - f.write(", ".join('"%s"' % |
213 |
| - modelSpecRow[0].strip() for modelSpecRow in supportModelRows)) |
214 |
| - copyfile("testModelsFooter.qlfrag", f) |
| 220 | + |
| 221 | +if len(supportModelRows) != 0: |
| 222 | + # Make a test extension file |
| 223 | + with open(resultYml, "w") as f: |
| 224 | + models = "\n".join(' - [%s]' % |
| 225 | + modelSpecRow[0].strip() for modelSpecRow in supportModelRows) |
| 226 | + dataextensions = f"""extensions: |
| 227 | + - addsTo: |
| 228 | + pack: codeql/java-tests |
| 229 | + extensible: extSummaryModel |
| 230 | + data: |
| 231 | +{models} |
| 232 | +""" |
| 233 | + f.write(dataextensions) |
| 234 | + # Make a qlpack file such that the extension will be picked up |
| 235 | + with open(resultPack, "w") as f: |
| 236 | + f.write(f"""name: example-test-pack |
| 237 | +version: 0.0.0 |
| 238 | +extractor: java |
| 239 | +dependencies: |
| 240 | + codeql/java-all: '*' |
| 241 | + codeql/java-queries: '*' |
| 242 | + codeql/java-tests: '*' |
| 243 | +dataExtensions: |
| 244 | + - test.model.yml |
| 245 | +""") |
215 | 246 |
|
216 | 247 | # Make an empty .expected file, since this is an inline-exectations test
|
217 | 248 | with open(os.path.join(sys.argv[3], "test.expected"), "w"):
|
|
0 commit comments