| #!/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) |