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))