valgrindTest.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #!/usr/bin/env python3
  2. # #############################################################################
  3. # Copyright (c) 2018-present lzutao <taolzu(at)gmail.com>
  4. # All rights reserved.
  5. #
  6. # This source code is licensed under both the BSD-style license (found in the
  7. # LICENSE file in the root directory of this source tree) and the GPLv2 (found
  8. # in the COPYING file in the root directory of this source tree).
  9. # #############################################################################
  10. import os
  11. import subprocess
  12. import tempfile
  13. def valgrindTest(valgrind, datagen, fuzzer, zstd, fullbench):
  14. VALGRIND_ARGS = [valgrind, '--leak-check=full', '--show-leak-kinds=all', '--error-exitcode=1']
  15. print('\n ---- valgrind tests : memory analyzer ----')
  16. subprocess.check_call([*VALGRIND_ARGS, datagen, '-g50M'], stdout=subprocess.DEVNULL)
  17. if subprocess.call([*VALGRIND_ARGS, zstd],
  18. stdout=subprocess.DEVNULL) == 0:
  19. raise subprocess.CalledProcessError('zstd without argument should have failed')
  20. with subprocess.Popen([datagen, '-g80'], stdout=subprocess.PIPE) as p1, \
  21. subprocess.Popen([*VALGRIND_ARGS, zstd, '-', '-c'],
  22. stdin=p1.stdout,
  23. stdout=subprocess.DEVNULL) as p2:
  24. p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits.
  25. p2.communicate()
  26. if p2.returncode != 0:
  27. raise subprocess.CalledProcessError()
  28. with subprocess.Popen([datagen, '-g16KB'], stdout=subprocess.PIPE) as p1, \
  29. subprocess.Popen([*VALGRIND_ARGS, zstd, '-vf', '-', '-c'],
  30. stdin=p1.stdout,
  31. stdout=subprocess.DEVNULL) as p2:
  32. p1.stdout.close()
  33. p2.communicate()
  34. if p2.returncode != 0:
  35. raise subprocess.CalledProcessError()
  36. with tempfile.NamedTemporaryFile() as tmp_fd:
  37. with subprocess.Popen([datagen, '-g2930KB'], stdout=subprocess.PIPE) as p1, \
  38. subprocess.Popen([*VALGRIND_ARGS, zstd, '-5', '-vf', '-', '-o', tmp_fd.name],
  39. stdin=p1.stdout) as p2:
  40. p1.stdout.close()
  41. p2.communicate()
  42. if p2.returncode != 0:
  43. raise subprocess.CalledProcessError()
  44. subprocess.check_call([*VALGRIND_ARGS, zstd, '-vdf', tmp_fd.name, '-c'],
  45. stdout=subprocess.DEVNULL)
  46. with subprocess.Popen([datagen, '-g64MB'], stdout=subprocess.PIPE) as p1, \
  47. subprocess.Popen([*VALGRIND_ARGS, zstd, '-vf', '-', '-c'],
  48. stdin=p1.stdout,
  49. stdout=subprocess.DEVNULL) as p2:
  50. p1.stdout.close()
  51. p2.communicate()
  52. if p2.returncode != 0:
  53. raise subprocess.CalledProcessError()
  54. subprocess.check_call([*VALGRIND_ARGS, fuzzer, '-T1mn', '-t1'])
  55. subprocess.check_call([*VALGRIND_ARGS, fullbench, '-i1'])
  56. def main():
  57. import argparse
  58. parser = argparse.ArgumentParser(description='Valgrind tests : memory analyzer')
  59. parser.add_argument('valgrind', help='valgrind path')
  60. parser.add_argument('zstd', help='zstd path')
  61. parser.add_argument('datagen', help='datagen path')
  62. parser.add_argument('fuzzer', help='fuzzer path')
  63. parser.add_argument('fullbench', help='fullbench path')
  64. args = parser.parse_args()
  65. valgrind = args.valgrind
  66. zstd = args.zstd
  67. datagen = args.datagen
  68. fuzzer = args.fuzzer
  69. fullbench = args.fullbench
  70. valgrindTest(valgrind, datagen, fuzzer, zstd, fullbench)
  71. if __name__ == '__main__':
  72. main()