Во время Олимпиады тестирование решений проводится автоматически, на тестирующих клиентах.
На одной физической машине можно запустить не более одного тестирующего клиента.
1)Клиент запрашивает из базы данных Задачу, которую еще никто не тестирует
2) Записывает в Базу Данных в таблицу Submits свой ip адрес.
(обратите внимание, что между первым и вторым шагом может пройти достаточное время. И другой тестирующий клиент также может забрать эту задачу, считается что задачу тестирует последний клиент, то есть тот кто записал свой ip в базу позже)
3)сервер присылает Клиенту md5-хеш.
4а)если md5-хеш присланный сервером совпадает с md5, который создан по архиву тестов хранящихся у клиента, то Клиент Запрашивает у сервера Решение Задачи на Проверку.
4б) если md5-хеш присланный сервером отличен от md5, который создан по архиву тестов хранящихся у клиента, то клиент запрашивает у сервера новый архив с тестами.
Тесты приходят к нему в ввиде zip-архива
5)Клиент запрашивает Решение на проверку
6)Решение Компилируется с помощью урезанного компилятора, из которого были удалены все библиотеки, не разрешенные правилами олимпиад.
7а) если Решение не скомпилировалось. То этот результат отправляется Серверу.
7б) если Решение С компилировалось. Проверка Продолжается
8) Запускается Процесс, для проверки Решения.
9)Этот процесс запускает Win Kill.
10) Winkill запускает процесс с ограниченными правами, который исполняет программу участника олимпиады.
11) на этот процесс накладываются ограничения по глобальному и процессорному времени, количеству используемой памяти. И тд.
12) Ищем Out Put файл, который должна была выдать программа пользователя
13а)Если Этот файл отсутствует, то выдается ошибка
13б)Если этот файл присутствует, то производится сравание этого output-файла, с output-файлом, хранящемся на клиенте.
14а) если предусмотрена программа чекер, она пересылается в том же архиве, что и тесты. То запускается Чекер и сравнивает результаты 2х файлов и выдает результат.
14б) если же чекер не предусмотрен, то сравнивание происходит побитово.
15а) если Олимпиада ACM и тест не был пройден успешно.
То проверка завершается.
И на сервер передаются результаты.
15б)если Олимпиада Школьная и тест не был пройден успешно. То Проверка переходим на шаг 16.
15в)если Олимпиада ACM и тест был пройден успешно, то переходим на шаг 16.
15г)если Олимпиада Школьная и тест был пройден успешно, то переходим на шаг 16.
16) Завершаем этот процесс, Завершаем процесс winkill, Завершаем процесс Завершивший winkill.
17а)Переходим к проверки нового теста. То есть переходим на шаг 8.
17б) если наш тест был последним, отправлем результаты на сервер.