blob: 1d537cee3a24e565b37a627d11b54006a38a996f [file] [log] [blame]
luqui@chromium.org0b887622014-09-03 02:31:03 +00001#!/usr/bin/env python
2
3"""Tests for git_footers."""
4
5import os
martiniss@chromium.org456ca7f2016-05-23 21:33:28 +00006import StringIO
luqui@chromium.org0b887622014-09-03 02:31:03 +00007import sys
8import unittest
9
10sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
11
martiniss@chromium.org456ca7f2016-05-23 21:33:28 +000012from testing_support.auto_stub import TestCase
13
luqui@chromium.org0b887622014-09-03 02:31:03 +000014import git_footers
15
martiniss@chromium.org456ca7f2016-05-23 21:33:28 +000016class GitFootersTest(TestCase):
luqui@chromium.org0b887622014-09-03 02:31:03 +000017 _message = """
18This is my commit message. There are many like it, but this one is mine.
19
20My 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.org0b887622014-09-03 02:31:03 +000028 def testFootersBasic(self):
29 self.assertEqual(
tandrii@chromium.orgf2aa52b2016-06-03 12:58:20 +000030 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 Shyshkalov80cae422017-04-27 01:01:42 +020038 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.orgf2aa52b2016-06-03 12:58:20 +000045
46 self.assertEqual(
luqui@chromium.org0b887622014-09-03 02:31:03 +000047 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.org0b887622014-09-03 02:31:03 +000052 git_footers.parse_footers(self._message + self._position_footer
53 + self._position_footer),
54 { 'Cr-Commit-Position': [ self._position, self._position ] })
Andrii Shyshkalov80cae422017-04-27 01:01:42 +020055 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 Shyshkalov04b51d62017-05-11 13:21:30 +020062 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.org0b887622014-09-03 02:31:03 +000089
tandrii@chromium.org3c3c0342016-03-04 11:59:28 +000090 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.org09d7a6a2016-03-04 15:44:48 +000097 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.org3c3c0342016-03-04 11:59:28 +0000101
102 def testAddFooterChangeId(self):
tandrii@chromium.orgf2aa52b2016-06-03 12:58:20 +0000103 with self.assertRaises(AssertionError):
104 git_footers.add_footer_change_id('Already has\n\nChange-Id: Ixxx', 'Izzz')
105
tandrii@chromium.org3c3c0342016-03-04 11:59:28 +0000106 self.assertEqual(
107 git_footers.add_footer_change_id('header-only', 'Ixxx'),
108 'header-only\n\nChange-Id: Ixxx')
109
110 self.assertEqual(
Aaron Gablec06db442017-04-26 17:29:49 -0700111 git_footers.add_footer_change_id('header\n\nsome: footer', 'Ixxx'),
112 'header\n\nsome: footer\nChange-Id: Ixxx')
tandrii@chromium.org3c3c0342016-03-04 11:59:28 +0000113
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 Gablec06db442017-04-26 17:29:49 -0700124 'header\n\nBUG: yy\n\nPos: 1\nChange-Id: Ixxx')
tandrii@chromium.org3c3c0342016-03-04 11:59:28 +0000125
tandrii@chromium.org9fc50db2016-03-17 12:38:55 +0000126 # 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 Shyshkalov04b51d62017-05-11 13:21:30 +0200131 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.orgf2aa52b2016-06-03 12:58:20 +0000135 def testAddFooter(self):
136 self.assertEqual(
137 git_footers.add_footer('', 'Key', 'Value'),
138 '\nKey: Value')
Aaron Gableb584c4f2017-04-26 16:28:08 -0700139
tandrii@chromium.orgf2aa52b2016-06-03 12:58:20 +0000140 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 Gablec06db442017-04-26 17:29:49 -0700151 'Top\n\nSome: footer\nKey: value')
tandrii@chromium.orgf2aa52b2016-06-03 12:58:20 +0000152
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 Gablec06db442017-04-26 17:29:49 -0700163 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 Gableb584c4f2017-04-26 16:28:08 -0700180 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.org456ca7f2016-05-23 21:33:28 +0000199 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.org3c3c0342016-03-04 11:59:28 +0000210
luqui@chromium.org0b887622014-09-03 02:31:03 +0000211if __name__ == '__main__':
212 unittest.main()