91 lines
3.4 KiB
Python
91 lines
3.4 KiB
Python
|
#!/usr/bin/env python3
|
||
|
# #############################################################################
|
||
|
# Copyright (c) 2018-present lzutao <taolzu(at)gmail.com>
|
||
|
# All rights reserved.
|
||
|
#
|
||
|
# This source code is licensed under both the BSD-style license (found in the
|
||
|
# LICENSE file in the root directory of this source tree) and the GPLv2 (found
|
||
|
# in the COPYING file in the root directory of this source tree).
|
||
|
# #############################################################################
|
||
|
import os
|
||
|
import subprocess
|
||
|
import tempfile
|
||
|
|
||
|
|
||
|
def valgrindTest(valgrind, datagen, fuzzer, zstd, fullbench):
|
||
|
VALGRIND_ARGS = [valgrind, '--leak-check=full', '--show-leak-kinds=all', '--error-exitcode=1']
|
||
|
|
||
|
print('\n ---- valgrind tests : memory analyzer ----')
|
||
|
|
||
|
subprocess.check_call([*VALGRIND_ARGS, datagen, '-g50M'], stdout=subprocess.DEVNULL)
|
||
|
|
||
|
if subprocess.call([*VALGRIND_ARGS, zstd],
|
||
|
stdout=subprocess.DEVNULL) == 0:
|
||
|
raise subprocess.CalledProcessError('zstd without argument should have failed')
|
||
|
|
||
|
with subprocess.Popen([datagen, '-g80'], stdout=subprocess.PIPE) as p1, \
|
||
|
subprocess.Popen([*VALGRIND_ARGS, zstd, '-', '-c'],
|
||
|
stdin=p1.stdout,
|
||
|
stdout=subprocess.DEVNULL) as p2:
|
||
|
p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits.
|
||
|
p2.communicate()
|
||
|
if p2.returncode != 0:
|
||
|
raise subprocess.CalledProcessError()
|
||
|
|
||
|
with subprocess.Popen([datagen, '-g16KB'], stdout=subprocess.PIPE) as p1, \
|
||
|
subprocess.Popen([*VALGRIND_ARGS, zstd, '-vf', '-', '-c'],
|
||
|
stdin=p1.stdout,
|
||
|
stdout=subprocess.DEVNULL) as p2:
|
||
|
p1.stdout.close()
|
||
|
p2.communicate()
|
||
|
if p2.returncode != 0:
|
||
|
raise subprocess.CalledProcessError()
|
||
|
|
||
|
with tempfile.NamedTemporaryFile() as tmp_fd:
|
||
|
with subprocess.Popen([datagen, '-g2930KB'], stdout=subprocess.PIPE) as p1, \
|
||
|
subprocess.Popen([*VALGRIND_ARGS, zstd, '-5', '-vf', '-', '-o', tmp_fd.name],
|
||
|
stdin=p1.stdout) as p2:
|
||
|
p1.stdout.close()
|
||
|
p2.communicate()
|
||
|
if p2.returncode != 0:
|
||
|
raise subprocess.CalledProcessError()
|
||
|
|
||
|
subprocess.check_call([*VALGRIND_ARGS, zstd, '-vdf', tmp_fd.name, '-c'],
|
||
|
stdout=subprocess.DEVNULL)
|
||
|
|
||
|
with subprocess.Popen([datagen, '-g64MB'], stdout=subprocess.PIPE) as p1, \
|
||
|
subprocess.Popen([*VALGRIND_ARGS, zstd, '-vf', '-', '-c'],
|
||
|
stdin=p1.stdout,
|
||
|
stdout=subprocess.DEVNULL) as p2:
|
||
|
p1.stdout.close()
|
||
|
p2.communicate()
|
||
|
if p2.returncode != 0:
|
||
|
raise subprocess.CalledProcessError()
|
||
|
|
||
|
subprocess.check_call([*VALGRIND_ARGS, fuzzer, '-T1mn', '-t1'])
|
||
|
subprocess.check_call([*VALGRIND_ARGS, fullbench, '-i1'])
|
||
|
|
||
|
|
||
|
def main():
|
||
|
import argparse
|
||
|
parser = argparse.ArgumentParser(description='Valgrind tests : memory analyzer')
|
||
|
parser.add_argument('valgrind', help='valgrind path')
|
||
|
parser.add_argument('zstd', help='zstd path')
|
||
|
parser.add_argument('datagen', help='datagen path')
|
||
|
parser.add_argument('fuzzer', help='fuzzer path')
|
||
|
parser.add_argument('fullbench', help='fullbench path')
|
||
|
|
||
|
args = parser.parse_args()
|
||
|
|
||
|
valgrind = args.valgrind
|
||
|
zstd = args.zstd
|
||
|
datagen = args.datagen
|
||
|
fuzzer = args.fuzzer
|
||
|
fullbench = args.fullbench
|
||
|
|
||
|
valgrindTest(valgrind, datagen, fuzzer, zstd, fullbench)
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
main()
|