示例#1
0
    def test_sumbit_not_matching(self, g_f_s_mock, g_i_mock):
        Utils.start_contest()
        self._insert_data(token="token", task="poldo")
        self._insert_data(token="token2", task="poldo")
        backup = Logger.LOG_LEVEL
        Logger.LOG_LEVEL = 9001

        self.handler.generate_input(token='token', task='poldo', _ip='1.1.1.1')
        g_i_mock.return_value = ("inputid2", "/path")
        self.handler.generate_input(token='token2',
                                    task='poldo',
                                    _ip='1.1.1.1')

        Database.c.execute(
            "INSERT INTO outputs (id, input, path, size, result) "
            "VALUES ('outputid', 'inputid', '/output', 42, '{}')")
        Database.c.execute("INSERT INTO sources (id, input, path, size) "
                           "VALUES ('sourceid', 'inputid2', '/source', 42)")
        with self.assertRaises(Forbidden) as ex:
            self.handler.submit(output_id='outputid',
                                source_id='sourceid',
                                _ip='1.1.1.1')

        self.assertIn("The provided pair of source-output is invalid",
                      ex.exception.response.data.decode())
        Logger.LOG_LEVEL = backup
示例#2
0
    def test_submit(self, g_f_s_mock, g_i_mock):
        Utils.start_contest()
        self._insert_data()
        self.handler.generate_input(token='token', task='poldo', _ip='1.1.1.1')

        Database.c.execute(
            "INSERT INTO outputs (id, input, path, size, result) "
            "VALUES ('outputid', 'inputid', '/output', 42,"
            ":result)", {
                "result":
                b'{\"score\":0.5,\"feedback\":{\"a\":1},'
                b'\"validation\":{\"b\":2}}'
            })
        Database.c.execute("INSERT INTO sources (id, input, path, size) "
                           "VALUES ('sourceid', 'inputid', '/source', 42)")

        response = self.handler.submit(output_id='outputid',
                                       source_id='sourceid',
                                       _ip='1.1.1.1')
        self.assertEqual("token", response["token"])
        self.assertEqual("poldo", response["task"])
        self.assertEqual(21, response["score"])
        self.assertEqual("inputid", response["input"]["id"])
        self.assertEqual("sourceid", response["source"]["id"])
        self.assertEqual("outputid", response["output"]["id"])
        self.assertEqual(1, response["feedback"]["a"])
        self.assertEqual(2, response["output"]["validation"]["b"])

        user_task = Database.get_user_task("token", "poldo")
        self.assertEqual(21, user_task["score"])
        self.assertEqual(response["id"],
                         Database.get_submission(response["id"])["id"])
    def test_submit_broken_transaction(self, gen_i_mock, a_s_mock, g_f_s_mock,
                                       g_i_mock):
        Utils.start_contest()
        self._insert_data()
        self.handler.generate_input(token="token", task="poldo", _ip="1.1.1.1")

        Database.c.execute(
            "INSERT INTO outputs (id, input, path, size, result) "
            "VALUES ('outputid', 'inputid', '/output', 42,"
            ":result)",
            {
                "result":
                b'{"score":0.5,"feedback":{"a":1},'
                b'"validation":{"b":2}}'
            },
        )
        Database.c.execute("INSERT INTO sources (id, input, path, size) "
                           "VALUES ('sourceid', 'inputid', '/source', 42)")

        with self.assertRaises(BadRequest) as ex:
            self.handler.submit(output_id="outputid",
                                source_id="sourceid",
                                _ip="1.1.1.1")
        self.assertIn("Error inserting the submission",
                      ex.exception.response.data.decode())
        self.assertIsNone(Database.get_submission("subid"))
示例#4
0
    def test_get_source_invalid_id(self):
        Utils.start_contest()
        with self.assertRaises(Forbidden) as ex:
            self.handler.get_source(source_id="invalid source", _ip="1.1.1.1")

        response = ex.exception.response.data.decode()
        self.assertIn("No such source", response)
示例#5
0
    def test_get_user_invalid_token(self):
        Utils.start_contest()
        with self.assertRaises(Forbidden) as ex:
            self.handler.get_user(token="invalid token", _ip="1.1.1.1")

        response = ex.exception.response.data.decode()
        self.assertIn("No such user", response)
示例#6
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"])
示例#7
0
    def test_start_reset(self):
        Utils.start_contest(since=-100)
        out = self.admin_handler.start("reset",
                                       admin_token="ADMIN-TOKEN",
                                       _ip="1.2.3.4")

        self.assertIsNone(out["start_time"])
        self.assertIsNone(Database.get_meta("start_time"))
示例#8
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"])
    def test_upload_output_invalid_input(self):
        Utils.start_contest()
        with self.assertRaises(Forbidden) as ex:
            self.handler.upload_output(input_id="invalid input",
                                       _ip="1.1.1.1",
                                       _file_content="foo",
                                       _file_name="bar")

        self.assertIn("No such input", ex.exception.response.data.decode())
