Pablo Greco e6a3ae
From 3b36d09996dbcbfc15cb83b2287940243022fd6a Mon Sep 17 00:00:00 2001
Pablo Greco e6a3ae
From: Pino Toscano <ptoscano@redhat.com>
Pablo Greco e6a3ae
Date: Mon, 8 Jul 2019 15:25:58 +0100
Pablo Greco e6a3ae
Subject: [PATCH 12/39] iotests: Use Python byte strings where appropriate
Pablo Greco e6a3ae
MIME-Version: 1.0
Pablo Greco e6a3ae
Content-Type: text/plain; charset=UTF-8
Pablo Greco e6a3ae
Content-Transfer-Encoding: 8bit
Pablo Greco e6a3ae
Pablo Greco e6a3ae
RH-Author: Pino Toscano <ptoscano@redhat.com>
Pablo Greco e6a3ae
Message-id: <20190708152601.21123-8-ptoscano@redhat.com>
Pablo Greco e6a3ae
Patchwork-id: 89424
Pablo Greco e6a3ae
O-Subject: [RHEL-8.1.0 qemu-kvm PATCH v3 07/10] iotests: Use Python byte strings where appropriate
Pablo Greco e6a3ae
Bugzilla: 1513367
Pablo Greco e6a3ae
RH-Acked-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Pablo Greco e6a3ae
RH-Acked-by: Max Reitz <mreitz@redhat.com>
Pablo Greco e6a3ae
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
Pablo Greco e6a3ae
RH-Acked-by: Markus Armbruster <armbru@redhat.com>
Pablo Greco e6a3ae
Pablo Greco e6a3ae
From: Max Reitz <mreitz@redhat.com>
Pablo Greco e6a3ae
Pablo Greco e6a3ae
Since byte strings are no longer the default in Python 3, we have to
Pablo Greco e6a3ae
explicitly use them where we need to, which is mostly when working with
Pablo Greco e6a3ae
structures.  It also means that we need to open a file in binary mode
Pablo Greco e6a3ae
when we want to use structures.
Pablo Greco e6a3ae
Pablo Greco e6a3ae
On the other hand, we have to accomodate for the fact that some
Pablo Greco e6a3ae
functions (still) work with byte strings but we want to use unicode
Pablo Greco e6a3ae
strings (in Python 3 at least, and it does not matter in Python 2).
Pablo Greco e6a3ae
This includes base64 encoding, but it is most notable when working with
Pablo Greco e6a3ae
the subprocess module: Either we set universal_newlines to True so that
Pablo Greco e6a3ae
the default streams are opened in text mode (hence this parameter is
Pablo Greco e6a3ae
aliased as "text" as of 3.7), or, if that is not possible, we have to
Pablo Greco e6a3ae
decode the output to a normal string.
Pablo Greco e6a3ae
Pablo Greco e6a3ae
Signed-off-by: Max Reitz <mreitz@redhat.com>
Pablo Greco e6a3ae
Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
Pablo Greco e6a3ae
Message-Id: <20181022135307.14398-4-mreitz@redhat.com>
Pablo Greco e6a3ae
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
Pablo Greco e6a3ae
(cherry picked from commit 8eb5e6746feaf9e021b69ea2521899f8dc889033)
Pablo Greco e6a3ae
Signed-off-by: Pino Toscano <ptoscano@redhat.com>
Pablo Greco e6a3ae
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
Pablo Greco e6a3ae
---
Pablo Greco e6a3ae
 scripts/qtest.py                         |  2 +-
Pablo Greco e6a3ae
 tests/qemu-iotests/044                   |  8 ++++----
Pablo Greco e6a3ae
 tests/qemu-iotests/149                   |  8 +++++---
Pablo Greco e6a3ae
 tests/qemu-iotests/207                   |  4 ++--
Pablo Greco e6a3ae
 tests/qemu-iotests/iotests.py            | 11 +++++++----
Pablo Greco e6a3ae
 tests/qemu-iotests/nbd-fault-injector.py |  4 ++--
