191d15aa0SMarkus Lavin#!/usr/bin/env python3 291d15aa0SMarkus Lavin 391d15aa0SMarkus Lavin# Automatically formatted with yapf (https://github.com/google/yapf) 491d15aa0SMarkus Lavin 591d15aa0SMarkus Lavinimport subprocess 691d15aa0SMarkus Lavinimport unittest 791d15aa0SMarkus Lavin 891d15aa0SMarkus Lavin 991d15aa0SMarkus Lavindef getFinalPasses(run): 1091d15aa0SMarkus Lavin stdout = run.stdout.decode() 11*b71edfaaSTobias Hieta stdout = stdout[: stdout.rfind("\n")] 12*b71edfaaSTobias Hieta stdout = stdout[stdout.rfind("\n") + 1 :] 1391d15aa0SMarkus Lavin return stdout 1491d15aa0SMarkus Lavin 1591d15aa0SMarkus Lavin 1691d15aa0SMarkus Lavinclass Test(unittest.TestCase): 1791d15aa0SMarkus Lavin def test_0(self): 1891d15aa0SMarkus Lavin """Test all passes are removed except those required to crash. Verify 1991d15aa0SMarkus Lavin that PM structure is intact.""" 2091d15aa0SMarkus Lavin run_args = [ 21*b71edfaaSTobias Hieta "./utils/reduce_pipeline.py", 22*b71edfaaSTobias Hieta "--opt-binary=./utils/reduce_pipeline_test/fake_opt.py", 23*b71edfaaSTobias Hieta "--input=/dev/null", 24*b71edfaaSTobias Hieta "--passes=a,b,c,A(d,B(e,f),g),h,i", 25*b71edfaaSTobias Hieta "-crash-seq=b,d,f", 2691d15aa0SMarkus Lavin ] 27*b71edfaaSTobias Hieta run = subprocess.run(run_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 2891d15aa0SMarkus Lavin self.assertEqual(run.returncode, 0) 2991d15aa0SMarkus Lavin self.assertEqual(getFinalPasses(run), '-passes="b,A(d,B(f))"') 3091d15aa0SMarkus Lavin 3191d15aa0SMarkus Lavin def test_1(self): 3291d15aa0SMarkus Lavin """Test all passes are removed except those required to crash. The 3391d15aa0SMarkus Lavin required passes in this case are the first and last in that order 3491d15aa0SMarkus Lavin (a bit of a corner-case for the reduction algorithm).""" 3591d15aa0SMarkus Lavin run_args = [ 36*b71edfaaSTobias Hieta "./utils/reduce_pipeline.py", 37*b71edfaaSTobias Hieta "--opt-binary=./utils/reduce_pipeline_test/fake_opt.py", 38*b71edfaaSTobias Hieta "--input=/dev/null", 39*b71edfaaSTobias Hieta "--passes=a,b,c,A(d,B(e,f),g),h,i", 40*b71edfaaSTobias Hieta "-crash-seq=a,i", 4191d15aa0SMarkus Lavin ] 42*b71edfaaSTobias Hieta run = subprocess.run(run_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 4391d15aa0SMarkus Lavin self.assertEqual(run.returncode, 0) 4491d15aa0SMarkus Lavin self.assertEqual(getFinalPasses(run), '-passes="a,i"') 4591d15aa0SMarkus Lavin 467e34d5eaSMarkus Lavin def test_2_0(self): 477e34d5eaSMarkus Lavin """Test expansion of EXPAND_a_to_f (expands into 'a,b,c,d,e,f').""" 4891d15aa0SMarkus Lavin run_args = [ 49*b71edfaaSTobias Hieta "./utils/reduce_pipeline.py", 50*b71edfaaSTobias Hieta "--opt-binary=./utils/reduce_pipeline_test/fake_opt.py", 51*b71edfaaSTobias Hieta "--input=/dev/null", 52*b71edfaaSTobias Hieta "--passes=EXPAND_a_to_f", 53*b71edfaaSTobias Hieta "-crash-seq=b,e", 5491d15aa0SMarkus Lavin ] 55*b71edfaaSTobias Hieta run = subprocess.run(run_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 5691d15aa0SMarkus Lavin self.assertEqual(run.returncode, 0) 577e34d5eaSMarkus Lavin self.assertEqual(getFinalPasses(run), '-passes="b,e"') 587e34d5eaSMarkus Lavin 597e34d5eaSMarkus Lavin def test_2_1(self): 607e34d5eaSMarkus Lavin """Test EXPAND_a_to_f and the '--dont-expand-passes' option.""" 617e34d5eaSMarkus Lavin run_args = [ 62*b71edfaaSTobias Hieta "./utils/reduce_pipeline.py", 63*b71edfaaSTobias Hieta "--opt-binary=./utils/reduce_pipeline_test/fake_opt.py", 64*b71edfaaSTobias Hieta "--input=/dev/null", 65*b71edfaaSTobias Hieta "--passes=EXPAND_a_to_f", 66*b71edfaaSTobias Hieta "-crash-seq=EXPAND_a_to_f", 67*b71edfaaSTobias Hieta "--dont-expand-passes", 687e34d5eaSMarkus Lavin ] 69*b71edfaaSTobias Hieta run = subprocess.run(run_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 707e34d5eaSMarkus Lavin self.assertEqual(run.returncode, 0) 717e34d5eaSMarkus Lavin self.assertEqual(getFinalPasses(run), '-passes="EXPAND_a_to_f"') 7291d15aa0SMarkus Lavin 7391d15aa0SMarkus Lavin def test_3(self): 7491d15aa0SMarkus Lavin """Test that empty pass-managers get removed by default.""" 7591d15aa0SMarkus Lavin run_args = [ 76*b71edfaaSTobias Hieta "./utils/reduce_pipeline.py", 77*b71edfaaSTobias Hieta "--opt-binary=./utils/reduce_pipeline_test/fake_opt.py", 78*b71edfaaSTobias Hieta "--input=/dev/null", 79*b71edfaaSTobias Hieta "--passes=a,b,c,A(d,B(e,f),g),h,i", 80*b71edfaaSTobias Hieta "-crash-seq=b,d,h", 8191d15aa0SMarkus Lavin ] 82*b71edfaaSTobias Hieta run = subprocess.run(run_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 8391d15aa0SMarkus Lavin self.assertEqual(run.returncode, 0) 8491d15aa0SMarkus Lavin self.assertEqual(getFinalPasses(run), '-passes="b,A(d),h"') 8591d15aa0SMarkus Lavin 8691d15aa0SMarkus Lavin def test_4(self): 8791d15aa0SMarkus Lavin """Test the '--dont-remove-empty-pm' option.""" 8891d15aa0SMarkus Lavin run_args = [ 89*b71edfaaSTobias Hieta "./utils/reduce_pipeline.py", 90*b71edfaaSTobias Hieta "--opt-binary=./utils/reduce_pipeline_test/fake_opt.py", 91*b71edfaaSTobias Hieta "--input=/dev/null", 92*b71edfaaSTobias Hieta "--passes=a,b,c,A(d,B(e,f),g),h,i", 93*b71edfaaSTobias Hieta "-crash-seq=b,d,h", 94*b71edfaaSTobias Hieta "--dont-remove-empty-pm", 9591d15aa0SMarkus Lavin ] 96*b71edfaaSTobias Hieta run = subprocess.run(run_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 9791d15aa0SMarkus Lavin self.assertEqual(run.returncode, 0) 9891d15aa0SMarkus Lavin self.assertEqual(getFinalPasses(run), '-passes="b,A(d,B()),h"') 9991d15aa0SMarkus Lavin 10091d15aa0SMarkus Lavin 10191d15aa0SMarkus Lavinunittest.main() 10291d15aa0SMarkus Lavinexit(0) 103