示例#10
0
    def test_get_submissions_invalid_task(self):
        Utils.start_contest()
        Database.add_user("token", "", "")
        with self.assertRaises(Forbidden) as ex:
            self.handler.get_submissions(token="token",
                                         task="invalid task",
                                         _ip="1.1.1.1")

        response = ex.exception.response.data.decode()
        self.assertIn("No such task", response)
示例#11
0
    def test_start_now_already_started(self):
        Utils.start_contest()

        with self.assertRaises(Forbidden) as ex:
            self.admin_handler.start(start_time="now",
                                     admin_token="ADMIN-TOKEN",
                                     _ip="1.2.3.4")

        self.assertIn("Contest has already been started",
                      ex.exception.response.data.decode())
示例#12
0
    def test_generate_input_invalid_task(self):
        Utils.start_contest()
        self._insert_data()

        with self.assertRaises(Forbidden) as ex:
            self.handler.generate_input(token='token',
                                        task='invalid task',
                                        _ip='1.1.1.1')

        self.assertIn("No such task", ex.exception.response.data.decode())
    def test_generate_input_invalid_token(self):
        Utils.start_contest()
        self._insert_data()

        with self.assertRaises(Forbidden) as ex:
            self.handler.generate_input(token="invalid token",
                                        task="poldo",
                                        _ip="1.1.1.1")

        self.assertIn("No such user", ex.exception.response.data.decode())
示例#14
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"])
示例#15
0
    def test_submit_invalid_output(self):
        Utils.start_contest()
        self._insert_data()

        with self.assertRaises(Forbidden) as ex:
            self.handler.submit(output_id='invalid output',
                                source_id='invalid source',
                                _ip='1.1.1.1')

        self.assertIn("No such output", ex.exception.response.data.decode())
    def test_upload_output_invalid_file_name(self, gen_mock):
        Utils.start_contest()
        self._insert_data()

        with self.assertRaises(BadRequest):
            self.handler.upload_output(
                input_id="inputid",
                _ip="1.1.1.1",
                file={"content": "foobar".encode(), "name": ".."},
            )
    def test_upload_output_check_failed(self, gen_mock, eval_mock):
        Utils.start_contest()
        self._insert_data()

        with self.assertRaises(InternalServerError):
            self.handler.upload_output(
                input_id="inputid",
                _ip="1.1.1.1",
                file={"content": "foobar".encode(), "name": "output.txt"},
            )
示例#18
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"])
示例#19
0
    def test_start_now_but_started_in_future(self):
        Utils.start_contest(since=-100)
        out = self.admin_handler.start("now",
                                       admin_token="ADMIN-TOKEN",
                                       _ip="1.2.3.4")

        start_time = dateutil.parser.parse(out["start_time"]).timestamp()
        self.assertTrue(start_time >= datetime.utcnow().timestamp() - 10)

        start_time_db = datetime.fromtimestamp(
            Database.get_meta("start_time", type=int), timezone.utc)
        self.assertEqual(start_time, start_time_db.timestamp())
示例#20
0
    def test_patch_submission(self, mock):
        Utils.start_contest()
        submission = {
            "id": "subid",
            "nested_item": 42,
            "output_result": b'{"feedback":123}'
        }

        res = InfoHandler.patch_submission(submission)
        self.assertEqual("subid", res["id"])
        self.assertEqual(42, res["nested"]["item"])
        self.assertEqual(123, res["feedback"])
        self.assertEqual("outputid", res["output"]["id"])
示例#21
0
 def test_generate_input_transaction_broken(self, register_mock,
                                            get_file_size_mock,
                                            get_input_mock):
     Utils.start_contest()
     self._insert_data()
     with self.assertRaises(Exception) as ex:
         with patch("terry.database.Database.commit",
                    side_effect=Exception("ops...")):
             self.handler.generate_input(token='token',
                                         task='poldo',
                                         _ip='1.1.1.1')
     self.assertIn("ops...", ex.exception.args[0])
     self.assertIsNone(Database.get_input("inputid"))
示例#22
0
    def test_generate_input_already_have(self, get_file_size_mock,
                                         get_input_mock):
        Utils.start_contest()
        self._insert_data()
        self.handler.generate_input(token='token', task='poldo', _ip='1.1.1.1')

        with self.assertRaises(Forbidden) as ex:
            self.handler.generate_input(token='token',
                                        task='poldo',
                                        _ip='1.1.1.1')

        self.assertIn("You already have a ready input",
                      ex.exception.response.data.decode())
