def test_get_user_windowed_partial_window(self): now = int(datetime.utcnow().timestamp()) Database.set_meta("start_time", now) Database.set_meta("contest_duration", 1000) Database.set_meta("window_duration", 100) Database.add_user("token", "", "") Database.set_start_delay("token", 990) Database.add_task("poldo", "", "", 42, 1) Database.add_user_task("token", "poldo") Database.add_input("inputid", "token", "poldo", 1, "/path", 42) Database.set_user_attempt("token", "poldo", 1) res = self.handler.get_user(token="token", _ip="1.1.1.1") end_time = datetime.fromtimestamp(now + 1000, timezone.utc).isoformat() self.assertEqual(end_time, res["end_time"])
def test_get_user_windowed_almost_finished(self): now = int(datetime.datetime.now().timestamp()) Database.set_meta("start_time", now - 90) Database.set_meta("contest_duration", 1000) Database.set_meta("window_duration", 100) Database.add_user("token", "", "") Database.set_start_delay("token", 10) Database.add_task("poldo", "", "", 42, 1) Database.add_user_task("token", "poldo") Database.add_input("inputid", "token", "poldo", 1, "/path", 42) Database.set_user_attempt("token", "poldo", 1) res = self.handler.get_user(token="token", _ip="1.1.1.1") end_time = datetime.datetime.fromtimestamp(now + 20).strftime( '%Y-%m-%dT%H:%M:%S') self.assertEqual(end_time, res["end_time"])
def _ensure_window_start(token): """ Makes sure that the window of the user has been started :param token: The token of the user :return: True if the user has been updated """ if not Database.get_meta("window_duration", None): return False user = Database.get_user(token) if not user: return False start_delay = user["contest_start_delay"] if start_delay is not None: return False start = Database.get_meta("start_time", type=int) if start is None: return False now = time.time() delay = now - start Database.set_start_delay(token, delay) Logger.info("WINDOW_START", "Contest started for %s after %d" % (token, delay)) return True