#!/usr/bin/env python3 # Automatically formatted with yapf (https://github.com/google/yapf) import subprocess import unittest def getFinalPasses(run): stdout = run.stdout.decode() stdout = stdout[: stdout.rfind("\n")] stdout = stdout[stdout.rfind("\n") + 1 :] return stdout class Test(unittest.TestCase): def test_0(self): """Test all passes are removed except those required to crash. Verify that PM structure is intact.""" run_args = [ "./utils/reduce_pipeline.py", "--opt-binary=./utils/reduce_pipeline_test/fake_opt.py", "--input=/dev/null", "--passes=a,b,c,A(d,B(e,f),g),h,i", "-crash-seq=b,d,f", ] run = subprocess.run(run_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) self.assertEqual(run.returncode, 0) self.assertEqual(getFinalPasses(run), '-passes="b,A(d,B(f))"') def test_1(self): """Test all passes are removed except those required to crash. The required passes in this case are the first and last in that order (a bit of a corner-case for the reduction algorithm).""" run_args = [ "./utils/reduce_pipeline.py", "--opt-binary=./utils/reduce_pipeline_test/fake_opt.py", "--input=/dev/null", "--passes=a,b,c,A(d,B(e,f),g),h,i", "-crash-seq=a,i", ] run = subprocess.run(run_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) self.assertEqual(run.returncode, 0) self.assertEqual(getFinalPasses(run), '-passes="a,i"') def test_2_0(self): """Test expansion of EXPAND_a_to_f (expands into 'a,b,c,d,e,f').""" run_args = [ "./utils/reduce_pipeline.py", "--opt-binary=./utils/reduce_pipeline_test/fake_opt.py", "--input=/dev/null", "--passes=EXPAND_a_to_f", "-crash-seq=b,e", ] run = subprocess.run(run_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) self.assertEqual(run.returncode, 0) self.assertEqual(getFinalPasses(run), '-passes="b,e"') def test_2_1(self): """Test EXPAND_a_to_f and the '--dont-expand-passes' option.""" run_args = [ "./utils/reduce_pipeline.py", "--opt-binary=./utils/reduce_pipeline_test/fake_opt.py", "--input=/dev/null", "--passes=EXPAND_a_to_f", "-crash-seq=EXPAND_a_to_f", "--dont-expand-passes", ] run = subprocess.run(run_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) self.assertEqual(run.returncode, 0) self.assertEqual(getFinalPasses(run), '-passes="EXPAND_a_to_f"') def test_3(self): """Test that empty pass-managers get removed by default.""" run_args = [ "./utils/reduce_pipeline.py", "--opt-binary=./utils/reduce_pipeline_test/fake_opt.py", "--input=/dev/null", "--passes=a,b,c,A(d,B(e,f),g),h,i", "-crash-seq=b,d,h", ] run = subprocess.run(run_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) self.assertEqual(run.returncode, 0) self.assertEqual(getFinalPasses(run), '-passes="b,A(d),h"') def test_4(self): """Test the '--dont-remove-empty-pm' option.""" run_args = [ "./utils/reduce_pipeline.py", "--opt-binary=./utils/reduce_pipeline_test/fake_opt.py", "--input=/dev/null", "--passes=a,b,c,A(d,B(e,f),g),h,i", "-crash-seq=b,d,h", "--dont-remove-empty-pm", ] run = subprocess.run(run_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) self.assertEqual(run.returncode, 0) self.assertEqual(getFinalPasses(run), '-passes="b,A(d,B()),h"') unittest.main() exit(0)