attempt to add valgrind support to the CIs and testament (#12646)

* attempt to add valgrind support to the CIs and testament

* valgrind (currently) works only on 64-bit Linux
This commit is contained in:
Andreas Rumpf
2019-11-18 09:10:48 +01:00
committed by GitHub
parent 58f3e07b1a
commit 223e65e529
5 changed files with 29 additions and 8 deletions

View File

@@ -51,6 +51,8 @@ addons:
- libsdl1.2-dev
- libgc-dev
- libsfml-dev
- libc6-dbg
- valgrind
homebrew:
packages:
- boehmgc

View File

@@ -46,7 +46,7 @@ steps:
sudo apt-fast update -qq
DEBIAN_FRONTEND='noninteractive' \
sudo apt-fast install --no-install-recommends -yq \
libcurl4-openssl-dev libgc-dev libsdl1.2-dev libsfml-dev
libcurl4-openssl-dev libgc-dev libsdl1.2-dev libsfml-dev valgrind libc6-dbg
displayName: 'Install dependencies (amd64 Linux)'
condition: and(eq(variables['Agent.OS'], 'Linux'), eq(variables['CPU'], 'amd64'))

View File

@@ -72,6 +72,7 @@ type
nimout*: string
parseErrors*: string # when the spec definition is invalid, this is not empty.
unjoinable*: bool
useValgrind*: bool
timeout*: float # in seconds, fractions possible,
# but don't rely on much precision
@@ -195,6 +196,14 @@ proc parseSpec*(filename: string): TSpec =
result.nimout = e.value
of "joinable":
result.unjoinable = not parseCfgBool(e.value)
of "valgrind":
when defined(linux) and sizeof(int) == 8:
result.useValgrind = parseCfgBool(e.value)
result.unjoinable = true
else:
# Windows lacks valgrind. Silly OS.
# Valgrind only supports OSX <= 17.x
result.useValgrind = false
of "disabled":
case e.value.normalize
of "y", "yes", "true", "1", "on": result.err = reDisabled

View File

@@ -100,8 +100,8 @@ proc execCmdEx2(command: string, args: openarray[string]; workingDir, input: str
for arg in args:
result.cmdLine.add ' '
result.cmdLine.add quoteShell(arg)
var p = startProcess(command, workingDir=workingDir, args=args, options={poStdErrToStdOut, poUsePath})
var p = startProcess(command, workingDir=workingDir, args=args,
options={poStdErrToStdOut, poUsePath})
var outp = outputStream(p)
# There is no way to provide input for the child process
@@ -441,12 +441,16 @@ proc testSpecHelper(r: var TResults, test: TTest, expected: TSpec, target: TTarg
if isJsTarget:
exeCmd = nodejs
args = concat(@[exeFile], args)
elif defined(posix) and not exeFile.contains('/'):
# "security" in Posix is actually just a euphemism
# for "unproductive arbitrary shit"
exeCmd = "./" & exeFile
else:
exeCmd = exeFile
if defined(posix) and not exeFile.contains('/'):
# "security" in Posix is actually just a euphemism
# for "unproductive arbitrary shit"
exeCmd = "./" & exeFile
else:
exeCmd = exeFile
if expected.useValgrind:
args = exeCmd & args
exeCmd = "valgrind"
var (_, buf, exitCode) = execCmdEx2(exeCmd, args, input = expected.input)
# Treat all failure codes from nodejs as 1. Older versions of nodejs used
# to return other codes, but for us it is sufficient to know that it's not 0.

View File

@@ -0,0 +1,6 @@
discard """
valgrind: true
cmd: "nim c --gc:destructors $file"
"""
echo "hello world"