testament: error instead of silently overwrite a spec (#16166)

This commit is contained in:
Timothee Cour 2020-11-29 10:42:50 -08:00 • committed by GitHub
commit 6114df3c24
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 51 additions and 27 deletions

View file

@ -8,7 +8,7 @@
#
import sequtils, parseutils, strutils, os, streams, parsecfg,
tables, hashes
tables, hashes, sets
type TestamentData* = ref object
# better to group globals under 1 object; could group the other ones here too
@ -82,7 +82,7 @@ type
tline*, tcolumn*: int
exitCode*: int
msg*: string
ccodeCheck*: string
ccodeCheck*: seq[string]
maxCodeSize*: int
err*: TResultEnum
inCurrentBatch*: bool
@ -244,11 +244,19 @@ proc parseSpec*(filename: string): TSpec =
var ss = newStringStream(specStr)
var p: CfgParser
open(p, ss, filename, 1)
var flags: HashSet[string]
while true:
var e = next(p)
case e.kind
of cfgKeyValuePair:
case normalize(e.key)
let key = e.key.normalize
const whiteListMulti = ["disabled", "ccodecheck"]
## list of flags that are correctly handled when passed multiple times
## (instead of being overwritten)
if key notin whiteListMulti:
doAssert key notin flags, $(key, filename)
flags.incl key
case key
of "action":
case e.value.normalize
of "compile":
@ -298,7 +306,7 @@ proc parseSpec*(filename: string): TSpec =
result.msg = e.value
if result.action != actionRun:
result.action = actionCompile
of "errormsg", "errmsg":
of "errormsg", "errmsg": # xxx just use errormsg, no need for such aliases
result.msg = e.value
result.action = actionReject
of "nimout":
@ -361,7 +369,7 @@ proc parseSpec*(filename: string): TSpec =
else:
result.cmd = e.value
of "ccodecheck":
result.ccodeCheck = e.value
result.ccodeCheck.add e.value
of "maxcodesize":
discard parseInt(e.value, result.maxCodeSize)
of "timeout":

View file

@ -402,9 +402,8 @@ proc codegenCheck(test: TTest, target: TTarget, spec: TSpec, expectedMsg: var st
try:
let genFile = generatedFile(test, target)
let contents = readFile(genFile).string
let check = spec.ccodeCheck
if check.len > 0:
if check[0] == '\\':
for check in spec.ccodeCheck:
if check.len > 0 and check[0] == '\\':
# little hack to get 'match' support:
if not contents.match(check.peg):
given.err = reCodegenFailure