def __init__(self, out, err, p, args): CommandError.__init__(self, out, err, p) self.args = args
def run_test(testdir): # Compile each 'input.c', using 'script.py' # Assume success and empty stdout; compare against expected stderr, or empty if file not present inputfiles = get_source_files(testdir) outfile = os.path.join(testdir, 'output.o') script_py = os.path.join(testdir, 'script.py') out = TestStream(os.path.join(testdir, 'stdout.txt')) err = TestStream(os.path.join(testdir, 'stderr.txt')) cp = configparser.SafeConfigParser() metadatapath = os.path.join(testdir, 'metadata.ini') cp.read([metadatapath]) if cp.has_section('WhenToRun'): if cp.has_option('WhenToRun', 'required_features'): required_features = cp.get('WhenToRun', 'required_features').split() for feature in required_features: if feature not in features: raise ValueError('%s in %s not found in %s' % (feature, metadatapath, config_h)) if not features[feature]: raise SkipTest('required feature %s not available in %s' % (feature, config_h)) env = dict(os.environ) env['LC_ALL'] = 'C' # Generate the command-line for invoking gcc: args = [CC] if len(inputfiles) == 1: args += ['-c'] # (don't run the linker) else: args += ['-fPIC', '-shared'] # Force LTO when there's more than one source file: args += ['-flto', '-flto-partition=none'] if GCC_VERSION >= 4008: # GCC 4.8 started showing the source line where the problem is, # followed by another line showing a caret indicating column. # This is a great usability feature, but totally breaks our "gold" # output, so turn it off for running tests: args += ['-fno-diagnostics-show-caret'] # Similarly, the macro expansion tracking is great for usability, # but breaks the "gold" output, so we disable it during tests: args += ['-ftrack-macro-expansion=0'] args += ['-o', outfile] args += [ '-fplugin=%s' % os.path.abspath('%s.so' % PLUGIN_NAME), '-fplugin-arg-%s-script=%s' % (PLUGIN_NAME, script_py) ] # Force the signedness of char so that the tests have consistent # behavior across all archs: args += ['-fsigned-char'] # Special-case: add the python include dir (for this runtime) if the C code # uses Python.h: def uses_python_headers(): for inputfile in inputfiles: with open(inputfile, 'r') as f: code = f.read() if '#include <Python.h>' in code: return True if uses_python_headers(): args += ['-I' + get_python_inc()] # If there's a getopts.py, run it to get additional test-specific # command-line options: getopts_py = os.path.join(testdir, 'getopts.py') if os.path.exists(getopts_py): p = Popen([sys.executable, getopts_py], stdout=PIPE, stderr=PIPE) opts_out, opts_err = p.communicate() if six.PY3: opts_out = opts_out.decode() opts_err = opts_err.decode() c = p.wait() if c != 0: raise CommandError() args += opts_out.split() # and the source files go at the end: args += inputfiles if uses_dg_directives(inputfiles): dg_context = DgContext(inputfiles) dg_context.echo_results = True for inputfile in inputfiles: dg_context.parse_directives(inputfile) args += dg_context.get_args() else: dg_context = None if options.show: # Show the gcc invocation: print(' '.join(args)) # Invoke the compiler: p = Popen(args, env=env, stdout=PIPE, stderr=PIPE) out.actual, err.actual = p.communicate() if six.PY3: out.actual = out.actual.decode() err.actual = err.actual.decode() #print 'out: %r' % out.actual #print 'err: %r' % err.actual exitcode_actual = p.wait() if options.show: # then the user wants to see the gcc invocation directly sys.stdout.write(out.actual) sys.stderr.write(err.actual) if dg_context: dg_context.check_result(out.actual, err.actual, exitcode_actual) if dg_context.num_failures() > 0: raise DejaGnuError(dg_context) return # Expected exit code # By default, we expect success if the expected stderr is empty, and # and failure if it's non-empty. # This can be overridden if the test has a metadata.ini, by setting # exitcode within the [ExpectedBehavior] section: if err.expdata == '': exitcode_expected = 0 else: exitcode_expected = 1 if cp.has_section('ExpectedBehavior'): if cp.has_option('ExpectedBehavior', 'exitcode'): exitcode_expected = cp.getint('ExpectedBehavior', 'exitcode') # Check exit code: if exitcode_actual != exitcode_expected: sys.stderr.write(out.diff('stdout')) sys.stderr.write(err.diff('stderr')) raise CompilationError(out.actual, err.actual, p, args) if exitcode_expected == 0: assert os.path.exists(outfile) out.check_for_diff(out.actual, err.actual, p, args, 'stdout', WRITEBACK) err.check_for_diff(out.actual, err.actual, p, args, 'stderr', WRITEBACK)
def run_test(testdir): # Compile each 'input.c', using 'script.py' # Assume success and empty stdout; compare against expected stderr, or empty if file not present inputfile = get_source_file(testdir) outfile = os.path.join(testdir, 'output.o') script_py = os.path.join(testdir, 'script.py') out = TestStream(os.path.join(testdir, 'stdout.txt')) err = TestStream(os.path.join(testdir, 'stderr.txt')) cp = configparser.SafeConfigParser() metadatapath = os.path.join(testdir, 'metadata.ini') cp.read([metadatapath]) if cp.has_section('WhenToRun'): if cp.has_option('WhenToRun', 'required_features'): required_features = cp.get('WhenToRun', 'required_features').split() for feature in required_features: if feature not in features: raise ValueError('%s in %s not found in %s' % (feature, metadatapath, config_h)) if not features[feature]: raise SkipTest('required feature %s not available in %s' % (feature, config_h)) env = dict(os.environ) env['LC_ALL'] = 'C' # Generate the command-line for invoking gcc: args = [os.environ.get('CC', 'gcc')] args += ['-c'] # (don't run the linker) args += ['-o', outfile] args += [ '-fplugin=%s' % os.path.abspath('python.so'), '-fplugin-arg-python-script=%s' % script_py ] # Special-case: add the python include dir (for this runtime) if the C code # uses Python.h: with open(inputfile, 'r') as f: code = f.read() if '#include <Python.h>' in code: args += ['-I' + get_python_inc()] # If there's a getopts.py, run it to get additional test-specific # command-line options: getopts_py = os.path.join(testdir, 'getopts.py') if os.path.exists(getopts_py): p = Popen([sys.executable, getopts_py], stdout=PIPE, stderr=PIPE) opts_out, opts_err = p.communicate() if six.PY3: opts_out = opts_out.decode() opts_err = opts_err.decode() c = p.wait() if c != 0: raise CommandError() args += opts_out.split() # and the source file goes at the end: args += [inputfile] # Invoke the compiler: p = Popen(args, env=env, stdout=PIPE, stderr=PIPE) out.actual, err.actual = p.communicate() if six.PY3: out.actual = out.actual.decode() err.actual = err.actual.decode() #print 'out: %r' % out.actual #print 'err: %r' % err.actual exitcode_actual = p.wait() # Expected exit code # By default, we expect success if the expected stderr is empty, and # and failure if it's non-empty. # This can be overridden if the test has a metadata.ini, by setting # exitcode within the [ExpectedBehavior] section: if err.expdata == '': exitcode_expected = 0 else: exitcode_expected = 1 if cp.has_section('ExpectedBehavior'): if cp.has_option('ExpectedBehavior', 'exitcode'): exitcode_expected = cp.getint('ExpectedBehavior', 'exitcode') # Check exit code: if exitcode_actual != exitcode_expected: sys.stderr.write(out.diff('stdout')) sys.stderr.write(err.diff('stderr')) raise CompilationError(out.actual, err.actual, p, args) if exitcode_expected == 0: assert os.path.exists(outfile) out.check_for_diff(out.actual, err.actual, p, args, 'stdout', 0) err.check_for_diff(out.actual, err.actual, p, args, 'stderr', 0)