def test_get_user_no_current_attempt(self): Utils.start_contest(since=100, duration=200) Database.add_user("token", "", "") Database.add_task("poldo", "", "", 42, 1) Database.add_user_task("token", "poldo") res = self.handler.get_user(token="token", _ip="1.1.1.1") self.assertEqual(None, res["tasks"]["poldo"]["current_input"])
def test_get_source(self): Utils.start_contest() Database.add_user("token", "", "") Database.add_task("poldo", "", "", 42, 1) Database.add_input("inputid", "token", "poldo", 1, "/path", 42) Database.add_source("sourceid", "inputid", "/path", 42) res = self.handler.get_source(source_id="sourceid", _ip="1.1.1.1") self.assertEqual("sourceid", res["id"])
def test_get_input(self): Database.add_user("token", "", "") Database.add_task("poldo", "", "", 42, 1) Database.add_input("inputid", "token", "poldo", 1, "/path", 42) Utils.start_contest() res = self.handler.get_input(input_id="inputid", _ip="1.1.1.1") self.assertEqual("inputid", res["id"]) self.assertEqual("token", res["token"]) self.assertEqual("poldo", res["task"])
def test_get_output(self): Database.add_user("token", "", "") Database.add_task("poldo", "", "", 42, 1) Database.add_input("inputid", "token", "poldo", 1, "/path", 42) Database.add_output("outputid", "inputid", "/path", 42, b'{"validation":42}') Utils.start_contest() res = self.handler.get_output(output_id="outputid", _ip="1.1.1.1") self.assertEqual("outputid", res["id"]) self.assertEqual(42, res["validation"])
def test_contest_started(self): Database.add_task("poldo", "", "", 42, 1) Database.set_meta("start_time", 1234) res = self.handler.get_contest() self.assertTrue(res["has_started"]) self.assertEqual( datetime.datetime.fromtimestamp(1234).isoformat(), res["start_time"]) self.assertEqual(1, len(res["tasks"])) self.assertEqual("poldo", res["tasks"][0]["name"])
def test_call_with_decorators(self): handler = TestBaseHandler.DummyHandler() env = Environ({"wsgi.input": None}) request = Request(env) Database.add_user("token", "", "") Database.add_task("poldo", "", "", 1, 1) Database.add_input("inputid", "token", "poldo", 1, "", 42) Database.add_output("outputid", "inputid", "", 42, "") handler._call(handler.with_decorators, { "input_id": "inputid", "output_id": "outputid" }, request)
def test_get_submissions(self): Utils.start_contest() Database.add_user("token", "", "") Database.add_task("poldo", "", "", 42, 1) Database.add_input("inputid", "token", "poldo", 1, "/path", 42) Database.add_output("outputid", "inputid", "/path", 42, b'{"validation":42,"feedback":42}') Database.add_source("sourceid", "inputid", "/path", 42) Database.add_submission("subid", "inputid", "outputid", "sourceid", 42) res = self.handler.get_submissions(token="token", task="poldo", _ip="1.1.1.1") self.assertEqual(1, len(res["items"])) self.assertEqual("subid", res["items"][0]["id"])
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 test_get_user(self): now = int(datetime.utcnow().timestamp()) Database.set_meta("start_time", now) Database.set_meta("contest_duration", 1000) Database.set_meta("extra_time", 50) Database.add_user("token", "", "") Database.set_extra_time("token", 30) 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 + 1080, timezone.utc).isoformat() self.assertEqual(end_time, res["end_time"]) self.assertEqual("poldo", res["tasks"]["poldo"]["name"]) self.assertEqual("inputid", res["tasks"]["poldo"]["current_input"]["id"])
def _insert_data(self): Database.add_user("token", "", "") Database.add_task("poldo", "", "", 42, 1) Database.add_user_task("token", "poldo") Database.add_input("inputid", "token", "poldo", 1, "/path", 42)
def read_from_disk(remove_enc=True): """ Load a task from the disk and load the data into the database """ try: contest = ContestManager.import_contest(Config.contest_path) except FileNotFoundError as ex: error = ( "Contest not found, you probably need to unzip it. Missing file %s" % ex.filename) Logger.warning("CONTEST", error) shutil.rmtree(Config.statementdir, ignore_errors=True) shutil.rmtree(Config.web_statementdir, ignore_errors=True) shutil.rmtree(Config.contest_path, ignore_errors=True) if remove_enc: with suppress(Exception): os.remove(Config.encrypted_file) with suppress(Exception): os.remove(Config.decrypted_file) Database.del_meta("admin_token") BaseHandler.raise_exc(UnprocessableEntity, "CONTEST", error) if not Database.get_meta("contest_imported", default=False, type=bool): Database.begin() try: Database.set_meta("contest_duration", contest["duration"], autocommit=False) Database.set_meta("contest_name", contest.get("name", "Contest"), autocommit=False) Database.set_meta( "contest_description", contest.get("description", ""), autocommit=False, ) Database.set_meta( "window_duration", # if None the contest is not USACO-style contest.get("window_duration"), autocommit=False, ) count = 0 for task in contest["tasks"]: Database.add_task( task["name"], task["description"], task["statement_path"], task["max_score"], count, autocommit=False, ) count += 1 for user in contest["users"]: Database.add_user(user["token"], user["name"], user["surname"], autocommit=False) for user in Database.get_users(): for task in Database.get_tasks(): Database.add_user_task(user["token"], task["name"], autocommit=False) Database.set_meta("contest_imported", True, autocommit=False) Database.commit() except: Database.rollback() raise else: # TODO: check that the contest is still the same pass # store the task in the ContestManager singleton ContestManager.tasks = dict( (task["name"], task) for task in contest["tasks"]) ContestManager.has_contest = True # create the queues for the task inputs for task in ContestManager.tasks: ContestManager.input_queue[task] = gevent.queue.Queue( Config.queue_size) gevent.spawn(ContestManager.worker, task)
def _insert_data(self): Database.add_user("token", "", "") Database.add_task("poldo", "Poldo", "/path", 42, 1) Database.add_input("inputid", "token", "poldo", 1, "/path", 42) Database.add_output("outputid", "inputid", "/path", 42, "{}") Database.add_source("sourceid", "inputid", "/path", 42)