Ebrahim Byagowi | 8d19907 | 2020-02-19 14:56:55 +0330 | [diff] [blame] | 1 | #!/usr/bin/env python3 |
Ebrahim Byagowi | cab2c2c | 2018-03-29 12:48:47 +0430 | [diff] [blame] | 2 | |
Ebrahim Byagowi | 7616952 | 2020-03-19 11:43:37 +0330 | [diff] [blame] | 3 | import sys, os, subprocess, tempfile, shutil |
Ebrahim Byagowi | 6d6edc8 | 2019-04-28 11:54:07 -0700 | [diff] [blame] | 4 | |
| 5 | |
Ebrahim Byagowi | 7616952 | 2020-03-19 11:43:37 +0330 | [diff] [blame] | 6 | def cmd (command): |
| 7 | # https://stackoverflow.com/a/4408409 as we might have huge output sometimes |
| 8 | with tempfile.TemporaryFile () as tempf: |
Ebrahim Byagowi | 6d6edc8 | 2019-04-28 11:54:07 -0700 | [diff] [blame] | 9 | p = subprocess.Popen (command, stderr=tempf) |
Ebrahim Byagowi | 6d6edc8 | 2019-04-28 11:54:07 -0700 | [diff] [blame] | 10 | |
| 11 | try: |
Khaled Hosny | 84dd65a | 2020-10-13 20:21:28 +0200 | [diff] [blame] | 12 | p.wait () |
Ebrahim Byagowi | 6d6edc8 | 2019-04-28 11:54:07 -0700 | [diff] [blame] | 13 | tempf.seek (0) |
Ebrahim Byagowi | 0665dce | 2019-09-21 17:22:02 +0430 | [diff] [blame] | 14 | text = tempf.read () |
| 15 | |
| 16 | #TODO: Detect debug mode with a better way |
| 17 | is_debug_mode = b"SANITIZE" in text |
| 18 | |
Ebrahim Byagowi | 7616952 | 2020-03-19 11:43:37 +0330 | [diff] [blame] | 19 | return ("" if is_debug_mode else text.decode ("utf-8").strip ()), p.returncode |
| 20 | except subprocess.TimeoutExpired: |
| 21 | return 'error: timeout, ' + ' '.join (command), 1 |
Ebrahim Byagowi | 6d6edc8 | 2019-04-28 11:54:07 -0700 | [diff] [blame] | 22 | |
Garret Rieger | 474afaa | 2018-03-14 19:15:33 -0700 | [diff] [blame] | 23 | |
Ebrahim Byagowi | a07672d | 2020-07-04 14:12:55 +0430 | [diff] [blame] | 24 | srcdir = os.getenv ("srcdir", ".") |
| 25 | EXEEXT = os.getenv ("EXEEXT", "") |
| 26 | top_builddir = os.getenv ("top_builddir", ".") |
Garret Rieger | 584693e | 2018-03-15 18:27:01 -0700 | [diff] [blame] | 27 | hb_subset_fuzzer = os.path.join (top_builddir, "hb-subset-fuzzer" + EXEEXT) |
Garret Rieger | 474afaa | 2018-03-14 19:15:33 -0700 | [diff] [blame] | 28 | |
| 29 | if not os.path.exists (hb_subset_fuzzer): |
Garret Rieger | c02b40e | 2018-04-17 08:21:22 -0600 | [diff] [blame] | 30 | if len (sys.argv) < 2 or not os.path.exists (sys.argv[1]): |
Ebrahim Byagowi | 7554f61 | 2020-05-28 22:51:29 +0430 | [diff] [blame] | 31 | sys.exit ("""Failed to find hb-subset-fuzzer binary automatically, |
Garret Rieger | 474afaa | 2018-03-14 19:15:33 -0700 | [diff] [blame] | 32 | please provide it as the first argument to the tool""") |
Garret Rieger | 474afaa | 2018-03-14 19:15:33 -0700 | [diff] [blame] | 33 | |
| 34 | hb_subset_fuzzer = sys.argv[1] |
| 35 | |
| 36 | print ('hb_subset_fuzzer:', hb_subset_fuzzer) |
| 37 | fails = 0 |
| 38 | |
Ebrahim Byagowi | 6d6edc8 | 2019-04-28 11:54:07 -0700 | [diff] [blame] | 39 | valgrind = None |
Ebrahim Byagowi | a07672d | 2020-07-04 14:12:55 +0430 | [diff] [blame] | 40 | if os.getenv ('RUN_VALGRIND', ''): |
Ebrahim Byagowi | b5526a0 | 2020-03-18 23:58:20 +0330 | [diff] [blame] | 41 | valgrind = shutil.which ('valgrind') |
Ebrahim Byagowi | 6d6edc8 | 2019-04-28 11:54:07 -0700 | [diff] [blame] | 42 | if valgrind is None: |
Ebrahim Byagowi | 7554f61 | 2020-05-28 22:51:29 +0430 | [diff] [blame] | 43 | sys.exit ("""Valgrind requested but not found.""") |
Ebrahim Byagowi | 6d6edc8 | 2019-04-28 11:54:07 -0700 | [diff] [blame] | 44 | |
Behdad Esfahbod | c0c190c | 2018-10-16 16:39:29 -0700 | [diff] [blame] | 45 | def run_dir (parent_path): |
| 46 | global fails |
Behdad Esfahbod | c0c190c | 2018-10-16 16:39:29 -0700 | [diff] [blame] | 47 | for file in os.listdir (parent_path): |
| 48 | path = os.path.join(parent_path, file) |
Ebrahim Byagowi | b65bad1 | 2019-07-11 14:31:55 +0430 | [diff] [blame] | 49 | # TODO: Run on all the fonts not just subset related ones |
| 50 | if "subset" not in path: continue |
Garret Rieger | c02b40e | 2018-04-17 08:21:22 -0600 | [diff] [blame] | 51 | |
Behdad Esfahbod | c0c190c | 2018-10-16 16:39:29 -0700 | [diff] [blame] | 52 | print ("running subset fuzzer against %s" % path) |
Ebrahim Byagowi | 6d6edc8 | 2019-04-28 11:54:07 -0700 | [diff] [blame] | 53 | if valgrind: |
Ebrahim Byagowi | e4f9969 | 2020-07-08 15:10:25 +0430 | [diff] [blame] | 54 | text, returncode = cmd ([valgrind, '--leak-check=full', '--error-exitcode=1', hb_subset_fuzzer, path]) |
Ebrahim Byagowi | 6d6edc8 | 2019-04-28 11:54:07 -0700 | [diff] [blame] | 55 | else: |
| 56 | text, returncode = cmd ([hb_subset_fuzzer, path]) |
| 57 | if 'error' in text: |
| 58 | returncode = 1 |
Garret Rieger | 474afaa | 2018-03-14 19:15:33 -0700 | [diff] [blame] | 59 | |
Ebrahim Byagowi | b65bad1 | 2019-07-11 14:31:55 +0430 | [diff] [blame] | 60 | if (not valgrind or returncode) and text.strip (): |
Ebrahim Byagowi | 6d6edc8 | 2019-04-28 11:54:07 -0700 | [diff] [blame] | 61 | print (text) |
| 62 | |
| 63 | if returncode != 0: |
Behdad Esfahbod | c0c190c | 2018-10-16 16:39:29 -0700 | [diff] [blame] | 64 | print ("failed for %s" % path) |
| 65 | fails = fails + 1 |
Garret Rieger | 474afaa | 2018-03-14 19:15:33 -0700 | [diff] [blame] | 66 | |
Behdad Esfahbod | c0c190c | 2018-10-16 16:39:29 -0700 | [diff] [blame] | 67 | |
| 68 | run_dir (os.path.join (srcdir, "..", "subset", "data", "fonts")) |
Ebrahim Byagowi | b65bad1 | 2019-07-11 14:31:55 +0430 | [diff] [blame] | 69 | run_dir (os.path.join (srcdir, "fonts")) |
Garret Rieger | c02b40e | 2018-04-17 08:21:22 -0600 | [diff] [blame] | 70 | |
Garret Rieger | 474afaa | 2018-03-14 19:15:33 -0700 | [diff] [blame] | 71 | if fails: |
Ebrahim Byagowi | 7554f61 | 2020-05-28 22:51:29 +0430 | [diff] [blame] | 72 | sys.exit ("%d subset fuzzer related tests failed." % fails) |