Edgewall Software

source: trunk/bitten/tests_slave/slave.py @ 1001

Last change on this file since 1001 was 915, checked in by hodgestar, 13 years ago

Add two simple slave tests. In particular, add a test for processing non-utf8 output. See #243.

  • Property svn:eol-style set to native
File size: 4.6 KB
CovLine 
1# -*- coding: utf-8 -*-
2#
3# Copyright (C) 2005-2007 Christopher Lenz <cmlenz@gmx.de>
4# Copyright (C) 2007-2010 Edgewall Software
5# All rights reserved.
6#
7# This software is licensed as described in the file COPYING, which
8# you should have received as part of this distribution. The terms
9# are also available at http://bitten.edgewall.org/wiki/License.
10
111import os
112import sys
113import shutil
114import tempfile
115import unittest
16
117from bitten.slave import BuildSlave, ExitSlave
118from bitten.util import xmlio
119from bitten.slave import encode_multipart_formdata
20
221class DummyResponse(object):
122    def __init__(self, code):
223        self.code = code
24
225class TestSlave(BuildSlave):
26
127    def __init__(self, filename, work_dir):
228        BuildSlave.__init__(self, [filename], work_dir=work_dir)
229        self.results = []
30
131    def _gather(self, method, url, body=None, headers=None):
232        self.results.append(xmlio.parse(body))
233        return DummyResponse(201)
34
135    def _execute_step(self, _build_url, recipe, step):
236        old_local, old_request = self.local, self.request
237        try:
238            self.local, self.request = False, self._gather
239            return BuildSlave._execute_step(self, 'dummy_build', recipe, step)
240        finally:
241            self.local, self.request = old_local, old_request
42
243class BuildSlaveTestCase(unittest.TestCase):
44
145    def setUp(self):
346        self.work_dir = tempfile.mkdtemp(prefix='bitten_test')
347        self.python_path = xmlio._escape_attr(sys.executable)
48
149    def tearDown(self):
350        shutil.rmtree(self.work_dir)
51
152    def _create_file(self, *path):
253        filename = os.path.join(self.work_dir, *path)
254        fd = file(filename, 'w')
255        fd.close()
256        return filename
57
158    def _run_slave(self, recipe):
259        results = []
260        filename = self._create_file("recipe.xml")
261        recipe_file = file(filename, "wb")
262        recipe_file.write(recipe)
263        recipe_file.close()
264        slave = TestSlave(filename, self.work_dir)
265        slave.run()
266        return slave.results
67
168    def test_quit_raises(self):
169        self.slave = BuildSlave([], work_dir=self.work_dir)
170        self.assertRaises(ExitSlave, self.slave.quit)
71
172    def test_simple_recipe(self):
173        results = self._run_slave("""
174        <build xmlns:sh="http://bitten.edgewall.org/tools/sh"
175            >
176            <step id="print">
177                <sh:exec executable="%s" args='-c "print (\\"Hello\\")"' />
178            </step>   
179        </build>""" % self.python_path)
80
181        result = results[0]
182        self.assertEqual(result.attr["step"], "print")
183        self.assertEqual(result.attr["status"], "success")
184        log = list(result)[0]
185        msg = list(log)[0]
186        self.assertEqual(str(msg), '<message level="info">Hello</message>')
87
188    def test_non_utf8(self):
189        results = self._run_slave("""
190        <build xmlns:sh="http://bitten.edgewall.org/tools/sh"
191            >
192            <step id="print">
193                <sh:exec executable="%s" args='-c "print (\\"\\xe9\\")"' />
194            </step>   
195        </build>""" % self.python_path)
96
197        result = results[0]
198        self.assertEqual(result.attr["step"], "print")
199        self.assertEqual(result.attr["status"], "success")
1100        log = list(result)[0]
1101        msg = list(log)[0]
102        # check replacement character (\uFFFD) was generated correctly
1103        self.assertEqual(str(msg).decode("utf-8"),
1104            u'<message level="info">\uFFFD</message>')
105
2106class MultiPartEncodeTestCase(unittest.TestCase):
107
1108    def setUp(self):
1109        self.work_dir = tempfile.mkdtemp(prefix='bitten_test')
110
1111    def tearDown(self):
1112        shutil.rmtree(self.work_dir)
113
1114    def test_mutlipart_encode_one(self):
1115        fields = {
1116            'foo': 'bar',
1117            'foofile': ('test.txt', 'contents of foofile'),
1118        }
1119        body, content_type = encode_multipart_formdata(fields)
1120        boundary = content_type.split(';')[1].strip().split('=')[1]
1121        self.assertEquals('multipart/form-data; boundary=%s' % boundary,
1122                                    content_type)
1123        self.assertEquals('--%s\r\nContent-Disposition: form-data; ' \
1124                'name="foo"\r\n\r\nbar\r\n--%s\r\nContent-Disposition: ' \
1125                'form-data; name="foofile"; filename="test.txt"\r\n' \
1126                'Content-Type: application/octet-stream\r\n\r\n' \
1127                'contents of foofile\r\n--%s--\r\n' % (
1128                            boundary,boundary,boundary), body)
129
1130def suite():
1131    suite = unittest.TestSuite()
1132    suite.addTest(unittest.makeSuite(BuildSlaveTestCase, 'test'))
1133    suite.addTest(unittest.makeSuite(MultiPartEncodeTestCase, 'test'))
1134    return suite
135
1136if __name__ == '__main__':
0137    unittest.main(defaultTest='suite')
Note: See TracBrowser for help on using the repository browser.