[U-Boot] [PATCHv2 10/13] test/py: Rework test.py to be a different kind of wrapper

Stephen Warren
2019-10-23T18:04:30Z

On 10/23/19 11:29 AM, Stephen Warren wrote:
> On 10/23/19 11:12 AM, Tom Rini wrote:
>> On Wed, Oct 23, 2019 at 11:03:38AM -0600, Stephen Warren wrote:
>>> On 10/23/19 10:58 AM, Tom Rini wrote:
>>>> On Wed, Oct 23, 2019 at 10:55:57AM -0600, Stephen Warren wrote:
>>>>> On 10/22/19 9:20 PM, Tom Rini wrote:
>>>>>> Now that we have moved to being based on pytest for python3 we
>>>>>> need to
>>>>>> make our test.py wrapper more robust in terms of only calling python3
>>>>>> rather than possibly finding and using python2.  To do this,
>>>>>> change from
>>>>>> execvp()'ing pytest to invoking the package itself via python.  In
>>>>>> the
>>>>>> event that pytest is unavailable we still get a user-friendly error:
>>>>>
>>>>> I guess if this works, it's fine. But I think it'd work just as
>>>>> well to
>>>>> simply s/py.test/py.test-3/ in the existing code?
>>>>
>>>> We can't because pip only provides "py.test" / "pytest" binaries.
>>>
>>> Hmm. It sucks that virtualenv does things differently to Ubuntu
>>> packaging
>>> then. That means this series will probably break my test system, which
>>> doesn't use virtualenv. I guess I'll apply it and see.
>>
>> This should be what works everywhere tho.  Instead of hoping that
>> "py.test" will be the right python version we tell python3 to use the
>> pytest module it has.  So if you have system python3-pytest, that works,
>> if you (python3) pip install pytest locally, that works and if you
>> virtualenv + python3 + pip install pytest, that works.
>
> On Ubuntu 16.04, with everything installed from Ubuntu packages rather
> than using virtualenv, I get this:
>
>> + ./src/u-boot/test/py/test.py --bd sandbox --build-dir
>> /var/lib/jenkins/workspace/u-boot-github_swarren_u-boot-tegra_dev-test-py/U_BOOT_BOARD/sandbox/build/u-boot/sandbox
>> -k 'not sleep'
>> Traceback (most recent call last):
>>   File "./src/u-boot/test/py/test.py", line 20, in <module>
>>     sys.exit(load_entry_point('pytest', 'console_scripts',
>> 'pytest')(args))
>>   File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py",
>> line 542, in load_entry_point
>>     return get_distribution(dist).load_entry_point(group, name)
>>   File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py",
>> line 2568, in load_entry_point
>>     raise ImportError("Entry point %r not found" % ((group, name),))
>> ImportError: Entry point ('console_scripts', 'pytest') not found
>
>> [swarren at swarren-lx1 u-boot]$ dpkg -l|grep py|grep test
>> ii  python-pytest    2.8.7-4
>> ii  python3-pytest   2.8.7-4
>
> I guess that's much older than the pytest in requirements.txt (5.2.1!!).
> While I think we can require a newish version of Python (3.5) since
> that's widely available on supported OSs, I don't think we want to force
> people to have a very new version of all the packages (which supported
> distros don't package yet), or change they way they run pytest (by
> requiring use of a virtualenv and requirements.txt) since that mechanism
> isn't supported on old branches of U-Boot, which will then require all
> kinds of special cases in scripts that invoke the U-Boot test system.

Ah. The issue is the name of the entry point; the last parameter to
load_entry_point(). "py.test" is supported everywhere, but only newer
versions of pytesst have a "pytest" entry point. Changing that parameter
to "py.test" makes the wrapper script work. Now every other test fails;
I will see if there's an easy fix for that or not.