test_extensions.py (8670B)
1 #!/usr/bin/env python 2 # 3 # Copyright 2012, Google Inc. 4 # All rights reserved. 5 # 6 # Redistribution and use in source and binary forms, with or without 7 # modification, are permitted provided that the following conditions are 8 # met: 9 # 10 # * Redistributions of source code must retain the above copyright 11 # notice, this list of conditions and the following disclaimer. 12 # * Redistributions in binary form must reproduce the above 13 # copyright notice, this list of conditions and the following disclaimer 14 # in the documentation and/or other materials provided with the 15 # distribution. 16 # * Neither the name of Google Inc. nor the names of its 17 # contributors may be used to endorse or promote products derived from 18 # this software without specific prior written permission. 19 # 20 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 """Tests for extensions module.""" 32 33 from __future__ import absolute_import 34 35 import unittest 36 import zlib 37 38 import set_sys_path # Update sys.path to locate pywebsocket3 module. 39 from pywebsocket3 import common, extensions 40 41 42 class ExtensionsTest(unittest.TestCase): 43 """A unittest for non-class methods in extensions.py""" 44 def test_parse_window_bits(self): 45 self.assertRaises(ValueError, extensions._parse_window_bits, None) 46 self.assertRaises(ValueError, extensions._parse_window_bits, 'foobar') 47 self.assertRaises(ValueError, extensions._parse_window_bits, ' 8 ') 48 self.assertRaises(ValueError, extensions._parse_window_bits, 'a8a') 49 self.assertRaises(ValueError, extensions._parse_window_bits, '00000') 50 self.assertRaises(ValueError, extensions._parse_window_bits, '00008') 51 self.assertRaises(ValueError, extensions._parse_window_bits, '0x8') 52 53 self.assertRaises(ValueError, extensions._parse_window_bits, '9.5') 54 self.assertRaises(ValueError, extensions._parse_window_bits, '8.0') 55 56 self.assertTrue(extensions._parse_window_bits, '8') 57 self.assertTrue(extensions._parse_window_bits, '15') 58 59 self.assertRaises(ValueError, extensions._parse_window_bits, '-8') 60 self.assertRaises(ValueError, extensions._parse_window_bits, '0') 61 self.assertRaises(ValueError, extensions._parse_window_bits, '7') 62 63 self.assertRaises(ValueError, extensions._parse_window_bits, '16') 64 self.assertRaises(ValueError, extensions._parse_window_bits, 65 '10000000') 66 67 68 class PerMessageDeflateExtensionProcessorParsingTest(unittest.TestCase): 69 """A unittest for checking that PerMessageDeflateExtensionProcessor parses 70 given extension parameter correctly. 71 """ 72 def test_registry(self): 73 processor = extensions.get_extension_processor( 74 common.ExtensionParameter('permessage-deflate')) 75 self.assertIsInstance(processor, 76 extensions.PerMessageDeflateExtensionProcessor) 77 78 def test_minimal_offer(self): 79 processor = extensions.PerMessageDeflateExtensionProcessor( 80 common.ExtensionParameter('permessage-deflate')) 81 82 response = processor.get_extension_response() 83 self.assertEqual('permessage-deflate', response.name()) 84 self.assertEqual(0, len(response.get_parameters())) 85 86 self.assertEqual(zlib.MAX_WBITS, 87 processor._rfc1979_deflater._window_bits) 88 self.assertFalse(processor._rfc1979_deflater._no_context_takeover) 89 90 def test_offer_with_max_window_bits(self): 91 parameter = common.ExtensionParameter('permessage-deflate') 92 parameter.add_parameter('server_max_window_bits', '10') 93 processor = extensions.PerMessageDeflateExtensionProcessor(parameter) 94 95 response = processor.get_extension_response() 96 self.assertEqual('permessage-deflate', response.name()) 97 self.assertEqual([('server_max_window_bits', '10')], 98 response.get_parameters()) 99 100 self.assertEqual(10, processor._rfc1979_deflater._window_bits) 101 102 def test_offer_with_out_of_range_max_window_bits(self): 103 parameter = common.ExtensionParameter('permessage-deflate') 104 parameter.add_parameter('server_max_window_bits', '0') 105 processor = extensions.PerMessageDeflateExtensionProcessor(parameter) 106 107 self.assertIsNone(processor.get_extension_response()) 108 109 def test_offer_with_max_window_bits_without_value(self): 110 parameter = common.ExtensionParameter('permessage-deflate') 111 parameter.add_parameter('server_max_window_bits', None) 112 processor = extensions.PerMessageDeflateExtensionProcessor(parameter) 113 114 self.assertIsNone(processor.get_extension_response()) 115 116 def test_offer_with_no_context_takeover(self): 117 parameter = common.ExtensionParameter('permessage-deflate') 118 parameter.add_parameter('server_no_context_takeover', None) 119 processor = extensions.PerMessageDeflateExtensionProcessor(parameter) 120 121 response = processor.get_extension_response() 122 self.assertEqual('permessage-deflate', response.name()) 123 self.assertEqual([('server_no_context_takeover', None)], 124 response.get_parameters()) 125 126 self.assertTrue(processor._rfc1979_deflater._no_context_takeover) 127 128 def test_offer_with_no_context_takeover_with_value(self): 129 parameter = common.ExtensionParameter('permessage-deflate') 130 parameter.add_parameter('server_no_context_takeover', 'foobar') 131 processor = extensions.PerMessageDeflateExtensionProcessor(parameter) 132 133 self.assertIsNone(processor.get_extension_response()) 134 135 def test_offer_with_unknown_parameter(self): 136 parameter = common.ExtensionParameter('permessage-deflate') 137 parameter.add_parameter('foo', 'bar') 138 processor = extensions.PerMessageDeflateExtensionProcessor(parameter) 139 140 self.assertIsNone(processor.get_extension_response()) 141 142 143 class PerMessageDeflateExtensionProcessorBuildingTest(unittest.TestCase): 144 """A unittest for checking that PerMessageDeflateExtensionProcessor builds 145 a response based on specified options correctly. 146 """ 147 def test_response_with_max_window_bits(self): 148 parameter = common.ExtensionParameter('permessage-deflate') 149 parameter.add_parameter('client_max_window_bits', None) 150 processor = extensions.PerMessageDeflateExtensionProcessor(parameter) 151 processor.set_client_max_window_bits(10) 152 153 response = processor.get_extension_response() 154 self.assertEqual('permessage-deflate', response.name()) 155 self.assertEqual([('client_max_window_bits', '10')], 156 response.get_parameters()) 157 158 def test_response_with_max_window_bits_without_client_permission(self): 159 processor = extensions.PerMessageDeflateExtensionProcessor( 160 common.ExtensionParameter('permessage-deflate')) 161 processor.set_client_max_window_bits(10) 162 163 response = processor.get_extension_response() 164 self.assertIsNone(response) 165 166 def test_response_with_true_for_no_context_takeover(self): 167 processor = extensions.PerMessageDeflateExtensionProcessor( 168 common.ExtensionParameter('permessage-deflate')) 169 170 processor.set_client_no_context_takeover(True) 171 172 response = processor.get_extension_response() 173 self.assertEqual('permessage-deflate', response.name()) 174 self.assertEqual([('client_no_context_takeover', None)], 175 response.get_parameters()) 176 177 def test_response_with_false_for_no_context_takeover(self): 178 processor = extensions.PerMessageDeflateExtensionProcessor( 179 common.ExtensionParameter('permessage-deflate')) 180 181 processor.set_client_no_context_takeover(False) 182 183 response = processor.get_extension_response() 184 self.assertEqual('permessage-deflate', response.name()) 185 self.assertEqual(0, len(response.get_parameters())) 186 187 188 if __name__ == '__main__': 189 unittest.main() 190 191 # vi:sts=4 sw=4 et