class TestAPRSTelemetryStore(unittest.TestCase): """ This is a test of APRSStation's implementation of ITelemetryObject. """ def setUp(self): self.clock = Clock() self.clock.advance(_dummy_receive_time) self.store = TelemetryStore(time_source=self.clock) def __receive(self, msg): expand_aprs_message(msg, self.store) def test_new_station(self): self.assertEqual([], self.store.state().keys()) self.__receive( parse_tnc2( 'N6WKZ-3>APU25N,WB6TMS-3*,N6ZX-3*,WIDE2*:=3746.42N112226.00W# {UIV32N}', _dummy_receive_time)) self.assertEqual(['N6WKZ-3'], self.store.state().keys()) # TODO: this test makes less sense now that expand_aprs_message is separate def test_object_item_report(self): self.__receive( parse_tnc2( 'KE6AFE-2>APU25N,WR6ABD*,NCA1:;TFCSCRUZ *160323z3655.94N\12200.92W?70 In 10 Minutes', _dummy_receive_time)) self.assertEqual({'KE6AFE-2', 'TFCSCRUZ '}, set(self.store.state().keys())) # TODO test value of object def test_object_kill(self): self.__receive( parse_tnc2( 'KE6AFE-2>APU25N,WR6ABD*,NCA1:;TFCSCRUZ *160323z3655.94N\12200.92W?70 In 10 Minutes', _dummy_receive_time)) self.assertEqual({'KE6AFE-2', 'TFCSCRUZ '}, set(self.store.state().keys())) self.__receive( parse_tnc2('FOO>BAR:;TFCSCRUZ _160323z3655.94N\12200.92W?', _dummy_receive_time)) self.clock.advance(0) self.assertEqual({'FOO', 'KE6AFE-2'}, set(self.store.state().keys())) def test_drop_old(self): self.__receive(parse_tnc2('FOO>RX:>', _dummy_receive_time)) self.assertEqual(['FOO'], self.store.state().keys()) self.clock.advance(1799.5) self.__receive(parse_tnc2('BAR>RX:>', _dummy_receive_time + 1799.5)) self.assertEqual({'BAR', 'FOO'}, set(self.store.state().keys())) self.clock.advance(0.5) self.__receive(parse_tnc2('BAR>RX:>', _dummy_receive_time + 1800)) self.assertEqual(['BAR'], self.store.state().keys())
class TestAPRSTelemetryStore(unittest.TestCase): """ This is a test of APRSStation's implementation of ITelemetryObject. """ def setUp(self): self.clock = Clock() self.clock.advance(_dummy_receive_time) self.store = TelemetryStore(time_source=self.clock) def __receive(self, msg): expand_aprs_message(msg, self.store) def test_new_station(self): self.assertEqual([], self.store.state().keys()) self.__receive(parse_tnc2( 'N6WKZ-3>APU25N,WB6TMS-3*,N6ZX-3*,WIDE2*:=3746.42N112226.00W# {UIV32N}', _dummy_receive_time)) self.assertEqual(['N6WKZ-3'], self.store.state().keys()) # TODO: this test makes less sense now that expand_aprs_message is separate def test_object_item_report(self): self.__receive(parse_tnc2( 'KE6AFE-2>APU25N,WR6ABD*,NCA1:;TFCSCRUZ *160323z3655.94N\12200.92W?70 In 10 Minutes', _dummy_receive_time)) self.assertEqual({'KE6AFE-2', 'TFCSCRUZ '}, set(self.store.state().keys())) # TODO test value of object def test_object_kill(self): self.__receive(parse_tnc2( 'KE6AFE-2>APU25N,WR6ABD*,NCA1:;TFCSCRUZ *160323z3655.94N\12200.92W?70 In 10 Minutes', _dummy_receive_time)) self.assertEqual({'KE6AFE-2', 'TFCSCRUZ '}, set(self.store.state().keys())) self.__receive(parse_tnc2( 'FOO>BAR:;TFCSCRUZ _160323z3655.94N\12200.92W?', _dummy_receive_time)) self.clock.advance(0) self.assertEqual({'FOO', 'KE6AFE-2'}, set(self.store.state().keys())) def test_drop_old(self): self.__receive(parse_tnc2('FOO>RX:>', _dummy_receive_time)) self.assertEqual(['FOO'], self.store.state().keys()) self.clock.advance(1799.5) self.__receive(parse_tnc2('BAR>RX:>', _dummy_receive_time + 1799.5)) self.assertEqual({'BAR', 'FOO'}, set(self.store.state().keys())) self.clock.advance(0.5) self.__receive(parse_tnc2('BAR>RX:>', _dummy_receive_time + 1800)) self.assertEqual(['BAR'], self.store.state().keys())
class TestTelemetryStore(unittest.TestCase): def setUp(self): self.clock = Clock() self.clock.advance(1000) self.store = TelemetryStore(time_source=self.clock) def test_new_object(self): self.assertEqual([], self.store.state().keys()) self.store.receive(Msg("foo", 1000)) self.assertEqual(["foo"], self.store.state().keys()) obj = self.store.state()["foo"].get() self.assertIsInstance(obj, Obj) def test_receive_called(self): self.store.receive(Msg("foo", 1000, 1)) obj = self.store.state()["foo"].get() self.assertEquals(obj.last_msg, 1) self.store.receive(Msg("foo", 1000, 2)) self.assertEquals(obj.last_msg, 2) def test_drop_old(self): self.store.receive(Msg("foo", 1000)) self.assertEqual(["foo"], self.store.state().keys()) self.clock.advance(1799.5) self.store.receive(Msg("bar", 2799.5)) self.assertEqual({"bar", "foo"}, set(self.store.state().keys())) self.clock.advance(0.5) self.store.receive(Msg("bar", 2800)) self.assertEqual(["bar"], self.store.state().keys()) def test_become_interesting(self): self.store.receive(Msg("foo", 1000, "boring")) self.assertEqual([], self.store.state().keys()) self.store.receive(Msg("foo", 1001, "interesting")) self.assertEqual(["foo"], self.store.state().keys()) # 'become boring' is not implemented, so also not tested yet def test_drop_old_boring(self): """ Make sure that dropping a boring object doesn't fail. """ self.store.receive(Msg("foo", 1000, "boring")) self.assertEqual([], self.store.state().keys()) self.clock.advance(1800) self.store.receive(Msg("bar", 2800, "boring")) self.assertEqual([], self.store.state().keys())
class TestTelemetryStore(unittest.TestCase): def setUp(self): self.clock = SlightlyBetterClock() self.clock.advance(1000) self.store = TelemetryStore(time_source=self.clock) def test_new_object(self): self.assertEqual(set(), set(self.store.state().keys())) self.store.receive(Msg('foo', 1000)) self.assertEqual({'foo'}, set(self.store.state().keys())) obj = self.store.state()['foo'].get() self.assertIsInstance(obj, Obj) def test_receive_called(self): self.store.receive(Msg('foo', 1000, 1)) obj = self.store.state()['foo'].get() self.assertEqual(obj.last_msg, 1) self.store.receive(Msg('foo', 1000, 2)) self.assertEqual(obj.last_msg, 2) def test_drop_old(self): self.store.receive(Msg('foo', 1000)) self.assertEqual({'foo'}, set(self.store.state().keys())) self.clock.advance(1799.5) self.store.receive(Msg('bar', 2799.5)) self.assertEqual({'bar', 'foo'}, set(self.store.state().keys())) self.clock.advance(0.5) self.assertEqual({'bar'}, set(self.store.state().keys())) self.clock.advance(10000) self.assertEqual(set(), set(self.store.state().keys())) # Expect complete cleanup -- that is, even if a TelemetryStore is created, filled, and thrown away, it will eventually be garbage collected when the objects expire. self.assertEqual(set(), set(self.clock.getDelayedCalls())) def test_become_interesting(self): self.store.receive(Msg('foo', 1000, 'boring')) self.assertEqual(set(), set(self.store.state().keys())) self.store.receive(Msg('foo', 1001, 'interesting')) self.assertEqual({'foo'}, set(self.store.state().keys())) # 'become boring' is not implemented, so also not tested yet def test_drop_old_boring(self): """ Make sure that dropping a boring object doesn't fail. """ self.store.receive(Msg('foo', 1000, 'boring')) self.assertEqual(set(), set(self.store.state().keys())) self.clock.advance(1800) self.store.receive(Msg('bar', 2800, 'boring')) self.assertEqual(set(), set(self.store.state().keys())) def test_expire_in_the_past(self): """ An ITelemetryObject expiring in the past is not an error. """ self.clock.advance(10000) self.store.receive(Msg('foo', 0, 'long ago')) self.clock.advance(2000)
class TestTelemetryStore(unittest.TestCase): def setUp(self): self.clock = Clock() self.clock.advance(1000) self.store = TelemetryStore(time_source=self.clock) def test_new_object(self): self.assertEqual([], self.store.state().keys()) self.store.receive(Msg('foo', 1000)) self.assertEqual(['foo'], self.store.state().keys()) obj = self.store.state()['foo'].get() self.assertIsInstance(obj, Obj) def test_receive_called(self): self.store.receive(Msg('foo', 1000, 1)) obj = self.store.state()['foo'].get() self.assertEquals(obj.last_msg, 1) self.store.receive(Msg('foo', 1000, 2)) self.assertEquals(obj.last_msg, 2) def test_drop_old(self): self.store.receive(Msg('foo', 1000)) self.assertEqual(['foo'], self.store.state().keys()) self.clock.advance(1799.5) self.store.receive(Msg('bar', 2799.5)) self.assertEqual({'bar', 'foo'}, set(self.store.state().keys())) self.clock.advance(0.5) self.store.receive(Msg('bar', 2800)) self.assertEqual(['bar'], self.store.state().keys()) def test_become_interesting(self): self.store.receive(Msg('foo', 1000, 'boring')) self.assertEqual([], self.store.state().keys()) self.store.receive(Msg('foo', 1001, 'interesting')) self.assertEqual(['foo'], self.store.state().keys()) # 'become boring' is not implemented, so also not tested yet def test_drop_old_boring(self): """ Make sure that dropping a boring object doesn't fail. """ self.store.receive(Msg('foo', 1000, 'boring')) self.assertEqual([], self.store.state().keys()) self.clock.advance(1800) self.store.receive(Msg('bar', 2800, 'boring')) self.assertEqual([], self.store.state().keys())
class TestTelemetryStore(unittest.TestCase): def setUp(self): self.clock = SlightlyBetterClock() self.clock.advance(1000) self.store = TelemetryStore(time_source=self.clock) def test_new_object(self): self.assertEqual([], self.store.state().keys()) self.store.receive(Msg('foo', 1000)) self.assertEqual(['foo'], self.store.state().keys()) obj = self.store.state()['foo'].get() self.assertIsInstance(obj, Obj) def test_receive_called(self): self.store.receive(Msg('foo', 1000, 1)) obj = self.store.state()['foo'].get() self.assertEquals(obj.last_msg, 1) self.store.receive(Msg('foo', 1000, 2)) self.assertEquals(obj.last_msg, 2) def test_drop_old(self): self.store.receive(Msg('foo', 1000)) self.assertEqual(['foo'], self.store.state().keys()) self.clock.advance(1799.5) self.store.receive(Msg('bar', 2799.5)) self.assertEqual({'bar', 'foo'}, set(self.store.state().keys())) self.clock.advance(0.5) self.assertEqual({'bar'}, set(self.store.state().keys())) self.clock.advance(10000) self.assertEqual([], self.store.state().keys()) # Expect complete cleanup -- that is, even if a TelemetryStore is created, filled, and thrown away, it will eventually be garbage collected when the objects expire. self.assertEqual([], self.clock.getDelayedCalls()) def test_become_interesting(self): self.store.receive(Msg('foo', 1000, 'boring')) self.assertEqual([], self.store.state().keys()) self.store.receive(Msg('foo', 1001, 'interesting')) self.assertEqual(['foo'], self.store.state().keys()) # 'become boring' is not implemented, so also not tested yet def test_drop_old_boring(self): """ Make sure that dropping a boring object doesn't fail. """ self.store.receive(Msg('foo', 1000, 'boring')) self.assertEqual([], self.store.state().keys()) self.clock.advance(1800) self.store.receive(Msg('bar', 2800, 'boring')) self.assertEqual([], self.store.state().keys()) def test_expire_in_the_past(self): """ An ITelemetryObject expiring in the past is not an error. """ self.clock.advance(10000) self.store.receive(Msg('foo', 0, 'long ago')) self.clock.advance(2000)