def test_datagram_signature_outdated_timestamp_reply(self): ''' Test if datagram processing reacts on outdated message (more than 20 seconds). Reply mode. :return: ''' factory = ssdp.SSDPFactory() factory.disable_hidden = True signature = ssdp.SSDPBase.DEFAULTS[ssdp.SSDPBase.SIGNATURE] data = '{}{}'.format(signature, '1516623820') addr = '10.10.10.10', 'foo.suse.de' ahead_dt = datetime.datetime.fromtimestamp(1516623841) curnt_dt = datetime.datetime.fromtimestamp(1516623820) delta = datetime.timedelta(0, 20) with patch.object(factory, 'log', MagicMock()), patch.object(factory, '_sendto'), \ patch('salt.utils.ssdp.datetime.datetime', MagicMock()), \ patch('salt.utils.ssdp.datetime.datetime.now', MagicMock(return_value=ahead_dt)), \ patch('salt.utils.ssdp.datetime.datetime.fromtimestamp', MagicMock(return_value=curnt_dt)), \ patch('salt.utils.ssdp.datetime.timedelta', MagicMock(return_value=delta)): factory.datagram_received(data=data, addr=addr) assert factory.log.debug.called assert factory.disable_hidden assert factory._sendto.called assert factory._sendto.call_args[0][ 0] == '{}:E:Timestamp is too old'.format(signature) assert 'Received outdated package' in factory.log.debug.call_args[ 0][0]
def test_datagram_signature_correct_timestamp_reply(self): ''' Test if datagram processing sends out correct reply within 20 seconds. :return: ''' factory = ssdp.SSDPFactory() factory.disable_hidden = True signature = ssdp.SSDPBase.DEFAULTS[ssdp.SSDPBase.SIGNATURE] data = '{}{}'.format(signature, '1516623820') addr = '10.10.10.10', 'foo.suse.de' ahead_dt = datetime.datetime.fromtimestamp(1516623840) curnt_dt = datetime.datetime.fromtimestamp(1516623820) delta = datetime.timedelta(0, 20) with patch.object(factory, 'log', MagicMock()), patch.object(factory, '_sendto'), \ patch('salt.utils.ssdp.datetime.datetime', MagicMock()), \ patch('salt.utils.ssdp.datetime.datetime.now', MagicMock(return_value=ahead_dt)), \ patch('salt.utils.ssdp.datetime.datetime.fromtimestamp', MagicMock(return_value=curnt_dt)), \ patch('salt.utils.ssdp.datetime.timedelta', MagicMock(return_value=delta)): factory.datagram_received(data=data, addr=addr) assert factory.log.debug.called assert factory.disable_hidden assert factory._sendto.called assert factory._sendto.call_args[0][ 0] == salt.utils.stringutils.to_bytes( "{}:@:{{}}".format(signature)) assert 'Received "%s" from %s:%s' in factory.log.debug.call_args[ 0][0]
def get_ssdp_factory(self, expected_ip=None, expected_hostname=None, **config): if expected_ip is None: expected_ip = "127.0.0.1" if expected_hostname is None: expected_hostname = "localhost" sock_mock = self.get_socket_mock(expected_ip, expected_hostname) with patch("salt.utils.ssdp.socket", sock_mock): factory = ssdp.SSDPFactory(**config) return factory
def test_datagram_signature_bad(self): ''' Test datagram_received on bad signature :return: ''' factory = ssdp.SSDPFactory() data = 'nonsense' addr = '10.10.10.10', 'foo.suse.de' with patch.object(factory, 'log', MagicMock()): factory.datagram_received(data=data, addr=addr) assert factory.log.debug.called assert 'Received bad signature from' in factory.log.debug.call_args[ 0][0] assert factory.log.debug.call_args[0][1] == addr[0] assert factory.log.debug.call_args[0][2] == addr[1]
def test_datagram_signature_wrong_timestamp_quiet(self): ''' Test datagram receives a wrong timestamp (no reply). :return: ''' factory = ssdp.SSDPFactory() data = '{}nonsense'.format( ssdp.SSDPBase.DEFAULTS[ssdp.SSDPBase.SIGNATURE]) addr = '10.10.10.10', 'foo.suse.de' with patch.object(factory, 'log', MagicMock()), patch.object(factory, '_sendto', MagicMock()): factory.datagram_received(data=data, addr=addr) assert factory.log.debug.called assert 'Received invalid timestamp in package' in factory.log.debug.call_args[ 0][0] assert not factory._sendto.called
def test_attr_check(self): ''' Tests attributes are set to the base class :return: ''' config = { ssdp.SSDPBase.SIGNATURE: '-signature-', ssdp.SSDPBase.ANSWER: { 'this-is': 'the-answer' } } factory = ssdp.SSDPFactory(**config) for attr in [ssdp.SSDPBase.SIGNATURE, ssdp.SSDPBase.ANSWER]: assert hasattr(factory, attr) assert getattr(factory, attr) == config[attr] assert not factory.disable_hidden assert factory.my_ip == '10.10.10.10'
def test_transport_sendto_success(self): ''' Test transport send_to. :return: ''' transport = MagicMock() log = MagicMock() factory = ssdp.SSDPFactory() with patch.object(factory, 'transport', transport), patch.object(factory, 'log', log): data = {'some': 'data'} addr = '10.10.10.10' factory._sendto(data=data, addr=addr) assert factory.transport.sendto.called assert factory.transport.sendto.mock_calls[0][1][0][ 'some'] == 'data' assert factory.transport.sendto.mock_calls[0][2][ 'addr'] == '10.10.10.10' assert factory.log.debug.called assert factory.log.debug.mock_calls[0][1][0] == 'Sent successfully'
def test_transport_sendto_retry(self): ''' Test transport send_to. :return: ''' transport = MagicMock() transport.sendto = MagicMock( side_effect=SSDPBaseTestCase.exception_attr_error) log = MagicMock() factory = ssdp.SSDPFactory() with patch.object(factory, 'transport', transport), patch.object(factory, 'log', log): data = {'some': 'data'} addr = '10.10.10.10' factory._sendto(data=data, addr=addr) assert factory.transport.sendto.called assert ssdp.time.sleep.called assert ssdp.time.sleep.call_args[0][ 0] > 0 and ssdp.time.sleep.call_args[0][0] < 0.5 assert factory.log.debug.called assert 'Permission error' in factory.log.debug.mock_calls[0][1][0]