PageRenderTime 52ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/master/buildbot/test/unit/test_data_changes.py

https://gitlab.com/murder187ss/buildbot
Python | 333 lines | 291 code | 26 blank | 16 comment | 0 complexity | 7a4e262398215599d13641cc71d1eec2 MD5 | raw file
  1. # This file is part of Buildbot. Buildbot is free software: you can
  2. # redistribute it and/or modify it under the terms of the GNU General Public
  3. # License as published by the Free Software Foundation, version 2.
  4. #
  5. # This program is distributed in the hope that it will be useful, but WITHOUT
  6. # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  7. # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  8. # details.
  9. #
  10. # You should have received a copy of the GNU General Public License along with
  11. # this program; if not, write to the Free Software Foundation, Inc., 51
  12. # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  13. #
  14. # Copyright Buildbot Team Members
  15. import mock
  16. from twisted.internet import defer
  17. from twisted.internet import task
  18. from twisted.trial import unittest
  19. from buildbot.data import changes
  20. from buildbot.data import resultspec
  21. from buildbot.process.users import users
  22. from buildbot.test.fake import fakedb
  23. from buildbot.test.fake import fakemaster
  24. from buildbot.test.util import endpoint
  25. from buildbot.test.util import interfaces
  26. from buildbot.util import epoch2datetime
  27. class ChangeEndpoint(endpoint.EndpointMixin, unittest.TestCase):
  28. endpointClass = changes.ChangeEndpoint
  29. resourceTypeClass = changes.Change
  30. def setUp(self):
  31. self.setUpEndpoint()
  32. self.db.insertTestData([
  33. fakedb.SourceStamp(id=234),
  34. fakedb.Change(changeid=13, branch=u'trunk', revision=u'9283',
  35. repository=u'svn://...', codebase=u'cbsvn',
  36. project=u'world-domination', sourcestampid=234),
  37. ])
  38. def tearDown(self):
  39. self.tearDownEndpoint()
  40. def test_get_existing(self):
  41. d = self.callGet(('changes', '13'))
  42. @d.addCallback
  43. def check(change):
  44. self.validateData(change)
  45. self.assertEqual(change['project'], 'world-domination')
  46. return d
  47. def test_get_missing(self):
  48. d = self.callGet(('changes', '99'))
  49. @d.addCallback
  50. def check(change):
  51. self.assertEqual(change, None)
  52. return d
  53. class ChangesEndpoint(endpoint.EndpointMixin, unittest.TestCase):
  54. endpointClass = changes.ChangesEndpoint
  55. resourceTypeClass = changes.Change
  56. def setUp(self):
  57. self.setUpEndpoint()
  58. self.db.insertTestData([
  59. fakedb.SourceStamp(id=133),
  60. fakedb.Change(changeid=13, branch=u'trunk', revision=u'9283',
  61. repository=u'svn://...', codebase=u'cbsvn',
  62. project=u'world-domination', sourcestampid=133),
  63. fakedb.SourceStamp(id=144),
  64. fakedb.Change(changeid=14, branch=u'devel', revision=u'9284',
  65. repository=u'svn://...', codebase=u'cbsvn',
  66. project=u'world-domination', sourcestampid=144),
  67. ])
  68. def tearDown(self):
  69. self.tearDownEndpoint()
  70. @defer.inlineCallbacks
  71. def test_get(self):
  72. changes = yield self.callGet(('changes',))
  73. self.validateData(changes[0])
  74. self.assertEqual(changes[0]['changeid'], 13)
  75. self.validateData(changes[1])
  76. self.assertEqual(changes[1]['changeid'], 14)
  77. @defer.inlineCallbacks
  78. def test_getRecentChanges(self):
  79. resultSpec = resultspec.ResultSpec(limit=1, order=['-changeid'])
  80. changes = yield self.callGet(('changes',), resultSpec=resultSpec)
  81. self.validateData(changes[0])
  82. self.assertEqual(changes[0]['changeid'], 14)
  83. self.assertEqual(len(changes), 1)
  84. @defer.inlineCallbacks
  85. def test_getChangesOtherOrder(self):
  86. resultSpec = resultspec.ResultSpec(limit=1, order=['-when_time_stamp'])
  87. changes = yield self.callGet(('changes',), resultSpec=resultSpec)
  88. # limit not implemented for other order
  89. self.assertEqual(len(changes), 2)
  90. @defer.inlineCallbacks
  91. def test_getChangesOtherOffset(self):
  92. resultSpec = resultspec.ResultSpec(limit=1, offset=1, order=['-changeid'])
  93. changes = yield self.callGet(('changes',), resultSpec=resultSpec)
  94. # limit not implemented for other offset
  95. self.assertEqual(len(changes), 2)
  96. class Change(interfaces.InterfaceTests, unittest.TestCase):
  97. changeEvent = {
  98. 'author': u'warner',
  99. 'branch': u'warnerdb',
  100. 'category': u'devel',
  101. 'codebase': u'',
  102. 'comments': u'fix whitespace',
  103. 'changeid': 500,
  104. 'files': [u'master/buildbot/__init__.py'],
  105. 'parent_changeids': [],
  106. 'project': u'Buildbot',
  107. 'properties': {u'foo': (20, u'Change')},
  108. 'repository': u'git://warner',
  109. 'revision': u'0e92a098b',
  110. 'revlink': u'http://warner/0e92a098b',
  111. 'when_timestamp': 256738404,
  112. 'sourcestamp': {
  113. 'branch': u'warnerdb',
  114. 'codebase': u'',
  115. 'patch': None,
  116. 'project': u'Buildbot',
  117. 'repository': u'git://warner',
  118. 'revision': u'0e92a098b',
  119. 'created_at': epoch2datetime(10000000),
  120. 'ssid': 100,
  121. },
  122. # uid
  123. }
  124. def setUp(self):
  125. self.master = fakemaster.make_master(wantMq=True, wantDb=True,
  126. wantData=True, testcase=self)
  127. self.rtype = changes.Change(self.master)
  128. def test_signature_addChange(self):
  129. @self.assertArgSpecMatches(
  130. self.master.data.updates.addChange, # fake
  131. self.rtype.addChange) # real
  132. def addChange(self, files=None, comments=None, author=None,
  133. revision=None, when_timestamp=None, branch=None, category=None,
  134. revlink=u'', properties=None, repository=u'', codebase=None,
  135. project=u'', src=None):
  136. pass
  137. def do_test_addChange(self, kwargs,
  138. expectedRoutingKey, expectedMessage, expectedRow,
  139. expectedChangeUsers=[]):
  140. clock = task.Clock()
  141. clock.advance(10000000)
  142. d = self.rtype.addChange(_reactor=clock, **kwargs)
  143. def check(changeid):
  144. self.assertEqual(changeid, 500)
  145. # check the correct message was received
  146. self.master.mq.assertProductions([
  147. (expectedRoutingKey, expectedMessage),
  148. ])
  149. # and that the correct data was inserted into the db
  150. self.master.db.changes.assertChange(500, expectedRow)
  151. self.master.db.changes.assertChangeUsers(500, expectedChangeUsers)
  152. d.addCallback(check)
  153. return d
  154. def test_addChange(self):
  155. # src and codebase are default here
  156. kwargs = dict(author=u'warner', branch=u'warnerdb',
  157. category=u'devel', comments=u'fix whitespace',
  158. files=[u'master/buildbot/__init__.py'],
  159. project=u'Buildbot', repository=u'git://warner',
  160. revision=u'0e92a098b', revlink=u'http://warner/0e92a098b',
  161. when_timestamp=256738404,
  162. properties={u'foo': 20})
  163. expectedRoutingKey = ('changes', '500', 'new')
  164. expectedMessage = self.changeEvent
  165. expectedRow = fakedb.Change(
  166. changeid=500,
  167. author='warner',
  168. comments='fix whitespace',
  169. branch='warnerdb',
  170. revision='0e92a098b',
  171. revlink='http://warner/0e92a098b',
  172. when_timestamp=256738404,
  173. category='devel',
  174. repository='git://warner',
  175. codebase='',
  176. project='Buildbot',
  177. sourcestampid=100,
  178. )
  179. return self.do_test_addChange(kwargs,
  180. expectedRoutingKey, expectedMessage, expectedRow)
  181. def test_addChange_src_codebase(self):
  182. createUserObject = mock.Mock(spec=users.createUserObject)
  183. createUserObject.return_value = defer.succeed(123)
  184. self.patch(users, 'createUserObject', createUserObject)
  185. kwargs = dict(author=u'warner', branch=u'warnerdb',
  186. category=u'devel', comments=u'fix whitespace',
  187. files=[u'master/buildbot/__init__.py'],
  188. project=u'Buildbot', repository=u'git://warner',
  189. revision=u'0e92a098b', revlink=u'http://warner/0e92a098b',
  190. when_timestamp=256738404,
  191. properties={u'foo': 20}, src=u'git', codebase=u'cb')
  192. expectedRoutingKey = ('changes', '500', 'new')
  193. expectedMessage = {
  194. 'author': u'warner',
  195. 'branch': u'warnerdb',
  196. 'category': u'devel',
  197. 'codebase': u'cb',
  198. 'comments': u'fix whitespace',
  199. 'changeid': 500,
  200. 'files': [u'master/buildbot/__init__.py'],
  201. 'parent_changeids': [],
  202. 'project': u'Buildbot',
  203. 'properties': {u'foo': (20, u'Change')},
  204. 'repository': u'git://warner',
  205. 'revision': u'0e92a098b',
  206. 'revlink': u'http://warner/0e92a098b',
  207. 'when_timestamp': 256738404,
  208. 'sourcestamp': {
  209. 'branch': u'warnerdb',
  210. 'codebase': u'cb',
  211. 'patch': None,
  212. 'project': u'Buildbot',
  213. 'repository': u'git://warner',
  214. 'revision': u'0e92a098b',
  215. 'created_at': epoch2datetime(10000000),
  216. 'ssid': 100,
  217. },
  218. # uid
  219. }
  220. expectedRow = fakedb.Change(
  221. changeid=500,
  222. author='warner',
  223. comments='fix whitespace',
  224. branch='warnerdb',
  225. revision='0e92a098b',
  226. revlink='http://warner/0e92a098b',
  227. when_timestamp=256738404,
  228. category='devel',
  229. repository='git://warner',
  230. codebase='cb',
  231. project='Buildbot',
  232. sourcestampid=100,
  233. )
  234. d = self.do_test_addChange(kwargs,
  235. expectedRoutingKey, expectedMessage, expectedRow,
  236. expectedChangeUsers=[123])
  237. @d.addCallback
  238. def check(_):
  239. createUserObject.assert_called_once_with(
  240. self.master, 'warner', 'git')
  241. return d
  242. def test_addChange_src_codebaseGenerator(self):
  243. def preChangeGenerator(**kwargs):
  244. return kwargs
  245. self.master.config = mock.Mock(name='master.config')
  246. self.master.config.preChangeGenerator = preChangeGenerator
  247. self.master.config.codebaseGenerator = \
  248. lambda change: 'cb-%s' % change['category']
  249. kwargs = dict(author=u'warner', branch=u'warnerdb',
  250. category=u'devel', comments=u'fix whitespace',
  251. files=[u'master/buildbot/__init__.py'],
  252. project=u'Buildbot', repository=u'git://warner',
  253. revision=u'0e92a098b', revlink=u'http://warner/0e92a098b',
  254. when_timestamp=256738404,
  255. properties={u'foo': 20})
  256. expectedRoutingKey = ('changes', '500', 'new')
  257. expectedMessage = {
  258. 'author': u'warner',
  259. 'branch': u'warnerdb',
  260. 'category': u'devel',
  261. 'codebase': u'cb-devel',
  262. 'comments': u'fix whitespace',
  263. 'changeid': 500,
  264. 'files': [u'master/buildbot/__init__.py'],
  265. 'parent_changeids': [],
  266. 'project': u'Buildbot',
  267. 'properties': {u'foo': (20, u'Change')},
  268. 'repository': u'git://warner',
  269. 'revision': u'0e92a098b',
  270. 'revlink': u'http://warner/0e92a098b',
  271. 'when_timestamp': 256738404,
  272. 'sourcestamp': {
  273. 'branch': u'warnerdb',
  274. 'codebase': u'cb-devel',
  275. 'patch': None,
  276. 'project': u'Buildbot',
  277. 'repository': u'git://warner',
  278. 'revision': u'0e92a098b',
  279. 'created_at': epoch2datetime(10000000),
  280. 'ssid': 100,
  281. },
  282. # uid
  283. }
  284. expectedRow = fakedb.Change(
  285. changeid=500,
  286. author='warner',
  287. comments='fix whitespace',
  288. branch='warnerdb',
  289. revision='0e92a098b',
  290. revlink='http://warner/0e92a098b',
  291. when_timestamp=256738404,
  292. category='devel',
  293. repository='git://warner',
  294. codebase='cb-devel',
  295. project='Buildbot',
  296. sourcestampid=100,
  297. )
  298. return self.do_test_addChange(kwargs,
  299. expectedRoutingKey, expectedMessage, expectedRow)