class HeartbeatWriterTest(TwistedTestCase): """Tests for HeartbeatWriter.""" interval = 5 @defer.inlineCallbacks def setUp(self): yield super(HeartbeatWriterTest, self).setUp() self.logger = logging.Logger("HeartbeatWriter.test") self.handler = MementoHandler() self.logger.addHandler(self.handler) self.addCleanup(self.logger.removeHandler, self.handler) self.clock = task.Clock() self.hw = HeartbeatWriter(self.interval, self.logger, reactor=self.clock) def test_send_no_transport(self): """Log a warning when there is no transport.""" self.hw.send() self.assertTrue(self.handler.check_warning( "Can't send heartbeat without a transport")) def test_send_loop(self): """Send heartbeats in the LoopingCall.""" # first connect to something transport = StringIO() self.clock.advance(2) self.hw.makeConnection(transport) self.clock.advance(5) self.clock.advance(5) # we should have 3 heartbeats in the transport, get them raw_events = transport.getvalue().split(BEGIN_TOKEN, 3) events = [] for raw_event in raw_events: if raw_event: events.append(json.loads(raw_event.strip(END_TOKEN))) # strip the tokens for i, timestamp in [(0, 2), (1, 7), (2, 12)]: self.assertEqual(events[i]['type'], "heartbeat") self.assertEqual(events[i]['time'], timestamp) def test_send_on_connectionMade(self): """On connectionMade start the loop and send.""" # first connect to something transport = StringIO() self.clock.advance(0.1) self.hw.makeConnection(transport) self.assertTrue(self.hw.loop.running) raw_event = transport.getvalue() self.assertTrue(raw_event.startswith(BEGIN_TOKEN)) self.assertTrue(raw_event.endswith(END_TOKEN)) # strip the tokens payload = json.loads(raw_event.strip(BEGIN_TOKEN).strip(END_TOKEN)) self.assertEqual(payload['type'], "heartbeat") self.assertEqual(payload['time'], self.clock.seconds()) def test_connectionLost(self): """On connectionLost cleanup everything.""" self.hw.makeConnection(None) called = [] self.patch(self.hw.loop, 'stop', lambda: called.append(True)) self.hw.connectionLost(protocol.connectionDone) self.assertTrue(self.handler.check_info( "HeartbeatWriter connectionLost: %s" % (protocol.connectionDone,))) self.assertTrue(called) self.assertEqual(self.hw.loop, None) self.assertEqual(self.hw.reactor, None) self.assertEqual(self.hw.logger, None)
class HeartbeatWriterTest(TwistedTestCase): """Tests for HeartbeatWriter.""" interval = 5 @defer.inlineCallbacks def setUp(self): yield super(HeartbeatWriterTest, self).setUp() self.logger = logging.Logger("HeartbeatWriter.test") self.handler = MementoHandler() self.logger.addHandler(self.handler) self.addCleanup(self.logger.removeHandler, self.handler) self.clock = task.Clock() self.hw = HeartbeatWriter(self.interval, self.logger, reactor=self.clock) def test_send_no_transport(self): """Log a warning when there is no transport.""" self.hw.send() self.assertTrue( self.handler.check_warning( "Can't send heartbeat without a transport")) def test_send_loop(self): """Send heartbeats in the LoopingCall.""" # first connect to something transport = StringIO() self.clock.advance(2) self.hw.makeConnection(transport) self.clock.advance(5) self.clock.advance(5) # we should have 3 heartbeats in the transport, get them raw_events = transport.getvalue().split(BEGIN_TOKEN, 3) events = [] for raw_event in raw_events: if raw_event: events.append(json.loads(raw_event.strip(END_TOKEN))) # strip the tokens for i, timestamp in [(0, 2), (1, 7), (2, 12)]: self.assertEqual(events[i]['type'], "heartbeat") self.assertEqual(events[i]['time'], timestamp) def test_send_on_connectionMade(self): """On connectionMade start the loop and send.""" # first connect to something transport = StringIO() self.clock.advance(0.1) self.hw.makeConnection(transport) self.assertTrue(self.hw.loop.running) raw_event = transport.getvalue() self.assertTrue(raw_event.startswith(BEGIN_TOKEN)) self.assertTrue(raw_event.endswith(END_TOKEN)) # strip the tokens payload = json.loads(raw_event.strip(BEGIN_TOKEN).strip(END_TOKEN)) self.assertEqual(payload['type'], "heartbeat") self.assertEqual(payload['time'], self.clock.seconds()) def test_connectionLost(self): """On connectionLost cleanup everything.""" self.hw.makeConnection(None) called = [] self.patch(self.hw.loop, 'stop', lambda: called.append(True)) self.hw.connectionLost(protocol.connectionDone) self.assertTrue( self.handler.check_info("HeartbeatWriter connectionLost: %s" % (protocol.connectionDone, ))) self.assertTrue(called) self.assertEqual(self.hw.loop, None) self.assertEqual(self.hw.reactor, None) self.assertEqual(self.hw.logger, None)