Bug#851588: diffoscope: skip tests if binutils can't handle the object file format
Daniel Shahaf
danielsh at apache.org
Mon Jan 16 19:07:57 UTC 2017
Mattia Rizzolo wrote on Mon, Jan 16, 2017 at 18:06:48 +0100:
> So, I finally managed to look into the tests failures were have been
> seeing in ubuntu's autopkgtest in armhf (and probably also ppc64el and
> s390x, but I didn't test for that).
> As supposed, the reason is that we're trying to disassemble x86-64
> binaries, and the installed multiarch can't deal with them;
Then should we look for 'x86_64-linux-gnu-readelf' rather than bare
'readelf'? And likewise for 'objdump' and friends.
> Now, I came up with a patch, but my python foo has its limit, and I
> think somebody might improve it quite some (e.g. please tell me how I
> can write a decorated fuction that doesn't take any value as input and
> still returns only pytest.mark.skipif()... what I did is uglyugly), so
> I'm filing it as a bug here instead of committing; see the attachment :)
The expression after the "@" sign is evaluated; that should result in
a callable object, which is called with the decoratee as an argument.
In your case, you should be able to pass no parameters, e.g.,
.
@skip_if_binutils_do_not_support_x86()
.
and then delete the sole formal argument from the function definition.
Note that the parentheses are still required in this case, since the
thing that is called with 'test_obj_compare_non_existing' as an actual
parameter is not 'skip_if_binutils_do_not_support_x86' but rather the
function it returns.
I'm not sure what's the best way to combine skip_unless_tools_exist and
pytest.mark.skipif(). The way decorators work is that they're invoked
on each other's return values, i.e.,
.
def skip_if_binutils_do_not_support_x86():
func1 = skip_unless_tools_exist('objdump')
func2 = pytest.mark.skipif(...)
return (lambda func: func2(func1(func)))
.
but whether that's readable is a question of taste.
Cheers,
Daniel
> return obj1.compare(obj2).details
>
> @skip_unless_tools_exist('readelf')
> + at skip_if_binutils_do_not_support_x86(True)
> def test_obj_compare_non_existing(monkeypatch, obj1):
> monkeypatch.setattr(Config(), 'new_file', True)
> difference = obj1.compare(MissingFile('/nonexisting', obj1))
> +def skip_if_binutils_do_not_support_x86(func):
> + if tools_missing('objdump'):
> + return skip_unless_tools_exists('objdump')
> + out = subprocess.check_output(('objdump', '-i')).decode('utf-8').splitlines()
> + return pytest.mark.skipif(
> + 'elf64-x86-64' not in out,
> + reason="requires a binutils capable of reading x86-64 binaries"
> + )
> +
> def load_fixture(filename):
> return pytest.fixture(
> lambda: specialize(FilesystemFile(filename))
> --
> 2.11.0
>
More information about the Reproducible-builds
mailing list