def test_disconnect_device(self, sleep_mock): adapter_mock = Mock() env = Simulation(device=Mock(), adapter=adapter_mock) # connected device calls adapter_mock env._process_cycle(0.5) adapter_mock.assert_has_calls([call.handle(env.cycle_delay)]) sleep_mock.assert_not_called() adapter_mock.reset_mock() sleep_mock.reset_mock() # disconnected device calls sleep_mock env.disconnect_device() env._process_cycle(0.5) sleep_mock.assert_has_calls([call.handle(env.cycle_delay)]) adapter_mock.assert_not_called() adapter_mock.reset_mock() sleep_mock.reset_mock() # re-connecting returns to previous behavior env.connect_device() env._process_cycle(0.5) adapter_mock.assert_has_calls([call.handle(env.cycle_delay)]) sleep_mock.assert_not_called()
def _check_reconnects_with_backoff(self, methodname): f = self._build_factory() # Violate the interface abstraction to verify backoff behavior: m_delaytracker = self.make_mock() f._delaytracker = m_delaytracker # Overwrite the extant one. m_connector = self.make_mock() m_reason = self.make_mock() method = getattr(f, methodname) ret = method(m_connector, m_reason) self.assertIsNone(ret) self.assert_calls_equal( m_delaytracker, [call.increment()]) def check_record_arg(rec): """<Record.msg.find('Reconnecting in') != -1>""" return rec.msg.find('Reconnecting in') != -1 self.assert_calls_equal( self.m_loghandler, [call.handle(ArgIsLogRecord(msg='Connection %s: %r (Reconnecting in %.2f seconds.)'))]) self.assert_calls_equal( self.m_reactor, [call.callLater(m_delaytracker.increment.return_value, m_connector.connect)])
def test_github_notification_with_connection_debug_logs_and_delegates(self): f = self._build_factory() m_addr = self.make_mock() f.buildProtocol(m_addr) # Peek behind the curtain: self.assertIsNotNone(f._protoinstance) m_protoinstance = self.make_mock() # Poke behind the curtain: f._protoinstance = m_protoinstance eventid = 42 eventname = 'blah-event' eventdict = {'fruit': 'apple', 'meat': 'pork'} f.handle_github_notification(eventid, eventname, eventdict) self.assert_calls_equal( self.m_loghandler, [call.handle(ArgIsLogRecord(levelname='DEBUG', msg=self.GithubNotificationLogTmpl))]) self.assert_calls_equal( m_protoinstance, [call.handle_github_notification(eventid, eventname, eventdict)])
def _test_init_and_name(self, name, instanceinfo): class MyClass(log.LogMixin): def __init__(self): log.LogMixin.__init__(self, instanceinfo) obj = MyClass() self.assertEqual(obj._log.name, name) self.assert_calls_equal(self.m_loghandler, [call.handle(ArgIsLogRecord(msg='__init__'))])
def test_signed_malformed_JSON(self): m_request = self.make_mock() self.res._handle_signed_message(m_request, '%@ NOT JSON @%') self.assert_calls_equal( self.m_loghandler, [call.handle(ArgIsLogRecord(levelname='ERROR'))]) self.assert_calls_equal( m_request, [call.setResponseCode(400, 'MALFORMED')])
def test_LogMixin_subclass_nameless(self): class MyClass (LogMixin): def __init__(self): self._init_log() self._log.info('created') MyClass() self.assert_calls_equal( self.m_loghandler, [call.handle(ArgIsLogRecord(msg='created'))])
def _test_init_and_name(self, name, instanceinfo): class MyClass (log.LogMixin): def __init__(self): log.LogMixin.__init__(self, instanceinfo) obj = MyClass() self.assertEqual(obj._log.name, name) self.assert_calls_equal( self.m_loghandler, [call.handle(ArgIsLogRecord(msg='__init__'))])
def test_handle_bare_event_some_unsupported_event_type(self): self._test_handle_bare_event( False, '%! some unsupported event type !%', 'banana', ) self.assert_calls_equal( self.m_loghandler, [call.handle( ArgIsLogRecord( levelname='INFO', msg='Unhandled github %r event %r.'))])
def test_handle_push_event_not_dockomorph_tag(self): self.res._handle_push_event({'ref': 'refs/heads/master'}) self.assert_calls_equal( self.m_loghandler, [call.handle( ArgIsLogRecord( levelname='DEBUG', args=('refs/heads/master',)))]) self.assert_calls_equal( self.m_handle_push_tag, [])
def test_connect(self): self.client.connect() self.assert_calls_equal( self.m_reactor, [call.connectSSL( self.host, self.port, ArgIsType(irc.ClientProtocolFactory), ArgIsType(ssl.ClientContextFactory))]) self.assert_calls_equal( self.m_loghandler, [call.handle(ArgIsLogRecord(msg='Connecting to %s:%d...'))])
def test_github_notification_without_connection_logs_info(self): f = self._build_factory() # Peek behind the curtain: self.assertIsNone(f._protoinstance) eventid = 42 eventname = 'blah-event' eventdict = {'fruit': 'apple', 'meat': 'pork'} f.handle_github_notification(eventid, eventname, eventdict) self.assert_calls_equal( self.m_loghandler, [call.handle(ArgIsLogRecord(levelname='INFO', msg=self.GithubNotificationLogTmpl))])
def test_process_cycle_calls_process_simulation(self): adapter_mock = Mock() device_mock = Mock() env = Simulation(device=device_mock, adapter=adapter_mock) set_simulation_running(env) env._process_cycle(0.5) adapter_mock.assert_has_calls( [call.handle(env.cycle_delay)]) device_mock.assert_has_calls( [call.process(0.5)] ) self.assertEqual(env.cycles, 1) self.assertEqual(env.runtime, 0.5)
def test_no_preexisting_secrets_file(self): m_FilePath = self.patch('twisted.python.filepath.FilePath') m_urandom = self.patch('os.urandom') m_secretsdir = m_FilePath.return_value m_path = m_secretsdir.child.return_value m_write_file = self.make_mock() def m_path_open(mode): if mode == 'r': raise IOError(errno.ENOENT, 'fake-no-entry') else: assert mode == 'w', repr(mode) return m_write_file m_path.open.side_effect = m_path_open # Exercise target code: result = secrets.create_or_load_secret('banana') # Verify results: self.assertIs(result, m_urandom.return_value.encode.return_value) self.assert_calls_equal( m_FilePath, [call(secrets._SecretsDir), call().makedirs(), call().child('banana'), call().child().open('r'), call().child().open('w'), ]) self.assert_calls_equal( m_urandom, [call(secrets._SecretByteSize), call().encode('hex')]) self.assert_calls_equal( self.m_loghandler, [call.handle( ArgIsLogRecord( levelname='INFO', msg='Initialized secret %r to: %s'))])
def test_render_POST_ping_tampered(self): tweakedmessage = self.pingmessage.copy() tweakedmessage['hook_id'] += 1 self.m_request.content.getvalue.return_value = json.dumps(tweakedmessage) r = self.res.render_POST(self.m_request) self.assertEqual(NOT_DONE_YET, r) self.assert_calls_equal( self.m_request, [call.getHeader('X-Hub-Signature'), call.content.getvalue(), call.setResponseCode(403, 'FORBIDDEN'), call.finish()]) self.assert_calls_equal( self.m_loghandler, [call.handle(ArgIsLogRecord(levelname='WARNING'))])
def setUp(self): LogMockingTestCase.setUp(self) self.sigver = github.SignatureVerifier(self.secret) self.m_reactor = self.make_mock() self.m_handle_push_tag = self.make_mock() self.res = github.WebhookResource( self.m_reactor, self.secret, self.m_handle_push_tag, ) self.assert_calls_equal( self.m_loghandler, [call.handle(ArgIsLogRecord(levelname='DEBUG', msg='__init__'))]) # Clear out m_loghandler: self.reset_mocks()
def _test_msg_debug_log(self, *args): m_ircIRCClient = self.patch('twisted.words.protocols.irc.IRCClient') self.p.msg(*args) self.assert_calls_equal( self.m_loghandler, [call.handle( ArgIsLogRecord( levelname='DEBUG', msg=r'msg(user=%r, message=%r, length=%r)'))]) expectedargs = args if len(expectedargs) == 2: expectedargs += (None,) # Ensure we delegate to the base library: self.assert_calls_equal( m_ircIRCClient, [call.msg(self.p, *expectedargs)])
def test_no_preexisting_secrets_file(self): m_FilePath = self.patch('twisted.python.filepath.FilePath') m_urandom = self.patch('os.urandom') m_secretsdir = m_FilePath.return_value m_path = m_secretsdir.child.return_value m_write_file = self.make_mock() def m_path_open(mode): if mode == 'r': raise IOError(errno.ENOENT, 'fake-no-entry') else: assert mode == 'w', repr(mode) return m_write_file m_path.open.side_effect = m_path_open # Exercise target code: result = secrets.create_or_load_secret('banana') # Verify results: self.assertIs(result, m_urandom.return_value.encode.return_value) self.assert_calls_equal(m_FilePath, [ call(secrets._SecretsDir), call().makedirs(), call().child('banana'), call().child().open('r'), call().child().open('w'), ]) self.assert_calls_equal( m_urandom, [call(secrets._SecretByteSize), call().encode('hex')]) self.assert_calls_equal(self.m_loghandler, [ call.handle( ArgIsLogRecord(levelname='INFO', msg='Initialized secret %r to: %s')) ])
def test_handleCommand_debug_log(self): m_ircIRCClient = self.patch('twisted.words.protocols.irc.IRCClient') # Taken from a real world test run: command='NOTICE' prefix='weber.oftc.net' params=['AUTH', '*** Looking up your hostname...'] self.p.handleCommand(command, prefix, params) self.assert_calls_equal( self.m_loghandler, [call.handle( ArgIsLogRecord( levelname='DEBUG', msg=r'handleCommand(command=%r, prefix=%r, params=%r)'))]) # Ensure we delegate to the base library: self.assert_calls_equal( m_ircIRCClient, [call.handleCommand(self.p, command, prefix, params)])
def test_render_POST_unhandled_event_type(self): m_request = self._setup_mock_request('unknown event type', []) r = self.res.render_POST(m_request) self.assertEqual(NOT_DONE_YET, r) self.assert_calls_equal( m_request, [call.getHeader('X-Hub-Signature'), call.content.getvalue(), call.getHeader('X-Github-Event'), call.getHeader('X-Github-Delivery'), call.setResponseCode(400, 'Event Not Supported'), call.finish()]) self.assert_calls_equal( self.m_loghandler, [call.handle( ArgIsLogRecord( levelname='INFO', msg='Unhandled github %r event %r.'))])
def test_render_POST_ping_tampered(self): m_request = self._setup_mock_request('ping', self.pingmessage) tweakedmessage = self.pingmessage.copy() tweakedmessage['hook_id'] += 1 m_request.content.getvalue.return_value = \ json.dumps(tweakedmessage) r = self.res.render_POST(m_request) self.assertEqual(NOT_DONE_YET, r) self.assert_calls_equal( m_request, [call.getHeader('X-Hub-Signature'), call.content.getvalue(), call.setResponseCode(403, 'FORBIDDEN'), call.finish()]) self.assert_calls_equal( self.m_loghandler, [call.handle(ArgIsLogRecord(levelname='WARNING'))])