add upload test case zip test

This commit is contained in:
virusdefender
2017-01-25 23:01:33 +08:00
parent e6deec0834
commit 681a88ea83
3 changed files with 88 additions and 5 deletions

View File

@@ -1,12 +1,13 @@
import hashlib
import json
import os
import zipfile
from django.conf import settings
from utils.api import CSRFExemptAPIView
from account.decorators import admin_required
from utils.api import CSRFExemptAPIView
from utils.shortcuts import rand_str
from ..serializers import TestCaseUploadForm
@@ -51,7 +52,7 @@ class TestCaseUploadAPI(CSRFExemptAPIView):
f.write(chunk)
try:
zip_file = zipfile.ZipFile(tmp_file)
except zipfile.BadZipfile:
except zipfile.BadZipFile:
return self.error("Bad zip file")
name_list = zip_file.namelist()
test_case_list = self.filter_name_list(name_list, spj=spj)
@@ -62,11 +63,42 @@ class TestCaseUploadAPI(CSRFExemptAPIView):
test_case_dir = os.path.join(settings.TEST_CASE_DIR, test_case_id)
os.mkdir(test_case_dir)
size_cache = {}
md5_cache = {}
for item in test_case_list:
with open(os.path.join(test_case_dir, item), "wb") as f:
f.write(zip_file.read(item).replace(b"\r\n", b"\n"))
content = zip_file.read(item).replace(b"\r\n", b"\n")
size_cache[item] = len(content)
if item.endswith(".out"):
md5_cache[item] = hashlib.md5(content).hexdigest()
f.write(content)
test_case_info = {"spj": spj, "test_cases": {}}
hint = None
diff = set(name_list).difference(set(test_case_list))
if diff:
hint = ", ".join(diff) + " are ignored"
return self.success({"id": test_case_id, "file_list": test_case_list, "hint": hint, "spj": spj})
ret = []
if spj:
for index, item in enumerate(test_case_list):
data = {"input_name": item, "input_size": size_cache[item]}
ret.append(data)
test_case_info["test_cases"][str(index + 1)] = data
else:
# ["1.in", "1.out", "2.in", "2.out"] => [("1.in", "1.out"), ("2.in", "2.out")]
test_case_list = zip(*[test_case_list[i::2] for i in range(2)])
for index, item in enumerate(test_case_list):
data = {"stripped_output_md5": md5_cache[item[1]],
"input_size": size_cache[item[0]],
"output_size": size_cache[item[1]],
"input_name": item[0],
"output_name": item[1]}
ret.append(data)
test_case_info["test_cases"][str(index + 1)] = data
with open(os.path.join(test_case_dir, "info"), "w", encoding="utf-8") as f:
f.write(json.dumps(test_case_info, indent=4))
return self.success({"id": test_case_id, "info": ret, "hint": hint, "spj": spj})