Commit 8d1a20cf authored by Guillaume Huard's avatar Guillaume Huard
Browse files

WIP

parent bb9861f4
......@@ -182,7 +182,7 @@ En outre, l'exécution elle même est controllée par deux réglages évitant un
ressources disponibles :
- =timeout= : valeur en secondes déterminant le temps alloué au test pour son exécution (10 par
défaut) ;
- =IOlimit= : taille maximale en blocs d'un fichier créé par le test (10 par défaut). La taille du
- =IOlimit= : taille maximale en blocs d'un fichier créé par le test (1000 blocs par défaut). La taille du
bloc dépend du système mais est souvent de 512 octets.
L'exemple suivant comprend une petite série de tests qui ne passe que si le programme s'exécute dans
les limites imposées :
......@@ -463,7 +463,6 @@ Nous pouvons remarquer plusieurs choses :
A l'heure actuelle il n'y a qu'un seul autre réglage applicable à un cas de test :
- =case_weight= : poids associé au test dans l'évaluation globale (1 par défaut).
* Mise en place de mon activité
Une activité fondée sur l'activité de programmation système présentée dans ce
......@@ -494,6 +493,18 @@ Essentiellement, il faut bien penser à :
N'ayez pas d'inquiétude concernant la sécurité, les fichiers conservés sont supprimés par l'activité
elle-même après avoir été pris en compte et avant l'exécution de tout code étudiant.
** Debugger
Lors de la mise au point de l'activité, il est possible d'ajouter au début du fichier
=vpl_evaluate.cases= la ligne :
#+BEGIN_EXAMPLE
$mode{debug} = 1;
#+END_EXAMPLE
Cela permet d'avoir une sortie d'exécution (cachée aux étudiants) beaucoup plus bavarde que par
défaut, avec notamment :
- un affichage de la table de hashage fournie dans =vpl_evaluate.cases= après évaluation
- un affichage des entrées / sorties même pour les tests passés avec succès
#+BEGIN_SRC txt :mkdirp yes :tangle Basic_System/vpl_id.txt :exports none
22733
#+END_SRC
......
......@@ -84,6 +84,16 @@ sub get_value($$$) {
}
}
# Sets a named field to a given value if it is not already set
sub set_default($$$) {
my $description = shift;
my $name = shift;
my $default = shift;
if (!exists($description->{$name})) {
$description->{$name} = $default;
}
}
# Reads all the data available from a given fd and closes it
sub read_from_fd($) {
my $fd = shift;
......@@ -114,22 +124,26 @@ sub run_command($$$) {
}
}
my $data = {};
my $timeout = get_value($test, "timeout", 10);
my $IOlimit = get_value($test, "IOlimit", 10);
my $command_line = "ulimit -f$IOlimit;timeout -s9 $timeout $command$arguments".
">.internal_output.txt 2>.internal_error.txt";
# We build an execution wrapper to ensure the use of bash instead of /bin/sh (system's default)
# This avoids issues with ulimit
my $command_script = "#!/bin/bash\n";
$command_script .= "ulimit -f$test->{IOlimit}\n" if exists($test->{IOlimit});
$command_script .= "timeout -s9 $test->{timeout} " if exists($test->{timeout});
$command_script .= "$command$arguments >.internal_output.txt 2>.internal_error.txt";
if (exists($test->{input})) {
write_file(".internal_input.txt", $test->{input});
$command_line .= " <.internal_input.txt";
ensure_write(".internal_input.txt", $test->{input});
$command_script .= " <.internal_input.txt";
}
debug("Executing: $command_line\n");
ensure_write(".execution_wrapper", $command_script);
chmod(0755, ".execution_wrapper") || error("Cannot make execution_wrapper executable");
# debug("Executing: $command_line\n");
# One should use the POSIX macros WIFEXITED, WEXITSTATUS, and so on, but it's too cumbersome
$data->{failure} = system("$command_line");
$data->{failure} = system("./.execution_wrapper");
$data->{signal} = $data->{failure} & 0xFF;
$data->{code} = $data->{failure} >> 8;
$data->{output} = read_file(".internal_output.txt");
$data->{error} = read_file(".internal_error.txt");
remove(".internal_input.txt", ".internal_output.txt", ".internal_error.txt");
remove(".execution_wrapper", ".internal_input.txt", ".internal_output.txt", ".internal_error.txt");
return $data;
}
......@@ -171,6 +185,7 @@ sub run_special($$$$) {
if (ref($special) ne 'HASH') {
$special = { content => $content };
} else {
# Values of special are written to test to be able to overwrite intput and args in special
my $given_test = $test;
$test = {};
add_values($test, $given_test);
......@@ -329,7 +344,12 @@ sub perform_tests($$) {
}
# runs program
my $data = run_special($test_name, $program, $case, $test);
my $student_test = {};
add_values($student_test, $test);
set_default($student_test, "timeout", 10);
set_default($student_test, "IOlimit", 1000);
my $data = run_special($test_name, $program, $case, $student_test);
if ($data->{compilation_error}) {
$details .= "Compilation errors, compiler output :\n".preformat($data->{output}.$data->{error});
$result = 0;
......@@ -380,6 +400,9 @@ sub perform_tests($$) {
foreach my $part ('output', 'error') {
$details .= "Validator $part is:\n".preformat($valid->{$part})."\n" if length($valid->{$part});
}
if (!$result) {
$details .= "The validator did not validate the test (code : $valid->{code}, signal : $valid->{signal})\n";
}
debug "Done with validator subtest with result $result\n";
remove(".program_name.txt", ".arguments.txt");
foreach my $part ('output', 'error', 'code') {
......
......@@ -22,7 +22,8 @@ EMACS=emacs --batch --eval "(progn \
all: files
%/vpl_id.txt: %.org
.SECONDEXPANSION:
%/vpl_id.txt: %.org $$(wildcard %/*/*)
$(EMACS) $< --batch --funcall org-babel-execute-buffer
$(EMACS) $< --batch --funcall org-babel-tangle
......
......@@ -8,3 +8,28 @@ Ce dépôt conttient diverses extensions d'actitivé VPL sous la forme de fichie
remplaçant les fichiers VPL par défaut. Il contient aussi un ensemble de scripts permettant une
exécution locale et un export sous caseine.org d'une activité décrite dans un fichier au format .org
respectant une organisation idoine.
* Auteur
Guillaume Huard, 2020.
* Licence
Ce programme est libre, vous pouvez le redistribuer et/ou le modifier selon les
termes de la Licence Publique Générale GNU publiée par la Free Software
Foundation (version 2 ou bien toute autre version ultérieure choisie par vous).
Ce programme est distribué car potentiellement utile, mais SANS AUCUNE
GARANTIE, ni explicite ni implicite, y compris les garanties de
commercialisation ou d'adaptation dans un but spécifique. Reportez-vous à la
Licence Publique Générale GNU pour plus de détails.
Vous devez avoir reçu une copie de la Licence Publique Générale GNU en même
temps que ce programme ; si ce n'est pas le cas, écrivez à la Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307,
États-Unis.
Contact: Guillaume POINT Huard AT imag POINT fr
Bâtiment IMAG
700 avenue centrale, domaine universitaire
38401 Saint Martin d'Hères
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment