1 # Copyright (c) Stas Shtin, 2010
3 # This file is part of IPyPBX.
5 # IPyPBX is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
10 # IPyPBX is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with IPyPBX. If not, see <http://www.gnu.org/licenses/>.
19 from ipypbx import http
20 from ipypbx.tests import support
21 from xml.etree import ElementTree as etree
24 'TestHttpRequestParser', 'TestFreeswitchConfigGenerator',
25 'TestSofiaConfGenerator')
28 class TestHttpRequestParser(unittest.TestCase):
30 Tests for ipypbx.http.HttpRequestParser.
34 Initialize request object.
36 self.request = http.HttpRequestParser()
38 def test_initial_state(self):
40 Check the default values.
42 self.assertEqual(self.request.method, None)
43 self.assertEqual(self.request.request_path, None)
44 self.assertEqual(self.request.http_version, None)
45 self.assertEqual(self.request.headers, {})
46 self.assertEqual(self.request.data, {})
47 self.assertEqual(self.request.result, None)
48 self.assertEqual(self.request.state, self.request.HTTP_NONE)
50 def test_handle_none(self):
52 HttpRequestParser.handleNone should just invoke next method and got to
55 self.request.handle('GET / HTTP/1.1')
56 self.assertNotEqual(self.request.state, self.request.HTTP_NONE)
59 def test_handle_request(self):
61 HttpRequestParser.handleRequest should get method, request path and HTTP
62 version from the request and move to headers parsing.
64 self.request.handle('GET / HTTP/1.1')
65 self.assertEqual(self.request.method, 'GET')
66 self.assertEqual(self.request.request_path, '/')
67 self.assertEqual(self.request.http_version, 'HTTP/1.1')
69 self.assertEqual(self.request.state, self.request.HTTP_HEADERS)
72 def test_handle_headers(self):
74 HttpRequestParser.handleNone should parse headers until empty line is
77 # Move to target state.
78 self.request.handle('GET / HTTP/1.1')
80 # Handle first header.
81 self.request.handle('Foo: bar')
82 self.assertEqual(self.request.state, self.request.HTTP_HEADERS)
83 self.assertEqual(self.request.headers['Foo'], 'bar')
84 self.assertEqual(len(self.request.headers), 1)
87 self.request.handle('Qwe: asd')
88 self.assertEqual(self.request.state, self.request.HTTP_HEADERS)
89 self.assertEqual(self.request.headers['Qwe'], 'asd')
90 self.assertEqual(len(self.request.headers), 2)
92 # Empty line terminates
93 self.request.handle('')
94 self.assertNotEqual(self.request.state, self.request.HTTP_HEADERS)
95 self.assertEqual(self.request.headers['Qwe'], 'asd')
96 self.assertEqual(len(self.request.headers), 2)
98 def test_handle_empty(self):
100 HttpRequestParser.handleEmpty just passes to next state.
102 prev_state = self.request.state
103 self.request.handleEmpty('')
104 self.assertEqual(self.request.state, prev_state + 1)
106 def _run_lines(self, *lines):
108 self.request.handle(line)
110 def test_handle_body(self):
112 HttpRequestParse.handleBody should parse variables from POST request.
118 self.assertEqual(self.request.data, {'foo': 'bar', 'qwe': 'asd'})
120 def test_handle_body_with_missing_values(self):
122 Missing values should give empty results.
128 self.assertEqual(self.request.data, {'foo': 'bar', 'qwe': ''})
130 def test_non_post_fails(self):
132 We expect only POST requests from Freeswitch, for anything else we
135 self.request.handle('GET / HTTP/1.1')
136 self.request.handle('')
138 http.HttpParseError, self.request.handle,
139 'Only post requests work')
142 class TestFreeswitchConfigGenerator(unittest.TestCase):
144 self.generator = http.FreeswitchConfigGenerator()
146 def test_can_handle(self):
147 self.generator.param_match = {'foo': 'bar'}
148 self.assertEqual(self.generator.canHandle({'foo': 'bar'}), True)
149 self.assertEqual(self.generator.canHandle({'foo': 'xxx'}), False)
150 self.assertEqual(self.generator.canHandle({'xxx': 'bar'}), False)
152 self.generator.canHandle({'foo': 'bar', 'qwe': 'asd'}), True)
153 self.assertEqual(self.generator.canHandle({'qwe': 'asd'}), False)
155 self.generator.param_match = {'foo': 'bar', 'baz': '123'}
156 self.assertEqual(self.generator.canHandle({'foo': 'bar'}), False)
158 self.generator.canHandle({'foo': 'bar', 'baz': '123'}), True)
160 self.generator.canHandle({'foo': 'bar', 'qwe': 'asd'}), False)
162 def test_base_elements(self):
164 ipypbx.http.FreeswitchConfigGenerator.baseElements returns a tuple of
165 document and section elelements.
167 self.generator.param_match = {'section': 'foo'}
168 root_elt, section_elt = self.generator.baseElements
170 etree.tostring(root_elt),
171 '<document type="freeswitch/xml"><section name="foo" />'
174 etree.tostring(section_elt), '<section name="foo" />')
176 def test_add_params(self):
178 ipypbx.http.FreeswitchConfigGenerator.addParams is a helper method for
179 creating params element.
181 foo_elt = etree.Element('foo')
183 etree.tostring(self.generator.addParams(foo_elt, (('qwe', 'asd'),))),
184 '<foo><params><param name="qwe" value="asd" /></params></foo>')
187 bar_elt = etree.Element('bar')
190 self.generator.addParams(bar_elt,
191 (('qwe', 'asd'), ('zxc', '123')))),
192 '<bar><params><param name="qwe" value="asd" />'
193 '<param name="zxc" value="123" /></params></bar>')
196 class TestSofiaConfGenerator(unittest.TestCase):
197 def test_generate_config(self):