def test09_next_owner_id_race_condition(self): owner = 11 player1 = 12 player2 = 13 # Create the game. response = yield self.service.handle([], {'action': ['create'], 'owner_id': [owner]}) game_id = response['game_id'] self.add_players_to_game(game_id, [owner, player1, player2]) # Complete the game. yield self.complete_game(game_id, owner, player1, player2) table = self.table_instance.game2table[game_id] self.test_done = False self.counter = 0 def listener(args): if not self.test_done: self.counter += 1 modified = args['modified'][0] table.poll({'modified': [modified]}).addCallback(listener) return args modified = table.get_modified() poll = table.poll({'modified': [modified]}).addCallback(listener) d1 = table.update_next_owner_id() d2 = table.update_next_owner_id() d3 = table.update_next_owner_id() d = defer.DeferredList([d1, d2, d3]) # Wait for all three update operations to finish... yield d # ...and then wait for the next_owner change to be dispatched by the poll. yield poll self.assertEquals(self.counter, 1) # Break the listen loop so that the test runner doesn't complain # about a dirty reactor. self.test_done = True table.touch({}) # For the same reason cancel the next_game_timer. table.stop_timer(table.next_game_timer)
def listener(args): if not self.test_done: self.counter += 1 modified = args['modified'][0] table.poll({'modified': [modified]}).addCallback(listener) return args