def run(self, env): # Find out the path to isabaelle-process args = [settings.ISABELLE_BINARY, "getenv", "-b", "ISABELLE_PROCESS"] (output, error, exitcode, _) = execute_arglist(args, env.tmpdir()) isabelle_process = output.rstrip() thys = map(lambda (name, _): ('"%s"' % os.path.splitext(name)[0]), env.sources()) ml_cmd = 'Secure.set_secure (); use_thys [%s]' % ','.join(thys) args = [isabelle_process, "-r", "-q", "-e", ml_cmd, self.logic] (output, error, exitcode, timed_out) = execute_arglist(args, env.tmpdir(), timeout=settings.TEST_TIMEOUT) if timed_out: output += "\n\n---- check aborted after %d seconds ----\n" % settings.TEST_TIMEOUT result = CheckerResult(checker=self) result.set_log('<pre>' + escape(output) + '</pre>') result.set_passed(not timed_out and self.output_ok(output)) return result
def run(self, env): """ Build it. """ result = CheckerResult(checker=self) filenames = [name for name in self.get_file_names(env)] args = [self.compiler()] + self.flags(env) + filenames + self.libs() [output,_,_,_] = execute_arglist(args, env.tmpdir(),self.environment()) has_main = re.search(r"^Linking ([^ ]*) ...$",output,re.MULTILINE) if has_main: self._detected_main = has_main.group(1) output = escape(output) output = self.enhance_output(env, output) # Allow server to delete created subfolders execute('chmod -R 0777 *', env.tmpdir()) # We mustn't have any warnings. passed = not self.has_warnings(output) log = self.build_log(output,args,set(filenames).intersection([solutionfile.path() for solutionfile in env.solution().solutionfile_set.all()])) # Now that submission was successfully built, try to find the main modules name again try: if passed : env.set_program(self.main_module(env)) except self.NotFoundError as e: passed = not self._main_required log += "<pre>" + str(e) + "</pre>" result.set_passed(passed) result.set_log(log) return result
def run(self, env): java_builder = IgnoringJavaBuilder(_flags="", _libs=self.junit_version,_file_pattern=r"^.*\.[jJ][aA][vV][aA]$",_output_flags="") java_builder._ignore = self.ignore.split(" ") build_result = java_builder.run(env) if not build_result.passed: result = CheckerResult(checker=self) result.set_passed(False) result.set_log('<pre>' + escape(self.test_description) + '\n\n======== Test Results ======\n\n</pre><br/>\n'+build_result.log) return result environ = {} environ['UPLOAD_ROOT'] = settings.UPLOAD_ROOT environ['JAVA'] = settings.JVM environ['POLICY'] = os.path.join(os.path.join(os.path.dirname(os.path.dirname(__file__)),"scripts"),"junit.policy") cmd = [settings.JVM_SECURE, "-cp", settings.JAVA_LIBS[self.junit_version]+":.", self.runner(), self.class_name] [output, error, exitcode,timed_out] = execute_arglist(cmd, env.tmpdir(),environment_variables=environ,timeout=settings.TEST_TIMEOUT,fileseeklimit=settings.TEST_MAXFILESIZE) result = CheckerResult(checker=self) (output,truncated) = truncated_log(output) output = '<pre>' + escape(self.test_description) + '\n\n======== Test Results ======\n\n</pre><br/><pre>' + escape(output) + '</pre>' result.set_log(output,timed_out=timed_out,truncated=truncated) result.set_passed(not exitcode and not timed_out and self.output_ok(output) and not truncated) return result
def run(self, env): """ Runs tests in a special environment. Here's the actual work. This runs the check in the environment ENV, returning a CheckerResult. """ # Setup copy_file(self.shell_script.path, env.tmpdir(), to_is_directory=True) os.chmod(env.tmpdir()+'/'+os.path.basename(self.shell_script.name),0750) # Run the tests -- execute dumped shell script 'script.sh' filenames = [quote(name) for (name,content) in env.sources()] args = [env.tmpdir()+'/'+os.path.basename(self.shell_script.name)] + filenames environ = {} environ['USER'] = str(env.user().id) environ['HOME'] = env.tmpdir() environ['JAVA'] = settings.JVM environ['JAVA_SECURE'] = settings.JVM_SECURE environ['PROGRAM'] = env.program() or '' [output, error, exitcode,timed_out] = execute_arglist(args, working_directory=env.tmpdir(), environment_variables=environ,timeout=settings.TEST_TIMEOUT,fileseeklimit=settings.TEST_MAXFILESIZE) output = force_unicode(output, errors='replace') result = CheckerResult(checker=self) (output,truncated) = truncated_log(output) if self.remove: output = re.sub(self.remove, "", output) if not self.returns_html or truncated: output = '<pre>' + escape(output) + '</pre>' result.set_log(output,timed_out=timed_out,truncated=truncated) result.set_passed(not exitcode and not timed_out and not truncated) return result
def run(self, env): # Save save check configuration config_path = os.path.join(env.tmpdir(), "checks.xml") copy_file(self.configuration.path, config_path) # Run the tests args = [ settings.JVM, "-cp", settings.CHECKSTYLEALLJAR, "-Dbasedir=.", "com.puppycrawl.tools.checkstyle.Main", "-c", "checks.xml" ] + [name for (name, content) in env.sources()] [output, error, exitcode, timed_out] = execute_arglist(args, env.tmpdir()) # Remove Praktomat-Path-Prefixes from result: output = re.sub(r"^" + re.escape(env.tmpdir()) + "/+", "", output, flags=re.MULTILINE) result = CheckerResult(checker=self) log = '<pre>' + escape(output) + '</pre>' if timed_out: log = log + '<div class="error">Timeout occured!</div>' result.set_log(log) result.set_passed( not timed_out and not exitcode and (not re.match('Starting audit...\nAudit done.', output) == None)) return result
def run(self, env): # Save public test cases in `tests.exp' tests_exp = os.path.join(self.tests_dir(env), "tests.exp") test_cases = string.replace( encoding.get_unicode(self.test_case.read()), u"PROGRAM", env.program()) create_file(tests_exp, test_cases) testsuite = self.testsuite_dir(env) program_name = env.program() if " " in program_name: result = self.result() result.set_log( "<pre><b class=\"fail\">Error</b>: Path to the main() - source file contains spaces.\n\nFor Java .zip submittions, the directory hierarchy of the .zip file must excactly match the package structure.\nThe default package must correspond to the .zip root directory.</pre>" ) result.set_passed(False) return result cmd = [settings.DEJAGNU_RUNTEST, "--tool", program_name, "tests.exp"] environ = {} environ['JAVA'] = settings.JVM environ['POLICY'] = join(join(dirname(dirname(__file__)), "scripts"), "praktomat.policy") environ['USER'] = env.user().get_full_name().encode( sys.getdefaultencoding(), 'ignore') environ['HOME'] = testsuite environ['UPLOAD_ROOT'] = settings.UPLOAD_ROOT [output, error, exitcode, timed_out] = execute_arglist(cmd, testsuite, environment_variables=environ, timeout=settings.TEST_TIMEOUT, fileseeklimit=settings.TEST_MAXFILESIZE) output = encoding.get_unicode(output) try: summary = encoding.get_unicode( open(os.path.join(testsuite, program_name + ".sum")).read()) log = encoding.get_unicode( open(os.path.join(testsuite, program_name + ".log")).read()) except: summary = "" log = "" complete_output = self.htmlize_output(output + log) result = self.result() result.set_log(complete_output, timed_out=timed_out) result.set_passed(not exitcode and not timed_out and self.output_ok(complete_output)) return result
def run(self, env): # Find out the path to isabaelle-process args = [settings.ISABELLE_BINARY, "getenv", "-b", "ISABELLE_PROCESS"] (output, error, exitcode, _) = execute_arglist(args, env.tmpdir()) isabelle_process = output.rstrip() thys = map (lambda (name,_): ('"%s"' % os.path.splitext(name)[0]), env.sources()) ml_cmd = 'Secure.set_secure (); use_thys [%s]' % ','.join(thys) args = [isabelle_process, "-r", "-q", "-e", ml_cmd, self.logic] (output, error, exitcode, timed_out) = execute_arglist(args, env.tmpdir(),timeout=settings.TEST_TIMEOUT) if timed_out: output += "\n\n---- check aborted after %d seconds ----\n" % settings.TEST_TIMEOUT result = CheckerResult(checker=self) result.set_log('<pre>' + escape(output) + '</pre>') result.set_passed(not timed_out and self.output_ok(output)) return result
def run(self, env): java_builder = IgnoringJavaBuilder( _flags="", _libs=self.junit_version, _file_pattern=r"^.*\.[jJ][aA][vV][aA]$", _output_flags="") java_builder._ignore = self.ignore.split(" ") build_result = java_builder.run(env) if not build_result.passed: result = CheckerResult(checker=self) result.set_passed(False) result.set_log( '<pre>' + escape(self.test_description) + '\n\n======== Test Results ======\n\n</pre><br/>\n' + build_result.log) return result environ = {} environ['UPLOAD_ROOT'] = settings.UPLOAD_ROOT environ['JAVA'] = settings.JVM environ['POLICY'] = os.path.join( os.path.join(os.path.dirname(os.path.dirname(__file__)), "scripts"), "junit.policy") cmd = [ settings.JVM_SECURE, "-cp", settings.JAVA_LIBS[self.junit_version] + ":.", self.runner(), self.class_name ] [output, error, exitcode, timed_out] = execute_arglist(cmd, env.tmpdir(), environment_variables=environ, timeout=settings.TEST_TIMEOUT, fileseeklimit=settings.TEST_MAXFILESIZE) result = CheckerResult(checker=self) (output, truncated) = truncated_log(output) output = '<pre>' + escape( self.test_description ) + '\n\n======== Test Results ======\n\n</pre><br/><pre>' + escape( output) + '</pre>' result.set_log(output, timed_out=timed_out, truncated=truncated) result.set_passed(not exitcode and not timed_out and self.output_ok(output) and not truncated) return result
def main_module(self, env): """ find the first class file containing a main method """ main_method = re.compile(r"^public static void main\(java.lang.String\[\]\)$", re.MULTILINE) main_method = "public static void main(java.lang.String[])" class_name = re.compile(r"^(public )?(abstract )?(final )?class ([^ ]*) extends .*$", re.MULTILINE) for dirpath, dirs, files in os.walk(env.tmpdir()): for filename in files: if filename.endswith(".class"): [classinfo,_,_,_] = execute_arglist([settings.JCLASSINFO, "--methods", "--general-info", os.path.join(dirpath,filename)], env.tmpdir(), self.environment()) if string.find(classinfo,main_method) >= 0: main_class_name = class_name.search(classinfo, re.MULTILINE).group(4) return main_class_name raise self.NotFoundError("A class containing the main method ('public static void main(String[] args)') could not be found.")
def run(self, env): # Save public test cases in `tests.exp' tests_exp = os.path.join(self.tests_dir(env), "tests.exp") test_cases = string.replace(encoding.get_unicode(self.test_case.read()), u"PROGRAM", env.program()) create_file(tests_exp,test_cases) testsuite = self.testsuite_dir(env) program_name = env.program() if " " in program_name: result = self.result() result.set_log("<pre><b class=\"fail\">Error</b>: Path to the main() - source file contains spaces.\n\nFor Java .zip submittions, the directory hierarchy of the .zip file must excactly match the package structure.\nThe default package must correspond to the .zip root directory.</pre>") result.set_passed(False) return result cmd = [settings.DEJAGNU_RUNTEST, "--tool", program_name, "tests.exp"] environ = {} environ['JAVA'] = settings.JVM environ['POLICY'] = join(join(dirname(dirname(__file__)),"scripts"),"praktomat.policy") environ['USER'] = env.user().get_full_name().encode(sys.getdefaultencoding(), 'ignore') environ['HOME'] = testsuite environ['UPLOAD_ROOT'] = settings.UPLOAD_ROOT environ['USE_KILL_LOG'] = str(settings.USE_KILL_LOG) environ['ULIMIT_FILESIZE'] = '128' # Have the checker script set a filesize-ulimit of 128kb # Specifically, this limits the DejaGNU .log file size, # and thus deals with Programs that output lots of junk [output, error, exitcode] = execute_arglist(cmd, testsuite, environment_variables=environ) output = encoding.get_unicode(output) try: summary = encoding.get_unicode(open(os.path.join(testsuite, program_name + ".sum")).read()) log = encoding.get_unicode(open(os.path.join(testsuite, program_name + ".log")).read()) except: summary = "" log = "" complete_output = output + log if error: complete_output += "ERROR: Ein TimeOut ist aufgetreten!" # Or propably somsing else happend??????? result = self.result() result.set_log(self.htmlize_output(complete_output)) result.set_passed((not error) & self.output_ok(complete_output)) return result
def run(self, env): """ Build it. """ result = CheckerResult(checker=self) # Try to find out the main modules name with only the source files present try: env.set_program(self.main_module(env)) except self.NotFoundError: pass filenames = [name for name in self.get_file_names(env)] args = [ self.compiler() ] + self.output_flags(env) + self.flags(env) + filenames + self.libs() [output, _, _, _] = execute_arglist(args, env.tmpdir(), self.environment()) output = escape(output) output = self.enhance_output(env, output) # Allow server to delete created subfolders execute('chmod -R 0777 *', env.tmpdir()) # We mustn't have any warnings. passed = not self.has_warnings(output) log = self.build_log( output, args, set(filenames).intersection([ solutionfile.path() for solutionfile in env.solution().solutionfile_set.all() ])) # Now that submission was successfully built, try to find the main modules name again try: if passed: env.set_program(self.main_module(env)) except self.NotFoundError as e: # But only complain if the main method is required if self._main_required: log += "<pre>" + str(e) + "</pre>" passed = False result.set_passed(passed) result.set_log(log) return result
def run(self, env): """ Runs tests in a special environment. Here's the actual work. This runs the check in the environment ENV, returning a CheckerResult. """ # Setup copy_file(self.shell_script.path, env.tmpdir(), to_is_directory=True) os.chmod(env.tmpdir() + '/' + os.path.basename(self.shell_script.name), 0750) # Run the tests -- execute dumped shell script 'script.sh' filenames = [quote(name) for (name, content) in env.sources()] args = [env.tmpdir() + '/' + os.path.basename(self.shell_script.name) ] + filenames environ = {} environ['USER'] = str(env.user().id) environ['HOME'] = env.tmpdir() environ['JAVA'] = settings.JVM environ['JAVA_SECURE'] = settings.JVM_SECURE environ['PROGRAM'] = env.program() or '' [output, error, exitcode, timed_out] = execute_arglist(args, working_directory=env.tmpdir(), environment_variables=environ, timeout=settings.TEST_TIMEOUT, fileseeklimit=settings.TEST_MAXFILESIZE) output = force_unicode(output, errors='replace') result = CheckerResult(checker=self) (output, truncated) = truncated_log(output) if self.remove: output = re.sub(self.remove, "", output) if not self.returns_html or truncated or timed_out: output = '<pre>' + escape(output) + '</pre>' result.set_log(output, timed_out=timed_out, truncated=truncated) result.set_passed(not exitcode and not timed_out and not truncated) return result
def run(self, env): # Save public test cases in `tests.exp' tests_exp = os.path.join(self.tests_dir(env), "tests.exp") test_cases = string.replace(encoding.get_unicode(self.test_case.read()), u"PROGRAM", env.program()) create_file(tests_exp,test_cases) testsuite = self.testsuite_dir(env) program_name = env.program() if " " in program_name: result = self.result() result.set_log("<pre><b class=\"fail\">Error</b>: Path to the main() - source file contains spaces.\n\nFor Java .zip submittions, the directory hierarchy of the .zip file must excactly match the package structure.\nThe default package must correspond to the .zip root directory.</pre>") result.set_passed(False) return result cmd = [settings.DEJAGNU_RUNTEST, "--tool", program_name, "tests.exp"] environ = {} environ['JAVA'] = settings.JVM environ['POLICY'] = join(join(dirname(dirname(__file__)),"scripts"),"praktomat.policy") environ['USER'] = env.user().get_full_name().encode(sys.getdefaultencoding(), 'ignore') environ['HOME'] = testsuite environ['UPLOAD_ROOT'] = settings.UPLOAD_ROOT [output, error, exitcode,timed_out] = execute_arglist(cmd, testsuite, environment_variables=environ,timeout=settings.TEST_TIMEOUT,fileseeklimit=settings.TEST_MAXFILESIZE) output = encoding.get_unicode(output) try: summary = encoding.get_unicode(open(os.path.join(testsuite, program_name + ".sum")).read()) log = encoding.get_unicode(open(os.path.join(testsuite, program_name + ".log")).read()) except: summary = "" log = "" complete_output = self.htmlize_output(output + log) result = self.result() result.set_log(complete_output,timed_out=timed_out) result.set_passed(not exitcode and not timed_out and self.output_ok(complete_output)) return result
def run(self, env): # Save save check configuration config_path = os.path.join(env.tmpdir(), "checks.xml") copy_file(self.configuration.path, config_path) # Run the tests args = [settings.JVM, "-cp", settings.CHECKSTYLEALLJAR, "-Dbasedir=.", "com.puppycrawl.tools.checkstyle.Main", "-c", "checks.xml"] + [name for (name,content) in env.sources()] [output, error, exitcode,timed_out] = execute_arglist(args, env.tmpdir()) # Remove Praktomat-Path-Prefixes from result: output = re.sub(r"^"+re.escape(env.tmpdir())+"/+","",output,flags=re.MULTILINE) result = CheckerResult(checker=self) log = '<pre>' + escape(output) + '</pre>' if timed_out: log = log + '<div class="error">Timeout occured!</div>' result.set_log(log) result.set_passed(not timed_out and not exitcode and (not re.match('Starting audit...\nAudit done.', output) == None)) return result
def run(self, env): """ Build it. """ result = CheckerResult(checker=self) filenames = [name for name in self.get_file_names(env)] args = [self.compiler()] + self.flags(env) + filenames + self.libs() [output, _, _, _] = execute_arglist(args, env.tmpdir(), self.environment()) has_main = re.search(r"^Linking ([^ ]*) ...$", output, re.MULTILINE) if has_main: self._detected_main = has_main.group(1) output = escape(output) output = self.enhance_output(env, output) # Allow server to delete created subfolders execute('chmod -R 0777 *', env.tmpdir()) # We mustn't have any warnings. passed = not self.has_warnings(output) log = self.build_log( output, args, set(filenames).intersection([ solutionfile.path() for solutionfile in env.solution().solutionfile_set.all() ])) # Now that submission was successfully built, try to find the main modules name again try: if passed: env.set_program(self.main_module(env)) except self.NotFoundError as e: passed = not self._main_required log += "<pre>" + str(e) + "</pre>" result.set_passed(passed) result.set_log(log) return result
def run(self, env): """ Build it. """ result = CheckerResult(checker=self) # Try to find out the main modules name with only the source files present try: env.set_program(self.main_module(env)) except self.NotFoundError: pass filenames = [name for name in self.get_file_names(env)] args = [self.compiler()] + self.output_flags(env) + self.flags(env) + filenames + self.libs() [output,_,_,_] = execute_arglist(args, env.tmpdir(),self.environment()) output = escape(output) output = self.enhance_output(env, output) # Allow server to delete created subfolders execute('chmod -R 0777 *', env.tmpdir()) # We mustn't have any warnings. passed = not self.has_warnings(output) log = self.build_log(output,args,set(filenames).intersection([solutionfile.path() for solutionfile in env.solution().solutionfile_set.all()])) # Now that submission was successfully built, try to find the main modules name again try: if passed : env.set_program(self.main_module(env)) except self.NotFoundError as e: # But only complain if the main method is required if self._main_required: log += "<pre>" + str(e) + "</pre>" passed = False result.set_passed(passed) result.set_log(log) return result
def run(self, env): filecopy_result = self.run_file(env) if not filecopy_result.passed: return filecopy_result if self.require_safe: safe_builder = IgnoringHaskellBuilder( _flags="-XSafe", _file_pattern=r"^.*\.[hH][sS]$", _main_required=False) safe_builder._ignore = self.ignore.split(" ") + [ self.path_relative_to_sandbox() ] safe_build_result = safe_builder.run(env) if not safe_build_result.passed: result = CheckerResult(checker=self) result.set_passed(False) result.set_log( '<pre>' + escape(self.test_description) + '\n\n======== Test Results (Safe) ======\n\n</pre><br/>\n' + safe_build_result.log) return result test_builder = TestOnlyBuildingBuilder( _flags="-main-is " + self.module_name(), _libs= "test-framework test-framework-quickcheck2 test-framework-hunit") test_builder._testsuite_filename = self.path_relative_to_sandbox() test_build_result = test_builder.run(env) if not test_build_result.passed: result = CheckerResult(checker=self) result.set_passed(False) result.set_log( '<pre>' + escape(self.test_description) + '\n\n======== Test Results (Building all) ======\n\n</pre><br/>\n' + test_build_result.log) return result environ = {} environ['UPLOAD_ROOT'] = settings.UPLOAD_ROOT cmd = [ "./" + self.module_binary_name(), "--maximum-generated-tests=5000" ] [output, error, exitcode, timed_out] = execute_arglist(cmd, env.tmpdir(), environment_variables=environ, timeout=settings.TEST_TIMEOUT, fileseeklimit=settings.TEST_MAXFILESIZE) result = CheckerResult(checker=self) (output, truncated) = truncated_log(output) output = '<pre>' + escape( self.test_description ) + '\n\n======== Test Results ======\n\n</pre><br/><pre>' + escape( output) + '</pre>' if self.include_testcase_in_report in ["FULL", "DL"]: testsuit_template = get_template( 'checker/checker/haskell_test_framework_report.html') output += testsuit_template.render( Context({ 'showSource': (self.include_testcase_in_report == "FULL"), 'testfile': self.file, 'testfilename': self.path_relative_to_sandbox(), 'testfileContent': encoding.get_unicode(self.file.read()) })) result.set_log(output, timed_out=timed_out, truncated=truncated) result.set_passed(not exitcode and not timed_out and self.output_ok(output) and not truncated) return result
def run(self, env): filecopy_result = self.run_file(env) if not filecopy_result.passed: return filecopy_result if self.require_safe: safe_builder = IgnoringHaskellBuilder( _flags="-XSafe", _file_pattern=r"^.*\.[hH][sS]$", _main_required=False ) safe_builder._ignore = self.ignore.split(" ") + [self.path_relative_to_sandbox()] safe_build_result = safe_builder.run(env) if not safe_build_result.passed: result = CheckerResult(checker=self) result.set_passed(False) result.set_log( "<pre>" + escape(self.test_description) + "\n\n======== Test Results (Safe) ======\n\n</pre><br/>\n" + safe_build_result.log ) return result test_builder = TestOnlyBuildingBuilder( _flags="-main-is " + self.module_name(), _libs="test-framework test-framework-quickcheck2 test-framework-hunit", ) test_builder._testsuite_filename = self.path_relative_to_sandbox() test_build_result = test_builder.run(env) if not test_build_result.passed: result = CheckerResult(checker=self) result.set_passed(False) result.set_log( "<pre>" + escape(self.test_description) + "\n\n======== Test Results (Building all) ======\n\n</pre><br/>\n" + test_build_result.log ) return result environ = {} environ["UPLOAD_ROOT"] = settings.UPLOAD_ROOT cmd = ["./" + self.module_binary_name(), "--maximum-generated-tests=5000"] [output, error, exitcode, timed_out] = execute_arglist( cmd, env.tmpdir(), environment_variables=environ, timeout=settings.TEST_TIMEOUT, fileseeklimit=settings.TEST_MAXFILESIZE, ) result = CheckerResult(checker=self) (output, truncated) = truncated_log(output) output = ( "<pre>" + escape(self.test_description) + "\n\n======== Test Results ======\n\n</pre><br/><pre>" + escape(output) + "</pre>" ) if self.include_testcase_in_report in ["FULL", "DL"]: testsuit_template = get_template("checker/checker/haskell_test_framework_report.html") output += testsuit_template.render( Context( { "showSource": (self.include_testcase_in_report == "FULL"), "testfile": self.file, "testfilename": self.path_relative_to_sandbox(), "testfileContent": encoding.get_unicode(self.file.read()), } ) ) result.set_log(output, timed_out=timed_out, truncated=truncated) result.set_passed(not exitcode and not timed_out and self.output_ok(output) and not truncated) return result