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'<&lt;&amp;&gt;>', 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'<&lt;&amp;&gt;>', 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