Пример #1
0
    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
Пример #2
0
	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        
Пример #3
0
	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
Пример #4
0
	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
Пример #5
0
    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
Пример #6
0
    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
Пример #7
0
	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
Пример #8
0
    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
Пример #9
0
	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.")
Пример #10
0
	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
Пример #11
0
    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
Пример #12
0
    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
Пример #13
0
	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
Пример #14
0
	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
Пример #15
0
    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
Пример #16
0
	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
Пример #18
0
    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