Beispiel #1
0
    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"])
Beispiel #2
0
    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"])
Beispiel #3
0
    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"])
Beispiel #4
0
    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"])
Beispiel #5
0
    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)
Beispiel #7
0
    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"])
Beispiel #9
0
    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)