Use weighted random selection; add project reviewers
* Allow Rust reviewers to have different number (quota)
of randomly assigned projects.
* People owning K projects got their quota reduced by K.
* Add more project owners (reviewers).
* Sort a set of reviewers before adding all of them.
* Add and separate unit tests.
* Add TEST_MAPPING with the reviewers presubmit test.
* Separate reviewers test in its own file;
old external_updater test does not run with atest or TH.
Bug: 162988933
Test: out/host/*/testcases/*/*/external_updater_test
Test: out/host/*/testcases/*/*/external_updater_reviewers_test
Test: out/.../bin/external_updater update --branch_and_commit --push_change <some_project>
Change-Id: I375bf3d216f213452aacbedf844d1a1015310e7b
diff --git a/external_updater_test.py b/external_updater_test.py
index 32e2918..c274be5 100644
--- a/external_updater_test.py
+++ b/external_updater_test.py
@@ -13,11 +13,9 @@
# limitations under the License.
"""Unit tests for external updater."""
-from typing import List, Mapping, Set
import unittest
import github_archive_updater
-import reviewers
class ExternalUpdaterTest(unittest.TestCase):
@@ -45,63 +43,6 @@
expected_url = prefix + "archive/ver-1.0.zip"
self.assertEqual(url, expected_url)
- def collect_reviewers(self, num_runs, proj_path):
- counters = {}
- for _ in range(num_runs):
- name = reviewers.find_reviewers(proj_path)
- if name in counters:
- counters[name] += 1
- else:
- counters[name] = 1
- return counters
-
- def test_reviewers(self):
- # There should be enough people in the reviewers pool.
- self.assertGreaterEqual(len(reviewers.RUST_REVIEWERS), 3)
- # Check element types of the reviewers list and map.
- self.assertIsInstance(reviewers.RUST_REVIEWERS, List)
- for x in reviewers.RUST_REVIEWERS:
- self.assertIsInstance(x, str)
- self.assertIsInstance(reviewers.PROJ_REVIEWERS, Mapping)
- for key, value in reviewers.PROJ_REVIEWERS.items():
- self.assertIsInstance(key, str)
- if isinstance(value, Set) or isinstance(value, List):
- for x in value:
- self.assertIsInstance(x, str)
- else:
- self.assertIsInstance(value, str)
- # Check random selection of reviewers.
- # This might fail when the random.choice function is extremely unfair.
- # With N * 20 tries, each reviewer should be picked at least twice.
- counters = self.collect_reviewers(len(reviewers.RUST_REVIEWERS) * 20,
- "rust/crates/no_such_project")
- self.assertEqual(len(counters), len(reviewers.RUST_REVIEWERS))
- for key, value in counters.items():
- self.assertGreaterEqual(value, 2)
- # For specific projects, select only the specified reviewers.
- saved_reviewers = reviewers.PROJ_REVIEWERS
- reviewers.PROJ_REVIEWERS = {
- "rust/crates/p1": "[email protected]",
- "rust/crates/p_any": ["[email protected]", "[email protected]"],
- "rust/crates/p_all": {"[email protected]", "[email protected]"},
- }
- counters = self.collect_reviewers(20, "external/rust/crates/p1")
- self.assertEqual(len(counters), 1)
- self.assertTrue(counters["[email protected]"], 20)
- counters = self.collect_reviewers(20, "external/rust/crates/p_any")
- self.assertEqual(len(counters), 2)
- self.assertGreater(counters["[email protected]"], 2)
- self.assertGreater(counters["[email protected]"], 2)
- self.assertTrue(counters["[email protected]"] + counters["[email protected]"], 20)
- counters = self.collect_reviewers(20, "external/rust/crates/p_all")
- counted = 0
- if "[email protected],[email protected]" in counters:
- counted += counters["[email protected],[email protected]"]
- if "[email protected],[email protected]" in counters:
- counted += counters["[email protected],[email protected]"]
- self.assertEqual(counted, 20)
- reviewers.PROJ_REVIEWERS = saved_reviewers
-
if __name__ == "__main__":
- unittest.main()
+ unittest.main(verbosity=2)