You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by be...@apache.org on 2011/06/05 10:41:53 UTC
svn commit: r1132103 [2/2] - in /incubator/mesos/trunk/src: ./ master/
slave/ webui/bottle-0.5.6/ webui/bottle-0.5.6/test/ webui/bottle-0.8.3/
webui/bottle-0.8.3/test/ webui/bottle-0.8.3/test/views/ webui/master/
webui/slave/
Added: incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_environ.py
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_environ.py?rev=1132103&view=auto
==============================================================================
--- incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_environ.py (added)
+++ incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_environ.py Sun Jun 5 08:41:52 2011
@@ -0,0 +1,241 @@
+# -*- coding: utf-8 -*-
+import unittest
+import sys, os.path
+from bottle import request, response
+import tools
+from tools import tob
+import wsgiref.util
+
+class TestEnviron(unittest.TestCase):
+ def test_path(self):
+ """ Environ: PATH_INFO """
+ t = dict()
+ t[''] = '/'
+ t['bla'] = '/bla'
+ t['bla/'] = '/bla/'
+ t['/bla'] = '/bla'
+ t['/bla/'] = '/bla/'
+ for k, v in t.iteritems():
+ request.bind({'PATH_INFO': k}, None)
+ self.assertEqual(v, request.path)
+ request.bind({}, None)
+ self.assertEqual('/', request.path)
+
+ def test_pathshift(self):
+ """ Environ: Request.path_shift() """
+ def test_shift(s, p, c):
+ request.bind({'SCRIPT_NAME': s, 'PATH_INFO': p})
+ request.path_shift(c)
+ return [request['SCRIPT_NAME'], request.path]
+ self.assertEqual(['/a/b', '/c/d'], test_shift('/a/b', '/c/d', 0))
+ self.assertEqual(['/a/b', '/c/d/'], test_shift('/a/b', '/c/d/', 0))
+ self.assertEqual(['/a/b/c', '/d'], test_shift('/a/b', '/c/d', 1))
+ self.assertEqual(['/a', '/b/c/d'], test_shift('/a/b', '/c/d', -1))
+ self.assertEqual(['/a/b/c', '/d/'], test_shift('/a/b', '/c/d/', 1))
+ self.assertEqual(['/a', '/b/c/d/'], test_shift('/a/b', '/c/d/', -1))
+ self.assertEqual(['/a/b/c', '/d/'], test_shift('/a/b/', '/c/d/', 1))
+ self.assertEqual(['/a', '/b/c/d/'], test_shift('/a/b/', '/c/d/', -1))
+ self.assertEqual(['/a/b/c/d', '/'], test_shift('/', '/a/b/c/d', 4))
+ self.assertEqual(['/', '/a/b/c/d/'], test_shift('/a/b/c/d', '/', -4))
+ self.assertRaises(AssertionError, test_shift, '/a/b', '/c/d', 3)
+ self.assertRaises(AssertionError, test_shift, '/a/b', '/c/d', -3)
+
+ def test_url(self):
+ """ Environ: URL building """
+ request.bind({'HTTP_HOST':'example.com'}, None)
+ self.assertEqual('http://example.com/', request.url)
+ request.bind({'SERVER_NAME':'example.com'}, None)
+ self.assertEqual('http://example.com/', request.url)
+ request.bind({'SERVER_NAME':'example.com', 'SERVER_PORT':'81'}, None)
+ self.assertEqual('http://example.com:81/', request.url)
+ request.bind({'wsgi.url_scheme':'https', 'SERVER_NAME':'example.com'}, None)
+ self.assertEqual('https://example.com:80/', request.url)
+ request.bind({'HTTP_HOST':'example.com', 'PATH_INFO':'/path', 'QUERY_STRING':'1=b&c=d', 'SCRIPT_NAME':'/sp'}, None)
+ self.assertEqual('http://example.com/sp/path?1=b&c=d', request.url)
+
+ def test_dict_access(self):
+ """ Environ: request objects are environment dicts """
+ e = {}
+ wsgiref.util.setup_testing_defaults(e)
+ request.bind(e, None)
+ self.assertEqual(list(request), e.keys())
+ self.assertEqual(len(request), len(e))
+ for k, v in e.iteritems():
+ self.assertTrue(k in request)
+ self.assertEqual(request[k], v)
+ request[k] = 'test'
+ self.assertEqual(request[k], 'test')
+ del request['PATH_INFO']
+ self.assertTrue('PATH_INFO' not in request)
+
+ def test_header_access(self):
+ """ Environ: Request objects decode headers """
+ e = {}
+ wsgiref.util.setup_testing_defaults(e)
+ e['HTTP_SOME_HEADER'] = 'some value'
+ request.bind(e, None)
+ request['HTTP_SOME_OTHER_HEADER'] = 'some other value'
+ self.assertTrue('Some-Header' in request.header)
+ self.assertTrue(request.header['Some-Header'] == 'some value')
+ self.assertTrue(request.header['Some-Other-Header'] == 'some other value')
+
+ def test_cookie(self):
+ """ Environ: COOKIES """
+ t = dict()
+ t['a=a'] = {'a': 'a'}
+ t['a=a; b=b'] = {'a': 'a', 'b':'b'}
+ t['a=a; a=b'] = {'a': 'b'}
+ for k, v in t.iteritems():
+ request.bind({'HTTP_COOKIE': k}, None)
+ self.assertEqual(v, request.COOKIES)
+
+ def test_get(self):
+ """ Environ: GET data """
+ e = {}
+ e['QUERY_STRING'] = 'a=a&a=1&b=b&c=c'
+ request.bind(e, None)
+ self.assertTrue('a' in request.GET)
+ self.assertTrue('b' in request.GET)
+ self.assertEqual(['a','1'], request.GET.getall('a'))
+ self.assertEqual(['b'], request.GET.getall('b'))
+ self.assertEqual('1', request.GET['a'])
+ self.assertEqual('b', request.GET['b'])
+
+ def test_post(self):
+ """ Environ: POST data """
+ sq = u'a=a&a=1&b=b&c=&d'.encode('utf8')
+ e = {}
+ wsgiref.util.setup_testing_defaults(e)
+ e['wsgi.input'].write(sq)
+ e['wsgi.input'].seek(0)
+ e['CONTENT_LENGTH'] = str(len(sq))
+ e['REQUEST_METHOD'] = "POST"
+ request.bind(e, None)
+ self.assertTrue('a' in request.POST)
+ self.assertTrue('b' in request.POST)
+ self.assertEqual(['a','1'], request.POST.getall('a'))
+ self.assertEqual(['b'], request.POST.getall('b'))
+ self.assertEqual('1', request.POST['a'])
+ self.assertEqual('b', request.POST['b'])
+ self.assertEqual('', request.POST['c'])
+ self.assertEqual('', request.POST['d'])
+
+ def test_bodypost(self):
+ sq = u'foobar'.encode('utf8')
+ e = {}
+ wsgiref.util.setup_testing_defaults(e)
+ e['wsgi.input'].write(sq)
+ e['wsgi.input'].seek(0)
+ e['CONTENT_LENGTH'] = str(len(sq))
+ e['REQUEST_METHOD'] = "POST"
+ request.bind(e, None)
+ self.assertEqual('', request.POST['foobar'])
+
+ def test_body_noclose(self):
+ """ Test that the body file handler is not closed after request.POST """
+ sq = u'a=a&a=1&b=b&c=&d'.encode('utf8')
+ e = {}
+ wsgiref.util.setup_testing_defaults(e)
+ e['wsgi.input'].write(sq)
+ e['wsgi.input'].seek(0)
+ e['CONTENT_LENGTH'] = str(len(sq))
+ e['REQUEST_METHOD'] = "POST"
+ request.bind(e, None)
+ self.assertEqual(sq, request.body.read())
+ request.POST # This caused a body.close() with Python 3.x
+ self.assertEqual(sq, request.body.read())
+
+ def test_params(self):
+ """ Environ: GET and POST are combined in request.param """
+ e = {}
+ wsgiref.util.setup_testing_defaults(e)
+ e['wsgi.input'].write(tob('b=b&c=p'))
+ e['wsgi.input'].seek(0)
+ e['CONTENT_LENGTH'] = '7'
+ e['QUERY_STRING'] = 'a=a&c=g'
+ e['REQUEST_METHOD'] = "POST"
+ request.bind(e, None)
+ self.assertEqual(['a','b','c'], sorted(request.params.keys()))
+ self.assertEqual('p', request.params['c'])
+
+ def test_getpostleak(self):
+ """ Environ: GET and POST sh0uld not leak into each other """
+ e = {}
+ wsgiref.util.setup_testing_defaults(e)
+ e['wsgi.input'].write(u'b=b'.encode('utf8'))
+ e['wsgi.input'].seek(0)
+ e['CONTENT_LENGTH'] = '3'
+ e['QUERY_STRING'] = 'a=a'
+ e['REQUEST_METHOD'] = "POST"
+ request.bind(e, None)
+ self.assertEqual(['a'], request.GET.keys())
+ self.assertEqual(['b'], request.POST.keys())
+
+ def test_body(self):
+ """ Environ: Request.body should behave like a file object factory """
+ e = {}
+ wsgiref.util.setup_testing_defaults(e)
+ e['wsgi.input'].write(u'abc'.encode('utf8'))
+ e['wsgi.input'].seek(0)
+ e['CONTENT_LENGTH'] = str(3)
+ request.bind(e, None)
+ self.assertEqual(u'abc'.encode('utf8'), request.body.read())
+ self.assertEqual(u'abc'.encode('utf8'), request.body.read(3))
+ self.assertEqual(u'abc'.encode('utf8'), request.body.readline())
+ self.assertEqual(u'abc'.encode('utf8'), request.body.readline(3))
+
+ def test_bigbody(self):
+ """ Environ: Request.body should handle big uploads using files """
+ e = {}
+ wsgiref.util.setup_testing_defaults(e)
+ e['wsgi.input'].write((u'x'*1024*1000).encode('utf8'))
+ e['wsgi.input'].seek(0)
+ e['CONTENT_LENGTH'] = str(1024*1000)
+ request.bind(e, None)
+ self.assertTrue(hasattr(request.body, 'fileno'))
+ self.assertEqual(1024*1000, len(request.body.read()))
+ self.assertEqual(1024, len(request.body.read(1024)))
+ self.assertEqual(1024*1000, len(request.body.readline()))
+ self.assertEqual(1024, len(request.body.readline(1024)))
+
+ def test_tobigbody(self):
+ """ Environ: Request.body should truncate to Content-Length bytes """
+ e = {}
+ wsgiref.util.setup_testing_defaults(e)
+ e['wsgi.input'].write((u'x'*1024).encode('utf8'))
+ e['wsgi.input'].seek(0)
+ e['CONTENT_LENGTH'] = '42'
+ request.bind(e, None)
+ self.assertEqual(42, len(request.body.read()))
+ self.assertEqual(42, len(request.body.read(1024)))
+ self.assertEqual(42, len(request.body.readline()))
+ self.assertEqual(42, len(request.body.readline(1024)))
+
+class TestMultipart(unittest.TestCase):
+ def test_multipart(self):
+ """ Environ: POST (multipart files and multible values per key) """
+ fields = [('field1','value1'), ('field2','value2'), ('field2','value3')]
+ files = [('file1','filename1.txt','content1'), ('file2','filename2.py',u'ä\nö\rü')]
+ e = tools.multipart_environ(fields=fields, files=files)
+ request.bind(e, None)
+ # File content
+ self.assertTrue('file1' in request.POST)
+ self.assertEqual('content1', request.POST['file1'].file.read())
+ # File name and meta data
+ self.assertTrue('file2' in request.POST)
+ self.assertEqual('filename2.py', request.POST['file2'].filename)
+ # UTF-8 files
+ x = request.POST['file2'].file.read()
+ if sys.version_info >= (3,0,0):
+ x = x.encode('ISO-8859-1')
+ self.assertEqual(u'ä\nö\rü'.encode('utf8'), x)
+ # No file
+ self.assertTrue('file3' not in request.POST)
+ # Field (single)
+ self.assertEqual('value1', request.POST['field1'])
+ # Field (multi)
+ self.assertEqual(2, len(request.POST.getall('field2')))
+ self.assertEqual(['value2', 'value3'], request.POST.getall('field2'))
+
+if __name__ == '__main__':
+ unittest.main()
Propchange: incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_environ.py
------------------------------------------------------------------------------
svn:executable = *
Added: incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_jinja2.py
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_jinja2.py?rev=1132103&view=auto
==============================================================================
--- incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_jinja2.py (added)
+++ incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_jinja2.py Sun Jun 5 08:41:52 2011
@@ -0,0 +1,61 @@
+# -*- coding: utf-8 -*-
+import unittest
+from bottle import Jinja2Template
+
+
+class TestJinja2Template(unittest.TestCase):
+
+ def test_string(self):
+ """ Templates: Jinja2 string"""
+ t = Jinja2Template('start {{var}} end').render(var='var')
+ self.assertEqual('start var end', ''.join(t))
+
+ def test_file(self):
+ """ Templates: Jinja2 file"""
+ t = Jinja2Template(name='./views/jinja2_simple.tpl').render(var='var')
+ self.assertEqual('start var end', ''.join(t))
+
+ def test_name(self):
+ """ Templates: Jinja2 lookup by name """
+ t = Jinja2Template(name='jinja2_simple', lookup=['./views/']).render(var='var')
+ self.assertEqual('start var end', ''.join(t))
+
+ def test_notfound(self):
+ """ Templates: Unavailable templates"""
+ self.assertRaises(Exception, Jinja2Template, name="abcdef")
+
+ def test_error(self):
+ """ Templates: Exceptions"""
+ self.assertRaises(Exception, Jinja2Template, '{% for badsyntax')
+
+ def test_inherit(self):
+ """ Templates: Jinja2 lookup and inherience """
+ t = Jinja2Template(name='jinja2_inherit', lookup=['./views/']).render()
+ self.assertEqual('begin abc end', ''.join(t))
+
+ def test_custom_filters(self):
+ """Templates: jinja2 custom filters """
+ from bottle import jinja2_template as template
+ settings = dict(filters = {"star": lambda var: u"".join((u'*', var, u'*'))})
+ t = Jinja2Template("start {{var|star}} end", **settings)
+ self.assertEqual("start *var* end", t.render(var="var"))
+
+ def test_custom_tests(self):
+ """Templates: jinja2 custom tests """
+ from bottle import jinja2_template as template
+ TEMPL = u"""{% if var is even %}gerade{% else %}ungerade{% endif %}"""
+ settings = dict(tests={"even": lambda x: False if x % 2 else True})
+ t = Jinja2Template(TEMPL, **settings)
+ self.assertEqual("gerade", t.render(var=2))
+ self.assertEqual("ungerade", t.render(var=1))
+
+
+try:
+ import jinja2
+except ImportError:
+ print "WARNING: No Jinja2 template support. Skipping tests."
+ del TestJinja2Template
+
+if __name__ == '__main__':
+ unittest.main()
+
Added: incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_mako.py
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_mako.py?rev=1132103&view=auto
==============================================================================
--- incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_mako.py (added)
+++ incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_mako.py Sun Jun 5 08:41:52 2011
@@ -0,0 +1,45 @@
+import unittest
+from bottle import MakoTemplate
+
+class TestMakoTemplate(unittest.TestCase):
+ def test_string(self):
+ """ Templates: Mako string"""
+ t = MakoTemplate('start ${var} end').render(var='var')
+ self.assertEqual('start var end', ''.join(t))
+
+ def test_file(self):
+ """ Templates: Mako file"""
+ t = MakoTemplate(name='./views/mako_simple.tpl').render(var='var')
+ self.assertEqual('start var end\n', ''.join(t))
+
+ def test_name(self):
+ """ Templates: Mako lookup by name """
+ t = MakoTemplate(name='mako_simple', lookup=['./views/']).render(var='var')
+ self.assertEqual('start var end\n', ''.join(t))
+
+ def test_notfound(self):
+ """ Templates: Unavailable templates"""
+ self.assertRaises(Exception, MakoTemplate, name="abcdef")
+
+ def test_error(self):
+ """ Templates: Exceptions"""
+ self.assertRaises(Exception, MakoTemplate, '%for badsyntax')
+
+ def test_inherit(self):
+ """ Templates: Mako lookup and inherience """
+ t = MakoTemplate(name='mako_inherit', lookup=['./views/']).render(var='v')
+ self.assertEqual('o\ncvc\no\n', ''.join(t))
+ t = MakoTemplate('<%inherit file="mako_base.tpl"/>\nc${var}c\n', lookup=['./views/']).render(var='v')
+ self.assertEqual('o\ncvc\no\n', ''.join(t))
+ t = MakoTemplate('<%inherit file="views/mako_base.tpl"/>\nc${var}c\n', lookup=['./']).render(var='v')
+ self.assertEqual('o\ncvc\no\n', ''.join(t))
+
+try:
+ import mako
+except ImportError:
+ print "WARNING: No Mako template support. Skipping tests."
+ del TestMakoTemplate
+
+if __name__ == '__main__':
+ unittest.main()
+
Added: incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_mdict.py
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_mdict.py?rev=1132103&view=auto
==============================================================================
--- incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_mdict.py (added)
+++ incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_mdict.py Sun Jun 5 08:41:52 2011
@@ -0,0 +1,51 @@
+import unittest
+from bottle import MultiDict, HeaderDict
+
+class TestMultiDict(unittest.TestCase):
+ def test_isadict(self):
+ """ MultiDict should behaves like a normal dict """
+ d, m = dict(a=5), MultiDict(a=5)
+ d['key'], m['key'] = 'value', 'value'
+ d['k2'], m['k2'] = 'v1', 'v1'
+ d['k2'], m['k2'] = 'v2', 'v2'
+ self.assertEqual(d.keys(), m.keys())
+ self.assertEqual(d.values(), m.values())
+ self.assertEqual(d.get('key'), m.get('key'))
+ self.assertEqual(d.get('cay'), m.get('cay'))
+ self.assertEqual(list(iter(d)), list(iter(m)))
+ self.assertEqual([k for k in d], [k for k in m])
+ self.assertEqual(len(d), len(m))
+ self.assertEqual('key' in d, 'key' in m)
+ self.assertEqual('cay' in d, 'cay' in m)
+ self.assertRaises(KeyError, lambda: m['cay'])
+
+ def test_ismulti(self):
+ """ MultiDict has some special features """
+ m = MultiDict(a=5)
+ m['a'] = 6
+ self.assertEqual([5, 6], m.getall('a'))
+ self.assertEqual([], m.getall('b'))
+ self.assertEqual([('a', 5), ('a', 6)], list(m.iterallitems()))
+
+ def test_isheader(self):
+ """ HeaderDict replaces by default and title()s its keys """
+ m = HeaderDict(abc_def=5)
+ m['abc_def'] = 6
+ self.assertEqual(['6'], m.getall('abc_def'))
+ m.append('abc_def', 7)
+ self.assertEqual(['6', '7'], m.getall('abc_def'))
+ self.assertEqual([('Abc-Def', '6'), ('Abc-Def', '7')], list(m.iterallitems()))
+
+ def test_headergetbug(self):
+ ''' Assure HeaderDict.get() to be case insensitive '''
+ d = HeaderDict()
+ d['UPPER'] = 'UPPER'
+ d['lower'] = 'lower'
+ self.assertEqual(d.get('upper'), 'UPPER')
+ self.assertEqual(d.get('LOWER'), 'lower')
+
+
+
+if __name__ == '__main__':
+ unittest.main()
+
Added: incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_outputfilter.py
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_outputfilter.py?rev=1132103&view=auto
==============================================================================
--- incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_outputfilter.py (added)
+++ incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_outputfilter.py Sun Jun 5 08:41:52 2011
@@ -0,0 +1,155 @@
+# -*- coding: utf-8 -*-
+'''Everything returned by Bottle()._cast() MUST be WSGI compatiple.'''
+
+import unittest
+import bottle
+from tools import ServerTestBase, tob, tobs
+
+class TestOutputFilter(ServerTestBase):
+ ''' Tests for WSGI functionality, routing and output casting (decorators) '''
+
+ def test_bytes(self):
+ self.app.route('/')(lambda: tob('test'))
+ self.assertBody('test')
+
+ def test_bytearray(self):
+ self.app.route('/')(lambda: map(tob, ['t', 'e', 'st']))
+ self.assertBody('test')
+
+ def test_tuple(self):
+ self.app.route('/')(lambda: ('t', 'e', 'st'))
+ self.assertBody('test')
+
+ def test_emptylist(self):
+ self.app.route('/')(lambda: [])
+ self.assertBody('')
+
+ def test_none(self):
+ self.app.route('/')(lambda: None)
+ self.assertBody('')
+
+ def test_illegal(self):
+ self.app.route('/')(lambda: 1234)
+ self.assertStatus(500)
+ self.assertInBody('Unhandled exception')
+
+ def test_error(self):
+ self.app.route('/')(lambda: 1/0)
+ self.assertStatus(500)
+ self.assertInBody('ZeroDivisionError')
+
+ def test_fatal_error(self):
+ @self.app.route('/')
+ def test(): raise KeyboardInterrupt()
+ self.assertRaises(KeyboardInterrupt, self.assertStatus, 500)
+
+ def test_file(self):
+ self.app.route('/')(lambda: tobs('test'))
+ self.assertBody('test')
+
+ def test_unicode(self):
+ self.app.route('/')(lambda: u'äöüÃ')
+ self.assertBody(u'äöüÃ'.encode('utf8'))
+
+ self.app.route('/')(lambda: [u'äö',u'üÃ'])
+ self.assertBody(u'äöüÃ'.encode('utf8'))
+
+ @self.app.route('/')
+ def test5():
+ bottle.response.content_type='text/html; charset=iso-8859-15'
+ return u'äöüÃ'
+ self.assertBody(u'äöüÃ'.encode('iso-8859-15'))
+
+ @self.app.route('/')
+ def test5():
+ bottle.response.content_type='text/html'
+ return u'äöüÃ'
+ self.assertBody(u'äöüÃ'.encode('utf8'))
+
+ def test_json(self):
+ self.app.route('/')(lambda: {'a': 1})
+ self.assertBody(bottle.json_dumps({'a': 1}))
+ self.assertHeader('Content-Type','application/json')
+
+ def test_custom(self):
+ self.app.route('/')(lambda: {'a': 1, 'b': 2})
+ self.app.add_filter(dict, lambda x: x.keys())
+ self.assertBody('ab')
+
+ def test_generator_callback(self):
+ @self.app.route('/')
+ def test():
+ bottle.response.headers['Test-Header'] = 'test'
+ yield 'foo'
+ self.assertBody('foo')
+ self.assertHeader('Test-Header', 'test')
+
+ def test_empty_generator_callback(self):
+ @self.app.route('/')
+ def test():
+ yield
+ bottle.response.headers['Test-Header'] = 'test'
+ self.assertBody('')
+ self.assertHeader('Test-Header', 'test')
+
+ def test_error_in_generator_callback(self):
+ @self.app.route('/')
+ def test():
+ yield 1/0
+ self.assertStatus(500)
+ self.assertInBody('ZeroDivisionError')
+
+ def test_fatal_error_in_generator_callback(self):
+ @self.app.route('/')
+ def test():
+ yield
+ raise KeyboardInterrupt()
+ self.assertRaises(KeyboardInterrupt, self.assertStatus, 500)
+
+ def test_httperror_in_generator_callback(self):
+ @self.app.route('/')
+ def test():
+ yield
+ bottle.abort(404, 'teststring')
+ self.assertInBody('teststring')
+ self.assertInBody('Error 404: Not Found')
+ self.assertStatus(404)
+
+ def test_httpresponse_in_generator_callback(self):
+ @self.app.route('/')
+ def test():
+ yield bottle.HTTPResponse('test')
+ self.assertBody('test')
+
+ def test_unicode_generator_callback(self):
+ @self.app.route('/')
+ def test():
+ yield u'äöüÃ'
+ self.assertBody(u'äöüÃ'.encode('utf8'))
+
+ def test_invalid_generator_callback(self):
+ @self.app.route('/')
+ def test():
+ yield 1234
+ self.assertStatus(500)
+ self.assertInBody('Unsupported response type')
+
+ def test_cookie(self):
+ """ WSGI: Cookies """
+ @bottle.route('/cookie')
+ def test():
+ bottle.response.COOKIES['a']="a"
+ bottle.response.set_cookie('b', 'b')
+ bottle.response.set_cookie('c', 'c', path='/')
+ return 'hello'
+ try:
+ c = self.urlopen('/cookie')['header'].get_all('Set-Cookie', '')
+ except:
+ c = self.urlopen('/cookie')['header'].get('Set-Cookie', '').split(',')
+ c = [x.strip() for x in c]
+ self.assertTrue('a=a' in c)
+ self.assertTrue('b=b' in c)
+ self.assertTrue('c=c; Path=/' in c)
+
+if __name__ == '__main__':
+ unittest.main()
Added: incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_router.py
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_router.py?rev=1132103&view=auto
==============================================================================
--- incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_router.py (added)
+++ incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_router.py Sun Jun 5 08:41:52 2011
@@ -0,0 +1,61 @@
+import unittest
+import bottle
+
+class TestRouter(unittest.TestCase):
+ def setUp(self):
+ self.r = r = bottle.Router()
+
+ def add(self, *a, **ka):
+ self.r.add(*a, **ka)
+ self.r.compile()
+
+ def testBasic(self):
+ add = self.add
+ match = self.r.match
+ add('/static', 'static')
+ self.assertEqual(('static', {}), match('/static'))
+ add('/\\:its/:#.+#/:test/:name#[a-z]+#/', 'handler')
+ self.assertEqual(('handler', {'test': 'cruel', 'name': 'world'}), match('/:its/a/cruel/world/'))
+ add('/:test', 'notail')
+ self.assertEqual(('notail', {'test': 'test'}), match('/test'))
+ add(':test/', 'nohead')
+ self.assertEqual(('nohead', {'test': 'test'}), match('test/'))
+ add(':test', 'fullmatch')
+ self.assertEqual(('fullmatch', {'test': 'test'}), match('test'))
+ add('/:#anon#/match', 'anon')
+ self.assertEqual(('anon', {}), match('/anon/match'))
+ self.assertEqual((None, {}), match('//no/m/at/ch/'))
+
+ def testParentheses(self):
+ add = self.add
+ match = self.r.match
+ add('/func(:param)', 'func')
+ self.assertEqual(('func', {'param':'foo'}), match('/func(foo)'))
+ add('/func2(:param#(foo|bar)#)', 'func2')
+ self.assertEqual(('func2', {'param':'foo'}), match('/func2(foo)'))
+ self.assertEqual(('func2', {'param':'bar'}), match('/func2(bar)'))
+ self.assertEqual((None, {}), match('/func2(baz)'))
+ add('/groups/:param#(foo|bar)#', 'groups')
+ self.assertEqual(('groups', {'param':'foo'}), match('/groups/foo'))
+
+ def testErrorInPattern(self):
+ self.assertRaises(bottle.RouteSyntaxError, self.add, '/:bug#(#/', 'buggy')
+
+ def testBuild(self):
+ add = self.add
+ build = self.r.build
+ add('/:test/:name#[a-z]+#/', 'handler', name='testroute')
+ add('/anon/:#.#', 'handler', name='anonroute')
+ url = build('testroute', test='hello', name='world')
+ self.assertEqual('/hello/world/', url)
+ self.assertRaises(bottle.RouteBuildError, build, 'test')
+ # RouteBuildError: No route found with name 'test'.
+ self.assertRaises(bottle.RouteBuildError, build, 'testroute')
+ # RouteBuildError: Missing parameter 'test' in route 'testroute'
+ #self.assertRaises(bottle.RouteBuildError, build, 'testroute', test='hello', name='1234')
+ # RouteBuildError: Parameter 'name' does not match pattern for route 'testroute': '[a-z]+'
+ #self.assertRaises(bottle.RouteBuildError, build, 'anonroute')
+ # RouteBuildError: Anonymous pattern found. Can't generate the route 'anonroute'.
+
+if __name__ == '__main__':
+ unittest.main()
Propchange: incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_router.py
------------------------------------------------------------------------------
svn:executable = *
Added: incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_securecookies.py
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_securecookies.py?rev=1132103&view=auto
==============================================================================
--- incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_securecookies.py (added)
+++ incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_securecookies.py Sun Jun 5 08:41:52 2011
@@ -0,0 +1,32 @@
+import unittest
+import bottle
+from tools import tob
+
+class TestSecureCookies(unittest.TestCase):
+ def setUp(self):
+ self.data = dict(a=5, b=u'unicode', c=[1,2,3,4,tob('bytestring')])
+ self.key = tob('secret')
+
+ def testDeEncode(self):
+ cookie = bottle.cookie_encode(self.data, self.key)
+ decoded = bottle.cookie_decode(cookie, self.key)
+ self.assertEqual(self.data, decoded)
+ decoded = bottle.cookie_decode(cookie+tob('x'), self.key)
+ self.assertEqual(None, decoded)
+
+ def testIsEncoded(self):
+ cookie = bottle.cookie_encode(self.data, self.key)
+ self.assertTrue(bottle.cookie_is_encoded(cookie))
+ self.assertFalse(bottle.cookie_is_encoded(tob('some string')))
+
+ def testWithBottle(self):
+ bottle.app.push()
+ bottle.response.bind(bottle.app())
+ bottle.response.set_cookie('key', dict(value=5), secret=tob('1234'))
+ cheader = [v for k, v in bottle.response.wsgiheader() if k == 'Set-Cookie'][0]
+ bottle.request.bind({'HTTP_COOKIE': cheader.split(';')[0]}, bottle.app())
+ self.assertEqual(repr(dict(value=5)), repr(bottle.request.get_cookie('key', secret=tob('1234'))))
+ bottle.app.pop()
+
+if __name__ == '__main__':
+ unittest.main()
Added: incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_sendfile.py
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_sendfile.py?rev=1132103&view=auto
==============================================================================
--- incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_sendfile.py (added)
+++ incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_sendfile.py Sun Jun 5 08:41:52 2011
@@ -0,0 +1,90 @@
+import unittest
+from bottle import send_file, static_file, HTTPError, HTTPResponse, request, response, parse_date, Bottle
+import wsgiref.util
+import os
+import os.path
+import tempfile
+import time
+
+class TestDateParser(unittest.TestCase):
+ def test_rfc1123(self):
+ """DateParser: RFC 1123 format"""
+ ts = time.time()
+ rs = time.strftime("%a, %d %b %Y %H:%M:%S GMT", time.gmtime(ts))
+ self.assertEqual(int(ts), int(parse_date(rs)))
+
+ def test_rfc850(self):
+ """DateParser: RFC 850 format"""
+ ts = time.time()
+ rs = time.strftime("%A, %d-%b-%y %H:%M:%S GMT", time.gmtime(ts))
+ self.assertEqual(int(ts), int(parse_date(rs)))
+
+ def test_asctime(self):
+ """DateParser: asctime format"""
+ ts = time.time()
+ rs = time.strftime("%a %b %d %H:%M:%S %Y", time.gmtime(ts))
+ self.assertEqual(int(ts), int(parse_date(rs)))
+
+ def test_bad(self):
+ """DateParser: Bad format"""
+ self.assertEqual(None, parse_date('Bad 123'))
+
+
+class TestSendFile(unittest.TestCase):
+ def setUp(self):
+ e = dict()
+ wsgiref.util.setup_testing_defaults(e)
+ b = Bottle()
+ request.bind(e, b)
+ response.bind(b)
+
+ def test_valid(self):
+ """ SendFile: Valid requests"""
+ out = static_file(os.path.basename(__file__), root='./')
+ self.assertEqual(open(__file__,'rb').read(), out.output.read())
+
+ def test_invalid(self):
+ """ SendFile: Invalid requests"""
+ self.assertEqual(404, static_file('not/a/file', root='./').status)
+ f = static_file(os.path.join('./../', os.path.basename(__file__)), root='./views/')
+ self.assertEqual(403, f.status)
+ try:
+ fp, fn = tempfile.mkstemp()
+ os.chmod(fn, 0)
+ self.assertEqual(403, static_file(fn, root='/').status)
+ finally:
+ os.close(fp)
+ os.unlink(fn)
+
+ def test_mime(self):
+ """ SendFile: Mime Guessing"""
+ f = static_file(os.path.basename(__file__), root='./')
+ self.assertTrue(f.headers['Content-Type'] in ('application/x-python-code', 'text/x-python'))
+ f = static_file(os.path.basename(__file__), root='./', mimetype='some/type')
+ self.assertEqual('some/type', f.headers['Content-Type'])
+ f = static_file(os.path.basename(__file__), root='./', guessmime=False)
+ self.assertEqual('text/plain', f.headers['Content-Type'])
+
+ def test_ims(self):
+ """ SendFile: If-Modified-Since"""
+ request.environ['HTTP_IF_MODIFIED_SINCE'] = time.strftime("%a, %d %b %Y %H:%M:%S GMT", time.gmtime())
+ res = static_file(os.path.basename(__file__), root='./')
+ self.assertEqual(304, res.status)
+ self.assertEqual(int(os.stat(__file__).st_mtime), parse_date(res.headers['Last-Modified']))
+ self.assertAlmostEqual(int(time.time()), parse_date(res.headers['Date']))
+ request.environ['HTTP_IF_MODIFIED_SINCE'] = time.strftime("%a, %d %b %Y %H:%M:%S GMT", time.gmtime(100))
+ self.assertEqual(open(__file__,'rb').read(), static_file(os.path.basename(__file__), root='./').output.read())
+
+ def test_download(self):
+ """ SendFile: Download as attachment """
+ basename = os.path.basename(__file__)
+ f = static_file(basename, root='./', download=True)
+ self.assertEqual('attachment; filename="%s"' % basename, f.headers['Content-Disposition'])
+ request.environ['HTTP_IF_MODIFIED_SINCE'] = time.strftime("%a, %d %b %Y %H:%M:%S GMT", time.gmtime(100))
+ f = static_file(os.path.basename(__file__), root='./')
+ self.assertEqual(open(__file__,'rb').read(), f.output.read())
+
+
+if __name__ == '__main__':
+ unittest.main()
+
Propchange: incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_sendfile.py
------------------------------------------------------------------------------
svn:executable = *
Added: incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_stpl.py
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_stpl.py?rev=1132103&view=auto
==============================================================================
--- incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_stpl.py (added)
+++ incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_stpl.py Sun Jun 5 08:41:52 2011
@@ -0,0 +1,207 @@
+# -*- coding: utf-8 -*-
+import unittest
+from bottle import SimpleTemplate, TemplateError
+
+class TestSimpleTemplate(unittest.TestCase):
+ def test_string(self):
+ """ Templates: Parse string"""
+ t = SimpleTemplate('start {{var}} end').render(var='var')
+ self.assertEqual(u'start var end', t)
+
+ def test_file(self):
+ """ Templates: Parse file"""
+ t = SimpleTemplate(name='./views/stpl_simple.tpl').render(var='var')
+ self.assertEqual(u'start var end\n', t)
+
+ def test_name(self):
+ """ Templates: Lookup by name """
+ t = SimpleTemplate(name='stpl_simple', lookup=['./views/']).render(var='var')
+ self.assertEqual(u'start var end\n', t)
+
+ def test_unicode(self):
+ """ Templates: Unicode variables """
+ t = SimpleTemplate('start {{var}} end').render(var=u'äöü')
+ self.assertEqual(u'start äöü end', t)
+
+ def test_unicode_code(self):
+ """ Templates: utf8 code in file"""
+ t = SimpleTemplate(name='./views/stpl_unicode.tpl').render(var='äöü')
+ self.assertEqual(u'start ñç äöü end\n', t)
+
+ def test_import(self):
+ """ Templates: import statement"""
+ t = '%from base64 import b64encode\nstart {{b64encode(var.encode("ascii") if hasattr(var, "encode") else var)}} end'
+ t = SimpleTemplate(t).render(var='var')
+ self.assertEqual(u'start dmFy end', t)
+
+ def test_data(self):
+ """ Templates: Data representation """
+ t = SimpleTemplate('<{{var}}>')
+ self.assertEqual(u'<True>', t.render(var=True))
+ self.assertEqual(u'<False>', t.render(var=False))
+ self.assertEqual(u'<None>', t.render(var=None))
+ self.assertEqual(u'<0>', t.render(var=0))
+ self.assertEqual(u'<5>', t.render(var=5))
+ self.assertEqual(u'<b>', t.render(var='b'))
+ self.assertEqual(u'<1.0>', t.render(var=1.0))
+ self.assertEqual(u'<[1, 2]>', t.render(var=[1,2]))
+
+ def test_escape(self):
+ t = SimpleTemplate('<{{var}}>')
+ self.assertEqual(u'<b>', t.render(var='b'))
+ self.assertEqual(u'<<&>>', t.render(var='<&>'))
+
+ def test_noescape(self):
+ t = SimpleTemplate('<{{!var}}>')
+ self.assertEqual(u'<b>', t.render(var='b'))
+ self.assertEqual(u'<<&>>', t.render(var='<&>'))
+
+ def test_noescape_setting(self):
+ t = SimpleTemplate('<{{var}}>', noescape=True)
+ self.assertEqual(u'<b>', t.render(var='b'))
+ self.assertEqual(u'<<&>>', t.render(var='<&>'))
+ t = SimpleTemplate('<{{!var}}>', noescape=True)
+ self.assertEqual(u'<b>', t.render(var='b'))
+ self.assertEqual(u'<<&>>', t.render(var='<&>'))
+
+ def test_blocks(self):
+ """ Templates: Code blocks and loops """
+ t = SimpleTemplate("start\n%for i in l:\n{{i}} \n%end\nend")
+ self.assertEqual(u'start\n1 \n2 \n3 \nend', t.render(l=[1,2,3]))
+ self.assertEqual(u'start\nend', t.render(l=[]))
+ t = SimpleTemplate("start\n%if i:\n{{i}} \n%end\nend")
+ self.assertEqual(u'start\nTrue \nend', t.render(i=True))
+ self.assertEqual(u'start\nend', t.render(i=False))
+
+ def test_elsebug(self):
+ ''' Whirespace between block keyword and colon is allowed '''
+ t = SimpleTemplate("%if 1:\nyes\n%else:\nno\n%end\n")
+ self.assertEqual(u"yes\n", t.render())
+ t = SimpleTemplate("%if 1:\nyes\n%else :\nno\n%end\n")
+ self.assertEqual(u"yes\n", t.render())
+
+ def test_commentbug(self):
+ ''' A "#" sign within an string is not a comment '''
+ t = SimpleTemplate("%if '#':\nyes\n%end\n")
+ self.assertEqual(u"yes\n", t.render())
+
+ def test_multiline(self):
+ ''' Block statements with non-terminating newlines '''
+ t = SimpleTemplate("%if 1\\\n%and 1:\nyes\n%end\n")
+ self.assertEqual(u"yes\n", t.render())
+
+ def test_newline_in_parameterlist(self):
+ ''' Block statements with non-terminating newlines in list '''
+ t = SimpleTemplate("%a=[1,\n%2]\n{{len(a)}}")
+ self.assertEqual(u"2", t.render())
+
+ def test_dedentbug(self):
+ ''' One-Line dednet blocks should not change indention '''
+ t = SimpleTemplate('%if x: a="if"\n%else: a="else"\n{{a}}')
+ self.assertEqual(u"if", t.render(x=True))
+ self.assertEqual(u"else", t.render(x=False))
+ t = SimpleTemplate('%if x:\n%a="if"\n%else: a="else"\n{{a}}')
+ self.assertEqual(u"if", t.render(x=True))
+ self.assertEqual(u"else", t.render(x=False))
+ t = SimpleTemplate('%if x: a="if"\n%else: a="else"\n%end')
+ self.assertRaises(NameError, t.render)
+
+ def test_onelinebugs(self):
+ ''' One-Line blocks should not change indention '''
+ t = SimpleTemplate('%if x:\n%a=1\n%end\n{{a}}')
+ self.assertEqual(u"1", t.render(x=True))
+ t = SimpleTemplate('%if x: a=1\n{{a}}')
+ self.assertEqual(u"1", t.render(x=True))
+ t = SimpleTemplate('%if x:\n%a=1\n%else:\n%a=2\n%end\n{{a}}')
+ self.assertEqual(u"1", t.render(x=True))
+ self.assertEqual(u"2", t.render(x=False))
+ t = SimpleTemplate('%if x: a=1\n%else:\n%a=2\n%end\n{{a}}')
+ self.assertEqual(u"1", t.render(x=True))
+ self.assertEqual(u"2", t.render(x=False))
+ t = SimpleTemplate('%if x:\n%a=1\n%else: a=2\n{{a}}')
+ self.assertEqual(u"1", t.render(x=True))
+ self.assertEqual(u"2", t.render(x=False))
+ t = SimpleTemplate('%if x: a=1\n%else: a=2\n{{a}}')
+ self.assertEqual(u"1", t.render(x=True))
+ self.assertEqual(u"2", t.render(x=False))
+
+ def test_onelineblocks(self):
+ """ Templates: one line code blocks """
+ t = SimpleTemplate("start\n%a=''\n%for i in l: a += str(i)\n{{a}}\nend")
+ self.assertEqual(u'start\n123\nend', t.render(l=[1,2,3]))
+ self.assertEqual(u'start\n\nend', t.render(l=[]))
+
+ def test_escaped_codelines(self):
+ t = SimpleTemplate('%% test')
+ self.assertEqual(u'% test', t.render())
+ t = SimpleTemplate('%%% test')
+ self.assertEqual(u'%% test', t.render())
+
+ def test_nobreak(self):
+ """ Templates: Nobreak statements"""
+ t = SimpleTemplate("start\\\\\n%pass\nend")
+ self.assertEqual(u'startend', t.render())
+
+ def test_nonobreak(self):
+ """ Templates: Escaped nobreak statements"""
+ t = SimpleTemplate("start\\\\\n\\\\\n%pass\nend")
+ self.assertEqual(u'start\\\\\nend', t.render())
+
+ def test_include(self):
+ """ Templates: Include statements"""
+ t = SimpleTemplate(name='stpl_include', lookup=['./views/'])
+ self.assertEqual(u'before\nstart var end\nafter\n', t.render(var='var'))
+
+ def test_rebase(self):
+ """ Templates: %rebase and method passing """
+ t = SimpleTemplate(name='stpl_t2main', lookup=['./views/'])
+ result=u'+base+\n+main+\n!1234!\n+include+\n-main-\n+include+\n-base-\n'
+ self.assertEqual(result, t.render(content='1234'))
+
+ def test_notfound(self):
+ """ Templates: Unavailable templates"""
+ self.assertRaises(TemplateError, SimpleTemplate, name="abcdef")
+
+ def test_error(self):
+ """ Templates: Exceptions"""
+ self.assertRaises(SyntaxError, SimpleTemplate, '%for badsyntax')
+ self.assertRaises(IndexError, SimpleTemplate('{{i[5]}}').render, i=[0])
+
+ def test_winbreaks(self):
+ """ Templates: Test windows line breaks """
+ t = SimpleTemplate('%var+=1\r\n{{var}}\r\n')
+ t = t.render(var=5)
+ self.assertEqual(u'6\r\n', t)
+
+ def test_commentonly(self):
+ """ Templates: Commentd should behave like code-lines (e.g. flush text-lines) """
+ t = SimpleTemplate('...\n%#test\n...')
+ self.failIfEqual('#test', t.code.splitlines()[0])
+
+ def test_detect_pep263(self):
+ ''' PEP263 strings in code-lines change the template encoding on the fly '''
+ t = SimpleTemplate(u'%#coding: iso8859_15\nöäü?@â¬'.encode('utf8'))
+ self.failIfEqual(u'öäü?@â¬', t.render())
+ self.assertEqual(t.encoding, 'iso8859_15')
+ t = SimpleTemplate(u'%#coding: iso8859_15\nöäü?@â¬'.encode('iso8859_15'))
+ self.assertEqual(u'öäü?@â¬', t.render())
+ self.assertEqual(t.encoding, 'iso8859_15')
+ self.assertEqual(2, len(t.code.splitlines()))
+
+ def test_ignore_pep263_in_textline(self):
+ ''' PEP263 strings in text-lines have no effect '''
+ self.assertRaises(UnicodeError, SimpleTemplate, u'#coding: iso8859_15\nöäü?@â¬'.encode('iso8859_15'))
+ t = SimpleTemplate(u'#coding: iso8859_15\nöäü?@â¬'.encode('utf8'))
+ self.assertEqual(u'#coding: iso8859_15\nöäü?@â¬', t.render())
+ self.assertEqual(t.encoding, 'utf8')
+
+ def test_ignore_late_pep263(self):
+ ''' PEP263 strings must appear within the first two lines '''
+ self.assertRaises(UnicodeError, SimpleTemplate, u'\n\n%#coding: iso8859_15\nöäü?@â¬'.encode('iso8859_15'))
+ t = SimpleTemplate(u'\n\n%#coding: iso8859_15\nöäü?@â¬'.encode('utf8'))
+ self.assertEqual(u'\n\nöäü?@â¬', t.render())
+ self.assertEqual(t.encoding, 'utf8')
+
+if __name__ == '__main__':
+ unittest.main()
+
Propchange: incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_stpl.py
------------------------------------------------------------------------------
svn:executable = *
Added: incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_wsgi.py
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_wsgi.py?rev=1132103&view=auto
==============================================================================
--- incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_wsgi.py (added)
+++ incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_wsgi.py Sun Jun 5 08:41:52 2011
@@ -0,0 +1,250 @@
+# -*- coding: utf-8 -*-
+import unittest
+import sys, os.path
+import bottle
+import urllib2
+from StringIO import StringIO
+import thread
+import time
+from tools import ServerTestBase, tob
+
+
+class TestWsgi(ServerTestBase):
+ ''' Tests for WSGI functionality, routing and output casting (decorators) '''
+
+ def test_get(self):
+ """ WSGI: GET routes"""
+ @bottle.route('/')
+ def test(): return 'test'
+ self.assertStatus(404, '/not/found')
+ self.assertStatus(405, '/', post="var=value")
+ self.assertBody('test', '/')
+
+ def test_post(self):
+ """ WSGI: POST routes"""
+ @bottle.route('/', method='POST')
+ def test(): return 'test'
+ self.assertStatus(404, '/not/found')
+ self.assertStatus(405, '/')
+ self.assertBody('test', '/', post="var=value")
+
+ def test_headget(self):
+ """ WSGI: HEAD routes and GET fallback"""
+ @bottle.route('/get')
+ def test(): return 'test'
+ @bottle.route('/head', method='HEAD')
+ def test2(): return 'test'
+ # GET -> HEAD
+ self.assertStatus(405, '/head')
+ # HEAD -> HEAD
+ self.assertStatus(200, '/head', method='HEAD')
+ self.assertBody('', '/head', method='HEAD')
+ # HEAD -> GET
+ self.assertStatus(200, '/get', method='HEAD')
+ self.assertBody('', '/get', method='HEAD')
+
+ def get304(self):
+ """ 304 responses must not return entity headers """
+ bad = ('allow', 'content-encoding', 'content-language',
+ 'content-length', 'content-md5', 'content-range',
+ 'content-type', 'last-modified') # + c-location, expires?
+ for h in bad:
+ bottle.response.set_header(h, 'foo')
+ bottle.status = 304
+ for h, v in bottle.response.headerlist:
+ self.assertFalse(h.lower() in bad, "Header %s not deleted" % h)
+
+
+ def test_anymethod(self):
+ self.assertStatus(404, '/any')
+ @bottle.route('/any', method='ANY')
+ def test2(): return 'test'
+ self.assertStatus(200, '/any', method='HEAD')
+ self.assertBody('test', '/any', method='GET')
+ self.assertBody('test', '/any', method='POST')
+ self.assertBody('test', '/any', method='DELETE')
+ @bottle.route('/any', method='GET')
+ def test2(): return 'test2'
+ self.assertBody('test2', '/any', method='GET')
+ @bottle.route('/any', method='POST')
+ def test2(): return 'test3'
+ self.assertBody('test3', '/any', method='POST')
+ self.assertBody('test', '/any', method='DELETE')
+
+ def test_500(self):
+ """ WSGI: Exceptions within handler code (HTTP 500) """
+ @bottle.route('/')
+ def test(): return 1/0
+ self.assertStatus(500, '/')
+
+ def test_503(self):
+ """ WSGI: Server stopped (HTTP 503) """
+ @bottle.route('/')
+ def test(): return 'bla'
+ self.assertStatus(200, '/')
+ bottle.app().serve = False
+ self.assertStatus(503, '/')
+
+ def test_401(self):
+ """ WSGI: abort(401, '') (HTTP 401) """
+ @bottle.route('/')
+ def test(): bottle.abort(401)
+ self.assertStatus(401,'/')
+ @bottle.error(401)
+ def err(e):
+ bottle.response.status = 200
+ return str(type(e))
+ self.assertStatus(200,'/')
+ self.assertBody("<class 'bottle.HTTPError'>",'/')
+
+ def test_303(self):
+ """ WSGI: redirect (HTTP 303) """
+ @bottle.route('/')
+ def test(): bottle.redirect('/yes')
+ self.assertStatus(303, '/')
+ self.assertHeader('Location', 'http://127.0.0.1/yes', '/')
+
+ def test_generator_callback(self):
+ @bottle.route('/yield')
+ def test():
+ bottle.response.headers['Test-Header'] = 'test'
+ yield 'foo'
+ @bottle.route('/yield_nothing')
+ def test2():
+ yield
+ bottle.response.headers['Test-Header'] = 'test'
+ self.assertBody('foo', '/yield')
+ self.assertHeader('Test-Header', 'test', '/yield')
+ self.assertBody('', '/yield_nothing')
+ self.assertHeader('Test-Header', 'test', '/yield_nothing')
+
+ def test_cookie(self):
+ """ WSGI: Cookies """
+ @bottle.route('/cookie')
+ def test():
+ bottle.response.COOKIES['a']="a"
+ bottle.response.set_cookie('b', 'b')
+ bottle.response.set_cookie('c', 'c', path='/')
+ return 'hello'
+ try:
+ c = self.urlopen('/cookie')['header'].get_all('Set-Cookie', '')
+ except:
+ c = self.urlopen('/cookie')['header'].get('Set-Cookie', '').split(',')
+ c = [x.strip() for x in c]
+ self.assertTrue('a=a' in c)
+ self.assertTrue('b=b' in c)
+ self.assertTrue('c=c; Path=/' in c)
+
+class TestDecorators(ServerTestBase):
+ ''' Tests Decorators '''
+
+ def test_view(self):
+ """ WSGI: Test view-decorator (should override autojson) """
+ @bottle.route('/tpl')
+ @bottle.view('stpl_t2main')
+ def test():
+ return dict(content='1234')
+ result = '+base+\n+main+\n!1234!\n+include+\n-main-\n+include+\n-base-\n'
+ self.assertHeader('Content-Type', 'text/html; charset=UTF-8', '/tpl')
+ self.assertBody(result, '/tpl')
+
+ def test_view_error(self):
+ """ WSGI: Test if view-decorator reacts on non-dict return values correctly."""
+ @bottle.route('/tpl')
+ @bottle.view('stpl_t2main')
+ def test():
+ return bottle.HTTPError(401, 'The cake is a lie!')
+ self.assertInBody('The cake is a lie!', '/tpl')
+ self.assertInBody('401: Unauthorized', '/tpl')
+ self.assertStatus(401, '/tpl')
+
+ def test_validate(self):
+ """ WSGI: Test validate-decorator"""
+ @bottle.route('/:var')
+ @bottle.route('/')
+ @bottle.validate(var=int)
+ def test(var): return 'x' * var
+ self.assertStatus(403,'/noint')
+ self.assertStatus(403,'/')
+ self.assertStatus(200,'/5')
+ self.assertBody('xxx', '/3')
+
+ def test_truncate_body(self):
+ """ WSGI: Some HTTP status codes must not be used with a response-body """
+ @bottle.route('/test/:code')
+ def test(code):
+ bottle.response.status = int(code)
+ return 'Some body content'
+ self.assertBody('Some body content', '/test/200')
+ self.assertBody('', '/test/100')
+ self.assertBody('', '/test/101')
+ self.assertBody('', '/test/204')
+ self.assertBody('', '/test/304')
+
+ def test_routebuild(self):
+ """ WSGI: Test route builder """
+ bottle.route('/a/:b/c', name='named')(5)
+ bottle.request.environ['SCRIPT_NAME'] = ''
+ self.assertEqual('/a/xxx/c', bottle.url('named', b='xxx'))
+ self.assertEqual('/a/xxx/c', bottle.app().get_url('named', b='xxx'))
+ bottle.request.environ['SCRIPT_NAME'] = '/app'
+ self.assertEqual('/app/a/xxx/c', bottle.url('named', b='xxx'))
+ bottle.request.environ['SCRIPT_NAME'] = '/app/'
+ self.assertEqual('/app/a/xxx/c', bottle.url('named', b='xxx'))
+ bottle.request.environ['SCRIPT_NAME'] = 'app/'
+ self.assertEqual('/app/a/xxx/c', bottle.url('named', b='xxx'))
+
+ def test_decorators(self):
+ app = bottle.Bottle()
+ app.route('/g')('foo')
+ bottle.route('/g')('foo')
+ app.route('/g2', method='GET')('foo')
+ bottle.get('/g2')('foo')
+ app.route('/p', method='POST')('foo')
+ bottle.post('/p')('foo')
+ app.route('/p2', method='PUT')('foo')
+ bottle.put('/p2')('foo')
+ app.route('/d', method='DELETE')('foo')
+ bottle.delete('/d')('foo')
+ self.assertEqual(app.routes, bottle.app().routes)
+
+ def test_autoroute(self):
+ app = bottle.Bottle()
+ def a(): pass
+ def b(x): pass
+ def c(x, y): pass
+ def d(x, y=5): pass
+ def e(x=5, y=6): pass
+ self.assertEqual(['a'],list(bottle.yieldroutes(a)))
+ self.assertEqual(['b/:x'],list(bottle.yieldroutes(b)))
+ self.assertEqual(['c/:x/:y'],list(bottle.yieldroutes(c)))
+ self.assertEqual(['d/:x','d/:x/:y'],list(bottle.yieldroutes(d)))
+ self.assertEqual(['e','e/:x','e/:x/:y'],list(bottle.yieldroutes(e)))
+
+
+class TestAppMounting(ServerTestBase):
+ def setUp(self):
+ ServerTestBase.setUp(self)
+ self.subapp = bottle.Bottle()
+
+ def test_basicmounting(self):
+ bottle.app().mount(self.subapp, '/test')
+ self.assertStatus(404, '/')
+ self.assertStatus(404, '/test')
+ self.assertStatus(404, '/test/')
+ self.assertStatus(404, '/test/test/bar')
+ @self.subapp.route('/')
+ @self.subapp.route('/test/:test')
+ def test(test='foo'):
+ return test
+ self.assertStatus(404, '/')
+ self.assertStatus(404, '/test')
+ self.assertStatus(200, '/test/')
+ self.assertBody('foo', '/test/')
+ self.assertStatus(200, '/test/test/bar')
+ self.assertBody('bar', '/test/test/bar')
+
+
+
+if __name__ == '__main__':
+ unittest.main()
Propchange: incubator/mesos/trunk/src/webui/bottle-0.8.3/test/test_wsgi.py
------------------------------------------------------------------------------
svn:executable = *
Added: incubator/mesos/trunk/src/webui/bottle-0.8.3/test/testall.py
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/bottle-0.8.3/test/testall.py?rev=1132103&view=auto
==============================================================================
--- incubator/mesos/trunk/src/webui/bottle-0.8.3/test/testall.py (added)
+++ incubator/mesos/trunk/src/webui/bottle-0.8.3/test/testall.py Sun Jun 5 08:41:52 2011
@@ -0,0 +1,26 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+import unittest
+import sys, os, glob
+
+os.chdir(os.path.dirname(os.path.abspath(__file__)))
+sys.path.insert(0, '../')
+sys.path.insert(0, './')
+
+unittests = [name[2:-3] for name in glob.glob('./test_*.py')]
+suite = unittest.defaultTestLoader.loadTestsFromNames(unittests)
+
+#import doctest
+#doctests = glob.glob('./doctest_*.txt')
+#suite.addTest(doctest.DocFileSuite(*doctests))
+
+def run():
+ import bottle
+ bottle.debug(True)
+ result = unittest.TextTestRunner(verbosity=0).run(suite)
+ sys.exit((result.errors or result.failures) and 1 or 0)
+
+if __name__ == '__main__':
+ run()
+
Propchange: incubator/mesos/trunk/src/webui/bottle-0.8.3/test/testall.py
------------------------------------------------------------------------------
svn:executable = *
Added: incubator/mesos/trunk/src/webui/bottle-0.8.3/test/tools.py
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/bottle-0.8.3/test/tools.py?rev=1132103&view=auto
==============================================================================
--- incubator/mesos/trunk/src/webui/bottle-0.8.3/test/tools.py (added)
+++ incubator/mesos/trunk/src/webui/bottle-0.8.3/test/tools.py Sun Jun 5 08:41:52 2011
@@ -0,0 +1,124 @@
+# -*- coding: utf-8 -*-
+import bottle
+import threading
+import urllib
+import urllib2
+import sys
+import time
+import unittest
+import wsgiref
+import wsgiref.simple_server
+import wsgiref.util
+import wsgiref.validate
+
+from StringIO import StringIO
+try:
+ from io import BytesIO
+except:
+ BytesIO = None
+ pass
+import mimetypes
+import uuid
+
+def tob(data):
+ ''' Transforms bytes or unicode into bytes. '''
+ return data.encode('utf8') if isinstance(data, unicode) else data
+
+def tobs(data):
+ ''' Transforms bytes or unicode into a byte stream. '''
+ return BytesIO(tob(data)) if BytesIO else StringIO(tob(data))
+
+class ServerTestBase(unittest.TestCase):
+ def setUp(self):
+ ''' Create a new Bottle app set it as default_app and register it to urllib2 '''
+ self.port = 8080
+ self.host = 'localhost'
+ self.app = bottle.app.push()
+ self.wsgiapp = wsgiref.validate.validator(self.app)
+
+ def urlopen(self, path, method='GET', post='', env=None):
+ result = {'code':0, 'status':'error', 'header':{}, 'body':tob('')}
+ def start_response(status, header):
+ result['code'] = int(status.split()[0])
+ result['status'] = status.split(None, 1)[-1]
+ for name, value in header:
+ name = name.title()
+ if name in result['header']:
+ result['header'][name] += ', ' + value
+ else:
+ result['header'][name] = value
+ env = env if env else {}
+ wsgiref.util.setup_testing_defaults(env)
+ env['REQUEST_METHOD'] = method.upper().strip()
+ env['PATH_INFO'] = path
+ env['QUERY_STRING'] = ''
+ if post:
+ env['REQUEST_METHOD'] = 'POST'
+ env['CONTENT_LENGTH'] = str(len(tob(post)))
+ env['wsgi.input'].write(tob(post))
+ env['wsgi.input'].seek(0)
+ response = self.wsgiapp(env, start_response)
+ for part in response:
+ try:
+ result['body'] += part
+ except TypeError:
+ raise TypeError('WSGI app yielded non-byte object %s', type(part))
+ if hasattr(response, 'close'):
+ response.close()
+ del response
+ return result
+
+ def postmultipart(self, path, fields, files):
+ return self.urlopen(path, multipart_environ(env), method='POST')
+
+ def tearDown(self):
+ bottle.app.pop()
+
+ def assertStatus(self, code, route='/', **kargs):
+ self.assertEqual(code, self.urlopen(route, **kargs)['code'])
+
+ def assertBody(self, body, route='/', **kargs):
+ self.assertEqual(tob(body), self.urlopen(route, **kargs)['body'])
+
+ def assertInBody(self, body, route='/', **kargs):
+ result = self.urlopen(route, **kargs)['body']
+ if tob(body) not in result:
+ self.fail('The search pattern "%s" is not included in body:\n%s' % (body, result))
+
+ def assertHeader(self, name, value, route='/', **kargs):
+ self.assertEqual(value, self.urlopen(route, **kargs)['header'].get(name))
+
+ def assertHeaderAny(self, name, route='/', **kargs):
+ self.assertTrue(self.urlopen(route, **kargs)['header'].get(name, None))
+
+ def assertInError(self, search, route='/', **kargs):
+ bottle.request.environ['wsgi.errors'].errors.seek(0)
+ err = bottle.request.environ['wsgi.errors'].errors.read()
+ if search not in err:
+ self.fail('The search pattern "%s" is not included in wsgi.error: %s' % (search, err))
+
+def multipart_environ(fields, files):
+ boundary = str(uuid.uuid1())
+ env = {'REQUEST_METHOD':'POST',
+ 'CONTENT_TYPE': 'multipart/form-data; boundary='+boundary}
+ wsgiref.util.setup_testing_defaults(env)
+ boundary = '--' + boundary
+ body = ''
+ for name, value in fields:
+ body += boundary + '\n'
+ body += 'Content-Disposition: form-data; name="%s"\n\n' % name
+ body += value + '\n'
+ for name, filename, content in files:
+ mimetype = mimetypes.guess_type(filename)[0] or 'application/octet-stream'
+ body += boundary + '\n'
+ body += 'Content-Disposition: file; name="%s"; filename="%s"\n' % \
+ (name, filename)
+ body += 'Content-Type: %s\n\n' % mimetype
+ body += content + '\n'
+ body += boundary + '--\n'
+ if hasattr(body, 'encode'):
+ body = body.encode('utf8')
+ env['CONTENT_LENGTH'] = str(len(body))
+ env['wsgi.input'].write(body)
+ env['wsgi.input'].seek(0)
+ return env
Propchange: incubator/mesos/trunk/src/webui/bottle-0.8.3/test/tools.py
------------------------------------------------------------------------------
svn:executable = *
Added: incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/jinja2_base.tpl
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/jinja2_base.tpl?rev=1132103&view=auto
==============================================================================
--- incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/jinja2_base.tpl (added)
+++ incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/jinja2_base.tpl Sun Jun 5 08:41:52 2011
@@ -0,0 +1 @@
+begin {% block content %}{% endblock %} end
\ No newline at end of file
Added: incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/jinja2_inherit.tpl
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/jinja2_inherit.tpl?rev=1132103&view=auto
==============================================================================
--- incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/jinja2_inherit.tpl (added)
+++ incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/jinja2_inherit.tpl Sun Jun 5 08:41:52 2011
@@ -0,0 +1,2 @@
+{% extends "jinja2_base" %}
+{% block content %}abc{% endblock %}
\ No newline at end of file
Added: incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/jinja2_simple.tpl
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/jinja2_simple.tpl?rev=1132103&view=auto
==============================================================================
--- incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/jinja2_simple.tpl (added)
+++ incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/jinja2_simple.tpl Sun Jun 5 08:41:52 2011
@@ -0,0 +1 @@
+start {{var}} end
\ No newline at end of file
Added: incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/mako_base.tpl
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/mako_base.tpl?rev=1132103&view=auto
==============================================================================
--- incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/mako_base.tpl (added)
+++ incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/mako_base.tpl Sun Jun 5 08:41:52 2011
@@ -0,0 +1 @@
+o${self.body()}o
Added: incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/mako_inherit.tpl
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/mako_inherit.tpl?rev=1132103&view=auto
==============================================================================
--- incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/mako_inherit.tpl (added)
+++ incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/mako_inherit.tpl Sun Jun 5 08:41:52 2011
@@ -0,0 +1,2 @@
+<%inherit file="mako_base.tpl"/>
+c${var}c
Added: incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/mako_simple.tpl
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/mako_simple.tpl?rev=1132103&view=auto
==============================================================================
--- incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/mako_simple.tpl (added)
+++ incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/mako_simple.tpl Sun Jun 5 08:41:52 2011
@@ -0,0 +1 @@
+start ${var} end
Added: incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/stpl_include.tpl
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/stpl_include.tpl?rev=1132103&view=auto
==============================================================================
--- incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/stpl_include.tpl (added)
+++ incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/stpl_include.tpl Sun Jun 5 08:41:52 2011
@@ -0,0 +1,3 @@
+before
+%include stpl_simple var=var
+after
Added: incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/stpl_simple.tpl
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/stpl_simple.tpl?rev=1132103&view=auto
==============================================================================
--- incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/stpl_simple.tpl (added)
+++ incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/stpl_simple.tpl Sun Jun 5 08:41:52 2011
@@ -0,0 +1 @@
+start {{var}} end
Added: incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/stpl_t2base.tpl
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/stpl_t2base.tpl?rev=1132103&view=auto
==============================================================================
--- incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/stpl_t2base.tpl (added)
+++ incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/stpl_t2base.tpl Sun Jun 5 08:41:52 2011
@@ -0,0 +1,4 @@
+%test('base')
+%include
+%include stpl_t2inc test=test
+%_['test2']('base')
Added: incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/stpl_t2inc.tpl
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/stpl_t2inc.tpl?rev=1132103&view=auto
==============================================================================
--- incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/stpl_t2inc.tpl (added)
+++ incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/stpl_t2inc.tpl Sun Jun 5 08:41:52 2011
@@ -0,0 +1,4 @@
+%test('include')
+%def test2(var):
+-{{var}}-
+%end
Added: incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/stpl_t2main.tpl
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/stpl_t2main.tpl?rev=1132103&view=auto
==============================================================================
--- incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/stpl_t2main.tpl (added)
+++ incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/stpl_t2main.tpl Sun Jun 5 08:41:52 2011
@@ -0,0 +1,8 @@
+%def test(var):
++{{var}}+
+%end
+%rebase stpl_t2base test=test
+%test('main')
+!{{content}}!
+%include stpl_t2inc test=test
+%_['test2']('main')
Added: incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/stpl_unicode.tpl
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/stpl_unicode.tpl?rev=1132103&view=auto
==============================================================================
--- incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/stpl_unicode.tpl (added)
+++ incubator/mesos/trunk/src/webui/bottle-0.8.3/test/views/stpl_unicode.tpl Sun Jun 5 08:41:52 2011
@@ -0,0 +1 @@
+start {{"ñç"}} {{var}} end
Modified: incubator/mesos/trunk/src/webui/master/framework.tpl
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/master/framework.tpl?rev=1132103&r1=1132102&r2=1132103&view=diff
==============================================================================
--- incubator/mesos/trunk/src/webui/master/framework.tpl (original)
+++ incubator/mesos/trunk/src/webui/master/framework.tpl Sun Jun 5 08:41:52 2011
@@ -1,7 +1,6 @@
%from datetime import datetime
%from master import get_master
%from webui_lib import *
-%
%master = get_master()
<html>
<head>
Modified: incubator/mesos/trunk/src/webui/master/index.tpl
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/master/index.tpl?rev=1132103&r1=1132102&r2=1132103&view=diff
==============================================================================
--- incubator/mesos/trunk/src/webui/master/index.tpl (original)
+++ incubator/mesos/trunk/src/webui/master/index.tpl Sun Jun 5 08:41:52 2011
@@ -2,7 +2,6 @@
%from datetime import datetime
%from master import get_master
%from webui_lib import *
-%
%master = get_master()
<html>
<head>
Modified: incubator/mesos/trunk/src/webui/master/webui.py
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/master/webui.py?rev=1132103&r1=1132102&r2=1132103&view=diff
==============================================================================
--- incubator/mesos/trunk/src/webui/master/webui.py (original)
+++ incubator/mesos/trunk/src/webui/master/webui.py Sun Jun 5 08:41:52 2011
@@ -37,7 +37,7 @@ def log_tail(level, lines):
return commands.getoutput('tail -%s %s/mesos-master.%s' % (lines, log_dir, level))
-bottle.TEMPLATE_PATH.append('./webui/master/%s.tpl')
+bottle.TEMPLATE_PATH.append('./webui/master/')
# TODO(*): Add an assert to confirm that all the arguments we are
# expecting have been passed to us, which will give us a better error
Modified: incubator/mesos/trunk/src/webui/slave/framework.tpl
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/slave/framework.tpl?rev=1132103&r1=1132102&r2=1132103&view=diff
==============================================================================
--- incubator/mesos/trunk/src/webui/slave/framework.tpl (original)
+++ incubator/mesos/trunk/src/webui/slave/framework.tpl Sun Jun 5 08:41:52 2011
@@ -1,6 +1,5 @@
%from slave import get_slave
%from webui_lib import *
-%
%slave = get_slave()
<html>
<head>
Modified: incubator/mesos/trunk/src/webui/slave/index.tpl
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/slave/index.tpl?rev=1132103&r1=1132102&r2=1132103&view=diff
==============================================================================
--- incubator/mesos/trunk/src/webui/slave/index.tpl (original)
+++ incubator/mesos/trunk/src/webui/slave/index.tpl Sun Jun 5 08:41:52 2011
@@ -1,7 +1,6 @@
%import os
%from slave import get_slave
%from webui_lib import *
-%
%slave = get_slave()
<html>
<head>
Modified: incubator/mesos/trunk/src/webui/slave/webui.py
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/slave/webui.py?rev=1132103&r1=1132102&r2=1132103&view=diff
==============================================================================
--- incubator/mesos/trunk/src/webui/slave/webui.py (original)
+++ incubator/mesos/trunk/src/webui/slave/webui.py Sun Jun 5 08:41:52 2011
@@ -65,7 +65,7 @@ def framework_log_tail(fid, log_type, li
abort(403, 'Slave not yet registered with master')
-bottle.TEMPLATE_PATH.append('./webui/slave/%s.tpl')
+bottle.TEMPLATE_PATH.append('./webui/slave/')
# TODO(*): Add an assert to confirm that all the arguments we are
# expecting have been passed to us, which will give us a better error