diff mbox series

[U-Boot,PATCHv2,06/13] test/py: Manual python3 fixes

Message ID 20191023032010.27725-7-trini@konsulko.com
State Changes Requested
Delegated to: Tom Rini
Headers show
Series Moving test/py to Python 3 | expand

Commit Message

Tom Rini Oct. 23, 2019, 3:20 a.m. UTC
- Modern pytest is more visible in telling us about parameters that we
  had not described, so describe a few more.
- ConfigParser.readfp(...) is now configparser.read_file(...)
- As part of the "strings vs bytes" conversions in Python 3, we use the
  default encoding/decoding of utf-8 but in some places tell Python to
  replace problematic conversions rather than throw a fatal error.
- Fix a typo noticed while doing the above ("tot he" -> "to the").
- As suggested by Stephen, re-alphabetize the import list
- Per Heinrich, replace how we write contents in test_fit.py

Signed-off-by: Tom Rini <trini@konsulko.com>
---
 test/py/conftest.py        | 9 ++++-----
 test/py/multiplexed_log.py | 9 +++++----
 test/py/pytest.ini         | 3 +++
 test/py/tests/test_fit.py  | 4 ++--
 test/py/u_boot_spawn.py    | 4 ++--
 5 files changed, 16 insertions(+), 13 deletions(-)

Comments

Stephen Warren Oct. 23, 2019, 6:50 p.m. UTC | #1
On 10/22/19 9:20 PM, Tom Rini wrote:
> - Modern pytest is more visible in telling us about parameters that we
>    had not described, so describe a few more.
> - ConfigParser.readfp(...) is now configparser.read_file(...)
> - As part of the "strings vs bytes" conversions in Python 3, we use the
>    default encoding/decoding of utf-8 but in some places tell Python to
>    replace problematic conversions rather than throw a fatal error.
> - Fix a typo noticed while doing the above ("tot he" -> "to the").
> - As suggested by Stephen, re-alphabetize the import list
> - Per Heinrich, replace how we write contents in test_fit.py

> diff --git a/test/py/multiplexed_log.py b/test/py/multiplexed_log.py