Pablo Greco e6a3ae
 tests/qemu-iotests/qcow2.py              | 10 +++++-----
Pablo Greco e6a3ae
 7 files changed, 26 insertions(+), 21 deletions(-)
Pablo Greco e6a3ae
Pablo Greco e6a3ae
diff --git a/scripts/qtest.py b/scripts/qtest.py
Pablo Greco e6a3ae
index df0daf2..adf1fe3 100644
Pablo Greco e6a3ae
--- a/scripts/qtest.py
Pablo Greco e6a3ae
+++ b/scripts/qtest.py
Pablo Greco e6a3ae
@@ -64,7 +64,7 @@ class QEMUQtestProtocol(object):
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
         @param qtest_cmd: qtest command text to be sent
Pablo Greco e6a3ae
         """
Pablo Greco e6a3ae
-        self._sock.sendall(qtest_cmd + "\n")
Pablo Greco e6a3ae
+        self._sock.sendall((qtest_cmd + "\n").encode('utf-8'))
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
     def close(self):
Pablo Greco e6a3ae
         self._sock.close()
Pablo Greco e6a3ae
diff --git a/tests/qemu-iotests/044 b/tests/qemu-iotests/044
Pablo Greco e6a3ae
index 11ea0f4..69e736f 100755
Pablo Greco e6a3ae
--- a/tests/qemu-iotests/044
Pablo Greco e6a3ae
+++ b/tests/qemu-iotests/044
Pablo Greco e6a3ae
@@ -53,21 +53,21 @@ class TestRefcountTableGrowth(iotests.QMPTestCase):
Pablo Greco e6a3ae
             fd.seek(off_reftable)
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
             for i in xrange(0, h.refcount_table_clusters):
Pablo Greco e6a3ae
-                sector = ''.join(struct.pack('>Q',
Pablo Greco e6a3ae
+                sector = b''.join(struct.pack('>Q',
Pablo Greco e6a3ae
                     off_refblock + i * 64 * 512 + j * 512)
Pablo Greco e6a3ae
                     for j in xrange(0, 64))
Pablo Greco e6a3ae
                 fd.write(sector)
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
             # Write the refcount blocks
Pablo Greco e6a3ae
             assert(fd.tell() == off_refblock)
Pablo Greco e6a3ae
-            sector = ''.join(struct.pack('>H', 1) for j in xrange(0, 64 * 256))
Pablo Greco e6a3ae
+            sector = b''.join(struct.pack('>H', 1) for j in range(0, 64 * 256))
Pablo Greco e6a3ae
             for block in xrange(0, h.refcount_table_clusters):
Pablo Greco e6a3ae
                 fd.write(sector)
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
             # Write the L1 table
Pablo Greco e6a3ae
             assert(fd.tell() == off_l1)
Pablo Greco e6a3ae
             assert(off_l2 + 512 * h.l1_size == off_data)
Pablo Greco e6a3ae
-            table = ''.join(struct.pack('>Q', (1 << 63) | off_l2 + 512 * j)
Pablo Greco e6a3ae
+            table = b''.join(struct.pack('>Q', (1 << 63) | off_l2 + 512 * j)
Pablo Greco e6a3ae
                 for j in xrange(0, h.l1_size))
Pablo Greco e6a3ae
             fd.write(table)
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
@@ -85,7 +85,7 @@ class TestRefcountTableGrowth(iotests.QMPTestCase):
Pablo Greco e6a3ae
                 remaining = remaining - 1024 * 512
Pablo Greco e6a3ae
                 off = off + 1024 * 512
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
-            table = ''.join(struct.pack('>Q', (1 << 63) | off + 512 * j)
Pablo Greco e6a3ae
+            table = b''.join(struct.pack('>Q', (1 << 63) | off + 512 * j)
Pablo Greco e6a3ae
                 for j in xrange(0, remaining / 512))
Pablo Greco e6a3ae
             fd.write(table)
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
diff --git a/tests/qemu-iotests/149 b/tests/qemu-iotests/149
Pablo Greco e6a3ae
index d3ffa25..87174b1 100755
Pablo Greco e6a3ae
--- a/tests/qemu-iotests/149
Pablo Greco e6a3ae
+++ b/tests/qemu-iotests/149
Pablo Greco e6a3ae
@@ -79,7 +79,7 @@ class LUKSConfig(object):
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
     def first_password_base64(self):
Pablo Greco e6a3ae
         (pw, slot) = self.first_password()
Pablo Greco e6a3ae
-        return base64.b64encode(pw)
Pablo Greco e6a3ae
+        return base64.b64encode(pw.encode('ascii')).decode('ascii')
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
     def active_slots(self):
Pablo Greco e6a3ae
         slots = []
Pablo Greco e6a3ae
@@ -98,7 +98,8 @@ def verify_passwordless_sudo():
Pablo Greco e6a3ae
     proc = subprocess.Popen(args,
Pablo Greco e6a3ae
                             stdin=subprocess.PIPE,
Pablo Greco e6a3ae
                             stdout=subprocess.PIPE,
Pablo Greco e6a3ae
-                            stderr=subprocess.STDOUT)
Pablo Greco e6a3ae
+                            stderr=subprocess.STDOUT,
Pablo Greco e6a3ae
+                            universal_newlines=True)
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
     msg = proc.communicate()[0]
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
@@ -116,7 +117,8 @@ def cryptsetup(args, password=None):
Pablo Greco e6a3ae
     proc = subprocess.Popen(fullargs,
Pablo Greco e6a3ae
                             stdin=subprocess.PIPE,
Pablo Greco e6a3ae
                             stdout=subprocess.PIPE,
Pablo Greco e6a3ae
-                            stderr=subprocess.STDOUT)
Pablo Greco e6a3ae
+                            stderr=subprocess.STDOUT,
Pablo Greco e6a3ae
+                            universal_newlines=True)
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
     msg = proc.communicate(password)[0]
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
diff --git a/tests/qemu-iotests/207 b/tests/qemu-iotests/207
Pablo Greco e6a3ae
index 8202bd1..d45bf72 100755
Pablo Greco e6a3ae
--- a/tests/qemu-iotests/207
Pablo Greco e6a3ae
+++ b/tests/qemu-iotests/207
Pablo Greco e6a3ae
@@ -109,7 +109,7 @@ with iotests.FilePath('t.img') as disk_path, \
Pablo Greco e6a3ae
     md5_key = subprocess.check_output(
Pablo Greco e6a3ae
         'ssh-keyscan -t rsa 127.0.0.1 2>/dev/null | grep -v "\\^#" | ' +
Pablo Greco e6a3ae
         'cut -d" " -f3 | base64 -d | md5sum -b | cut -d" " -f1',
Pablo Greco e6a3ae
-        shell=True).rstrip()
Pablo Greco e6a3ae
+        shell=True).rstrip().decode('ascii')
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
     vm.launch()
Pablo Greco e6a3ae
     blockdev_create(vm, { 'driver': 'ssh',
Pablo Greco e6a3ae
@@ -147,7 +147,7 @@ with iotests.FilePath('t.img') as disk_path, \
Pablo Greco e6a3ae
     sha1_key = subprocess.check_output(
Pablo Greco e6a3ae
         'ssh-keyscan -t rsa 127.0.0.1 2>/dev/null | grep -v "\\^#" | ' +
Pablo Greco e6a3ae
         'cut -d" " -f3 | base64 -d | sha1sum -b | cut -d" " -f1',
Pablo Greco e6a3ae
-        shell=True).rstrip()
Pablo Greco e6a3ae
+        shell=True).rstrip().decode('ascii')
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
     vm.launch()
Pablo Greco e6a3ae
     blockdev_create(vm, { 'driver': 'ssh',
Pablo Greco e6a3ae
diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py
Pablo Greco e6a3ae
index 0f6980a..3d41ff0 100644
Pablo Greco e6a3ae
--- a/tests/qemu-iotests/iotests.py
Pablo Greco e6a3ae
+++ b/tests/qemu-iotests/iotests.py
Pablo Greco e6a3ae
@@ -104,7 +104,8 @@ def qemu_img_pipe(*args):
Pablo Greco e6a3ae
     '''Run qemu-img and return its output'''
Pablo Greco e6a3ae
     subp = subprocess.Popen(qemu_img_args + list(args),
Pablo Greco e6a3ae
                             stdout=subprocess.PIPE,
Pablo Greco e6a3ae
-                            stderr=subprocess.STDOUT)
Pablo Greco e6a3ae
+                            stderr=subprocess.STDOUT,
Pablo Greco e6a3ae
+                            universal_newlines=True)
Pablo Greco e6a3ae
     exitcode = subp.wait()
Pablo Greco e6a3ae
     if exitcode < 0:
Pablo Greco e6a3ae
         sys.stderr.write('qemu-img received signal %i: %s\n' % (-exitcode, ' '.join(qemu_img_args + list(args))))
Pablo Greco e6a3ae
@@ -128,7 +129,8 @@ def qemu_io(*args):
Pablo Greco e6a3ae
     '''Run qemu-io and return the stdout data'''
Pablo Greco e6a3ae
     args = qemu_io_args + list(args)
Pablo Greco e6a3ae
     subp = subprocess.Popen(args, stdout=subprocess.PIPE,
Pablo Greco e6a3ae
-                            stderr=subprocess.STDOUT)
Pablo Greco e6a3ae
+                            stderr=subprocess.STDOUT,
Pablo Greco e6a3ae
+                            universal_newlines=True)
Pablo Greco e6a3ae
     exitcode = subp.wait()
Pablo Greco e6a3ae
     if exitcode < 0:
Pablo Greco e6a3ae
         sys.stderr.write('qemu-io received signal %i: %s\n' % (-exitcode, ' '.join(args)))
Pablo Greco e6a3ae
@@ -149,7 +151,8 @@ class QemuIoInteractive:
Pablo Greco e6a3ae
         self.args = qemu_io_args + list(args)
Pablo Greco e6a3ae
         self._p = subprocess.Popen(self.args, stdin=subprocess.PIPE,
Pablo Greco e6a3ae
                                    stdout=subprocess.PIPE,
Pablo Greco e6a3ae
-                                   stderr=subprocess.STDOUT)
Pablo Greco e6a3ae
+                                   stderr=subprocess.STDOUT,
Pablo Greco e6a3ae
+                                   universal_newlines=True)
Pablo Greco e6a3ae
         assert self._p.stdout.read(9) == 'qemu-io> '
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
     def close(self):
Pablo Greco e6a3ae
@@ -192,7 +195,7 @@ def compare_images(img1, img2, fmt1=imgfmt, fmt2=imgfmt):
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
 def create_image(name, size):
Pablo Greco e6a3ae
     '''Create a fully-allocated raw image with sector markers'''
Pablo Greco e6a3ae
-    file = open(name, 'w')
Pablo Greco e6a3ae
+    file = open(name, 'wb')
Pablo Greco e6a3ae
     i = 0
Pablo Greco e6a3ae
     while i < size:
Pablo Greco e6a3ae
         sector = struct.pack('>l504xl', i / 512, i / 512)
Pablo Greco e6a3ae
diff --git a/tests/qemu-iotests/nbd-fault-injector.py b/tests/qemu-iotests/nbd-fault-injector.py
Pablo Greco e6a3ae
index f9193c0..09668f6 100755
Pablo Greco e6a3ae
--- a/tests/qemu-iotests/nbd-fault-injector.py
Pablo Greco e6a3ae
+++ b/tests/qemu-iotests/nbd-fault-injector.py
Pablo Greco e6a3ae
@@ -86,7 +86,7 @@ def recvall(sock, bufsize):
Pablo Greco e6a3ae
             raise Exception('unexpected disconnect')
Pablo Greco e6a3ae
         chunks.append(chunk)
Pablo Greco e6a3ae
         received += len(chunk)
Pablo Greco e6a3ae
-    return ''.join(chunks)
Pablo Greco e6a3ae
+    return b''.join(chunks)
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
 class Rule(object):
Pablo Greco e6a3ae
     def __init__(self, name, event, io, when):
Pablo Greco e6a3ae
@@ -176,7 +176,7 @@ def handle_connection(conn, use_export):
Pablo Greco e6a3ae
         req = read_request(conn)
Pablo Greco e6a3ae
         if req.type == NBD_CMD_READ:
Pablo Greco e6a3ae
             write_reply(conn, 0, req.handle)
Pablo Greco e6a3ae
-            conn.send('\0' * req.len, event='data')
Pablo Greco e6a3ae
+            conn.send(b'\0' * req.len, event='data')
Pablo Greco e6a3ae
         elif req.type == NBD_CMD_WRITE:
Pablo Greco e6a3ae
             _ = conn.recv(req.len, event='data')
Pablo Greco e6a3ae
             write_reply(conn, 0, req.handle)
Pablo Greco e6a3ae
diff --git a/tests/qemu-iotests/qcow2.py b/tests/qemu-iotests/qcow2.py
Pablo Greco e6a3ae
index b95a837..b392972 100755
Pablo Greco e6a3ae
--- a/tests/qemu-iotests/qcow2.py
Pablo Greco e6a3ae
+++ b/tests/qemu-iotests/qcow2.py
Pablo Greco e6a3ae
@@ -10,7 +10,7 @@ class QcowHeaderExtension:
Pablo Greco e6a3ae
     def __init__(self, magic, length, data):
Pablo Greco e6a3ae
         if length % 8 != 0:
Pablo Greco e6a3ae
             padding = 8 - (length % 8)
Pablo Greco e6a3ae
-            data += "\0" * padding
Pablo Greco e6a3ae
+            data += b"\0" * padding
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
         self.magic  = magic
Pablo Greco e6a3ae
         self.length = length
Pablo Greco e6a3ae
@@ -103,7 +103,7 @@ class QcowHeader:
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
         fd.seek(self.header_length)
Pablo Greco e6a3ae
         extensions = self.extensions
Pablo Greco e6a3ae
-        extensions.append(QcowHeaderExtension(0, 0, ""))
Pablo Greco e6a3ae
+        extensions.append(QcowHeaderExtension(0, 0, b""))
Pablo Greco e6a3ae
         for ex in extensions:
Pablo Greco e6a3ae
             buf = struct.pack('>II', ex.magic, ex.length)
Pablo Greco e6a3ae
             fd.write(buf)
Pablo Greco e6a3ae
@@ -137,8 +137,8 @@ class QcowHeader:
Pablo Greco e6a3ae
         for ex in self.extensions:
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
             data = ex.data[:ex.length]
Pablo Greco e6a3ae
-            if all(c in string.printable for c in data):
Pablo Greco e6a3ae
-                data = "'%s'" % data
Pablo Greco e6a3ae
+            if all(c in string.printable.encode('ascii') for c in data):
Pablo Greco e6a3ae
+                data = "'%s'" % data.decode('ascii')
Pablo Greco e6a3ae
             else:
Pablo Greco e6a3ae
                 data = "<binary>"
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
@@ -178,7 +178,7 @@ def cmd_add_header_ext(fd, magic, data):
Pablo Greco e6a3ae
         sys.exit(1)
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
     h = QcowHeader(fd)
Pablo Greco e6a3ae
-    h.extensions.append(QcowHeaderExtension.create(magic, data))
Pablo Greco e6a3ae
+    h.extensions.append(QcowHeaderExtension.create(magic, data.encode('ascii')))
Pablo Greco e6a3ae
     h.update(fd)
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
 def cmd_add_header_ext_stdio(fd, magic):
Pablo Greco e6a3ae
-- 
Pablo Greco e6a3ae
1.8.3.1
Pablo Greco e6a3ae