Description:
update java-bm
Commit status:
[Not Reviewed]
References:
merge java
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r214:336e928de90e - - 9 files changed: 60 inserted, 21 deleted

@@ -1,63 +1,76
1 #!/bin/sh
1 #!/bin/sh
2
2
3 echo "This script will install and configure Cafe grader."
3 echo "This script will install and configure Cafe grader."
4
4
5 - echo "This will install Ruby 1.9.2 under rvm"
5 + RUBY_VERSION=2.1.2
6 + echo "This will install Ruby $RUBY_VERSION under RVM"
6
7
7 echo "Installing required apts"
8 echo "Installing required apts"
8
9
9 sudo apt-get update
10 sudo apt-get update
10 sudo apt-get install mysql-server mysql-client \
11 sudo apt-get install mysql-server mysql-client \
11 g++ gcc apache2 libmysqlclient15-dev build-essential \
12 g++ gcc apache2 libmysqlclient15-dev build-essential \
12 git-core openssl libreadline6 libreadline6-dev \
13 git-core openssl libreadline6 libreadline6-dev \
13 zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-dev \
14 zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-dev \
14 sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev \
15 sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev \
15 ncurses-dev automake libtool bison subversion \
16 ncurses-dev automake libtool bison subversion \
16 - pkg-config curl nodejs unzip
17 + pkg-config curl nodejs unzip pyflakes ruby default-jdk
17
18
18 echo "Installing RVM"
19 echo "Installing RVM"
19 curl -k -L https://get.rvm.io | bash -s stable
20 curl -k -L https://get.rvm.io | bash -s stable
20 - ~/.rvm/scripts/rvm
21 + source ~/.rvm/scripts/rvm
21
22
22 - echo "Installing Ruby 1.9.2 in RVM"
23 + echo "Installing Ruby $RUBY_VERSION in RVM"
23
24
24 - rvm install 1.9.2
25 + rvm install $RUBY_VERSION
25 - rvm use 1.9.2
26 + rvm use $RUBY_VERSION
26
27
27 echo "Fetching Cafe Grader from Git repositories"
28 echo "Fetching Cafe Grader from Git repositories"
28
29
29 echo "Fetching web interface"
30 echo "Fetching web interface"
30
31
31 mkdir cafe_grader
32 mkdir cafe_grader
32 cd cafe_grader
33 cd cafe_grader
33 git clone -q git://github.com/jittat/cafe-grader-web.git web
34 git clone -q git://github.com/jittat/cafe-grader-web.git web
34
35
35 echo "Configuring rails app"
36 echo "Configuring rails app"
36
37
37 cp web/config/application.rb.SAMPLE web/config/application.rb
38 cp web/config/application.rb.SAMPLE web/config/application.rb
38 cp web/config/initializers/cafe_grader_config.rb.SAMPLE web/config/initializers/cafe_grader_config.rb
39 cp web/config/initializers/cafe_grader_config.rb.SAMPLE web/config/initializers/cafe_grader_config.rb
39
40
41 + #replace UTC in application.rb with the system timezone
42 + timezone='UTC'
43 + if [ -f '/etc/timezone' ]; then
44 + timezone=\"`cat /etc/timezone`\"
45 + else
46 + if [ -f '/etc/sysconfig/clock' ]; then
47 + timezone=`grep -e '^TIMEZONE' /etc/sysconfig/clock | grep -o -e '\".*\"'`
48 + fi
49 + fi
50 + replace="s!'UTC'!$timezone!g"
51 + sed -i $replace web/config/application.rb
52 +
40 echo "At this point we will need MySQL user and database."
53 echo "At this point we will need MySQL user and database."
41 echo "Have you created MySQL user and database for Cafe grader? (Y/N) "
54 echo "Have you created MySQL user and database for Cafe grader? (Y/N) "
42 read ch
55 read ch
43
56
44 if [ "$ch" = "n" -o "$ch" = "N" ]
57 if [ "$ch" = "n" -o "$ch" = "N" ]
45 then
58 then
46 echo "Please open another terminal and create the user and database for Cafe grader."
59 echo "Please open another terminal and create the user and database for Cafe grader."
47 echo "Don't forget to grant access to that database for the user."
60 echo "Don't forget to grant access to that database for the user."
48 echo "Please have username, password, and database name ready before continue."
61 echo "Please have username, password, and database name ready before continue."
49 echo
62 echo
50 echo "The following are instructions:"
63 echo "The following are instructions:"
51 echo "1. Run mysql:"
64 echo "1. Run mysql:"
52 echo
65 echo
53 echo " mysql -u root -p"
66 echo " mysql -u root -p"
54 echo
67 echo
55 echo " if you have just installed mysql, the root password is the one that you have just entered"
68 echo " if you have just installed mysql, the root password is the one that you have just entered"
56 echo "2. Create a new database, a new user, and grant access to grader database:"
69 echo "2. Create a new database, a new user, and grant access to grader database:"
57 echo
70 echo
58 echo " create user 'USERNAME'@'localhost' identified by 'PASSWORD';"
71 echo " create user 'USERNAME'@'localhost' identified by 'PASSWORD';"
59 echo " create database \`DATABASENEME\`;"
72 echo " create database \`DATABASENEME\`;"
60 echo " grant all on \`DATABASENAME\`.* to 'USERNAME'@'localhost';"
73 echo " grant all on \`DATABASENAME\`.* to 'USERNAME'@'localhost';"
61 echo
74 echo
62 echo " Replace USERNAME, PASSWORD, and DATABASENAME accordingly."
75 echo " Replace USERNAME, PASSWORD, and DATABASENAME accordingly."
63 echo
76 echo
@@ -93,62 +106,75
93 echo " adapter: mysql2" >> config/database.yml
106 echo " adapter: mysql2" >> config/database.yml
94 echo " encoding: utf8" >> config/database.yml
107 echo " encoding: utf8" >> config/database.yml
95 echo " reconnect: false" >> config/database.yml
108 echo " reconnect: false" >> config/database.yml
96 echo " database: $database" >> config/database.yml
109 echo " database: $database" >> config/database.yml
97 echo " pool: 5" >> config/database.yml
110 echo " pool: 5" >> config/database.yml
98 echo " username: $username" >> config/database.yml
111 echo " username: $username" >> config/database.yml
99 echo " password: $password" >> config/database.yml
112 echo " password: $password" >> config/database.yml
100 echo " host: localhost" >> config/database.yml
113 echo " host: localhost" >> config/database.yml
101 echo " socket: /var/run/mysqld/mysqld.sock" >> config/database.yml
114 echo " socket: /var/run/mysqld/mysqld.sock" >> config/database.yml
102
115
103 echo "Object.instance_eval{remove_const :GRADER_ROOT_DIR}" >> config/initializers/cafe_grader_config.rb
116 echo "Object.instance_eval{remove_const :GRADER_ROOT_DIR}" >> config/initializers/cafe_grader_config.rb
104 echo "Object.instance_eval{remove_const :GRADING_RESULT_DIR}" >> config/initializers/cafe_grader_config.rb
117 echo "Object.instance_eval{remove_const :GRADING_RESULT_DIR}" >> config/initializers/cafe_grader_config.rb
105 echo "GRADER_ROOT_DIR = '$CAFE_PATH/judge'" >> config/initializers/cafe_grader_config.rb
118 echo "GRADER_ROOT_DIR = '$CAFE_PATH/judge'" >> config/initializers/cafe_grader_config.rb
106 echo "GRADING_RESULT_DIR = '$CAFE_PATH/judge/result'" >> config/initializers/cafe_grader_config.rb
119 echo "GRADING_RESULT_DIR = '$CAFE_PATH/judge/result'" >> config/initializers/cafe_grader_config.rb
107
120
108 echo "Installing required gems"
121 echo "Installing required gems"
109 gem install bundler
122 gem install bundler
110 bundle install
123 bundle install
111
124
112 echo "Running rake tasks to initialize database"
125 echo "Running rake tasks to initialize database"
113
126
114 rake db:migrate
127 rake db:migrate
115 rake db:seed
128 rake db:seed
116
129
130 + echo "Running rake tasks to precompile the assets"
131 +
132 + rake assets:precompile
133 +
117 echo "Intalling web interface complete..."
134 echo "Intalling web interface complete..."
118 echo
135 echo
119 echo "Fetching grader"
136 echo "Fetching grader"
120
137
121 cd ..
138 cd ..
122
139
123 mkdir judge
140 mkdir judge
124 cd judge
141 cd judge
125 git clone -q git://github.com/jittat/cafe-grader-judge-scripts.git scripts
142 git clone -q git://github.com/jittat/cafe-grader-judge-scripts.git scripts
126 mkdir raw
143 mkdir raw
127 mkdir ev-exam
144 mkdir ev-exam
128 mkdir ev
145 mkdir ev
129 mkdir result
146 mkdir result
130 mkdir log
147 mkdir log
131
148
132 echo "Configuring grader"
149 echo "Configuring grader"
133
150
134 cp scripts/config/env_exam.rb.SAMPLE scripts/config/env_exam.rb
151 cp scripts/config/env_exam.rb.SAMPLE scripts/config/env_exam.rb
135 cp scripts/config/env_grading.rb.SAMPLE scripts/config/env_grading.rb
152 cp scripts/config/env_grading.rb.SAMPLE scripts/config/env_grading.rb
136
153
137 # create new environment.rb file
154 # create new environment.rb file
138 echo "RAILS_ROOT = '$CAFE_PATH/web'" > scripts/config/environment.rb
155 echo "RAILS_ROOT = '$CAFE_PATH/web'" > scripts/config/environment.rb
139 echo "GRADER_ROOT = '$CAFE_PATH/judge/scripts'" >> scripts/config/environment.rb
156 echo "GRADER_ROOT = '$CAFE_PATH/judge/scripts'" >> scripts/config/environment.rb
140 echo "require File.join(File.dirname(__FILE__),'../lib/boot')" >> scripts/config/environment.rb
157 echo "require File.join(File.dirname(__FILE__),'../lib/boot')" >> scripts/config/environment.rb
141 echo "require File.dirname(__FILE__) + \"/env_#{GRADER_ENV}.rb\"" >> scripts/config/environment.rb
158 echo "require File.dirname(__FILE__) + \"/env_#{GRADER_ENV}.rb\"" >> scripts/config/environment.rb
142
159
160 + # compiling box
161 + MACHINE_TYPE=`uname -m`
162 + if [ ${MACHINE_TYPE} == 'x86_64' ]; then
163 + gcc -std=c99 -o scripts/std-script/box scripts/std-script/box64-new.c
164 + else
165 + g++ -o scripts/std-script/box scripts/std-script/box.cc
166 + fi
167 +
168 +
143 cd ..
169 cd ..
144
170
145 echo "Now you are ready to run cafe grader...."
171 echo "Now you are ready to run cafe grader...."
146 echo
172 echo
147 echo "Try:"
173 echo "Try:"
148 echo
174 echo
149 echo " cd web"
175 echo " cd web"
150 echo " rails s"
176 echo " rails s"
151 echo
177 echo
152 echo "and access web at http://localhost:3000/"
178 echo "and access web at http://localhost:3000/"
153 echo "The root username is 'root', its password is 'ioionrails'."
179 echo "The root username is 'root', its password is 'ioionrails'."
154
180
@@ -1,25 +1,25
1 - #!/usr/bin/ruby
1 + #!/usr/bin/env ruby
2
2
3 # new_problem:
3 # new_problem:
4 # * creates a directory for a problem in the current directory,
4 # * creates a directory for a problem in the current directory,
5 # * create standard testcase config file
5 # * create standard testcase config file
6
6
7 require 'erb'
7 require 'erb'
8
8
9 def process_options(options)
9 def process_options(options)
10 i = 2
10 i = 2
11 while i<ARGV.length
11 while i<ARGV.length
12 if ARGV[i]=='-t'
12 if ARGV[i]=='-t'
13 options[:time_limit] = ARGV[i+1].to_i if ARGV.length>i+1
13 options[:time_limit] = ARGV[i+1].to_i if ARGV.length>i+1
14 i += 1
14 i += 1
15 end
15 end
16 if ARGV[i]=='-m'
16 if ARGV[i]=='-m'
17 options[:mem_limit] = ARGV[i+1].to_i if ARGV.length>i+1
17 options[:mem_limit] = ARGV[i+1].to_i if ARGV.length>i+1
18 i += 1
18 i += 1
19 end
19 end
20 i += 1
20 i += 1
21 end
21 end
22 end
22 end
23
23
24
24
25 puts "This script is out of dated, shall be fixed soon"
25 puts "This script is out of dated, shall be fixed soon"
@@ -1635,59 +1635,63
1635 \n\
1635 \n\
1636 Options:\n\
1636 Options:\n\
1637 -a <level>\tSet file access level (0=none, 1=cwd, 2=/etc,/lib,..., 3=whole fs, 9=no checks; needs -f)\n\
1637 -a <level>\tSet file access level (0=none, 1=cwd, 2=/etc,/lib,..., 3=whole fs, 9=no checks; needs -f)\n\
1638 -c <dir>\tChange directory to <dir> first\n\
1638 -c <dir>\tChange directory to <dir> first\n\
1639 -e\t\tInherit full environment of the parent process\n\
1639 -e\t\tInherit full environment of the parent process\n\
1640 -E <var>\tInherit the environment variable <var> from the parent process\n\
1640 -E <var>\tInherit the environment variable <var> from the parent process\n\
1641 -E <var>=<val>\tSet the environment variable <var> to <val>; unset it if <var> is empty\n\
1641 -E <var>=<val>\tSet the environment variable <var> to <val>; unset it if <var> is empty\n\
1642 -f\t\tFilter system calls (-ff=very restricted)\n\
1642 -f\t\tFilter system calls (-ff=very restricted)\n\
1643 -i <file>\tRedirect stdin from <file>\n\
1643 -i <file>\tRedirect stdin from <file>\n\
1644 -k <size>\tLimit stack size to <size> KB (default: 0=unlimited)\n\
1644 -k <size>\tLimit stack size to <size> KB (default: 0=unlimited)\n\
1645 -m <size>\tLimit address space to <size> KB\n\
1645 -m <size>\tLimit address space to <size> KB\n\
1646 -M <file>\tOutput process information to <file> (name:value)\n\
1646 -M <file>\tOutput process information to <file> (name:value)\n\
1647 -o <file>\tRedirect stdout to <file>\n\
1647 -o <file>\tRedirect stdout to <file>\n\
1648 -p <path>\tPermit access to the specified path (or subtree if it ends with a `/')\n\
1648 -p <path>\tPermit access to the specified path (or subtree if it ends with a `/')\n\
1649 -p <path>=<act>\tDefine action for the specified path (<act>=yes/no)\n\
1649 -p <path>=<act>\tDefine action for the specified path (<act>=yes/no)\n\
1650 -r <file>\tRedirect stderr to <file>\n\
1650 -r <file>\tRedirect stderr to <file>\n\
1651 -s <sys>\tPermit the specified syscall (be careful)\n\
1651 -s <sys>\tPermit the specified syscall (be careful)\n\
1652 -s <sys>=<act>\tDefine action for the specified syscall (<act>=yes/no/file)\n\
1652 -s <sys>=<act>\tDefine action for the specified syscall (<act>=yes/no/file)\n\
1653 -t <time>\tSet run time limit (seconds, fractions allowed)\n\
1653 -t <time>\tSet run time limit (seconds, fractions allowed)\n\
1654 -T\t\tAllow syscalls for measuring run time\n\
1654 -T\t\tAllow syscalls for measuring run time\n\
1655 -v\t\tBe verbose (use multiple times for even more verbosity)\n\
1655 -v\t\tBe verbose (use multiple times for even more verbosity)\n\
1656 -w <time>\tSet wall clock time limit (seconds, fractions allowed)\n\
1656 -w <time>\tSet wall clock time limit (seconds, fractions allowed)\n\
1657 -x <time>\tSet extra timeout, before which a timing-out program is not yet killed,\n\
1657 -x <time>\tSet extra timeout, before which a timing-out program is not yet killed,\n\
1658 \t\tso that its real execution time is reported (seconds, fractions allowed)\n\
1658 \t\tso that its real execution time is reported (seconds, fractions allowed)\n\
1659 + -A <opt>\tPass <opt> as additional argument to the <command>\n\
1660 + \t\tBe noted that this option will be appended after <arguments> respectively\n\
1659 ");
1661 ");
1660 exit(2);
1662 exit(2);
1661 }
1663 }
1662
1664
1663 int
1665 int
1664 main(int argc, char **argv)
1666 main(int argc, char **argv)
1665 {
1667 {
1666 int c;
1668 int c;
1667 uid_t uid;
1669 uid_t uid;
1670 + char **prog_argv = xmalloc(sizeof(char*) * argc);
1671 + int prog_argc = 0;
1668
1672
1669 - while ((c = getopt(argc, argv, "a:c:eE:fi:k:m:M:o:p:r:s:t:Tvw:x:")) >= 0)
1673 + while ((c = getopt(argc, argv, "a:c:eE:fi:k:m:M:o:p:r:s:t:Tvw:x:A:")) >= 0)
1670 switch (c)
1674 switch (c)
1671 {
1675 {
1672 case 'a':
1676 case 'a':
1673 file_access = atol(optarg);
1677 file_access = atol(optarg);
1674 break;
1678 break;
1675 case 'c':
1679 case 'c':
1676 set_cwd = optarg;
1680 set_cwd = optarg;
1677 break;
1681 break;
1678 case 'e':
1682 case 'e':
1679 pass_environ = 1;
1683 pass_environ = 1;
1680 break;
1684 break;
1681 case 'E':
1685 case 'E':
1682 if (!set_env_action(optarg))
1686 if (!set_env_action(optarg))
1683 usage();
1687 usage();
1684 break;
1688 break;
1685 case 'f':
1689 case 'f':
1686 filter_syscalls++;
1690 filter_syscalls++;
1687 break;
1691 break;
1688 case 'k':
1692 case 'k':
1689 stack_limit = atol(optarg);
1693 stack_limit = atol(optarg);
1690 break;
1694 break;
1691 case 'i':
1695 case 'i':
1692 redir_stdin = optarg;
1696 redir_stdin = optarg;
1693 break;
1697 break;
@@ -1704,44 +1708,53
1704 if (!set_path_action(optarg))
1708 if (!set_path_action(optarg))
1705 usage();
1709 usage();
1706 break;
1710 break;
1707 case 'r':
1711 case 'r':
1708 redir_stderr = optarg;
1712 redir_stderr = optarg;
1709 break;
1713 break;
1710 case 's':
1714 case 's':
1711 if (!set_syscall_action(optarg))
1715 if (!set_syscall_action(optarg))
1712 usage();
1716 usage();
1713 break;
1717 break;
1714 case 't':
1718 case 't':
1715 timeout = 1000*atof(optarg);
1719 timeout = 1000*atof(optarg);
1716 break;
1720 break;
1717 case 'T':
1721 case 'T':
1718 syscall_action[__NR_times] = A_YES;
1722 syscall_action[__NR_times] = A_YES;
1719 break;
1723 break;
1720 case 'v':
1724 case 'v':
1721 verbose++;
1725 verbose++;
1722 break;
1726 break;
1723 case 'w':
1727 case 'w':
1724 wall_timeout = 1000*atof(optarg);
1728 wall_timeout = 1000*atof(optarg);
1725 break;
1729 break;
1726 case 'x':
1730 case 'x':
1727 extra_timeout = 1000*atof(optarg);
1731 extra_timeout = 1000*atof(optarg);
1732 + case 'A':
1733 + prog_argv[prog_argc++] = strdup(optarg);
1734 + break;
1728 break;
1735 break;
1729 default:
1736 default:
1730 usage();
1737 usage();
1731 }
1738 }
1732 if (optind >= argc)
1739 if (optind >= argc)
1733 usage();
1740 usage();
1734
1741
1735 sanity_check();
1742 sanity_check();
1736 uid = geteuid();
1743 uid = geteuid();
1737 if (setreuid(uid, uid) < 0)
1744 if (setreuid(uid, uid) < 0)
1738 die("setreuid: %m");
1745 die("setreuid: %m");
1739 box_pid = fork();
1746 box_pid = fork();
1740 if (box_pid < 0)
1747 if (box_pid < 0)
1741 die("fork: %m");
1748 die("fork: %m");
1742 - if (!box_pid)
1749 + if (!box_pid) {
1743 - box_inside(argc-optind, argv+optind);
1750 + int real_argc = prog_argc + argc - optind;
1744 - else
1751 + char **real_argv = xmalloc(sizeof(char*) * (real_argc));
1752 + for (int i = 0;i < argc-optind;i++)
1753 + real_argv[i] = strdup(argv[i+optind]);
1754 + for (int i = 0;i < prog_argc;i++)
1755 + real_argv[argc - optind + i] = strdup(prog_argv[i]);
1756 + box_inside(real_argc, real_argv);
1757 + } else
1745 boxkeeper();
1758 boxkeeper();
1746 die("Internal error: fell over edge of the world");
1759 die("Internal error: fell over edge of the world");
1747 }
1760 }
@@ -83,55 +83,55
83 end
83 end
84
84
85 # Hide PROBLEM_HOME
85 # Hide PROBLEM_HOME
86 ENV['PROBLEM_HOME'] = nil
86 ENV['PROBLEM_HOME'] = nil
87 ENV['SOURCE_NAME'] = nil
87 ENV['SOURCE_NAME'] = nil
88
88
89 # Run the program.
89 # Run the program.
90 #run_command = "/usr/bin/time -f \"#{time_output_format}\" 2>run_result #{problem_home}/script/box_new -a 2 -f -t #{time_limit} -m #{mem_limit} -i #{input_file_name} -o output.txt #{program_name}"
90 #run_command = "/usr/bin/time -f \"#{time_output_format}\" 2>run_result #{problem_home}/script/box_new -a 2 -f -t #{time_limit} -m #{mem_limit} -i #{input_file_name} -o output.txt #{program_name}"
91 #
91 #
92
92
93 JAVA_OPTION = "-s set_robust_list -s futex -s clone -s getppid -s clone -s wait4 -p /usr/bin/ -p ./"
93 JAVA_OPTION = "-s set_robust_list -s futex -s clone -s getppid -s clone -s wait4 -p /usr/bin/ -p ./"
94 RUBY_OPTION = "-p /usr/lib64/ -p /usr/local/lib64/ -p /usr/local/lib/ -p /lib64/ -p /dev/urandom -p #{sandbox_dir}/#{program_name} -p #{sandbox_dir}/ -s set_robust_list -s sched_getaffinity -s clock_gettime -s sigaltstack -s pipe2 -s clone -s futex -s openat -s pipe"
94 RUBY_OPTION = "-p /usr/lib64/ -p /usr/local/lib64/ -p /usr/local/lib/ -p /lib64/ -p /dev/urandom -p #{sandbox_dir}/#{program_name} -p #{sandbox_dir}/ -s set_robust_list -s sched_getaffinity -s clock_gettime -s sigaltstack -s pipe2 -s clone -s futex -s openat -s pipe"
95 PYTHON_OPTION = "-p /usr/lib64/ -p /usr/local/lib64/ -p /usr/local/lib/ -p /usr/bin/ -p /lib64/ -p #{sandbox_dir}/#{program_name} -p ./#{program_name} -p #{sandbox_dir}/#{source_name} -s set_robust_list -s openat -s recvmsg -s connect -s socket -s sendto -s futex -E PYTHONNOUSERSITE=yes"
95 PYTHON_OPTION = "-p /usr/lib64/ -p /usr/local/lib64/ -p /usr/local/lib/ -p /usr/bin/ -p /lib64/ -p #{sandbox_dir}/#{program_name} -p ./#{program_name} -p #{sandbox_dir}/#{source_name} -s set_robust_list -s openat -s recvmsg -s connect -s socket -s sendto -s futex -E PYTHONNOUSERSITE=yes"
96 PHP_OPTION = "-p /usr/lib64/ -p/lib64/ -p /usr/bin/ -p #{sandbox_dir}/#{program_name} -p ./#{program_name} -p /usr/share/ -s setfsuid -s setfsgid -s openat -s set_robust_list -s futex -s clone -s socket -s connect"
96 PHP_OPTION = "-p /usr/lib64/ -p/lib64/ -p /usr/bin/ -p #{sandbox_dir}/#{program_name} -p ./#{program_name} -p /usr/share/ -s setfsuid -s setfsgid -s openat -s set_robust_list -s futex -s clone -s socket -s connect"
97
97
98 case language
98 case language
99 when "java"
99 when "java"
100 # for java, extract the classname
100 # for java, extract the classname
101 # wne have to add additional systemcall and we don't check the mem limit (dunno how to fix...)
101 # wne have to add additional systemcall and we don't check the mem limit (dunno how to fix...)
102 classname = 'DUMMY'
102 classname = 'DUMMY'
103 File.open(program_name,"r").each do |line|
103 File.open(program_name,"r").each do |line|
104 classname = line
104 classname = line
105 end
105 end
106 #for java, we cannot really check the memory limit...
106 #for java, we cannot really check the memory limit...
107 - run_command = "#{problem_home}/script/box -a 3 -f -T -t #{time_limit} #{JAVA_OPTION} -i #{input_file_name} -o output.txt /usr/bin/java #{classname} "
107 + run_command = "#{problem_home}/script/box -a 3 -f -T -t #{time_limit} #{JAVA_OPTION} -i #{input_file_name} -o output.txt /usr/bin/java -A -Xmx#{mem_limit}k -A #{classname} "
108 when "ruby"
108 when "ruby"
109 run_command = "#{problem_home}/script/box -a 2 -f -T -t #{time_limit*=2} -m #{mem_limit} #{RUBY_OPTION} -i #{input_file_name} -o output.txt /usr/bin/ruby #{program_name} "
109 run_command = "#{problem_home}/script/box -a 2 -f -T -t #{time_limit*=2} -m #{mem_limit} #{RUBY_OPTION} -i #{input_file_name} -o output.txt /usr/bin/ruby #{program_name} "
110 when "python"
110 when "python"
111 run_command = "#{problem_home}/script/box -a 2 -f -T -t #{time_limit*=2} -m #{mem_limit} #{PYTHON_OPTION} -i #{input_file_name} -o output.txt /usr/bin/python #{program_name} "
111 run_command = "#{problem_home}/script/box -a 2 -f -T -t #{time_limit*=2} -m #{mem_limit} #{PYTHON_OPTION} -i #{input_file_name} -o output.txt /usr/bin/python #{program_name} "
112 when "php"
112 when "php"
113 - run_command = "#{problem_home}/script/box -a 2 -f -T -t #{time_limit*=2} #{PHP_OPTION} -i #{input_file_name} -o output.txt /usr/bin/php #{program_name} "
113 + run_command = "#{problem_home}/script/box -a 2 -f -T -t #{time_limit*=2} -m #{[128*1024,mem_limit].max} #{PHP_OPTION} -i #{input_file_name} -o output.txt /usr/bin/php -A -d -A memory_limit=#{mem_limit}k -A #{program_name} "
114 else # for c++, pascal, we do the normal checking
114 else # for c++, pascal, we do the normal checking
115 run_command = "#{problem_home}/script/box -a 2 -f -T -t #{time_limit} -m #{mem_limit} -i #{input_file_name} -o output.txt #{program_name} "
115 run_command = "#{problem_home}/script/box -a 2 -f -T -t #{time_limit} -m #{mem_limit} -i #{input_file_name} -o output.txt #{program_name} "
116 end
116 end
117
117
118
118
119 log "Running test #{test_num}..."
119 log "Running test #{test_num}..."
120 log run_command
120 log run_command
121 log
121 log
122 system(run_command,err: 'run_result')
122 system(run_command,err: 'run_result')
123
123
124 # Restore PROBLEM_HOME
124 # Restore PROBLEM_HOME
125 ENV['PROBLEM_HOME'] = problem_home
125 ENV['PROBLEM_HOME'] = problem_home
126
126
127 # Create the result file.
127 # Create the result file.
128 result_file = File.new("result", "w")
128 result_file = File.new("result", "w")
129 comment_file = File.new("comment", "w")
129 comment_file = File.new("comment", "w")
130
130
131 # Check if the program actually produced any output.
131 # Check if the program actually produced any output.
132 run_result_file = File.new("run_result", "r")
132 run_result_file = File.new("run_result", "r")
133 run_result = run_result_file.readlines
133 run_result = run_result_file.readlines
134 run_result_file.close
134 run_result_file.close
135
135
136 run_stat = run_result[run_result.length-1]
136 run_stat = run_result[run_result.length-1]
137 running_time = extract_time(run_stat)
137 running_time = extract_time(run_stat)
@@ -1,25 +1,25
1 - #!/usr/bin/ruby
1 + #!/usr/bin/env ruby
2
2
3 #
3 #
4 # This is a check script wrapper. It read all required information
4 # This is a check script wrapper. It read all required information
5 # and call a real check script call REAL_CHECK_SCRIPT in directory
5 # and call a real check script call REAL_CHECK_SCRIPT in directory
6 # [problem_home]/script
6 # [problem_home]/script
7 #
7 #
8
8
9 REAL_CHECK_SCRIPT = "<%= script_name %>"
9 REAL_CHECK_SCRIPT = "<%= script_name %>"
10
10
11 # The REAL_CHECK_SCRIPT is called with:
11 # The REAL_CHECK_SCRIPT is called with:
12 #
12 #
13 # (script) <lang> <test-num> <in-file> <out-file> <ans-file> <full-score>
13 # (script) <lang> <test-num> <in-file> <out-file> <ans-file> <full-score>
14 #
14 #
15 # and REAL_CHECK_SCRIPT's output to standard out is redirected to
15 # and REAL_CHECK_SCRIPT's output to standard out is redirected to
16 # 'check_result' as required by normal check script.
16 # 'check_result' as required by normal check script.
17
17
18 problem_home = ENV['PROBLEM_HOME']
18 problem_home = ENV['PROBLEM_HOME']
19 require "#{problem_home}/script/test_dsl.rb"
19 require "#{problem_home}/script/test_dsl.rb"
20
20
21 if ARGV.length < 2
21 if ARGV.length < 2
22 puts "Usage: check <language> <test-number> [<output-file>]"
22 puts "Usage: check <language> <test-number> [<output-file>]"
23 exit(0)
23 exit(0)
24 end
24 end
25
25
@@ -1,25 +1,25
1 - #!/usr/bin/ruby
1 + #!/usr/bin/env ruby
2
2
3 problem_home = ENV['PROBLEM_HOME']
3 problem_home = ENV['PROBLEM_HOME']
4 require "#{problem_home}/script/test_dsl.rb"
4 require "#{problem_home}/script/test_dsl.rb"
5
5
6 if ARGV.length < 2
6 if ARGV.length < 2
7 puts "Usage: check <language> <test-number> [<output-file>]"
7 puts "Usage: check <language> <test-number> [<output-file>]"
8 exit(0)
8 exit(0)
9 end
9 end
10
10
11 language = ARGV[0]
11 language = ARGV[0]
12 test_num = ARGV[1].to_i
12 test_num = ARGV[1].to_i
13 if ARGV.length >= 3
13 if ARGV.length >= 3
14 output_file_name = ARGV[2]
14 output_file_name = ARGV[2]
15 else
15 else
16 output_file_name = "output.txt"
16 output_file_name = "output.txt"
17 end
17 end
18
18
19 load "#{problem_home}/test_cases/all_tests.cfg"
19 load "#{problem_home}/test_cases/all_tests.cfg"
20 problem = Problem.get_instance
20 problem = Problem.get_instance
21
21
22 output_file = File.new(output_file_name, "r")
22 output_file = File.new(output_file_name, "r")
23 answer_file = File.new("#{problem_home}/test_cases/#{test_num}/answer-#{test_num}.txt")
23 answer_file = File.new("#{problem_home}/test_cases/#{test_num}/answer-#{test_num}.txt")
24 result_file = File.new("check_result", "w")
24 result_file = File.new("check_result", "w")
25
25
@@ -1,25 +1,25
1 - #!/usr/bin/ruby
1 + #!/usr/bin/env ruby
2
2
3 problem_home = ENV['PROBLEM_HOME']
3 problem_home = ENV['PROBLEM_HOME']
4 require "#{problem_home}/script/test_dsl.rb"
4 require "#{problem_home}/script/test_dsl.rb"
5
5
6 if ARGV.length < 2
6 if ARGV.length < 2
7 puts "Usage: check <language> <test-number> [<output-file>]"
7 puts "Usage: check <language> <test-number> [<output-file>]"
8 exit(0)
8 exit(0)
9 end
9 end
10
10
11 language = ARGV[0]
11 language = ARGV[0]
12 test_num = ARGV[1].to_i
12 test_num = ARGV[1].to_i
13 if ARGV.length >= 3
13 if ARGV.length >= 3
14 output_file_name = ARGV[2]
14 output_file_name = ARGV[2]
15 else
15 else
16 output_file_name = "output.txt"
16 output_file_name = "output.txt"
17 end
17 end
18
18
19 load "#{problem_home}/test_cases/all_tests.cfg"
19 load "#{problem_home}/test_cases/all_tests.cfg"
20 problem = Problem.get_instance
20 problem = Problem.get_instance
21
21
22 output_file = File.new(output_file_name, "r")
22 output_file = File.new(output_file_name, "r")
23 answer_file = File.new("#{problem_home}/test_cases/#{test_num}/answer-#{test_num}.txt")
23 answer_file = File.new("#{problem_home}/test_cases/#{test_num}/answer-#{test_num}.txt")
24 result_file = File.new("check_result", "w")
24 result_file = File.new("check_result", "w")
25
25
@@ -1,25 +1,25
1 - #!/usr/bin/ruby
1 + #!/usr/bin/env ruby
2
2
3 problem_home = ENV['PROBLEM_HOME']
3 problem_home = ENV['PROBLEM_HOME']
4 require "#{problem_home}/script/test_dsl.rb"
4 require "#{problem_home}/script/test_dsl.rb"
5
5
6 if ARGV.length < 2
6 if ARGV.length < 2
7 puts "Usage: check <language> <test-number> [<output-file>]"
7 puts "Usage: check <language> <test-number> [<output-file>]"
8 exit(0)
8 exit(0)
9 end
9 end
10
10
11 language = ARGV[0]
11 language = ARGV[0]
12 test_num = ARGV[1].to_i
12 test_num = ARGV[1].to_i
13 if ARGV.length >= 3
13 if ARGV.length >= 3
14 output_file_name = ARGV[2]
14 output_file_name = ARGV[2]
15 else
15 else
16 output_file_name = "output.txt"
16 output_file_name = "output.txt"
17 end
17 end
18
18
19 load "#{problem_home}/test_cases/all_tests.cfg"
19 load "#{problem_home}/test_cases/all_tests.cfg"
20 problem = Problem.get_instance
20 problem = Problem.get_instance
21
21
22 output_file = File.new(output_file_name, "r")
22 output_file = File.new(output_file_name, "r")
23 answer_file = File.new("#{problem_home}/test_cases/#{test_num}/answer-#{test_num}.txt")
23 answer_file = File.new("#{problem_home}/test_cases/#{test_num}/answer-#{test_num}.txt")
24 result_file = File.new("check_result", "w")
24 result_file = File.new("check_result", "w")
25
25
@@ -181,122 +181,122
181 :with => 'in1.txt',
181 :with => 'in1.txt',
182 :and_report => {
182 :and_report => {
183 :graded_at= => nil,
183 :graded_at= => nil,
184 :compiler_message= => '',
184 :compiler_message= => '',
185 :grader_comment= => '',
185 :grader_comment= => '',
186 :running_stat= => /template not found/,
186 :running_stat= => /template not found/,
187 :running_time= => nil,
187 :running_time= => nil,
188 :exit_status= => nil,
188 :exit_status= => nil,
189 :memory_usage= => nil,
189 :memory_usage= => nil,
190 :save => nil})
190 :save => nil})
191 end
191 end
192
192
193 it "should run test request and produce output file" do
193 it "should run test request and produce output file" do
194 problem = stub(Problem,
194 problem = stub(Problem,
195 :id => 1, :name => 'test_normal')
195 :id => 1, :name => 'test_normal')
196 grader_should(:grade => 'test1_correct.c',
196 grader_should(:grade => 'test1_correct.c',
197 :on => problem,
197 :on => problem,
198 :with => 'in1.txt',
198 :with => 'in1.txt',
199 :and_report => {
199 :and_report => {
200 :graded_at= => nil,
200 :graded_at= => nil,
201 :compiler_message= => '',
201 :compiler_message= => '',
202 :grader_comment= => '',
202 :grader_comment= => '',
203 :running_stat= => /0.0\d* sec./,
203 :running_stat= => /0.0\d* sec./,
204 :output_file_name= => lambda { |fname|
204 :output_file_name= => lambda { |fname|
205 - File.exists?(fname).should be_true
205 + File.exists?(fname).should be true
206 },
206 },
207 :running_time= => nil,
207 :running_time= => nil,
208 :exit_status= => nil,
208 :exit_status= => nil,
209 :memory_usage= => nil,
209 :memory_usage= => nil,
210 :save => nil})
210 :save => nil})
211 end
211 end
212
212
213 it "should clean up problem directory after running test request" do
213 it "should clean up problem directory after running test request" do
214 problem = stub(Problem,
214 problem = stub(Problem,
215 :id => 1, :name => 'test_normal')
215 :id => 1, :name => 'test_normal')
216 grader_should(:grade => 'test1_correct.c',
216 grader_should(:grade => 'test1_correct.c',
217 :on => problem,
217 :on => problem,
218 :with => 'in1.txt',
218 :with => 'in1.txt',
219 :and_report => {
219 :and_report => {
220 :graded_at= => nil,
220 :graded_at= => nil,
221 :compiler_message= => '',
221 :compiler_message= => '',
222 :grader_comment= => '',
222 :grader_comment= => '',
223 :running_stat= => nil,
223 :running_stat= => nil,
224 :output_file_name= => nil,
224 :output_file_name= => nil,
225 :running_time= => nil,
225 :running_time= => nil,
226 :exit_status= => nil,
226 :exit_status= => nil,
227 :memory_usage= => nil,
227 :memory_usage= => nil,
228 :save => nil})
228 :save => nil})
229 - File.exists?(@config.user_result_dir + "/test_request/test_normal/test_cases/1/input-1.txt").should be_false
229 + File.exists?(@config.user_result_dir + "/test_request/test_normal/test_cases/1/input-1.txt").should be false
230 end
230 end
231
231
232 it "should compile test request with error and report compilation error" do
232 it "should compile test request with error and report compilation error" do
233 problem = stub(Problem,
233 problem = stub(Problem,
234 :id => 1, :name => 'test_normal')
234 :id => 1, :name => 'test_normal')
235 grader_should(:grade => 'test1_compile_error.c',
235 grader_should(:grade => 'test1_compile_error.c',
236 :on => problem,
236 :on => problem,
237 :with => 'in1.txt',
237 :with => 'in1.txt',
238 :and_report => {
238 :and_report => {
239 :graded_at= => nil,
239 :graded_at= => nil,
240 :compiler_message= => /.+/,
240 :compiler_message= => /.+/,
241 :grader_comment= => /[Cc]ompil.*error/,
241 :grader_comment= => /[Cc]ompil.*error/,
242 :running_stat= => '',
242 :running_stat= => '',
243 :save => nil})
243 :save => nil})
244 end
244 end
245
245
246 it "should report exit status" do
246 it "should report exit status" do
247 problem = stub(Problem,
247 problem = stub(Problem,
248 :id => 1, :name => 'test_normal')
248 :id => 1, :name => 'test_normal')
249 grader_should(:grade => 'add_nonzero_exit_status.c',
249 grader_should(:grade => 'add_nonzero_exit_status.c',
250 :on => problem,
250 :on => problem,
251 :with => 'in1.txt',
251 :with => 'in1.txt',
252 :and_report => {
252 :and_report => {
253 :graded_at= => nil,
253 :graded_at= => nil,
254 :compiler_message= => '',
254 :compiler_message= => '',
255 :grader_comment= => '',
255 :grader_comment= => '',
256 :running_stat= => /[Ee]xit.*status.*10.*0\.0\d* sec/m,
256 :running_stat= => /[Ee]xit.*status.*10.*0\.0\d* sec/m,
257 :output_file_name= => lambda { |fname|
257 :output_file_name= => lambda { |fname|
258 - File.exists?(fname).should be_true
258 + File.exists?(fname).should be true
259 },
259 },
260 :running_time= => nil,
260 :running_time= => nil,
261 :exit_status= => /10/,
261 :exit_status= => /10/,
262 :memory_usage= => nil,
262 :memory_usage= => nil,
263 :save => nil})
263 :save => nil})
264 end
264 end
265
265
266 it "should produce running statistics for normal submission" do
266 it "should produce running statistics for normal submission" do
267 problem = stub(Problem,
267 problem = stub(Problem,
268 :id => 1, :name => 'test_normal')
268 :id => 1, :name => 'test_normal')
269 grader_should(:grade => 'test_run_stat.c',
269 grader_should(:grade => 'test_run_stat.c',
270 :on => problem,
270 :on => problem,
271 :with => 'in1.txt',
271 :with => 'in1.txt',
272 :and_report => {
272 :and_report => {
273 :graded_at= => nil,
273 :graded_at= => nil,
274 :compiler_message= => '',
274 :compiler_message= => '',
275 :grader_comment= => '',
275 :grader_comment= => '',
276 :running_stat= => nil,
276 :running_stat= => nil,
277 :output_file_name= => lambda { |fname|
277 :output_file_name= => lambda { |fname|
278 - File.exists?(fname).should be_true
278 + File.exists?(fname).should be true
279 },
279 },
280 :running_time= => lambda { |t|
280 :running_time= => lambda { |t|
281 (t>=0.14) and (t<=0.16)
281 (t>=0.14) and (t<=0.16)
282 },
282 },
283 :exit_status= => nil,
283 :exit_status= => nil,
284 :memory_usage= => lambda { |s|
284 :memory_usage= => lambda { |s|
285 (s>=500) and (s<=1000)
285 (s>=500) and (s<=1000)
286 },
286 },
287 :save => nil})
287 :save => nil})
288 end
288 end
289
289
290 protected
290 protected
291 def grader_should(args)
291 def grader_should(args)
292 @user1 = stub(User,
292 @user1 = stub(User,
293 :id => 1, :login => 'user1')
293 :id => 1, :login => 'user1')
294
294
295 problem = args[:on]
295 problem = args[:on]
296 input_file = @config.test_request_input_base_dir + "/" + args[:with]
296 input_file = @config.test_request_input_base_dir + "/" + args[:with]
297
297
298 submission =
298 submission =
299 create_submission_from_file(1, @user1, args[:on], args[:grade])
299 create_submission_from_file(1, @user1, args[:on], args[:grade])
300
300
301 test_request = stub(TestRequest,
301 test_request = stub(TestRequest,
302 :id => 1,
302 :id => 1,
You need to be logged in to leave comments. Login now