Пример #1
0
class ActorManagerTests(unittest.TestCase):

    def setUp(self):
        n = DummyNode()
        self.am = ActorManager(node=n)
        self.am.connection_handler = ConnectionHandler()
        n.am = self.am

    def tearDown(self):
        pass

    def _new_actor(self, a_type, a_args, app_id=None, **kwargs):
        a_id = self.am.new(a_type, a_args, app_id=app_id, **kwargs)
        a = self.am.actors.get(a_id, None)
        self.assertTrue(a)
        return a, a_id

    def testNewActor(self):
        # Test basic actor creation
        a_type = 'std.Constant'
        data = 42
        a, _ = self._new_actor(a_type, {'data':data})
        self.assertEqual(a.data, data)

    def testActorStateGet(self):
        # Test basic actor state retrieval
        a_type = 'std.Constant'
        data = 42
        a, a_id = self._new_actor(a_type, {'data':data})
        s = a.state()

        self.assertEqual(s['data'], data)
        self.assertEqual(s['id'], a_id)
        self.assertEqual(s['n'], 1)

    def testNewActorFromState(self):
        # Test basic actor state manipulation
        a_type = 'std.Constant'
        data = 42
        a, a_id = self._new_actor(a_type, {'data': data})
        a.data = 43
        a.n = 2
        s = a.state()
        self.am.delete_actor(a_id)
        self.assertEqual(len(self.am.actors), 0)

        b, b_id = self._new_actor(a_type, None, state=s)

        self.assertEqual(a.data, 43)
        self.assertEqual(a.n, 2)
        # Assert id is preserved
        self.assertEqual(a.id, a_id)
        # Assert actor database is consistent
        self.assertTrue(self.am.actors[a_id])
        self.assertEqual(len(self.am.actors), 1)

    def testNewReplicaWithState(self):
        a_type = 'io.StandardOut'
        a, a_id = self._new_actor(a_type, {'name': 'a_name', 'store_tokens': 1})
        a.tokens = [1, 2, 3]
        state = a.state()

        prev_connections = a.connections(self.am.node.id)
        prev_connections['port_names'] = a.port_names()

        args = a.replication_args()
        args['name'] = 'new_name'
        self.am.new_replica(a_type, args, state, dict(prev_connections), None, None)
        self.assertEqual(len(self.am.actors), 2)

        ids = set(self.am.actors.keys())
        b_id = (ids | set([a.id])).pop()
        b = self.am.actors[b_id]

        self.assertEqual(a.tokens, [1, 2, 3])
        self.assertEqual(a.store_tokens, 1)
        self.assertEqual(b.tokens, [1, 2, 3])
        self.assertEqual(b.store_tokens, 1)

        # Assert new id is assigned
        self.assertNotEqual(b.id, a.id)

        # Assert new name is assigned
        self.assertNotEqual(b.name, a.name)

        # Assert actor database is consistent
        self.assertTrue(self.am.actors[a_id])
        self.assertTrue(self.am.actors[b.id])
        self.assertEqual(len(self.am.actors), 2)