1*61046927SAndroid Build Coastguard Worker# Copyright © 2019,2021 Intel Corporation 2*61046927SAndroid Build Coastguard Worker 3*61046927SAndroid Build Coastguard Worker# Permission is hereby granted, free of charge, to any person obtaining a copy 4*61046927SAndroid Build Coastguard Worker# of this software and associated documentation files (the "Software"), to deal 5*61046927SAndroid Build Coastguard Worker# in the Software without restriction, including without limitation the rights 6*61046927SAndroid Build Coastguard Worker# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7*61046927SAndroid Build Coastguard Worker# copies of the Software, and to permit persons to whom the Software is 8*61046927SAndroid Build Coastguard Worker# furnished to do so, subject to the following conditions: 9*61046927SAndroid Build Coastguard Worker 10*61046927SAndroid Build Coastguard Worker# The above copyright notice and this permission notice shall be included in 11*61046927SAndroid Build Coastguard Worker# all copies or substantial portions of the Software. 12*61046927SAndroid Build Coastguard Worker 13*61046927SAndroid Build Coastguard Worker# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14*61046927SAndroid Build Coastguard Worker# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15*61046927SAndroid Build Coastguard Worker# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16*61046927SAndroid Build Coastguard Worker# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17*61046927SAndroid Build Coastguard Worker# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18*61046927SAndroid Build Coastguard Worker# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19*61046927SAndroid Build Coastguard Worker# SOFTWARE. 20*61046927SAndroid Build Coastguard Worker 21*61046927SAndroid Build Coastguard Workerimport sys 22*61046927SAndroid Build Coastguard Workerimport textwrap 23*61046927SAndroid Build Coastguard Workerimport typing 24*61046927SAndroid Build Coastguard Worker 25*61046927SAndroid Build Coastguard Workerimport pytest 26*61046927SAndroid Build Coastguard Worker 27*61046927SAndroid Build Coastguard Worker# AsyncMock is new in 3.8, so if we're using an older version we need the 28*61046927SAndroid Build Coastguard Worker# backported version of mock 29*61046927SAndroid Build Coastguard Workerif sys.version_info >= (3, 8): 30*61046927SAndroid Build Coastguard Worker from unittest import mock 31*61046927SAndroid Build Coastguard Workerelse: 32*61046927SAndroid Build Coastguard Worker import mock 33*61046927SAndroid Build Coastguard Worker 34*61046927SAndroid Build Coastguard Workerfrom .gen_release_notes import * 35*61046927SAndroid Build Coastguard Worker 36*61046927SAndroid Build Coastguard Worker 37*61046927SAndroid Build Coastguard Worker@pytest.mark.parametrize( 38*61046927SAndroid Build Coastguard Worker 'current, is_point, expected', 39*61046927SAndroid Build Coastguard Worker [ 40*61046927SAndroid Build Coastguard Worker ('19.2.0', True, '19.2.1'), 41*61046927SAndroid Build Coastguard Worker ('19.3.6', True, '19.3.7'), 42*61046927SAndroid Build Coastguard Worker ('20.0.0-rc4', False, '20.0.0'), 43*61046927SAndroid Build Coastguard Worker ]) 44*61046927SAndroid Build Coastguard Workerdef test_next_version(current: str, is_point: bool, expected: str) -> None: 45*61046927SAndroid Build Coastguard Worker assert calculate_next_version(current, is_point) == expected 46*61046927SAndroid Build Coastguard Worker 47*61046927SAndroid Build Coastguard Worker 48*61046927SAndroid Build Coastguard Worker@pytest.mark.parametrize( 49*61046927SAndroid Build Coastguard Worker 'current, is_point, expected', 50*61046927SAndroid Build Coastguard Worker [ 51*61046927SAndroid Build Coastguard Worker ('19.3.6', True, '19.3.6'), 52*61046927SAndroid Build Coastguard Worker ('20.0.0-rc4', False, '19.3.0'), 53*61046927SAndroid Build Coastguard Worker ]) 54*61046927SAndroid Build Coastguard Workerdef test_previous_version(current: str, is_point: bool, expected: str) -> None: 55*61046927SAndroid Build Coastguard Worker assert calculate_previous_version(current, is_point) == expected 56*61046927SAndroid Build Coastguard Worker 57*61046927SAndroid Build Coastguard Worker 58*61046927SAndroid Build Coastguard Worker@pytest.mark.asyncio 59*61046927SAndroid Build Coastguard Workerasync def test_get_shortlog(): 60*61046927SAndroid Build Coastguard Worker # Certainly not perfect, but it's something 61*61046927SAndroid Build Coastguard Worker version = '19.2.0' 62*61046927SAndroid Build Coastguard Worker out = await get_shortlog(version) 63*61046927SAndroid Build Coastguard Worker assert out 64*61046927SAndroid Build Coastguard Worker 65*61046927SAndroid Build Coastguard Worker 66*61046927SAndroid Build Coastguard Worker@pytest.mark.asyncio 67*61046927SAndroid Build Coastguard Workerasync def test_gather_commits(): 68*61046927SAndroid Build Coastguard Worker # Certainly not perfect, but it's something 69*61046927SAndroid Build Coastguard Worker version = '19.2.0' 70*61046927SAndroid Build Coastguard Worker out = await gather_commits(version) 71*61046927SAndroid Build Coastguard Worker assert out 72*61046927SAndroid Build Coastguard Worker 73*61046927SAndroid Build Coastguard Worker 74*61046927SAndroid Build Coastguard Worker@pytest.mark.asyncio 75*61046927SAndroid Build Coastguard Worker@pytest.mark.parametrize( 76*61046927SAndroid Build Coastguard Worker 'content, bugs', 77*61046927SAndroid Build Coastguard Worker [ 78*61046927SAndroid Build Coastguard Worker # It is important to have the title on a new line, as 79*61046927SAndroid Build Coastguard Worker # textwrap.dedent won't work otherwise. 80*61046927SAndroid Build Coastguard Worker 81*61046927SAndroid Build Coastguard Worker # Test the `Closes: #N` syntax 82*61046927SAndroid Build Coastguard Worker ( 83*61046927SAndroid Build Coastguard Worker '''\ 84*61046927SAndroid Build Coastguard Worker A commit 85*61046927SAndroid Build Coastguard Worker 86*61046927SAndroid Build Coastguard Worker It has a message in it 87*61046927SAndroid Build Coastguard Worker 88*61046927SAndroid Build Coastguard Worker Closes: #1 89*61046927SAndroid Build Coastguard Worker ''', 90*61046927SAndroid Build Coastguard Worker ['1'], 91*61046927SAndroid Build Coastguard Worker ), 92*61046927SAndroid Build Coastguard Worker 93*61046927SAndroid Build Coastguard Worker # Test the Full url 94*61046927SAndroid Build Coastguard Worker ( 95*61046927SAndroid Build Coastguard Worker '''\ 96*61046927SAndroid Build Coastguard Worker A commit with no body 97*61046927SAndroid Build Coastguard Worker 98*61046927SAndroid Build Coastguard Worker Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/3456 99*61046927SAndroid Build Coastguard Worker ''', 100*61046927SAndroid Build Coastguard Worker ['3456'], 101*61046927SAndroid Build Coastguard Worker ), 102*61046927SAndroid Build Coastguard Worker 103*61046927SAndroid Build Coastguard Worker # Test projects that are not mesa 104*61046927SAndroid Build Coastguard Worker ( 105*61046927SAndroid Build Coastguard Worker '''\ 106*61046927SAndroid Build Coastguard Worker A commit for libdrm 107*61046927SAndroid Build Coastguard Worker 108*61046927SAndroid Build Coastguard Worker Closes: https://gitlab.freedesktop.org/mesa/drm/-/3456 109*61046927SAndroid Build Coastguard Worker ''', 110*61046927SAndroid Build Coastguard Worker [], 111*61046927SAndroid Build Coastguard Worker ), 112*61046927SAndroid Build Coastguard Worker ( 113*61046927SAndroid Build Coastguard Worker '''\ 114*61046927SAndroid Build Coastguard Worker A commit for for something else completely 115*61046927SAndroid Build Coastguard Worker 116*61046927SAndroid Build Coastguard Worker Closes: https://github.com/Organization/project/1234 117*61046927SAndroid Build Coastguard Worker ''', 118*61046927SAndroid Build Coastguard Worker [], 119*61046927SAndroid Build Coastguard Worker ), 120*61046927SAndroid Build Coastguard Worker 121*61046927SAndroid Build Coastguard Worker # Test multiple issues on one line 122*61046927SAndroid Build Coastguard Worker ( 123*61046927SAndroid Build Coastguard Worker '''\ 124*61046927SAndroid Build Coastguard Worker Fix many bugs 125*61046927SAndroid Build Coastguard Worker 126*61046927SAndroid Build Coastguard Worker Closes: #1, #2 127*61046927SAndroid Build Coastguard Worker ''', 128*61046927SAndroid Build Coastguard Worker ['1', '2'], 129*61046927SAndroid Build Coastguard Worker ), 130*61046927SAndroid Build Coastguard Worker 131*61046927SAndroid Build Coastguard Worker # Test multiple closes 132*61046927SAndroid Build Coastguard Worker ( 133*61046927SAndroid Build Coastguard Worker '''\ 134*61046927SAndroid Build Coastguard Worker Fix many bugs 135*61046927SAndroid Build Coastguard Worker 136*61046927SAndroid Build Coastguard Worker Closes: #1 137*61046927SAndroid Build Coastguard Worker Closes: #2 138*61046927SAndroid Build Coastguard Worker ''', 139*61046927SAndroid Build Coastguard Worker ['1', '2'], 140*61046927SAndroid Build Coastguard Worker ), 141*61046927SAndroid Build Coastguard Worker ( 142*61046927SAndroid Build Coastguard Worker '''\ 143*61046927SAndroid Build Coastguard Worker With long form 144*61046927SAndroid Build Coastguard Worker 145*61046927SAndroid Build Coastguard Worker Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/3456 146*61046927SAndroid Build Coastguard Worker Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/3457 147*61046927SAndroid Build Coastguard Worker Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/3458 148*61046927SAndroid Build Coastguard Worker ''', 149*61046927SAndroid Build Coastguard Worker ['3456', '3457', '3458'], 150*61046927SAndroid Build Coastguard Worker ), 151*61046927SAndroid Build Coastguard Worker ( 152*61046927SAndroid Build Coastguard Worker '''\ 153*61046927SAndroid Build Coastguard Worker Without /-/ 154*61046927SAndroid Build Coastguard Worker 155*61046927SAndroid Build Coastguard Worker Closes: https://gitlab.freedesktop.org/mesa/mesa/issues/36 156*61046927SAndroid Build Coastguard Worker ''', 157*61046927SAndroid Build Coastguard Worker ['36'], 158*61046927SAndroid Build Coastguard Worker ), 159*61046927SAndroid Build Coastguard Worker ( 160*61046927SAndroid Build Coastguard Worker '''\ 161*61046927SAndroid Build Coastguard Worker Ignore merge_requests 162*61046927SAndroid Build Coastguard Worker 163*61046927SAndroid Build Coastguard Worker Closes: https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20241 164*61046927SAndroid Build Coastguard Worker ''', 165*61046927SAndroid Build Coastguard Worker [], 166*61046927SAndroid Build Coastguard Worker ), 167*61046927SAndroid Build Coastguard Worker ( 168*61046927SAndroid Build Coastguard Worker '''\ 169*61046927SAndroid Build Coastguard Worker Parse "Fixes:" tag too 170*61046927SAndroid Build Coastguard Worker 171*61046927SAndroid Build Coastguard Worker Fixes: https://gitlab.freedesktop.org/mesa/mesa/issues/36 172*61046927SAndroid Build Coastguard Worker Fixes: 142565a3bc2 173*61046927SAndroid Build Coastguard Worker Fixes: 142565a3bc2 ("docs: do something very useful") 174*61046927SAndroid Build Coastguard Worker Fixes: 142565a3bc2 ("docs: fix #1234, have a comma") 175*61046927SAndroid Build Coastguard Worker Fixes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/37 176*61046927SAndroid Build Coastguard Worker ''', 177*61046927SAndroid Build Coastguard Worker ['36', '37'], 178*61046927SAndroid Build Coastguard Worker ), 179*61046927SAndroid Build Coastguard Worker ( 180*61046927SAndroid Build Coastguard Worker '''\ 181*61046927SAndroid Build Coastguard Worker Parse Fixes/Closes in weird cases 182*61046927SAndroid Build Coastguard Worker 183*61046927SAndroid Build Coastguard Worker fixes: https://gitlab.freedesktop.org/mesa/mesa/issues/36 184*61046927SAndroid Build Coastguard Worker fiXES: https://gitlab.freedesktop.org/mesa/mesa/issues/37 185*61046927SAndroid Build Coastguard Worker closes: https://gitlab.freedesktop.org/mesa/mesa/issues/38 186*61046927SAndroid Build Coastguard Worker cloSES: https://gitlab.freedesktop.org/mesa/mesa/issues/39 187*61046927SAndroid Build Coastguard Worker ''', 188*61046927SAndroid Build Coastguard Worker ['36', '37', '38', '39'], 189*61046927SAndroid Build Coastguard Worker ), 190*61046927SAndroid Build Coastguard Worker ]) 191*61046927SAndroid Build Coastguard Workerasync def test_parse_issues(content: str, bugs: typing.List[str]) -> None: 192*61046927SAndroid Build Coastguard Worker mock_com = mock.AsyncMock(return_value=(textwrap.dedent(content).encode(), '')) 193*61046927SAndroid Build Coastguard Worker mock_p = mock.Mock() 194*61046927SAndroid Build Coastguard Worker mock_p.communicate = mock_com 195*61046927SAndroid Build Coastguard Worker mock_exec = mock.AsyncMock(return_value=mock_p) 196*61046927SAndroid Build Coastguard Worker 197*61046927SAndroid Build Coastguard Worker with mock.patch('bin.gen_release_notes.asyncio.create_subprocess_exec', mock_exec), \ 198*61046927SAndroid Build Coastguard Worker mock.patch('bin.gen_release_notes.gather_commits', mock.AsyncMock(return_value='sha\n')): 199*61046927SAndroid Build Coastguard Worker ids = await parse_issues('1234 not used') 200*61046927SAndroid Build Coastguard Worker assert set(ids) == set(bugs) 201*61046927SAndroid Build Coastguard Worker 202*61046927SAndroid Build Coastguard Worker@pytest.mark.asyncio 203*61046927SAndroid Build Coastguard Workerasync def test_rst_escape(): 204*61046927SAndroid Build Coastguard Worker out = inliner.quoteInline('foo@bar') 205*61046927SAndroid Build Coastguard Worker assert out == 'foo\@bar' 206