|  | #!/usr/bin/env python3 | 
|  |  | 
|  | # Copyright 2023 The IREE Authors | 
|  | # | 
|  | # Licensed under the Apache License v2.0 with LLVM Exceptions. | 
|  | # See https://llvm.org/LICENSE.txt for license information. | 
|  | # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  |  | 
|  | import pathlib | 
|  | import unittest | 
|  |  | 
|  | import configure_ci | 
|  |  | 
|  |  | 
|  | class ConfigureCITest(unittest.TestCase): | 
|  | def test_parse_jobs_trailer(self): | 
|  | trailers = {"key": "job1,job2"} | 
|  | key = "key" | 
|  | all_jobs = {"job1", "job2", "job3"} | 
|  | jobs = configure_ci.parse_jobs_trailer(trailers, key, all_jobs) | 
|  | self.assertCountEqual(jobs, {"job1", "job2"}) | 
|  |  | 
|  | def test_parse_jobs_trailer_whitespace(self): | 
|  | trailers = {"key": "  job1 ,  job2 "} | 
|  | key = "key" | 
|  | all_jobs = {"job1", "job2", "job3"} | 
|  | jobs = configure_ci.parse_jobs_trailer(trailers, key, all_jobs) | 
|  | self.assertCountEqual(jobs, {"job1", "job2"}) | 
|  |  | 
|  | def test_parse_jobs_trailer_all_with_others(self): | 
|  | bad_text = "job1, all" | 
|  | trailers = {"key": bad_text} | 
|  | key = "key" | 
|  | all_jobs = {"job1", "job2", "job3"} | 
|  | with self.assertRaises(ValueError) as cm: | 
|  | configure_ci.parse_jobs_trailer(trailers, key, all_jobs) | 
|  |  | 
|  | msg = str(cm.exception) | 
|  | self.assertIn(configure_ci.ALL_KEY, msg) | 
|  | self.assertIn(bad_text, msg) | 
|  |  | 
|  | def test_parse_jobs_unknown_job(self): | 
|  | unknown_job = "unknown_job" | 
|  | trailers = {"key": f"job1, {unknown_job}"} | 
|  | key = "key" | 
|  | all_jobs = {"job1", "job2", "job3"} | 
|  | # Unknown jobs log a warning, as multiple workflows use configure_ci | 
|  | # and a name may be recognized by one workflow and not another. | 
|  | jobs = configure_ci.parse_jobs_trailer(trailers, key, all_jobs) | 
|  | self.assertCountEqual(jobs, {"job1"}) | 
|  |  | 
|  | def test_get_enabled_jobs_all(self): | 
|  | trailers = {} | 
|  | all_jobs = {"job1", "job2", "job3"} | 
|  | is_pr = True | 
|  | is_llvm_integrate_pr = False | 
|  | modified_paths = ["runtime/file"] | 
|  | jobs = configure_ci.get_enabled_jobs( | 
|  | trailers, | 
|  | all_jobs, | 
|  | modified_paths=modified_paths, | 
|  | is_pr=is_pr, | 
|  | is_llvm_integrate_pr=is_llvm_integrate_pr, | 
|  | ) | 
|  | self.assertCountEqual(jobs, all_jobs) | 
|  |  | 
|  | def test_get_enabled_jobs_postsubmit(self): | 
|  | trailers = {} | 
|  | default_jobs = {"job1", "job2", "job3"} | 
|  | postsubmit_job = next(iter(configure_ci.DEFAULT_POSTSUBMIT_ONLY_JOBS)) | 
|  | all_jobs = default_jobs | {postsubmit_job} | 
|  | is_pr = False | 
|  | is_llvm_integrate_pr = False | 
|  | modified_paths = ["runtime/file"] | 
|  | jobs = configure_ci.get_enabled_jobs( | 
|  | trailers, | 
|  | all_jobs, | 
|  | modified_paths=modified_paths, | 
|  | is_pr=is_pr, | 
|  | is_llvm_integrate_pr=is_llvm_integrate_pr, | 
|  | ) | 
|  | self.assertCountEqual(jobs, all_jobs) | 
|  |  | 
|  | def test_get_enabled_jobs_no_postsubmit(self): | 
|  | trailers = {} | 
|  | default_jobs = {"job1", "job2", "job3"} | 
|  | postsubmit_job = next(iter(configure_ci.DEFAULT_POSTSUBMIT_ONLY_JOBS)) | 
|  | all_jobs = default_jobs | {postsubmit_job} | 
|  | is_pr = True | 
|  | is_llvm_integrate_pr = False | 
|  | modified_paths = ["runtime/file"] | 
|  | jobs = configure_ci.get_enabled_jobs( | 
|  | trailers, | 
|  | all_jobs, | 
|  | modified_paths=modified_paths, | 
|  | is_pr=is_pr, | 
|  | is_llvm_integrate_pr=is_llvm_integrate_pr, | 
|  | ) | 
|  | self.assertCountEqual(jobs, default_jobs) | 
|  |  | 
|  | def test_get_enabled_jobs_llvm_integrate(self): | 
|  | trailers = {} | 
|  | default_jobs = {"job1", "job2", "job3"} | 
|  | postsubmit_job = next(iter(configure_ci.DEFAULT_POSTSUBMIT_ONLY_JOBS)) | 
|  | all_jobs = default_jobs | {postsubmit_job} | 
|  | is_pr = True | 
|  | is_llvm_integrate_pr = True | 
|  | modified_paths = ["runtime/file"] | 
|  | jobs = configure_ci.get_enabled_jobs( | 
|  | trailers, | 
|  | all_jobs, | 
|  | modified_paths=modified_paths, | 
|  | is_pr=is_pr, | 
|  | is_llvm_integrate_pr=is_llvm_integrate_pr, | 
|  | ) | 
|  | self.assertCountEqual(jobs, all_jobs) | 
|  |  | 
|  | def test_get_enabled_jobs_no_modifies(self): | 
|  | trailers = {} | 
|  | default_jobs = {"job1", "job2", "job3"} | 
|  | postsubmit_job = next(iter(configure_ci.DEFAULT_POSTSUBMIT_ONLY_JOBS)) | 
|  | all_jobs = default_jobs | {postsubmit_job} | 
|  | is_pr = True | 
|  | is_llvm_integrate_pr = False | 
|  | modified_paths = ["experimental/file"] | 
|  | jobs = configure_ci.get_enabled_jobs( | 
|  | trailers, | 
|  | all_jobs, | 
|  | modified_paths=modified_paths, | 
|  | is_pr=is_pr, | 
|  | is_llvm_integrate_pr=is_llvm_integrate_pr, | 
|  | ) | 
|  | self.assertCountEqual(jobs, {}) | 
|  |  | 
|  | def test_get_enabled_jobs_skip(self): | 
|  | trailers = {configure_ci.Trailer.SKIP_JOBS: "job1,job2"} | 
|  | default_jobs = {"job1", "job2", "job3"} | 
|  | postsubmit_job = next(iter(configure_ci.DEFAULT_POSTSUBMIT_ONLY_JOBS)) | 
|  | all_jobs = default_jobs | {postsubmit_job} | 
|  | is_pr = True | 
|  | is_llvm_integrate_pr = False | 
|  | modified_paths = ["runtime/file"] | 
|  | jobs = configure_ci.get_enabled_jobs( | 
|  | trailers, | 
|  | all_jobs, | 
|  | modified_paths=modified_paths, | 
|  | is_pr=is_pr, | 
|  | is_llvm_integrate_pr=is_llvm_integrate_pr, | 
|  | ) | 
|  | self.assertCountEqual(jobs, {"job3"}) | 
|  |  | 
|  | def test_get_enabled_jobs_skip_all(self): | 
|  | trailers = {configure_ci.Trailer.SKIP_JOBS: "all"} | 
|  | default_jobs = {"job1", "job2", "job3"} | 
|  | postsubmit_job = next(iter(configure_ci.DEFAULT_POSTSUBMIT_ONLY_JOBS)) | 
|  | all_jobs = default_jobs | {postsubmit_job} | 
|  | is_pr = True | 
|  | is_llvm_integrate_pr = False | 
|  | modified_paths = ["runtime/file"] | 
|  | jobs = configure_ci.get_enabled_jobs( | 
|  | trailers, | 
|  | all_jobs, | 
|  | modified_paths=modified_paths, | 
|  | is_pr=is_pr, | 
|  | is_llvm_integrate_pr=is_llvm_integrate_pr, | 
|  | ) | 
|  | self.assertCountEqual(jobs, {}) | 
|  |  | 
|  | def test_get_enabled_jobs_extra(self): | 
|  | postsubmit_job = next(iter(configure_ci.DEFAULT_POSTSUBMIT_ONLY_JOBS)) | 
|  | trailers = {configure_ci.Trailer.EXTRA_JOBS: postsubmit_job} | 
|  | default_jobs = {"job1", "job2", "job3"} | 
|  | all_jobs = default_jobs | {postsubmit_job} | 
|  | is_pr = True | 
|  | is_llvm_integrate_pr = False | 
|  | modified_paths = ["runtime/file"] | 
|  | jobs = configure_ci.get_enabled_jobs( | 
|  | trailers, | 
|  | all_jobs, | 
|  | modified_paths=modified_paths, | 
|  | is_pr=is_pr, | 
|  | is_llvm_integrate_pr=is_llvm_integrate_pr, | 
|  | ) | 
|  | self.assertCountEqual(jobs, all_jobs) | 
|  |  | 
|  | def test_get_enabled_jobs_exactly(self): | 
|  | postsubmit_job = next(iter(configure_ci.DEFAULT_POSTSUBMIT_ONLY_JOBS)) | 
|  | trailers = {configure_ci.Trailer.EXACTLY_JOBS: postsubmit_job} | 
|  | default_jobs = {"job1", "job2", "job3"} | 
|  | all_jobs = default_jobs | {postsubmit_job} | 
|  | is_pr = True | 
|  | is_llvm_integrate_pr = False | 
|  | modified_paths = ["runtime/file"] | 
|  | jobs = configure_ci.get_enabled_jobs( | 
|  | trailers, | 
|  | all_jobs, | 
|  | modified_paths=modified_paths, | 
|  | is_pr=is_pr, | 
|  | is_llvm_integrate_pr=is_llvm_integrate_pr, | 
|  | ) | 
|  | self.assertCountEqual(jobs, {postsubmit_job}) | 
|  |  | 
|  | def test_get_enabled_jobs_windows(self): | 
|  | trailers = {} | 
|  | all_jobs = {"job1"} | 
|  | is_pr = True | 
|  | is_llvm_integrate_pr = False | 
|  | modified_paths = ["runtime/src/iree/base/internal/threading_win32.c"] | 
|  | jobs = configure_ci.get_enabled_jobs( | 
|  | trailers, | 
|  | all_jobs, | 
|  | modified_paths=modified_paths, | 
|  | is_pr=is_pr, | 
|  | is_llvm_integrate_pr=is_llvm_integrate_pr, | 
|  | ) | 
|  | expected_jobs = {"job1", "windows_x64_msvc"} | 
|  | self.assertCountEqual(jobs, expected_jobs) | 
|  |  | 
|  | def test_get_enabled_jobs_windows_docs(self): | 
|  | # docs/ directory is excluded from CI, superceding "windows" inclusion | 
|  | trailers = {} | 
|  | all_jobs = {"job1"} | 
|  | is_pr = True | 
|  | is_llvm_integrate_pr = False | 
|  | modified_paths = ["docs/windows.md"] | 
|  | jobs = configure_ci.get_enabled_jobs( | 
|  | trailers, | 
|  | all_jobs, | 
|  | modified_paths=modified_paths, | 
|  | is_pr=is_pr, | 
|  | is_llvm_integrate_pr=is_llvm_integrate_pr, | 
|  | ) | 
|  | expected_jobs = {} | 
|  | self.assertCountEqual(jobs, expected_jobs) | 
|  |  | 
|  | def test_parse_path_from_workflow_ref(self): | 
|  | path = configure_ci.parse_path_from_workflow_ref( | 
|  | "octocat/example", "octocat/example/.github/test.yml@1234" | 
|  | ) | 
|  |  | 
|  | self.assertEqual(path, pathlib.Path(".github/test.yml")) | 
|  |  | 
|  | def test_parse_path_from_workflow_ref_invalid_ref(self): | 
|  | self.assertRaises( | 
|  | ValueError, | 
|  | lambda: configure_ci.parse_path_from_workflow_ref( | 
|  | "octocat/example", "squid/unknown/.github/test.yml@1234" | 
|  | ), | 
|  | ) | 
|  |  | 
|  | def test_parse_trailer_map_no_trailers(self): | 
|  | trailer_map = configure_ci.parse_trailer_map_from_description("""No trailers""") | 
|  | self.assertDictEqual(trailer_map, {}) | 
|  |  | 
|  | def test_parse_trailer_map_one_trailer(self): | 
|  | trailer_map = configure_ci.parse_trailer_map_from_description( | 
|  | """First line | 
|  |  | 
|  | key: value""" | 
|  | ) | 
|  | self.assertDictEqual(trailer_map, {"key": "value"}) | 
|  |  | 
|  | def test_parse_trailer_map_text_after_trailers(self): | 
|  | trailer_map = configure_ci.parse_trailer_map_from_description( | 
|  | """First line | 
|  |  | 
|  | key: value | 
|  |  | 
|  | More non-trailer text here""" | 
|  | ) | 
|  | # Trailers can't appear in the middle of the description. | 
|  | self.assertDictEqual(trailer_map, {}) | 
|  |  | 
|  | def test_parse_trailer_map_two_trailers(self): | 
|  | trailer_map = configure_ci.parse_trailer_map_from_description( | 
|  | """First line | 
|  |  | 
|  | key1: value1 | 
|  | key2: value2""" | 
|  | ) | 
|  | self.assertDictEqual(trailer_map, {"key1": "value1", "key2": "value2"}) | 
|  |  | 
|  | def test_parse_trailer_map_multiline_trailer(self): | 
|  | trailer_map = configure_ci.parse_trailer_map_from_description( | 
|  | """First line | 
|  |  | 
|  | key: value line 1 | 
|  | value line 2""" | 
|  | ) | 
|  | # Note: Only using the first non-empty line of the trailer. | 
|  | self.assertDictEqual(trailer_map, {"key": "value line 1"}) | 
|  |  | 
|  | def test_parse_trailer_map_multiline_trailer_skip_first(self): | 
|  | trailer_map = configure_ci.parse_trailer_map_from_description( | 
|  | """First line | 
|  |  | 
|  | key: | 
|  | value line 2 | 
|  | value line 3""" | 
|  | ) | 
|  | # Note: Only using the first non-empty line of the trailer. | 
|  | self.assertDictEqual(trailer_map, {"key": "value line 2"}) | 
|  |  | 
|  |  | 
|  | if __name__ == "__main__": | 
|  | unittest.main() |