Skip to content

Commit

Permalink
Merge branch 'sse' of git://github.com/tardyp/buildbot into nine
Browse files Browse the repository at this point in the history
  • Loading branch information
djmitche committed Dec 5, 2013
2 parents a9ef2fc + 56381a3 commit 47924c1
Show file tree
Hide file tree
Showing 6 changed files with 321 additions and 66 deletions.
11 changes: 6 additions & 5 deletions common/validate.sh
Expand Up @@ -76,7 +76,6 @@ check_relnotes() {
return 0
fi
}

run_tests() {
if [ -n "${TRIALTMP}" ]; then
TEMP_DIRECTORY_OPT="--temp-directory ${TRIALTMP}"
Expand All @@ -96,8 +95,8 @@ fi

# get a list of changed files, used below; this uses a tempfile to work around
# shell behavior when piping to 'while'
tempfile=$(mktemp)
trap 'rm -f ${tempfile}' 1 2 3 15
tempfile=$(mktemp -t bbvalidate)
trap "rm -f ${tempfile}" 1 2 3 15
git diff --name-only $REVRANGE | grep '\.py$' | grep -v '\(^master/\(contrib\|docs\)\|/setup\.py\)' > ${tempfile}
py_files=()
while read line; do
Expand All @@ -109,9 +108,11 @@ git log "$REVRANGE" --pretty=oneline || exit 1

if $slow; then
status "running 'setup.py develop' for www"
(cd www; python setup.py develop 2>&1 >/dev/null) || not_ok "www/setup.py failed"
(cd www; python setup.py develop 2>&1 >/dev/null ) || not_ok "www/setup.py failed"
status "running 'grunt ci' for www"
(cd www; node_modules/.bin/grunt ci 2>&1 >/dev/null) || not_ok "grunt ci failed"
LOG=/dev/null
if [[ `uname` == "Darwin" ]] ;then LOG=/dev/stdout; fi # grunt >/dev/null hangs on osx ?!
(cd www; node_modules/.bin/grunt --no-color ci 2>&1 >$LOG ) || not_ok "grunt ci failed"
fi
if $slow; then
status "running tests"
Expand Down
53 changes: 27 additions & 26 deletions master/buildbot/test/unit/test_data_changes.py
Expand Up @@ -99,6 +99,32 @@ def test_startConsuming(self):


class Change(interfaces.InterfaceTests, unittest.TestCase):
changeEvent = {
'author': u'warner',
'branch': u'warnerdb',
'category': u'devel',
'codebase': u'',
'comments': u'fix whitespace',
'changeid': 500,
'files': [u'master/buildbot/__init__.py'],
'project': u'Buildbot',
'properties': {u'foo': (20, u'Change')},
'repository': u'git://warner',
'revision': u'0e92a098b',
'revlink': u'http://warner/0e92a098b',
'when_timestamp': 256738404,
'sourcestamp': {
'branch': u'warnerdb',
'codebase': u'',
'patch': None,
'project': u'Buildbot',
'repository': u'git://warner',
'revision': u'0e92a098b',
'created_at': 10000000,
'ssid': 100,
},
# uid
}

def setUp(self):
self.master = fakemaster.make_master(wantMq=True, wantDb=True,
Expand Down Expand Up @@ -144,32 +170,7 @@ def test_addChange(self):
when_timestamp=256738404,
properties={u'foo': 20})
expectedRoutingKey = ('change', '500', 'new')
expectedMessage = {
'author': u'warner',
'branch': u'warnerdb',
'category': u'devel',
'codebase': u'',
'comments': u'fix whitespace',
'changeid': 500,
'files': [u'master/buildbot/__init__.py'],
'project': u'Buildbot',
'properties': {u'foo': (20, u'Change')},
'repository': u'git://warner',
'revision': u'0e92a098b',
'revlink': u'http://warner/0e92a098b',
'when_timestamp': 256738404,
'sourcestamp': {
'branch': u'warnerdb',
'codebase': u'',
'patch': None,
'project': u'Buildbot',
'repository': u'git://warner',
'revision': u'0e92a098b',
'created_at': 10000000,
'ssid': 100,
},
# uid
}
expectedMessage = self.changeEvent
expectedRow = fakedb.Change(
changeid=500,
author='warner',
Expand Down
127 changes: 127 additions & 0 deletions master/buildbot/test/unit/test_www_sse.py
@@ -0,0 +1,127 @@
# This file is part of Buildbot. Buildbot is free software: you can
# redistribute it and/or modify it under the terms of the GNU General Public
# License as published by the Free Software Foundation, version 2.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Software Foundation, Inc., 51
# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Copyright Buildbot Team Members

from buildbot.test.unit import test_data_changes
from buildbot.test.util import www
from buildbot.util import json
from buildbot.www import sse
from twisted.trial import unittest


class EventResource(www.WwwTestMixin, unittest.TestCase):

def setUp(self):
self.master = master = self.make_master(url='h:/a/b/')
self.sse = sse.EventResource(master)

def test_oldapi(self):
self.render_resource(self.sse, '/change')
self.readUUID(self.request)
self.assertReceivesChangeNewMessage(self.request)
self.assertEqual(self.request.finished, False)

def test_listen(self):
self.render_resource(self.sse, '/listen/change')
self.readUUID(self.request)
self.assertReceivesChangeNewMessage(self.request)
self.assertEqual(self.request.finished, False)

def test_listen_add_then_close(self):
self.render_resource(self.sse, '/listen')
request = self.request
self.request = None
uuid = self.readUUID(request)
self.render_resource(self.sse, '/add/' + uuid + "/change")
self.assertReceivesChangeNewMessage(request)
self.assertEqual(self.request.finished, True)
self.assertEqual(request.finished, False)
request.finish() # fake close connection on client side
self.assertRaises(AssertionError, self.assertReceivesChangeNewMessage, request)

def test_listen_add_then_remove(self):
self.render_resource(self.sse, '/listen')
request = self.request
uuid = self.readUUID(request)
self.render_resource(self.sse, '/add/' + uuid + "/change")
self.assertReceivesChangeNewMessage(request)
self.assertEqual(request.finished, False)
self.render_resource(self.sse, '/remove/' + uuid + "/change")
self.assertRaises(AssertionError, self.assertReceivesChangeNewMessage, request)

def test_listen_add_nouuid(self):
self.render_resource(self.sse, '/listen')
request = self.request
self.readUUID(request)
self.render_resource(self.sse, '/add/')
self.assertEqual(self.request.finished, True)
self.assertEqual(self.request.responseCode, 400)
self.assertIn("need uuid", self.request.written)

def test_listen_add_baduuid(self):
self.render_resource(self.sse, '/listen')
request = self.request
self.readUUID(request)
self.render_resource(self.sse, '/add/foo')
self.assertEqual(self.request.finished, True)
self.assertEqual(self.request.responseCode, 400)
self.assertIn("unknown uuid", self.request.written)

def test_listen_add_badevent(self):
self.render_resource(self.sse, '/listen')
request = self.request
uuid = self.readUUID(request)
self.render_resource(self.sse, '/add/' + uuid + '/foo')
self.assertEqual(self.request.finished, True)
self.assertEqual(self.request.responseCode, 404)
self.assertIn("not implemented", self.request.written)

def test_listen_add_then_remove_bad_event(self):
self.render_resource(self.sse, '/listen')
request = self.request
uuid = self.readUUID(request)
self.render_resource(self.sse, '/add/' + uuid + "/change")
self.assertReceivesChangeNewMessage(request)
self.assertEqual(request.finished, False)
self.render_resource(self.sse, '/remove/' + uuid + "/foo")
self.assertEqual(self.request.responseCode, 404)
self.assertIn("consumer is not listening to this event", self.request.written)

def readEvent(self, request):
kw = {}
hasEmptyLine = False
for line in request.written.splitlines():
if line.find(":") > 0:
k, v = line.split(": ", 1)
self.assertTrue(k not in kw, k + " in " + str(kw))
kw[k] = v
else:
self.assertEqual(line, "")
hasEmptyLine = True
request.written = ""
self.assertTrue(hasEmptyLine)
return kw

def readUUID(self, request):
kw = self.readEvent(request)
self.assertEqual(kw["event"], "handshake")
return kw["data"]

def assertReceivesChangeNewMessage(self, request):
self.master.mq.callConsumer(("change", "500", "new"), test_data_changes.Change.changeEvent)
kw = self.readEvent(request)
self.assertEqual(kw["event"], "event")
msg = json.loads(kw["data"])
self.assertEqual(msg["key"], [u'change', u'500', u'new'])
self.assertEqual(msg["message"], json.loads(json.dumps(test_data_changes.Change.changeEvent)))
13 changes: 12 additions & 1 deletion master/buildbot/test/util/www.py
Expand Up @@ -75,6 +75,15 @@ def getHeader(self, key):
def processingFailed(self, f):
self.deferred.errback(f)

def notifyFinish(self):
d = defer.Deferred()

@self.deferred.addBoth
def finished(res):
d.callback(res)
return res
return d


class RequiresWwwMixin(object):
# mix this into a TestCase to skip if buildbot-www is not installed
Expand Down Expand Up @@ -116,7 +125,9 @@ def render_resource(self, rsrc, path='/', accept=None, method='GET',

rv = rsrc.render(request)
if rv != server.NOT_DONE_YET:
return defer.succeed(rv)
if rv is not None:
request.write(rv)
request.finish()
return request.deferred

def render_control_resource(self, rsrc, path='/', params={},
Expand Down

0 comments on commit 47924c1

Please sign in to comment.