示例#23
0
    def test_sumbit_invalid_source(self, g_f_s_mock, g_i_mock):
        Utils.start_contest()
        self._insert_data()

        self.handler.generate_input(token='token', task='poldo', _ip='1.1.1.1')
        Database.c.execute(
            "INSERT INTO outputs (id, input, path, size, result) "
            "VALUES ('outputid', 'inputid', '/output', 42, '{}')")
        with self.assertRaises(Forbidden) as ex:
            self.handler.submit(output_id='outputid',
                                source_id='invalid source',
                                _ip='1.1.1.1')

        self.assertIn("No such source", ex.exception.response.data.decode())
    def test_upload_source_with_exe(self, gen_mock):
        Utils.start_contest()
        self._insert_data()
        executable = b"\x4D\x5Adeadbaba"

        res = self.handler.upload_source(
            input_id="inputid",
            _ip="1.1.1.1",
            file={"content": executable, "name": "lol.exe"},
        )
        alerts = res["validation"]["alerts"]
        self.assertEqual(1, len(alerts))
        self.assertIn("executable", alerts[0]["message"])
        self.assertEqual("warning", alerts[0]["severity"])
示例#25
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_upload_output(self, gen_mock, eval_mock):
        Utils.start_contest()
        self._insert_data()

        res = self.handler.upload_output(
            input_id="inputid",
            _ip="1.1.1.1",
            file={"content": "foobar".encode(), "name": "output.txt"},
        )
        self.assertEqual("outputid", res["id"])
        self.assertIn("output.txt", res["path"])
        self.assertEqual(42, res["validation"])
        self.assertEqual("inputid", res["input"])
        self.assertEqual(6, res["size"])
        path = os.path.join(Config.storedir, res["path"])
        with open(path, "r") as file:
            self.assertEqual("foobar", file.read())
示例#27
0
    def test_patch_output(self):
        Utils.start_contest()
        output = {
            "id": "outputid",
            "date": 1234,
            "path": "/path",
            "size": 42,
            "result": b'{"validation":42}'
        }

        res = InfoHandler.patch_output(output)
        self.assertEqual("outputid", res["id"]),
        self.assertEqual(
            datetime.datetime.fromtimestamp(1234).isoformat(), res["date"])
        self.assertEqual("/path", res["path"])
        self.assertEqual(42, res["validation"])
        self.assertEqual(42, res["size"])
示例#28
0
    def test_generate_input(self, get_file_size_mock, get_input_mock):
        Utils.start_contest()
        self._insert_data()
        response = self.handler.generate_input(token='token',
                                               task='poldo',
                                               _ip='1.1.1.1')

        self.assertEqual("inputid", response["id"])
        self.assertEqual("/path", response["path"])
        self.assertEqual(42, response["size"])
        self.assertEqual("token", response["token"])
        self.assertEqual("poldo", response["task"])
        self.assertEqual(1, response["attempt"])

        Database.c.execute("SELECT * FROM user_tasks WHERE token = 'token'")
        row = Database.c.fetchone()
        self.assertEqual("token", row[0])
        self.assertEqual("poldo", row[1])
        self.assertEqual(1, row[3])
 def test_submit_db_broken(self, g_i_mock, g_f_s_mock):
     Utils.start_contest()
     self._insert_data()
     self.handler.generate_input(token="token", task="poldo", _ip="1.1.1.1")
     Database.c.execute(
         "INSERT INTO outputs (id, input, path, size, result) "
         "VALUES ('outputid', 'inputid', '/output', 42,"
         '\'{"score":0.5,"feedback":{"a":1},"validation":{'
         '"b":2}}\')')
     Database.c.execute("INSERT INTO sources (id, input, path, size) "
                        "VALUES ('sourceid', 'inputid', '/source', 42)")
     with patch("terry.database.Database.get_input", return_value=None):
         with Utils.nostderr() as stderr:
             with self.assertRaises(BadRequest) as ex:
                 self.handler.submit(output_id="outputid",
                                     source_id="sourceid",
                                     _ip="1.1.1.1")
     self.assertIn("WRONG_INPUT", ex.exception.response.data.decode())
     self.assertIn("The provided input in invalid",
                   ex.exception.response.data.decode())
示例#30
0
 def test_submit_db_broken(self, g_i_mock, g_f_s_mock):
     Utils.start_contest()
     self._insert_data()
     self.handler.generate_input(token='token', task='poldo', _ip='1.1.1.1')
     Database.c.execute(
         "INSERT INTO outputs (id, input, path, size, result) "
         "VALUES ('outputid', 'inputid', '/output', 42,"
         "'{\"score\":0.5,\"feedback\":{\"a\":1},\"validation\":{"
         "\"b\":2}}')")
     Database.c.execute("INSERT INTO sources (id, input, path, size) "
                        "VALUES ('sourceid', 'inputid', '/source', 42)")
     with patch("terry.database.Database.get_input", return_value=None):
         with Utils.nostderr() as stderr:
             with self.assertRaises(BadRequest) as ex:
                 self.handler.submit(output_id='outputid',
                                     source_id='sourceid',
                                     _ip='1.1.1.1')
     self.assertIn("WRONG_INPUT", ex.exception.response.data.decode())
     self.assertIn("The provided input in invalid",
                   ex.exception.response.data.decode())