1bf215546Sopenharmony_ciimport argparse
2bf215546Sopenharmony_ciimport pytest  # type: ignore
3bf215546Sopenharmony_ciimport subprocess
4bf215546Sopenharmony_ci
5bf215546Sopenharmony_cifrom .commit_in_branch import (
6bf215546Sopenharmony_ci    is_commit_valid,
7bf215546Sopenharmony_ci    branch_has_commit,
8bf215546Sopenharmony_ci    branch_has_backport_of_commit,
9bf215546Sopenharmony_ci    canonicalize_commit,
10bf215546Sopenharmony_ci    validate_branch,
11bf215546Sopenharmony_ci)
12bf215546Sopenharmony_ci
13bf215546Sopenharmony_ci
14bf215546Sopenharmony_cidef get_upstream() -> str:
15bf215546Sopenharmony_ci    # Let's assume main is bound to the upstream remote and not a fork
16bf215546Sopenharmony_ci    out = subprocess.check_output(['git', 'for-each-ref',
17bf215546Sopenharmony_ci                                   '--format=%(upstream)',
18bf215546Sopenharmony_ci                                   'refs/heads/main'],
19bf215546Sopenharmony_ci                                  stderr=subprocess.DEVNULL)
20bf215546Sopenharmony_ci    return out.decode().strip().split('/')[2]
21bf215546Sopenharmony_ci
22bf215546Sopenharmony_ci
23bf215546Sopenharmony_ci@pytest.mark.parametrize(
24bf215546Sopenharmony_ci    'commit, expected',
25bf215546Sopenharmony_ci    [
26bf215546Sopenharmony_ci        ('20.1-branchpoint', True),
27bf215546Sopenharmony_ci        ('main', True),
28bf215546Sopenharmony_ci        ('e58a10af640ba58b6001f5c5ad750b782547da76', True),
29bf215546Sopenharmony_ci        ('d043d24654c851f0be57dbbf48274b5373dea42b', True),
30bf215546Sopenharmony_ci        ('dd2bd68fa69124c86cd008b256d06f44fab8e6cd', True),
31bf215546Sopenharmony_ci        ('0000000000000000000000000000000000000000', False),
32bf215546Sopenharmony_ci        ('not-even-a-valid-commit-format', False),
33bf215546Sopenharmony_ci    ])
34bf215546Sopenharmony_cidef test_canonicalize_commit(commit: str, expected: bool) -> None:
35bf215546Sopenharmony_ci    if expected:
36bf215546Sopenharmony_ci        assert canonicalize_commit(commit)
37bf215546Sopenharmony_ci    else:
38bf215546Sopenharmony_ci        try:
39bf215546Sopenharmony_ci            assert canonicalize_commit(commit)
40bf215546Sopenharmony_ci        except argparse.ArgumentTypeError:
41bf215546Sopenharmony_ci            return
42bf215546Sopenharmony_ci        assert False
43bf215546Sopenharmony_ci
44bf215546Sopenharmony_ci
45bf215546Sopenharmony_ci@pytest.mark.parametrize(
46bf215546Sopenharmony_ci    'commit, expected',
47bf215546Sopenharmony_ci    [
48bf215546Sopenharmony_ci        (get_upstream() + '/20.1', True),
49bf215546Sopenharmony_ci        (get_upstream() + '/main', True),
50bf215546Sopenharmony_ci        ('20.1', False),
51bf215546Sopenharmony_ci        ('main', False),
52bf215546Sopenharmony_ci        ('e58a10af640ba58b6001f5c5ad750b782547da76', False),
53bf215546Sopenharmony_ci        ('d043d24654c851f0be57dbbf48274b5373dea42b', False),
54bf215546Sopenharmony_ci        ('dd2bd68fa69124c86cd008b256d06f44fab8e6cd', False),
55bf215546Sopenharmony_ci        ('0000000000000000000000000000000000000000', False),
56bf215546Sopenharmony_ci        ('not-even-a-valid-commit-format', False),
57bf215546Sopenharmony_ci    ])
58bf215546Sopenharmony_cidef test_validate_branch(commit: str, expected: bool) -> None:
59bf215546Sopenharmony_ci    if expected:
60bf215546Sopenharmony_ci        assert validate_branch(commit)
61bf215546Sopenharmony_ci    else:
62bf215546Sopenharmony_ci        try:
63bf215546Sopenharmony_ci            assert validate_branch(commit)
64bf215546Sopenharmony_ci        except argparse.ArgumentTypeError:
65bf215546Sopenharmony_ci            return
66bf215546Sopenharmony_ci        assert False
67bf215546Sopenharmony_ci
68bf215546Sopenharmony_ci
69bf215546Sopenharmony_ci@pytest.mark.parametrize(
70bf215546Sopenharmony_ci    'commit, expected',
71bf215546Sopenharmony_ci    [
72bf215546Sopenharmony_ci        ('main', True),
73bf215546Sopenharmony_ci        ('20.1-branchpoint', True),
74bf215546Sopenharmony_ci        ('20.1', False),
75bf215546Sopenharmony_ci        (get_upstream() + '/20.1', True),
76bf215546Sopenharmony_ci        ('e58a10af640ba58b6001f5c5ad750b782547da76', True),
77bf215546Sopenharmony_ci        ('d043d24654c851f0be57dbbf48274b5373dea42b', True),
78bf215546Sopenharmony_ci        ('dd2bd68fa69124c86cd008b256d06f44fab8e6cd', True),
79bf215546Sopenharmony_ci        ('0000000000000000000000000000000000000000', False),
80bf215546Sopenharmony_ci        ('not-even-a-valid-commit-format', False),
81bf215546Sopenharmony_ci    ])
82bf215546Sopenharmony_cidef test_is_commit_valid(commit: str, expected: bool) -> None:
83bf215546Sopenharmony_ci    assert is_commit_valid(commit) == expected
84bf215546Sopenharmony_ci
85bf215546Sopenharmony_ci
86bf215546Sopenharmony_ci@pytest.mark.parametrize(
87bf215546Sopenharmony_ci    'branch, commit, expected',
88bf215546Sopenharmony_ci    [
89bf215546Sopenharmony_ci        ('20.1', '20.1-branchpoint', True),
90bf215546Sopenharmony_ci        ('20.1', '20.0', False),
91bf215546Sopenharmony_ci        ('20.1', 'main', False),
92bf215546Sopenharmony_ci        ('20.1', 'e58a10af640ba58b6001f5c5ad750b782547da76', True),
93bf215546Sopenharmony_ci        ('20.1', 'd043d24654c851f0be57dbbf48274b5373dea42b', True),
94bf215546Sopenharmony_ci        ('20.1', 'dd2bd68fa69124c86cd008b256d06f44fab8e6cd', False),
95bf215546Sopenharmony_ci        ('main', 'dd2bd68fa69124c86cd008b256d06f44fab8e6cd', True),
96bf215546Sopenharmony_ci        ('20.0', 'd043d24654c851f0be57dbbf48274b5373dea42b', False),
97bf215546Sopenharmony_ci    ])
98bf215546Sopenharmony_cidef test_branch_has_commit(branch: str, commit: str, expected: bool) -> None:
99bf215546Sopenharmony_ci    upstream = get_upstream()
100bf215546Sopenharmony_ci    assert branch_has_commit(upstream, branch, commit) == expected
101bf215546Sopenharmony_ci
102bf215546Sopenharmony_ci
103bf215546Sopenharmony_ci@pytest.mark.parametrize(
104bf215546Sopenharmony_ci    'branch, commit, expected',
105bf215546Sopenharmony_ci    [
106bf215546Sopenharmony_ci        ('20.1', 'dd2bd68fa69124c86cd008b256d06f44fab8e6cd', 'd043d24654c851f0be57dbbf48274b5373dea42b'),
107bf215546Sopenharmony_ci        ('20.1', '20.1-branchpoint', ''),
108bf215546Sopenharmony_ci        ('20.1', '20.0', ''),
109bf215546Sopenharmony_ci        ('20.1', '20.2', ''),
110bf215546Sopenharmony_ci        ('20.1', 'main', ''),
111bf215546Sopenharmony_ci        ('20.1', 'd043d24654c851f0be57dbbf48274b5373dea42b', ''),
112bf215546Sopenharmony_ci        ('20.0', 'dd2bd68fa69124c86cd008b256d06f44fab8e6cd', ''),
113bf215546Sopenharmony_ci    ])
114bf215546Sopenharmony_cidef test_branch_has_backport_of_commit(branch: str, commit: str, expected: bool) -> None:
115bf215546Sopenharmony_ci    upstream = get_upstream()
116bf215546Sopenharmony_ci    assert branch_has_backport_of_commit(upstream, branch, commit) == expected
117