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
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"))
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)
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)
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_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"))
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())
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)
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())
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())
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_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"}, )
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_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())
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"])
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"))
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())
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"])
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())
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"])
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())
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())