Esempio n. 1
0
    def test_student_sharding(self):
        # Ensure empty starting DB
        result = DeploymentConfig().query().fetch(limit=None)
        self.assertFalse(result)
        result = Student().query().fetch(limit=None)
        self.assertFalse(result)
        result = StudentShard().query().fetch(limit=None)
        self.assertFalse(result)
        # Test creation of dummy deployment config
        config = get_dummy_config()
        result = DeploymentConfig().query().fetch(limit=None)
        self.assertEqual(1, len(result))

        # Create/delete shards
        shard_count = len(get_dummy_ids())
        setup_dummy_shards()
        result = StudentShard().query().fetch(limit=None)
        self.assertEqual(shard_count, len(result))
        self.assertEqual(shard_count, len(StudentShard.get_all()))
        StudentShard.delete_all()
        self.assertFalse(StudentShard.get_all())

        # Linear shard generator serves each shard once
        setup_dummy_shards()
        seen_shards = {}
        gen = StudentShard.linear_shard_generator
        for i in gen():
            seen_shards[i.key] = True
        self.assertEqual(shard_count, len(seen_shards))

        # Circular shard generator serves each shard once, then loops
        seen_shards = {}
        gen = StudentShard.circular_shard_generator
        failsafe = 10000
        count = 0
        try:
            for i in gen():
                count += 1
                if count > failsafe:
                    raise ValueError("Infinite loop when testing circular_shard_generator")
                if i.key in seen_shards:
                    raise StopIteration("Shard repeat")
                else:
                    seen_shards[i.key] = True
        except StopIteration:
            pass
        self.assertEqual(shard_count, len(seen_shards))