> @@ -133,7 +134,7 @@ class RunAndLog(object):
>           self.logfile.write(self, msg)
>   
>           try:
> -            p = subprocess.Popen(cmd, cwd=cwd,
> +            p = subprocess.Popen(cmd, cwd=cwd, encoding="utf-8",

The encoding parameter was added in Python 3.6, so this change causes 
test.py to crash for me (with Python 3.5.2). The following will fix that:

>             p = subprocess.Popen(cmd, cwd=cwd,
>                 stdin=None, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
>             (stdout, stderr) = p.communicate()
>             if stdout is not None:
>                 stdout = stdout.decode('utf-8')
>             if stderr is not None:
>                 stderr = stderr.decode('utf-8')

I also noticed that a variety of strings in these patches use "" not '' 
in at least this patch. When I first wrote test/py, Simon made me go 
through everything and replace "" with '', so we should probably make 
new code follow the convention of using ''.
Tom Rini Oct. 23, 2019, 7:01 p.m. UTC | #2
On Wed, Oct 23, 2019 at 12:50:12PM -0600, Stephen Warren wrote:
> On 10/22/19 9:20 PM, Tom Rini wrote:
> > - Modern pytest is more visible in telling us about parameters that we
> >    had not described, so describe a few more.
> > - ConfigParser.readfp(...) is now configparser.read_file(...)
> > - As part of the "strings vs bytes" conversions in Python 3, we use the
> >    default encoding/decoding of utf-8 but in some places tell Python to
> >    replace problematic conversions rather than throw a fatal error.
> > - Fix a typo noticed while doing the above ("tot he" -> "to the").
> > - As suggested by Stephen, re-alphabetize the import list
> > - Per Heinrich, replace how we write contents in test_fit.py
> 
> > diff --git a/test/py/multiplexed_log.py b/test/py/multiplexed_log.py
> 
> > @@ -133,7 +134,7 @@ class RunAndLog(object):
> >           self.logfile.write(self, msg)
> >           try:
> > -            p = subprocess.Popen(cmd, cwd=cwd,
> > +            p = subprocess.Popen(cmd, cwd=cwd, encoding="utf-8",
> 
> The encoding parameter was added in Python 3.6, so this change causes
> test.py to crash for me (with Python 3.5.2). The following will fix that:

Right, Ubuntu 16.04 has Python 3.5.x and later has 3.6 or higher.  It's
reasonable to ask what the minimum host version is going to be and how
much overhead things get the lower we go.  Given:

> >             p = subprocess.Popen(cmd, cwd=cwd,
> >                 stdin=None, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
> >             (stdout, stderr) = p.communicate()
> >             if stdout is not None:
> >                 stdout = stdout.decode('utf-8')
> >             if stderr is not None:
> >                 stderr = stderr.decode('utf-8')

That's not too bad, so we can go with that.  Can you please chime in on
the "Minimum Python 3 version?" thread with what I assume is your
use-case of needing to use older-than-latest-LTS distributions?

> I also noticed that a variety of strings in these patches use "" not '' in
> at least this patch. When I first wrote test/py, Simon made me go through
> everything and replace "" with '', so we should probably make new code
> follow the convention of using ''.

OK, I'll get on top of that, thanks.
Stephen Warren Oct. 23, 2019, 7:27 p.m. UTC | #3
On 10/23/19 1:01 PM, Tom Rini wrote:
> On Wed, Oct 23, 2019 at 12:50:12PM -0600, Stephen Warren wrote:
>> On 10/22/19 9:20 PM, Tom Rini wrote:
>>> - Modern pytest is more visible in telling us about parameters that we
>>>     had not described, so describe a few more.
>>> - ConfigParser.readfp(...) is now configparser.read_file(...)
>>> - As part of the "strings vs bytes" conversions in Python 3, we use the
>>>     default encoding/decoding of utf-8 but in some places tell Python to
>>>     replace problematic conversions rather than throw a fatal error.
>>> - Fix a typo noticed while doing the above ("tot he" -> "to the").
>>> - As suggested by Stephen, re-alphabetize the import list
>>> - Per Heinrich, replace how we write contents in test_fit.py
>>
>>> diff --git a/test/py/multiplexed_log.py b/test/py/multiplexed_log.py
>>
>>> @@ -133,7 +134,7 @@ class RunAndLog(object):
>>>            self.logfile.write(self, msg)
>>>            try:
>>> -            p = subprocess.Popen(cmd, cwd=cwd,
>>> +            p = subprocess.Popen(cmd, cwd=cwd, encoding="utf-8",
>>
>> The encoding parameter was added in Python 3.6, so this change causes
>> test.py to crash for me (with Python 3.5.2). The following will fix that:
> 
> Right, Ubuntu 16.04 has Python 3.5.x and later has 3.6 or higher.  It's
> reasonable to ask what the minimum host version is going to be and how
> much overhead things get the lower we go.  Given:
> 
>>>              p = subprocess.Popen(cmd, cwd=cwd,
>>>                  stdin=None, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
>>>              (stdout, stderr) = p.communicate()
>>>              if stdout is not None:
>>>                  stdout = stdout.decode('utf-8')
>>>              if stderr is not None:
>>>                  stderr = stderr.decode('utf-8')
> 
> That's not too bad, so we can go with that.  Can you please chime in on
> the "Minimum Python 3 version?" thread with what I assume is your
> use-case of needing to use older-than-latest-LTS distributions?

A very quick survey of distros that I can quickly find package lists for:

RHEL 6 - 2 only
RHEL 7 - 3.6
Ubuntu 16.04 - 3.5
Ubuntu 18.04 - 3.6
Debian oldtsable - 3.5
Debian stable and all later - 3.7

So, Ubuntu 16.04 is perhaps the only distro that still contains Python 
3.5. That said, 16.04 is still fully supported for 18 more months, so it 
feels quite reasonable to support it. I have no choice but to use it for 
now.
Simon Glass Oct. 24, 2019, 12:59 a.m. UTC | #4
On Tue, 22 Oct 2019 at 21:20, Tom Rini <trini@konsulko.com> wrote:
>
> - Modern pytest is more visible in telling us about parameters that we
>   had not described, so describe a few more.
> - ConfigParser.readfp(...) is now configparser.read_file(...)
> - As part of the "strings vs bytes" conversions in Python 3, we use the
>   default encoding/decoding of utf-8 but in some places tell Python to
>   replace problematic conversions rather than throw a fatal error.
> - Fix a typo noticed while doing the above ("tot he" -> "to the").
> - As suggested by Stephen, re-alphabetize the import list
> - Per Heinrich, replace how we write contents in test_fit.py
>
> Signed-off-by: Tom Rini <trini@konsulko.com>
> ---
>  test/py/conftest.py        | 9 ++++-----
>  test/py/multiplexed_log.py | 9 +++++----
>  test/py/pytest.ini         | 3 +++
>  test/py/tests/test_fit.py  | 4 ++--
>  test/py/u_boot_spawn.py    | 4 ++--
>  5 files changed, 16 insertions(+), 13 deletions(-)

Reviewed-by: Simon Glass <sjg@chromium.org>
Tested on sandbox:
Tested-by: Simon Glass <sjg@chromium.org>

(I agree about supporting the older Python 3, BTW)
diff mbox series

Patch

diff --git a/test/py/conftest.py b/test/py/conftest.py
index 5c19af1d5034..bffee6b8a3a2 100644
--- a/test/py/conftest.py
+++ b/test/py/conftest.py
@@ -13,17 +13,16 @@ 
 # - Implementing custom pytest markers.
 
 import atexit
+import configparser
 import errno
+import io
 import os
 import os.path
 import pytest
-from _pytest.runner import runtestprotocol
 import re
-import io
+from _pytest.runner import runtestprotocol
 import sys
 
-import configparser
-
 # Globals: The HTML log file, and the connection to the U-Boot console.
 log = None
 console = None
@@ -168,7 +167,7 @@  def pytest_configure(config):
             ini_str = '[root]\n' + f.read()
             ini_sio = io.StringIO(ini_str)
             parser = configparser.RawConfigParser()
-            parser.readfp(ini_sio)
+            parser.read_file(ini_sio)
             ubconfig.buildconfig.update(parser.items('root'))
 
     ubconfig.test_py_dir = test_py_dir
diff --git a/test/py/multiplexed_log.py b/test/py/multiplexed_log.py
index de0aacc659b8..5ea4c055e072 100644
--- a/test/py/multiplexed_log.py
+++ b/test/py/multiplexed_log.py
@@ -51,7 +51,7 @@  class LogfileStream(object):
         """Write data to the log stream.
 
         Args:
-            data: The data to write tot he file.
+            data: The data to write to the file.
             implicit: Boolean indicating whether data actually appeared in the
                 stream, or was implicitly generated. A valid use-case is to
                 repeat a shell prompt at the start of each separate log
@@ -64,7 +64,8 @@  class LogfileStream(object):
 
         self.logfile.write(self, data, implicit)
         if self.chained_file:
-            self.chained_file.write(data)
+            # Chained file is console, convert things a little
+            self.chained_file.write((data.encode("ascii", "replace")).decode())
 
     def flush(self):
         """Flush the log stream, to ensure correct log interleaving.
@@ -133,7 +134,7 @@  class RunAndLog(object):
         self.logfile.write(self, msg)
 
         try:
-            p = subprocess.Popen(cmd, cwd=cwd,
+            p = subprocess.Popen(cmd, cwd=cwd, encoding="utf-8",
                 stdin=None, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
             (stdout, stderr) = p.communicate()
             output = ''
@@ -215,7 +216,7 @@  class Logfile(object):
             Nothing.
         """
 
-        self.f = open(fn, 'wt')
+        self.f = open(fn, 'wt', encoding="utf-8")
         self.last_stream = None
         self.blocks = []
         self.cur_evt = 1
diff --git a/test/py/pytest.ini b/test/py/pytest.ini
index 7e400682bf25..e93d010f1fa2 100644
--- a/test/py/pytest.ini
+++ b/test/py/pytest.ini
@@ -8,3 +8,6 @@ 
 markers =
     boardspec: U-Boot: Describes the set of boards a test can/can't run on.
     buildconfigspec: U-Boot: Describes Kconfig/config-header constraints.
+    notbuildconfigspec: U-Boot: Describes required disabled Kconfig options.
+    requiredtool: U-Boot: Required host tools for a test.
+    slow: U-Boot: Specific test will run slowly.
diff --git a/test/py/tests/test_fit.py b/test/py/tests/test_fit.py
index 4922b9dcc664..356d9a20f299 100755
--- a/test/py/tests/test_fit.py
+++ b/test/py/tests/test_fit.py
@@ -153,7 +153,7 @@  def test_fit(u_boot_console):
         src = make_fname('u-boot.dts')
         dtb = make_fname('u-boot.dtb')
         with open(src, 'w') as fd:
-            print(base_fdt, file=fd)
+            fd.write(base_fdt)
         util.run_and_log(cons, ['dtc', src, '-O', 'dtb', '-o', dtb])
         return dtb
 
@@ -186,7 +186,7 @@  def test_fit(u_boot_console):
         its = make_its(params)
         util.run_and_log(cons, [mkimage, '-f', its, fit])
         with open(make_fname('u-boot.dts'), 'w') as fd:
-            print(base_fdt, file=fd)
+            fd.write(base_fdt)
         return fit
 
     def make_kernel(filename, text):
diff --git a/test/py/u_boot_spawn.py b/test/py/u_boot_spawn.py
index b011a3e3da25..7fedb18d2790 100644
--- a/test/py/u_boot_spawn.py
+++ b/test/py/u_boot_spawn.py
@@ -113,7 +113,7 @@  class Spawn(object):
             Nothing.
         """
 
-        os.write(self.fd, data)
+        os.write(self.fd, data.encode(errors="replace"))
 
     def expect(self, patterns):
         """Wait for the sub-process to emit specific data.
@@ -171,7 +171,7 @@  class Spawn(object):
                 events = self.poll.poll(poll_maxwait)
                 if not events:
                     raise Timeout()
-                c = os.read(self.fd, 1024)
+                c = os.read(self.fd, 1024).decode(errors="replace")
                 if not c:
                     raise EOFError()
                 if self.logfile_read: