def test_get_streams(self): """ Exercises the get_streams() method. """ # get a list of fake, but good looking, streams valid_streams = ( ("1", "NEW", "4", "10.10.10.1:80"), ("2", "SUCCEEDED", "4", "10.10.10.1:80"), ("3", "SUCCEEDED", "4", "10.10.10.1:80") ) responses = ["%s\r\n" % " ".join(entry) for entry in valid_streams] mocking.mock_method(Controller, "get_info", mocking.return_value( "".join(responses) )) streams = self.controller.get_streams() self.assertEqual(len(valid_streams), len(streams)) for index, stream in enumerate(streams): self.assertEqual(valid_streams[index][0], stream.id) self.assertEqual(valid_streams[index][1], stream.status) self.assertEqual(valid_streams[index][2], stream.circ_id) self.assertEqual(valid_streams[index][3], stream.target)
def test_get_exit_policy(self): """ Exercises the get_exit_policy() method. """ mocking.mock_method( Controller, "get_conf", mocking.return_for_args( { ("ExitPolicyRejectPrivate", ): "1", ("ExitPolicy", "multiple=True"): [ "accept *:80, accept *:443", "accept 43.5.5.5,reject *:22" ] }, is_method=True)) mocking.mock_method( Controller, "get_info", mocking.return_for_args( { ("address", None): "123.45.67.89", ("exit-policy/default", ): "reject *:25,reject *:119,reject *:135-139,reject *:445,reject *:563,reject *:1214,reject *:4661-4666,reject *:6346-6429,reject *:6699,reject *:6881-6999,accept *:*" }, is_method=True)) expected = ExitPolicy( 'reject 0.0.0.0/8:*', # private entries 'reject 169.254.0.0/16:*', 'reject 127.0.0.0/8:*', 'reject 192.168.0.0/16:*', 'reject 10.0.0.0/8:*', 'reject 172.16.0.0/12:*', 'reject 123.45.67.89:*', # relay's public address 'accept *:80', # finally we get to our ExitPolicy 'accept *:443', 'accept 43.5.5.5:*', 'reject *:22', 'reject *:25', # default policy 'reject *:119', 'reject *:135-139', 'reject *:445', 'reject *:563', 'reject *:1214', 'reject *:4661-4666', 'reject *:6346-6429', 'reject *:6699', 'reject *:6881-6999', 'accept *:*', ) self.assertEqual(expected, self.controller.get_exit_policy())
def test_attach_stream(self): """ Exercises the attach_stream() method. """ # Response when the stream is in a state where it can't be attached (for # instance, it's already open). response = stem.response.ControlMessage.from_str("555 Connection is not managed by controller.\r\n") mocking.mock_method(Controller, "msg", mocking.return_value(response)) self.assertRaises(UnsatisfiableRequest, self.controller.attach_stream, 'stream_id', 'circ_id')
def test_event_listening(self): """ Exercises the add_event_listener and remove_event_listener methods. """ # set up for failure to create any events mocking.mock_method(Controller, "is_authenticated", mocking.return_true()) mocking.mock_method(Controller, "_attach_listeners", mocking.return_value(([], []))) mocking.mock_method( Controller, "get_version", mocking.return_value(stem.version.Version('0.1.0.14'))) self.assertRaises(InvalidRequest, self.controller.add_event_listener, mocking.no_op(), EventType.BW) # set up to only fail newer events mocking.mock_method( Controller, "get_version", mocking.return_value(stem.version.Version('0.2.0.35'))) # EventType.BW is one of the earliest events self.controller.add_event_listener(mocking.no_op(), EventType.BW) # EventType.SIGNAL was added in tor version 0.2.3.1-alpha self.assertRaises(InvalidRequest, self.controller.add_event_listener, mocking.no_op(), EventType.SIGNAL)
def test_event_listening(self): """ Exercises the add_event_listener and remove_event_listener methods. """ # set up for failure to create any events mocking.mock_method(Controller, "get_version", mocking.return_value(stem.version.Version('0.1.0.14'))) self.assertRaises(InvalidRequest, self.controller.add_event_listener, mocking.no_op(), EventType.BW) # set up to only fail newer events mocking.mock_method(Controller, "get_version", mocking.return_value(stem.version.Version('0.2.0.35'))) # EventType.BW is one of the earliest events self.controller.add_event_listener(mocking.no_op(), EventType.BW) # EventType.SIGNAL was added in tor version 0.2.3.1-alpha self.assertRaises(InvalidRequest, self.controller.add_event_listener, mocking.no_op(), EventType.SIGNAL)
def test_get_network_status(self): """ Exercises the get_network_status() method. """ # Build a single router status entry. nickname = "Beaver" fingerprint = "/96bKo4soysolMgKn5Hex2nyFSY" desc = "r %s %s u5lTXJKGsLKufRLnSyVqT7TdGYw 2012-12-30 22:02:49 77.223.43.54 9001 0\ns Fast Named Running Stable Valid\nw Bandwidth=75" % ( nickname, fingerprint) router = stem.descriptor.router_status_entry.RouterStatusEntryV2(desc) # Always return the same router status entry. mocking.mock_method(Controller, "get_info", mocking.return_value(desc)) # Pretend to get the router status entry with its name. self.assertEqual(router, self.controller.get_network_status(nickname)) # Pretend to get the router status entry with its fingerprint. hex_fingerprint = stem.descriptor.router_status_entry._base64_to_hex( fingerprint, False) self.assertEqual(router, self.controller.get_network_status(hex_fingerprint)) # Mangle hex fingerprint and try again. hex_fingerprint = hex_fingerprint[2:] self.assertRaises(ValueError, self.controller.get_network_status, hex_fingerprint) # Raise an exception in the get_info() call. mocking.mock_method(Controller, "get_info", mocking.raise_exception(InvalidArguments)) # Get a default value when the call fails. self.assertEqual( "default returned", self.controller.get_network_status(nickname, default="default returned")) # No default value, accept the error. self.assertRaises(InvalidArguments, self.controller.get_network_status, nickname)
def test_get_exit_policy(self): """ Exercises the get_exit_policy() method. """ mocking.mock_method(Controller, "get_conf", mocking.return_for_args({ ("ExitPolicyRejectPrivate",): "1", ("ExitPolicy", "multiple=True"): ["accept *:80, accept *:443", "accept 43.5.5.5,reject *:22"] }, is_method = True)) mocking.mock_method(Controller, "get_info", mocking.return_for_args({ ("address", None): "123.45.67.89", ("exit-policy/default",): "reject *:25,reject *:119,reject *:135-139,reject *:445,reject *:563,reject *:1214,reject *:4661-4666,reject *:6346-6429,reject *:6699,reject *:6881-6999,accept *:*" }, is_method = True)) expected = ExitPolicy( 'reject 0.0.0.0/8:*', # private entries 'reject 169.254.0.0/16:*', 'reject 127.0.0.0/8:*', 'reject 192.168.0.0/16:*', 'reject 10.0.0.0/8:*', 'reject 172.16.0.0/12:*', 'reject 123.45.67.89:*', # relay's public address 'accept *:80', # finally we get to our ExitPolicy 'accept *:443', 'accept 43.5.5.5:*', 'reject *:22', 'reject *:25', # default policy 'reject *:119', 'reject *:135-139', 'reject *:445', 'reject *:563', 'reject *:1214', 'reject *:4661-4666', 'reject *:6346-6429', 'reject *:6699', 'reject *:6881-6999', 'accept *:*', ) self.assertEqual(expected, self.controller.get_exit_policy())
def test_get_socks_listeners_new(self): """ Exercises the get_socks_listeners() method as if talking to a newer tor instance. """ # multiple SOCKS listeners mocking.mock_method( Controller, "get_info", mocking.return_value('"127.0.0.1:1112" "127.0.0.1:1114"')) self.assertEqual([('127.0.0.1', 1112), ('127.0.0.1', 1114)], self.controller.get_socks_listeners()) # no SOCKS listeners mocking.mock_method(Controller, "get_info", mocking.return_value("")) self.assertEqual([], self.controller.get_socks_listeners()) # check where GETINFO provides malformed content invalid_responses = ( '"127.0.0.1"', # address only '"1112"', # port only '"5127.0.0.1:1112"', # invlaid address '"127.0.0.1:991112"', # invalid port ) for response in invalid_responses: mocking.mock_method(Controller, "get_info", mocking.return_value(response)) self.assertRaises(stem.ProtocolError, self.controller.get_socks_listeners)
def test_get_socks_listeners_new(self): """ Exercises the get_socks_listeners() method as if talking to a newer tor instance. """ # multiple SOCKS listeners mocking.mock_method(Controller, "get_info", mocking.return_value( '"127.0.0.1:1112" "127.0.0.1:1114"' )) self.assertEqual( [('127.0.0.1', 1112), ('127.0.0.1', 1114)], self.controller.get_socks_listeners() ) # no SOCKS listeners mocking.mock_method(Controller, "get_info", mocking.return_value("")) self.assertEqual([], self.controller.get_socks_listeners()) # check where GETINFO provides malformed content invalid_responses = ( '"127.0.0.1"', # address only '"1112"', # port only '"5127.0.0.1:1112"', # invlaid address '"127.0.0.1:991112"', # invalid port ) for response in invalid_responses: mocking.mock_method(Controller, "get_info", mocking.return_value(response)) self.assertRaises(stem.ProtocolError, self.controller.get_socks_listeners)
def test_get_version(self): """ Exercises the get_version() method. """ try: # Use one version for first check. version_2_1 = "0.2.1.32" version_2_1_object = stem.version.Version(version_2_1) mocking.mock_method(Controller, "get_info", mocking.return_value(version_2_1)) # Return a version with a cold cache. self.assertEqual(version_2_1_object, self.controller.get_version()) # Use a different version for second check. version_2_2 = "0.2.2.39" version_2_2_object = stem.version.Version(version_2_2) mocking.mock_method(Controller, "get_info", mocking.return_value(version_2_2)) # Return a version with a hot cache, so it will be the old version. self.assertEqual(version_2_1_object, self.controller.get_version()) # Turn off caching. self.controller._is_caching_enabled = False # Return a version without caching, so it will be the new version. self.assertEqual(version_2_2_object, self.controller.get_version()) # Raise an exception in the get_info() call. mocking.mock_method(Controller, "get_info", mocking.raise_exception(InvalidArguments)) # Get a default value when the call fails. self.assertEqual( "default returned", self.controller.get_version(default="default returned")) # No default value, accept the error. self.assertRaises(InvalidArguments, self.controller.get_version) # Give a bad version. The stem.version.Version ValueError should bubble up. version_A_42 = "0.A.42.spam" mocking.mock_method(Controller, "get_info", mocking.return_value(version_A_42)) self.assertRaises(ValueError, self.controller.get_version) finally: # Turn caching back on before we leave. self.controller._is_caching_enabled = True
def test_get_network_status(self): """ Exercises the get_network_status() method. """ # Build a single router status entry. nickname = "Beaver" fingerprint = "/96bKo4soysolMgKn5Hex2nyFSY" desc = "r %s %s u5lTXJKGsLKufRLnSyVqT7TdGYw 2012-12-30 22:02:49 77.223.43.54 9001 0\ns Fast Named Running Stable Valid\nw Bandwidth=75" % (nickname, fingerprint) router = stem.descriptor.router_status_entry.RouterStatusEntryV2(desc) # Always return the same router status entry. mocking.mock_method(Controller, "get_info", mocking.return_value(desc)) # Pretend to get the router status entry with its name. self.assertEqual(router, self.controller.get_network_status(nickname)) # Pretend to get the router status entry with its fingerprint. hex_fingerprint = stem.descriptor.router_status_entry._decode_fingerprint(fingerprint, False) self.assertEqual(router, self.controller.get_network_status(hex_fingerprint)) # Mangle hex fingerprint and try again. hex_fingerprint = hex_fingerprint[2:] self.assertRaises(ValueError, self.controller.get_network_status, hex_fingerprint) # Raise an exception in the get_info() call. mocking.mock_method(Controller, "get_info", mocking.raise_exception(InvalidArguments)) # Get a default value when the call fails. self.assertEqual( "default returned", self.controller.get_network_status(nickname, default = "default returned") ) # No default value, accept the error. self.assertRaises(InvalidArguments, self.controller.get_network_status, nickname)
def test_get_version(self): """ Exercises the get_version() method. """ try: # Use one version for first check. version_2_1 = "0.2.1.32" version_2_1_object = stem.version.Version(version_2_1) mocking.mock_method(Controller, "get_info", mocking.return_value(version_2_1)) # Return a version with a cold cache. self.assertEqual(version_2_1_object, self.controller.get_version()) # Use a different version for second check. version_2_2 = "0.2.2.39" version_2_2_object = stem.version.Version(version_2_2) mocking.mock_method(Controller, "get_info", mocking.return_value(version_2_2)) # Return a version with a hot cache, so it will be the old version. self.assertEqual(version_2_1_object, self.controller.get_version()) # Turn off caching. self.controller._is_caching_enabled = False # Return a version without caching, so it will be the new version. self.assertEqual(version_2_2_object, self.controller.get_version()) # Raise an exception in the get_info() call. mocking.mock_method(Controller, "get_info", mocking.raise_exception(InvalidArguments)) # Get a default value when the call fails. self.assertEqual( "default returned", self.controller.get_version(default = "default returned") ) # No default value, accept the error. self.assertRaises(InvalidArguments, self.controller.get_version) # Give a bad version. The stem.version.Version ValueError should bubble up. version_A_42 = "0.A.42.spam" mocking.mock_method(Controller, "get_info", mocking.return_value(version_A_42)) self.assertRaises(ValueError, self.controller.get_version) finally: # Turn caching back on before we leave. self.controller._is_caching_enabled = True
def setUp(self): mock_method(RelayDescriptor, '_verify_digest', no_op())
def test_get_socks_listeners_old(self): """ Exercises the get_socks_listeners() method as though talking to an old tor instance. """ # An old tor raises stem.InvalidArguments for get_info about socks, but # get_socks_listeners should work anyway. mocking.mock_method(Controller, "get_info", mocking.raise_exception(InvalidArguments)) mocking.mock_method(Controller, "get_conf", mocking.return_for_args({ ("SocksPort",): "9050", ("SocksListenAddress", "multiple=True"): ["127.0.0.1"] }, is_method = True)) self.assertEqual([('127.0.0.1', 9050)], self.controller.get_socks_listeners()) # Again, an old tor, but SocksListenAddress overrides the port number. mocking.mock_method(Controller, "get_conf", mocking.return_for_args({ ("SocksPort",): "9050", ("SocksListenAddress", "multiple=True"): ["127.0.0.1:1112"] }, is_method = True)) self.assertEqual([('127.0.0.1', 1112)], self.controller.get_socks_listeners()) # Again, an old tor, but multiple listeners mocking.mock_method(Controller, "get_conf", mocking.return_for_args({ ("SocksPort",): "9050", ("SocksListenAddress", "multiple=True"): ["127.0.0.1:1112", "127.0.0.1:1114"] }, is_method = True)) self.assertEqual([('127.0.0.1', 1112), ('127.0.0.1', 1114)], self.controller.get_socks_listeners()) # Again, an old tor, but no SOCKS listeners mocking.mock_method(Controller, "get_conf", mocking.return_for_args({ ("SocksPort",): "0", ("SocksListenAddress", "multiple=True"): [] }, is_method = True)) self.assertEqual([], self.controller.get_socks_listeners()) # Where tor provides invalid ports or addresses mocking.mock_method(Controller, "get_conf", mocking.return_for_args({ ("SocksPort",): "blarg", ("SocksListenAddress", "multiple=True"): ["127.0.0.1"] }, is_method = True)) self.assertRaises(stem.ProtocolError, self.controller.get_socks_listeners) mocking.mock_method(Controller, "get_conf", mocking.return_for_args({ ("SocksPort",): "0", ("SocksListenAddress", "multiple=True"): ["127.0.0.1:abc"] }, is_method = True)) self.assertRaises(stem.ProtocolError, self.controller.get_socks_listeners) mocking.mock_method(Controller, "get_conf", mocking.return_for_args({ ("SocksPort",): "40", ("SocksListenAddress", "multiple=True"): ["500.0.0.1"] }, is_method = True)) self.assertRaises(stem.ProtocolError, self.controller.get_socks_listeners)
def setUp(self): socket = stem.socket.ControlSocket() mocking.mock_method(Controller, "add_event_listener", mocking.no_op()) self.controller = Controller(socket) mocking.revert_mocking()
def test_get_socks_listeners_old(self): """ Exercises the get_socks_listeners() method as though talking to an old tor instance. """ # An old tor raises stem.InvalidArguments for get_info about socks, but # get_socks_listeners should work anyway. mocking.mock_method(Controller, "get_info", mocking.raise_exception(InvalidArguments)) mocking.mock_method( Controller, "get_conf", mocking.return_for_args( { ("SocksPort", ): "9050", ("SocksListenAddress", "multiple=True"): ["127.0.0.1"] }, is_method=True)) self.assertEqual([('127.0.0.1', 9050)], self.controller.get_socks_listeners()) # Again, an old tor, but SocksListenAddress overrides the port number. mocking.mock_method( Controller, "get_conf", mocking.return_for_args( { ("SocksPort", ): "9050", ("SocksListenAddress", "multiple=True"): ["127.0.0.1:1112"] }, is_method=True)) self.assertEqual([('127.0.0.1', 1112)], self.controller.get_socks_listeners()) # Again, an old tor, but multiple listeners mocking.mock_method( Controller, "get_conf", mocking.return_for_args( { ("SocksPort", ): "9050", ("SocksListenAddress", "multiple=True"): ["127.0.0.1:1112", "127.0.0.1:1114"] }, is_method=True)) self.assertEqual([('127.0.0.1', 1112), ('127.0.0.1', 1114)], self.controller.get_socks_listeners()) # Again, an old tor, but no SOCKS listeners mocking.mock_method( Controller, "get_conf", mocking.return_for_args( { ("SocksPort", ): "0", ("SocksListenAddress", "multiple=True"): [] }, is_method=True)) self.assertEqual([], self.controller.get_socks_listeners()) # Where tor provides invalid ports or addresses mocking.mock_method( Controller, "get_conf", mocking.return_for_args( { ("SocksPort", ): "blarg", ("SocksListenAddress", "multiple=True"): ["127.0.0.1"] }, is_method=True)) self.assertRaises(stem.ProtocolError, self.controller.get_socks_listeners) mocking.mock_method( Controller, "get_conf", mocking.return_for_args( { ("SocksPort", ): "0", ("SocksListenAddress", "multiple=True"): ["127.0.0.1:abc"] }, is_method=True)) self.assertRaises(stem.ProtocolError, self.controller.get_socks_listeners) mocking.mock_method( Controller, "get_conf", mocking.return_for_args( { ("SocksPort", ): "40", ("SocksListenAddress", "multiple=True"): ["500.0.0.1"] }, is_method=True)) self.assertRaises(stem.ProtocolError, self.controller.get_socks_listeners)
def setUp(self): self.stdout, self.stdout_real = StringIO.StringIO(), sys.stdout sys.stdout = self.stdout mocking.mock_method(RelayDescriptor, '_verify_digest', mocking.no_op())
def setUp(self): socket = stem.socket.ControlSocket() mocking.mock_method(Controller, "add_event_listener", mocking.no_op()) self.controller = Controller(socket, enable_caching = True) mocking.revert_mocking()