luqui@chromium.org | 0b88762 | 2014-09-03 02:31:03 +0000 | [diff] [blame] | 1 | #!/usr/bin/env python |
| 2 | |
| 3 | """Tests for git_footers.""" |
| 4 | |
| 5 | import os |
martiniss@chromium.org | 456ca7f | 2016-05-23 21:33:28 +0000 | [diff] [blame] | 6 | import StringIO |
luqui@chromium.org | 0b88762 | 2014-09-03 02:31:03 +0000 | [diff] [blame] | 7 | import sys |
| 8 | import unittest |
| 9 | |
| 10 | sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) |
| 11 | |
martiniss@chromium.org | 456ca7f | 2016-05-23 21:33:28 +0000 | [diff] [blame] | 12 | from testing_support.auto_stub import TestCase |
| 13 | |
luqui@chromium.org | 0b88762 | 2014-09-03 02:31:03 +0000 | [diff] [blame] | 14 | import git_footers |
| 15 | |
martiniss@chromium.org | 456ca7f | 2016-05-23 21:33:28 +0000 | [diff] [blame] | 16 | class GitFootersTest(TestCase): |
luqui@chromium.org | 0b88762 | 2014-09-03 02:31:03 +0000 | [diff] [blame] | 17 | _message = """ |
| 18 | This is my commit message. There are many like it, but this one is mine. |
| 19 | |
| 20 | My commit message is my best friend. It is my life. I must master it. |
| 21 | |
| 22 | """ |
| 23 | |
| 24 | _position = 'refs/heads/master@{#292272}' |
| 25 | |
| 26 | _position_footer = 'Cr-Commit-Position: %s\n' % _position |
| 27 | |
luqui@chromium.org | 0b88762 | 2014-09-03 02:31:03 +0000 | [diff] [blame] | 28 | def testFootersBasic(self): |
| 29 | self.assertEqual( |
tandrii@chromium.org | f2aa52b | 2016-06-03 12:58:20 +0000 | [diff] [blame] | 30 | git_footers.split_footers('Not-A: footer'), |
| 31 | (['Not-A: footer'], [], [])) |
| 32 | self.assertEqual( |
| 33 | git_footers.split_footers('Header\n\nActual: footer'), |
| 34 | (['Header', ''], ['Actual: footer'], [('Actual', 'footer')])) |
| 35 | self.assertEqual( |
| 36 | git_footers.split_footers('\nActual: footer'), |
| 37 | ([''], ['Actual: footer'], [('Actual', 'footer')])) |
Andrii Shyshkalov | 80cae42 | 2017-04-27 01:01:42 +0200 | [diff] [blame] | 38 | self.assertEqual( |
| 39 | git_footers.split_footers('H\n\nBug:\nAlso: footer'), |
| 40 | (['H', ''], ['Bug:', 'Also: footer'], |
| 41 | [('Bug', ''), ('Also', 'footer')])) |
| 42 | self.assertEqual( |
| 43 | git_footers.split_footers('H\n\nBug: '), |
| 44 | (['H', ''], ['Bug: '], [('Bug', '')])) |
tandrii@chromium.org | f2aa52b | 2016-06-03 12:58:20 +0000 | [diff] [blame] | 45 | |
| 46 | self.assertEqual( |
luqui@chromium.org | 0b88762 | 2014-09-03 02:31:03 +0000 | [diff] [blame] | 47 | git_footers.parse_footers(self._message), {}) |
| 48 | self.assertEqual( |
| 49 | git_footers.parse_footers(self._message + self._position_footer), |
| 50 | { 'Cr-Commit-Position': [ self._position ] }) |
| 51 | self.assertEqual( |
luqui@chromium.org | 0b88762 | 2014-09-03 02:31:03 +0000 | [diff] [blame] | 52 | git_footers.parse_footers(self._message + self._position_footer |
| 53 | + self._position_footer), |
| 54 | { 'Cr-Commit-Position': [ self._position, self._position ] }) |
Andrii Shyshkalov | 80cae42 | 2017-04-27 01:01:42 +0200 | [diff] [blame] | 55 | self.assertEqual( |
| 56 | git_footers.parse_footers(self._message + |
| 57 | 'Bug:\n' + |
| 58 | self._position_footer), |
| 59 | { 'Bug': [''], |
| 60 | 'Cr-Commit-Position': [ self._position ] }) |
| 61 | |
Andrii Shyshkalov | 04b51d6 | 2017-05-11 13:21:30 +0200 | [diff] [blame^] | 62 | def testSkippingBadFooterLines(self): |
| 63 | message = ('Title.\n' |
| 64 | '\n' |
| 65 | 'Last: paragraph starts\n' |
| 66 | 'It-may: contain\n' |
| 67 | 'bad lines, which should be skipped\n' |
| 68 | 'For: example\n' |
| 69 | '(cherry picked from)\n' |
| 70 | 'And-only-valid: footers taken') |
| 71 | self.assertEqual(git_footers.split_footers(message), |
| 72 | (['Title.', |
| 73 | ''], |
| 74 | ['Last: paragraph starts', |
| 75 | 'It-may: contain', |
| 76 | 'bad lines, which should be skipped', |
| 77 | 'For: example', |
| 78 | '(cherry picked from)', |
| 79 | 'And-only-valid: footers taken'], |
| 80 | [('Last', 'paragraph starts'), |
| 81 | ('It-may', 'contain'), |
| 82 | ('For', 'example'), |
| 83 | ('And-only-valid', 'footers taken')])) |
| 84 | self.assertEqual(git_footers.parse_footers(message), |
| 85 | {'Last': ['paragraph starts'], |
| 86 | 'It-May': ['contain'], |
| 87 | 'For': ['example'], |
| 88 | 'And-Only-Valid': ['footers taken']}) |
luqui@chromium.org | 0b88762 | 2014-09-03 02:31:03 +0000 | [diff] [blame] | 89 | |
tandrii@chromium.org | 3c3c034 | 2016-03-04 11:59:28 +0000 | [diff] [blame] | 90 | def testGetFooterChangeId(self): |
| 91 | msg = '\n'.join(['whatever', |
| 92 | '', |
| 93 | 'Change-Id: ignored', |
| 94 | '', # Above is ignored because of this empty line. |
| 95 | 'Change-Id: Ideadbeaf']) |
| 96 | self.assertEqual(['Ideadbeaf'], git_footers.get_footer_change_id(msg)) |
tandrii@chromium.org | 09d7a6a | 2016-03-04 15:44:48 +0000 | [diff] [blame] | 97 | self.assertEqual([], git_footers.get_footer_change_id( |
| 98 | 'desc\nBUG=not-a-valid-footer\nChange-Id: Ixxx')) |
| 99 | self.assertEqual(['Ixxx'], git_footers.get_footer_change_id( |
| 100 | 'desc\nBUG=not-a-valid-footer\n\nChange-Id: Ixxx')) |
tandrii@chromium.org | 3c3c034 | 2016-03-04 11:59:28 +0000 | [diff] [blame] | 101 | |
| 102 | def testAddFooterChangeId(self): |
tandrii@chromium.org | f2aa52b | 2016-06-03 12:58:20 +0000 | [diff] [blame] | 103 | with self.assertRaises(AssertionError): |
| 104 | git_footers.add_footer_change_id('Already has\n\nChange-Id: Ixxx', 'Izzz') |
| 105 | |
tandrii@chromium.org | 3c3c034 | 2016-03-04 11:59:28 +0000 | [diff] [blame] | 106 | self.assertEqual( |
| 107 | git_footers.add_footer_change_id('header-only', 'Ixxx'), |
| 108 | 'header-only\n\nChange-Id: Ixxx') |
| 109 | |
| 110 | self.assertEqual( |
Aaron Gable | c06db44 | 2017-04-26 17:29:49 -0700 | [diff] [blame] | 111 | git_footers.add_footer_change_id('header\n\nsome: footer', 'Ixxx'), |
| 112 | 'header\n\nsome: footer\nChange-Id: Ixxx') |
tandrii@chromium.org | 3c3c034 | 2016-03-04 11:59:28 +0000 | [diff] [blame] | 113 | |
| 114 | self.assertEqual( |
| 115 | git_footers.add_footer_change_id('header\n\nBUG: yy', 'Ixxx'), |
| 116 | 'header\n\nBUG: yy\nChange-Id: Ixxx') |
| 117 | |
| 118 | self.assertEqual( |
| 119 | git_footers.add_footer_change_id('header\n\nBUG: yy\nPos: 1', 'Ixxx'), |
| 120 | 'header\n\nBUG: yy\nChange-Id: Ixxx\nPos: 1') |
| 121 | |
| 122 | self.assertEqual( |
| 123 | git_footers.add_footer_change_id('header\n\nBUG: yy\n\nPos: 1', 'Ixxx'), |
Aaron Gable | c06db44 | 2017-04-26 17:29:49 -0700 | [diff] [blame] | 124 | 'header\n\nBUG: yy\n\nPos: 1\nChange-Id: Ixxx') |
tandrii@chromium.org | 3c3c034 | 2016-03-04 11:59:28 +0000 | [diff] [blame] | 125 | |
tandrii@chromium.org | 9fc50db | 2016-03-17 12:38:55 +0000 | [diff] [blame] | 126 | # Special case: first line is never a footer, even if it looks line one. |
| 127 | self.assertEqual( |
| 128 | git_footers.add_footer_change_id('header: like footer', 'Ixxx'), |
| 129 | 'header: like footer\n\nChange-Id: Ixxx') |
| 130 | |
Andrii Shyshkalov | 04b51d6 | 2017-05-11 13:21:30 +0200 | [diff] [blame^] | 131 | self.assertEqual( |
| 132 | git_footers.add_footer_change_id('Header.\n\nBug: v8\nN=t\nT=z', 'Ix'), |
| 133 | 'Header.\n\nBug: v8\nChange-Id: Ix\nN=t\nT=z') |
| 134 | |
tandrii@chromium.org | f2aa52b | 2016-06-03 12:58:20 +0000 | [diff] [blame] | 135 | def testAddFooter(self): |
| 136 | self.assertEqual( |
| 137 | git_footers.add_footer('', 'Key', 'Value'), |
| 138 | '\nKey: Value') |
Aaron Gable | b584c4f | 2017-04-26 16:28:08 -0700 | [diff] [blame] | 139 | |
tandrii@chromium.org | f2aa52b | 2016-06-03 12:58:20 +0000 | [diff] [blame] | 140 | self.assertEqual( |
| 141 | git_footers.add_footer('Header with empty line.\n\n', 'Key', 'Value'), |
| 142 | 'Header with empty line.\n\nKey: Value') |
| 143 | |
| 144 | self.assertEqual( |
| 145 | git_footers.add_footer('Top\n\nSome: footer', 'Key', 'value'), |
| 146 | 'Top\n\nSome: footer\nKey: value') |
| 147 | |
| 148 | self.assertEqual( |
| 149 | git_footers.add_footer('Top\n\nSome: footer', 'Key', 'value', |
| 150 | after_keys=['Any']), |
Aaron Gable | c06db44 | 2017-04-26 17:29:49 -0700 | [diff] [blame] | 151 | 'Top\n\nSome: footer\nKey: value') |
tandrii@chromium.org | f2aa52b | 2016-06-03 12:58:20 +0000 | [diff] [blame] | 152 | |
| 153 | self.assertEqual( |
| 154 | git_footers.add_footer('Top\n\nSome: footer', 'Key', 'value', |
| 155 | after_keys=['Some']), |
| 156 | 'Top\n\nSome: footer\nKey: value') |
| 157 | |
| 158 | self.assertEqual( |
| 159 | git_footers.add_footer('Top\n\nSome: footer\nOther: footer', |
| 160 | 'Key', 'value', after_keys=['Some']), |
| 161 | 'Top\n\nSome: footer\nKey: value\nOther: footer') |
| 162 | |
Aaron Gable | c06db44 | 2017-04-26 17:29:49 -0700 | [diff] [blame] | 163 | self.assertEqual( |
| 164 | git_footers.add_footer('Top\n\nSome: footer\nOther: footer', |
| 165 | 'Key', 'value', before_keys=['Other']), |
| 166 | 'Top\n\nSome: footer\nKey: value\nOther: footer') |
| 167 | |
| 168 | self.assertEqual( |
| 169 | git_footers.add_footer( |
| 170 | 'Top\n\nSome: footer\nOther: footer\nFinal: footer', |
| 171 | 'Key', 'value', after_keys=['Some'], before_keys=['Final']), |
| 172 | 'Top\n\nSome: footer\nKey: value\nOther: footer\nFinal: footer') |
| 173 | |
| 174 | self.assertEqual( |
| 175 | git_footers.add_footer( |
| 176 | 'Top\n\nSome: footer\nOther: footer\nFinal: footer', |
| 177 | 'Key', 'value', after_keys=['Other'], before_keys=['Some']), |
| 178 | 'Top\n\nSome: footer\nOther: footer\nKey: value\nFinal: footer') |
| 179 | |
Aaron Gable | b584c4f | 2017-04-26 16:28:08 -0700 | [diff] [blame] | 180 | def testRemoveFooter(self): |
| 181 | self.assertEqual( |
| 182 | git_footers.remove_footer('message', 'Key'), |
| 183 | 'message') |
| 184 | |
| 185 | self.assertEqual( |
| 186 | git_footers.remove_footer('message\n\nSome: footer', 'Key'), |
| 187 | 'message\n\nSome: footer') |
| 188 | |
| 189 | self.assertEqual( |
| 190 | git_footers.remove_footer('message\n\nSome: footer\nKey: value', 'Key'), |
| 191 | 'message\n\nSome: footer') |
| 192 | |
| 193 | self.assertEqual( |
| 194 | git_footers.remove_footer( |
| 195 | 'message\n\nKey: value\nSome: footer\nKey: value', 'Key'), |
| 196 | 'message\n\nSome: footer') |
| 197 | |
| 198 | |
martiniss@chromium.org | 456ca7f | 2016-05-23 21:33:28 +0000 | [diff] [blame] | 199 | def testReadStdin(self): |
| 200 | self.mock(git_footers.sys, 'stdin', StringIO.StringIO( |
| 201 | 'line\r\notherline\r\n\r\n\r\nFoo: baz')) |
| 202 | |
| 203 | stdout = StringIO.StringIO() |
| 204 | self.mock(git_footers.sys, 'stdout', stdout) |
| 205 | |
| 206 | self.assertEqual(git_footers.main([]), 0) |
| 207 | self.assertEqual(stdout.getvalue(), "Foo: baz\n") |
| 208 | |
| 209 | |
tandrii@chromium.org | 3c3c034 | 2016-03-04 11:59:28 +0000 | [diff] [blame] | 210 | |
luqui@chromium.org | 0b88762 | 2014-09-03 02:31:03 +0000 | [diff] [blame] | 211 | if __name__ == '__main__': |
| 212 | unittest.main() |