PageRenderTime 25ms CodeModel.GetById 10ms RepoModel.GetById 0ms app.codeStats 0ms

/master/buildbot/test/unit/test_scripts_create_master.py

https://gitlab.com/murder187ss/buildbot
Python | 244 lines | 180 code | 43 blank | 21 comment | 7 complexity | db9a2488864dcb15a7c61694ec9c7a1e 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. from future.utils import itervalues
  16. import os
  17. import mock
  18. from twisted.internet import defer
  19. from twisted.trial import unittest
  20. from buildbot.db import connector
  21. from buildbot.db import model
  22. from buildbot.scripts import create_master
  23. from buildbot.test.util import dirs
  24. from buildbot.test.util import misc
  25. from buildbot.test.util import www
  26. def mkconfig(**kwargs):
  27. config = dict(force=False, relocatable=False, config='master.cfg',
  28. db='sqlite:///state.sqlite', basedir=os.path.abspath('basedir'),
  29. quiet=False, **{'no-logrotate': False, 'log-size': 10000000,
  30. 'log-count': 10})
  31. config.update(kwargs)
  32. return config
  33. class TestCreateMaster(misc.StdoutAssertionsMixin, unittest.TestCase):
  34. def setUp(self):
  35. # createMaster is decorated with @in_reactor, so strip that decoration
  36. # since the master is already running
  37. self.patch(create_master, 'createMaster',
  38. create_master.createMaster._orig)
  39. self.setUpStdoutAssertions()
  40. # tests
  41. def do_test_createMaster(self, config):
  42. # mock out everything that createMaster calls, then check that
  43. # they are called, in order
  44. functions = ['makeBasedir', 'makeTAC', 'makeSampleConfig',
  45. 'makePublicHtml', 'createDB']
  46. repls = {}
  47. calls = []
  48. for fn in functions:
  49. repl = repls[fn] = mock.Mock(name=fn)
  50. repl.side_effect = lambda config, fn=fn: calls.append(fn)
  51. self.patch(create_master, fn, repl)
  52. repls['createDB'].side_effect = (lambda config:
  53. calls.append(fn) or defer.succeed(None))
  54. d = create_master.createMaster(config)
  55. @d.addCallback
  56. def check(rc):
  57. self.assertEqual(rc, 0)
  58. self.assertEqual(calls, functions)
  59. for repl in itervalues(repls):
  60. repl.assert_called_with(config)
  61. return d
  62. def test_createMaster_quiet(self):
  63. d = self.do_test_createMaster(mkconfig(quiet=True))
  64. @d.addCallback
  65. def check(_):
  66. self.assertWasQuiet()
  67. return d
  68. def test_createMaster_loud(self):
  69. d = self.do_test_createMaster(mkconfig(quiet=False))
  70. @d.addCallback
  71. def check(_):
  72. self.assertInStdout('buildmaster configured in')
  73. return d
  74. class TestCreateMasterFunctions(www.WwwTestMixin, dirs.DirsMixin,
  75. misc.StdoutAssertionsMixin, unittest.TestCase):
  76. def setUp(self):
  77. self.setUpDirs('test')
  78. self.basedir = os.path.abspath(os.path.join('test', 'basedir'))
  79. self.setUpStdoutAssertions()
  80. def tearDown(self):
  81. self.tearDownDirs()
  82. def assertInTacFile(self, str):
  83. self.assertIn(str,
  84. open(os.path.join('test', 'buildbot.tac'), 'rt').read())
  85. def assertNotInTacFile(self, str):
  86. self.assertNotIn(str,
  87. open(os.path.join('test', 'buildbot.tac'), 'rt').read())
  88. def assertDBSetup(self, basedir=None, db_url='sqlite:///state.sqlite',
  89. verbose=True):
  90. # mock out the database setup
  91. self.db = mock.Mock()
  92. self.db.setup.side_effect = lambda *a, **k: defer.succeed(None)
  93. self.DBConnector = mock.Mock()
  94. self.DBConnector.return_value = self.db
  95. self.patch(connector, 'DBConnector', self.DBConnector)
  96. basedir = basedir or self.basedir
  97. self.assertEqual(
  98. dict(basedir=self.DBConnector.call_args[0][1],
  99. db_url=self.DBConnector.call_args[0][0].mkconfig.db['db_url'],
  100. verbose=self.db.setup.call_args[1]['verbose'],
  101. check_version=self.db.setup.call_args[1]['check_version'],
  102. ),
  103. dict(basedir=self.basedir,
  104. db_url=db_url,
  105. verbose=True,
  106. check_version=False))
  107. # tests
  108. def test_makeBasedir(self):
  109. self.assertFalse(os.path.exists(self.basedir))
  110. create_master.makeBasedir(mkconfig(basedir=self.basedir))
  111. self.assertTrue(os.path.exists(self.basedir))
  112. self.assertInStdout('mkdir %s' % (self.basedir,))
  113. def test_makeBasedir_quiet(self):
  114. self.assertFalse(os.path.exists(self.basedir))
  115. create_master.makeBasedir(mkconfig(basedir=self.basedir, quiet=True))
  116. self.assertTrue(os.path.exists(self.basedir))
  117. self.assertWasQuiet()
  118. def test_makeBasedir_existing(self):
  119. os.mkdir(self.basedir)
  120. create_master.makeBasedir(mkconfig(basedir=self.basedir))
  121. self.assertInStdout('updating existing installation')
  122. def test_makeTAC(self):
  123. create_master.makeTAC(mkconfig(basedir='test'))
  124. self.assertInTacFile("Application('buildmaster')")
  125. self.assertWasQuiet()
  126. def test_makeTAC_relocatable(self):
  127. create_master.makeTAC(mkconfig(basedir='test', relocatable=True))
  128. self.assertInTacFile("basedir = '.'") # repr() prefers ''
  129. self.assertWasQuiet()
  130. def test_makeTAC_no_logrotate(self):
  131. create_master.makeTAC(mkconfig(basedir='test', **{'no-logrotate': True}))
  132. self.assertNotInTacFile("import Log")
  133. self.assertWasQuiet()
  134. def test_makeTAC_int_log_count(self):
  135. create_master.makeTAC(mkconfig(basedir='test', **{'log-count': 30}))
  136. self.assertInTacFile("\nmaxRotatedFiles = 30\n")
  137. self.assertWasQuiet()
  138. def test_makeTAC_str_log_count(self):
  139. self.assertRaises(TypeError,
  140. create_master.makeTAC,
  141. mkconfig(basedir='test', **{'log-count': '30'}))
  142. def test_makeTAC_none_log_count(self):
  143. create_master.makeTAC(mkconfig(basedir='test', **{'log-count': None}))
  144. self.assertInTacFile("\nmaxRotatedFiles = None\n")
  145. self.assertWasQuiet()
  146. def test_makeTAC_int_log_size(self):
  147. create_master.makeTAC(mkconfig(basedir='test', **{'log-size': 3000}))
  148. self.assertInTacFile("\nrotateLength = 3000\n")
  149. self.assertWasQuiet()
  150. def test_makeTAC_str_log_size(self):
  151. self.assertRaises(TypeError,
  152. create_master.makeTAC,
  153. mkconfig(basedir='test', **{'log-size': '3000'}))
  154. def test_makeTAC_existing_incorrect(self):
  155. with open(os.path.join('test', 'buildbot.tac'), 'wt') as f:
  156. f.write('WRONG')
  157. create_master.makeTAC(mkconfig(basedir='test'))
  158. self.assertInTacFile("WRONG")
  159. self.assertTrue(os.path.exists(
  160. os.path.join('test', 'buildbot.tac.new')))
  161. self.assertInStdout('not touching existing buildbot.tac')
  162. def test_makeTAC_existing_incorrect_quiet(self):
  163. with open(os.path.join('test', 'buildbot.tac'), 'wt') as f:
  164. f.write('WRONG')
  165. create_master.makeTAC(mkconfig(basedir='test', quiet=True))
  166. self.assertInTacFile("WRONG")
  167. self.assertWasQuiet()
  168. def test_makeTAC_existing_correct(self):
  169. create_master.makeTAC(mkconfig(basedir='test', quiet=True))
  170. create_master.makeTAC(mkconfig(basedir='test'))
  171. self.assertFalse(os.path.exists(
  172. os.path.join('test', 'buildbot.tac.new')))
  173. self.assertInStdout('and is correct')
  174. def test_makeSampleConfig(self):
  175. create_master.makeSampleConfig(mkconfig(basedir='test'))
  176. self.assertTrue(os.path.exists(
  177. os.path.join('test', 'master.cfg.sample')))
  178. self.assertInStdout('creating ')
  179. def test_makeSampleConfig_db(self):
  180. create_master.makeSampleConfig(mkconfig(basedir='test', db='XXYYZZ',
  181. quiet=True))
  182. with open(os.path.join('test', 'master.cfg.sample'), 'rt') as f:
  183. self.assertIn("XXYYZZ", f.read())
  184. self.assertWasQuiet()
  185. def test_makePublicHtml(self):
  186. create_master.makePublicHtml(mkconfig(basedir='test', quiet=True))
  187. self.assertTrue(os.path.exists(
  188. os.path.join('test', 'public_html')))
  189. self.assertWasQuiet()
  190. @defer.inlineCallbacks
  191. def test_createDB(self):
  192. setup = mock.Mock(side_effect=lambda **kwargs: defer.succeed(None))
  193. self.patch(connector.DBConnector, 'setup', setup)
  194. upgrade = mock.Mock(side_effect=lambda **kwargs: defer.succeed(None))
  195. self.patch(model.Model, 'upgrade', upgrade)
  196. yield create_master.createDB(
  197. mkconfig(basedir='test', quiet=True),
  198. _noMonkey=True)
  199. setup.asset_called_with(check_version=False, verbose=False)
  200. upgrade.assert_called_with()
  201. self.assertWasQuiet()