test_bisect.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import sys
  2. import pytest
  3. from unittest import mock
  4. from typing import List, Dict
  5. from ray_release.scripts.ray_bisect import (
  6. _bisect,
  7. _obtain_test_result,
  8. _sanity_check,
  9. _get_test,
  10. )
  11. def test_sanity_check():
  12. def _mock_run_test(*args, **kwawrgs) -> Dict[str, Dict[int, str]]:
  13. return {
  14. "passing_revision": {0: "passed", 1: "passed"},
  15. "failing_revision": {0: "failed", 1: "failed"},
  16. "flaky_revision": {0: "failed", 1: "passed"},
  17. }
  18. with mock.patch(
  19. "ray_release.scripts.ray_bisect._run_test",
  20. side_effect=_mock_run_test,
  21. ):
  22. assert _sanity_check({}, "passing_revision", "failing_revision", 2)
  23. assert _sanity_check({}, "passing_revision", "flaky_revision", 2)
  24. assert not _sanity_check({}, "failing_revision", "passing_revision", 2)
  25. assert not _sanity_check({}, "passing_revision", "passing_revision", 2)
  26. assert not _sanity_check({}, "failing_revision", "failing_revision", 2)
  27. assert not _sanity_check({}, "flaky_revision", "failing_revision", 2)
  28. def test_obtain_test_result():
  29. test_cases = [
  30. {
  31. "c0": {0: "passed"},
  32. },
  33. {
  34. "c0": {0: "passed", 1: "passed"},
  35. "c1": {0: "hard_failed", 1: "hard_failed"},
  36. },
  37. ]
  38. def _mock_check_output(input: List[str]) -> str:
  39. commit, run = tuple(input[-1].split("-"))
  40. return bytes(test_case[commit][int(run)], "utf-8")
  41. for test_case in test_cases:
  42. with mock.patch(
  43. "subprocess.check_output",
  44. side_effect=_mock_check_output,
  45. ):
  46. commits = set(test_case.keys())
  47. rerun_per_commit = len(test_case[list(commits)[0]])
  48. _obtain_test_result(commits, rerun_per_commit) == test_case
  49. def test_get_test():
  50. test = _get_test(
  51. "test_name", ["release/ray_release/tests/test_collection_data.yaml"]
  52. )
  53. assert test.get_name() == "test_name"
  54. def test_bisect():
  55. test_cases = {
  56. "c3": {
  57. "c0": {0: "passed"},
  58. "c1": {0: "passed"},
  59. "c3": {0: "hard_failed"},
  60. "c4": {0: "soft_failed"},
  61. },
  62. "c1": {
  63. "c0": {0: "passed"},
  64. "c1": {0: "hard_failed"},
  65. "c2": {0: "hard_failed"},
  66. },
  67. "cc1": {
  68. "cc0": {0: "passed"},
  69. "cc1": {0: "hard_failed"},
  70. },
  71. "c2": {
  72. "c0": {0: "passed", 1: "passed"},
  73. "c2": {0: "passed", 1: "hard_failed"},
  74. "c3": {0: "hard_failed", 1: "passed"},
  75. "c4": {0: "soft_failed", 1: "soft_failed"},
  76. },
  77. }
  78. for output, input in test_cases.items():
  79. def _side_effect(ret):
  80. def _mock_run_test(*args, **kwawrgs) -> Dict[str, str]:
  81. return ret
  82. return _mock_run_test
  83. with mock.patch(
  84. "ray_release.scripts.ray_bisect._run_test",
  85. side_effect=_side_effect(input),
  86. ):
  87. for concurreny in range(1, 4):
  88. assert _bisect({}, list(input.keys()), concurreny, 1) == output
  89. if __name__ == "__main__":
  90. sys.exit(pytest.main(["-v", __file__]))