Skip to content

Commit

Permalink
move versions to www/config. add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
chase committed Mar 10, 2015
1 parent 499877c commit e58347f
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 10 deletions.
18 changes: 12 additions & 6 deletions master/buildbot/config.py
Expand Up @@ -616,13 +616,19 @@ def load_www(self, filename, config_dict):
error("unknown www configuration parameter(s) %s" %
(', '.join(unknown),))

if www_cfg.get('versions') is None:
www_cfg['versions'] = []
versions = www_cfg.get('versions')

if not isinstance(www_cfg['versions'], list):
error("'versions' must be a list of tuples")

www_cfg['versions'] = self.getEnvironmentVersions() + www_cfg['versions']
if versions is not None:
cleaned_versions = []
if not isinstance(versions, list):
error('Invalid www configuration value of versions')
else:
for i, v in enumerate(versions):
if not isinstance(v, tuple) or len(v) < 2:
error('Invalid www configuration value of versions')
break
cleaned_versions.append(v)
www_cfg['versions'] = cleaned_versions

self.www.update(www_cfg)

Expand Down
25 changes: 25 additions & 0 deletions master/buildbot/test/unit/test_config.py
Expand Up @@ -853,6 +853,31 @@ def test_load_www_logfileName(self):
avatar_methods={'name': 'gravatar'},
logfileName='http-access.log'))

def test_load_www_versions(self):
custom_versions = [
('Test Custom Component', '0.0.1'),
('Test Custom Component 2', '0.1.0'),
]
self.cfg.load_www(self.filename, {'www': dict(versions=custom_versions)})
self.assertResults(www=dict(port=None,
plugins={}, auth={'name': 'NoAuth'},
avatar_methods={'name': 'gravatar'},
versions=custom_versions,
logfileName='http.log'))

def test_load_www_versions_not_list(self):
custom_versions = {
'Test Custom Component': '0.0.1',
'Test Custom Component 2': '0.0.2',
}
self.cfg.load_www(self.filename, {'www': dict(versions=custom_versions)})
self.assertConfigError(self.errors, 'Invalid www configuration value of versions')

def test_load_www_versions_value_invalid(self):
custom_versions = [('a', '1'), 'abc', ('b',)]
self.cfg.load_www(self.filename, {'www': dict(versions=custom_versions)})
self.assertConfigError(self.errors, 'Invalid www configuration value of versions')

def test_load_www_unknown(self):
self.cfg.load_www(self.filename,
dict(www=dict(foo="bar")))
Expand Down
17 changes: 13 additions & 4 deletions master/buildbot/test/unit/test_www_config.py
Expand Up @@ -14,6 +14,7 @@
# Copyright Buildbot Team Members

import mock
import json

from buildbot.test.util import www
from buildbot.www import auth
Expand All @@ -28,26 +29,34 @@ class IndexResource(www.WwwTestMixin, unittest.TestCase):
def test_render(self):
_auth = auth.NoAuth()
_auth.maybeAutoLogin = mock.Mock()
master = self.make_master(url='h:/a/b/', auth=_auth)

custom_versions = [('test compoent', '0.1.2'), ('test component 2', '0.2.1')]

master = self.make_master(url='h:/a/b/', auth=_auth, versions=custom_versions)
rsrc = config.IndexResource(master, "foo")
rsrc.reconfigResource(master.config)
rsrc.jinja = mock.Mock()
template = mock.Mock()
rsrc.jinja.get_template = lambda x: template
template.render = lambda configjson, config: configjson

vjson = json.dumps([] + rsrc.env_versions + custom_versions)

res = yield self.render_resource(rsrc, '/')
_auth.maybeAutoLogin.assert_called_with(mock.ANY)
exp = '{"titleURL": "http://buildbot.net", "title": "Buildbot", "auth": {"name": "NoAuth"}, "user": {"anonymous": true}, "buildbotURL": "h:/a/b/", "multiMaster": false, "port": null}'
exp = '{"titleURL": "http://buildbot.net", "versions": %s, "title": "Buildbot", "auth": {"name": "NoAuth"}, "user": {"anonymous": true}, "buildbotURL": "h:/a/b/", "multiMaster": false, "port": null}'
exp = exp % vjson
self.assertIn(res, exp)

master.session.user_info = dict(name="me", email="me@me.org")
res = yield self.render_resource(rsrc, '/')
exp = '{"titleURL": "http://buildbot.net", "title": "Buildbot", "auth": {"name": "NoAuth"}, "user": {"email": "me@me.org", "name": "me"}, "buildbotURL": "h:/a/b/", "multiMaster": false, "port": null}'
exp = '{"titleURL": "http://buildbot.net", "versions": %s, "title": "Buildbot", "auth": {"name": "NoAuth"}, "user": {"email": "me@me.org", "name": "me"}, "buildbotURL": "h:/a/b/", "multiMaster": false, "port": null}'
exp = exp % vjson
self.assertIn(res, exp)

master = self.make_master(url='h:/a/c/', auth=_auth)
rsrc.reconfigResource(master.config)
res = yield self.render_resource(rsrc, '/')
exp = '{"titleURL": "http://buildbot.net", "title": "Buildbot", "auth": {"name": "NoAuth"}, "user": {"anonymous": true}, "buildbotURL": "h:/a/b/", "multiMaster": false, "port": null}'
exp = '{"titleURL": "http://buildbot.net", "title": "Buildbot", "versions": %s, "auth": {"name": "NoAuth"}, "user": {"anonymous": true}, "buildbotURL": "h:/a/b/", "multiMaster": false, "port": null}'
exp = exp % vjson
self.assertIn(res, exp)
28 changes: 28 additions & 0 deletions master/buildbot/www/config.py
Expand Up @@ -30,13 +30,32 @@ def __init__(self, master, staticdir):
resource.Resource.__init__(self, master)
loader = jinja2.FileSystemLoader(staticdir)
self.jinja = jinja2.Environment(loader=loader, undefined=jinja2.StrictUndefined)
self.env_versions = self.getEnvironmentVersions()

def reconfigResource(self, new_config):
self.config = new_config.www

def render_GET(self, request):
return self.asyncRenderHelper(request, self.renderIndex)

def getEnvironmentVersions(self):
import sys
import twisted
from buildbot import version as bbversion

pyversion = '.'.join(map(str, sys.version_info[:3]))

tx_version_info= (twisted.version.major,
twisted.version.minor,
twisted.version.micro)
txversion = '.'.join(map(str, tx_version_info))

return [
('Python version', pyversion),
('Buildbot version', bbversion),
('Twisted version', txversion),
]

@defer.inlineCallbacks
def renderIndex(self, request):
config = {}
Expand All @@ -53,11 +72,20 @@ def renderIndex(self, request):
config.update({"user": session.user_info})
else:
config.update({"user": {"anonymous": True}})

www = self.master.config.www
versions = []
versions += self.env_versions

if isinstance(www.get('versions'), list):
versions += www['versions']

config.update(self.config)
config['buildbotURL'] = self.master.config.buildbotURL
config['title'] = self.master.config.title
config['titleURL'] = self.master.config.titleURL
config['multiMaster'] = self.master.config.multiMaster
config['versions'] = versions

def toJson(obj):
obj = IConfigured(obj).getConfigDict()
Expand Down

0 comments on commit e58347f

Please sign in to comment.