1*d415bd75Srobert#!/usr/bin/env python3 2*d415bd75Srobert 3*d415bd75Srobert# Automatically formatted with yapf (https://github.com/google/yapf) 4*d415bd75Srobert 5*d415bd75Srobertimport subprocess 6*d415bd75Srobertimport unittest 7*d415bd75Srobert 8*d415bd75Srobert 9*d415bd75Srobertdef getFinalPasses(run): 10*d415bd75Srobert stdout = run.stdout.decode() 11*d415bd75Srobert stdout = stdout[:stdout.rfind('\n')] 12*d415bd75Srobert stdout = stdout[stdout.rfind('\n') + 1:] 13*d415bd75Srobert return stdout 14*d415bd75Srobert 15*d415bd75Srobert 16*d415bd75Srobertclass Test(unittest.TestCase): 17*d415bd75Srobert def test_0(self): 18*d415bd75Srobert """Test all passes are removed except those required to crash. Verify 19*d415bd75Srobert that PM structure is intact.""" 20*d415bd75Srobert run_args = [ 21*d415bd75Srobert './utils/reduce_pipeline.py', 22*d415bd75Srobert '--opt-binary=./utils/reduce_pipeline_test/fake_opt.py', 23*d415bd75Srobert '--input=/dev/null', '--passes=a,b,c,A(d,B(e,f),g),h,i', 24*d415bd75Srobert '-crash-seq=b,d,f' 25*d415bd75Srobert ] 26*d415bd75Srobert run = subprocess.run(run_args, 27*d415bd75Srobert stdout=subprocess.PIPE, 28*d415bd75Srobert stderr=subprocess.PIPE) 29*d415bd75Srobert self.assertEqual(run.returncode, 0) 30*d415bd75Srobert self.assertEqual(getFinalPasses(run), '-passes="b,A(d,B(f))"') 31*d415bd75Srobert 32*d415bd75Srobert def test_1(self): 33*d415bd75Srobert """Test all passes are removed except those required to crash. The 34*d415bd75Srobert required passes in this case are the first and last in that order 35*d415bd75Srobert (a bit of a corner-case for the reduction algorithm).""" 36*d415bd75Srobert run_args = [ 37*d415bd75Srobert './utils/reduce_pipeline.py', 38*d415bd75Srobert '--opt-binary=./utils/reduce_pipeline_test/fake_opt.py', 39*d415bd75Srobert '--input=/dev/null', '--passes=a,b,c,A(d,B(e,f),g),h,i', 40*d415bd75Srobert '-crash-seq=a,i' 41*d415bd75Srobert ] 42*d415bd75Srobert run = subprocess.run(run_args, 43*d415bd75Srobert stdout=subprocess.PIPE, 44*d415bd75Srobert stderr=subprocess.PIPE) 45*d415bd75Srobert self.assertEqual(run.returncode, 0) 46*d415bd75Srobert self.assertEqual(getFinalPasses(run), '-passes="a,i"') 47*d415bd75Srobert 48*d415bd75Srobert def test_2_0(self): 49*d415bd75Srobert """Test expansion of EXPAND_a_to_f (expands into 'a,b,c,d,e,f').""" 50*d415bd75Srobert run_args = [ 51*d415bd75Srobert './utils/reduce_pipeline.py', 52*d415bd75Srobert '--opt-binary=./utils/reduce_pipeline_test/fake_opt.py', 53*d415bd75Srobert '--input=/dev/null', '--passes=EXPAND_a_to_f', '-crash-seq=b,e' 54*d415bd75Srobert ] 55*d415bd75Srobert run = subprocess.run(run_args, 56*d415bd75Srobert stdout=subprocess.PIPE, 57*d415bd75Srobert stderr=subprocess.PIPE) 58*d415bd75Srobert self.assertEqual(run.returncode, 0) 59*d415bd75Srobert self.assertEqual(getFinalPasses(run), '-passes="b,e"') 60*d415bd75Srobert 61*d415bd75Srobert def test_2_1(self): 62*d415bd75Srobert """Test EXPAND_a_to_f and the '--dont-expand-passes' option.""" 63*d415bd75Srobert run_args = [ 64*d415bd75Srobert './utils/reduce_pipeline.py', 65*d415bd75Srobert '--opt-binary=./utils/reduce_pipeline_test/fake_opt.py', 66*d415bd75Srobert '--input=/dev/null', '--passes=EXPAND_a_to_f', 67*d415bd75Srobert '-crash-seq=EXPAND_a_to_f', '--dont-expand-passes' 68*d415bd75Srobert ] 69*d415bd75Srobert run = subprocess.run(run_args, 70*d415bd75Srobert stdout=subprocess.PIPE, 71*d415bd75Srobert stderr=subprocess.PIPE) 72*d415bd75Srobert self.assertEqual(run.returncode, 0) 73*d415bd75Srobert self.assertEqual(getFinalPasses(run), '-passes="EXPAND_a_to_f"') 74*d415bd75Srobert 75*d415bd75Srobert def test_3(self): 76*d415bd75Srobert """Test that empty pass-managers get removed by default.""" 77*d415bd75Srobert run_args = [ 78*d415bd75Srobert './utils/reduce_pipeline.py', 79*d415bd75Srobert '--opt-binary=./utils/reduce_pipeline_test/fake_opt.py', 80*d415bd75Srobert '--input=/dev/null', '--passes=a,b,c,A(d,B(e,f),g),h,i', 81*d415bd75Srobert '-crash-seq=b,d,h' 82*d415bd75Srobert ] 83*d415bd75Srobert run = subprocess.run(run_args, 84*d415bd75Srobert stdout=subprocess.PIPE, 85*d415bd75Srobert stderr=subprocess.PIPE) 86*d415bd75Srobert self.assertEqual(run.returncode, 0) 87*d415bd75Srobert self.assertEqual(getFinalPasses(run), '-passes="b,A(d),h"') 88*d415bd75Srobert 89*d415bd75Srobert def test_4(self): 90*d415bd75Srobert """Test the '--dont-remove-empty-pm' option.""" 91*d415bd75Srobert run_args = [ 92*d415bd75Srobert './utils/reduce_pipeline.py', 93*d415bd75Srobert '--opt-binary=./utils/reduce_pipeline_test/fake_opt.py', 94*d415bd75Srobert '--input=/dev/null', '--passes=a,b,c,A(d,B(e,f),g),h,i', 95*d415bd75Srobert '-crash-seq=b,d,h', '--dont-remove-empty-pm' 96*d415bd75Srobert ] 97*d415bd75Srobert run = subprocess.run(run_args, 98*d415bd75Srobert stdout=subprocess.PIPE, 99*d415bd75Srobert stderr=subprocess.PIPE) 100*d415bd75Srobert self.assertEqual(run.returncode, 0) 101*d415bd75Srobert self.assertEqual(getFinalPasses(run), '-passes="b,A(d,B()),h"') 102*d415bd75Srobert 103*d415bd75Srobert 104*d415bd75Srobertunittest.main() 105*d415bd75Srobertexit(0) 106