tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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