From 227bc33a9f24b563f1a04211ef8fa8c4adb4fe62 Mon Sep 17 00:00:00 2001
From: Leo-Paul Geneau <leo-paul.geneau@nexedi.com>
Date: Fri, 9 Oct 2020 10:21:41 +0200
Subject: [PATCH] software/proftpd:  Updates software release tests to be
 python3 compliant

---
 software/proftpd/software.cfg               |  2 ++
 software/proftpd/test/test.py               | 30 ++++++++++-----------
 software/slapos-sr-testing/software-py3.cfg |  1 +
 software/slapos-sr-testing/software.cfg     |  1 -
 4 files changed, 18 insertions(+), 16 deletions(-)

diff --git a/software/proftpd/software.cfg b/software/proftpd/software.cfg
index 1be902939..623bfe400 100644
--- a/software/proftpd/software.cfg
+++ b/software/proftpd/software.cfg
@@ -12,6 +12,8 @@ parts =
   proftpd-config-file
   instance-profile
 
+[python]
+part = python3
 
 [download-file-base]
 recipe = slapos.recipe.build:download
diff --git a/software/proftpd/test/test.py b/software/proftpd/test/test.py
index 5c7ae8fb2..17b347bd4 100644
--- a/software/proftpd/test/test.py
+++ b/software/proftpd/test/test.py
@@ -27,9 +27,9 @@
 
 import os
 import shutil
-import urlparse
+from urllib.parse import urlparse
 import tempfile
-import StringIO
+import io
 import subprocess
 
 import pysftp
@@ -58,7 +58,7 @@ class ProFTPdTestCase(SlapOSInstanceTestCase):
     cnopts.hostkeys = None
 
     parameter_dict = self.computer_partition.getConnectionParameterDict()
-    sftp_url = urlparse.urlparse(parameter_dict['url'])
+    sftp_url = urlparse(parameter_dict['url'])
 
     return pysftp.Connection(
         hostname or sftp_url.hostname,
@@ -95,7 +95,7 @@ class TestSFTPOperations(ProFTPdTestCase):
   def test_simple_sftp_session(self):
     with self._getConnection() as sftp:
       # put a file
-      with tempfile.NamedTemporaryFile() as f:
+      with tempfile.NamedTemporaryFile(mode='w') as f:
         f.write("Hello FTP !")
         f.flush()
         sftp.put(f.name, remotepath='testfile')
@@ -117,14 +117,14 @@ class TestSFTPOperations(ProFTPdTestCase):
   def test_uploaded_file_not_visible_until_fully_uploaded(self):
     test_self = self
 
-    class PartialFile(StringIO.StringIO):
+    class PartialFile(io.StringIO):
       def read(self, *args):
         # file is not visible yet
         test_self.assertNotIn('destination', os.listdir(test_self.upload_dir))
         # it's just a hidden file
         test_self.assertEqual(
             ['.in.destination.'], os.listdir(test_self.upload_dir))
-        return StringIO.StringIO.read(self, *args)
+        return super().read(*args)
 
     with self._getConnection() as sftp:
       sftp.sftp_client.putfo(PartialFile("content"), "destination")
@@ -136,7 +136,7 @@ class TestSFTPOperations(ProFTPdTestCase):
     test_self = self
     with self._getConnection() as sftp:
 
-      class ErrorFile(StringIO.StringIO):
+      class ErrorFile(io.StringIO):
         def read(self, *args):
           # at this point, file is already created on server
           test_self.assertEqual(
@@ -152,17 +152,17 @@ class TestSFTPOperations(ProFTPdTestCase):
 
   def test_user_cannot_escape_home(self):
     with self._getConnection() as sftp:
-      with self.assertRaisesRegexp(IOError, 'Permission denied'):
+      with self.assertRaises(PermissionError):
         sftp.listdir('..')
-      with self.assertRaisesRegexp(IOError, 'Permission denied'):
+      with self.assertRaises(PermissionError):
         sftp.listdir('/')
-      with self.assertRaisesRegexp(IOError, 'Permission denied'):
+      with self.assertRaises(PermissionError):
         sftp.listdir('/tmp/')
 
 
 class TestUserManagement(ProFTPdTestCase):
   def test_user_can_be_added_from_script(self):
-    with self.assertRaisesRegexp(AuthenticationException,
+    with self.assertRaisesRegex(AuthenticationException,
                                  'Authentication failed'):
       self._getConnection(username='bob', password='secret')
 
@@ -177,12 +177,12 @@ class TestBan(ProFTPdTestCase):
   def test_client_are_banned_after_5_wrong_passwords(self):
     # Simulate failed 5 login attempts
     for i in range(5):
-      with self.assertRaisesRegexp(AuthenticationException,
+      with self.assertRaisesRegex(AuthenticationException,
                                    'Authentication failed'):
         self._getConnection(password='wrong')
 
     # after that, even with a valid password we cannot connect
-    with self.assertRaisesRegexp(SSHException, 'Connection reset by peer'):
+    with self.assertRaisesRegex(SSHException, 'Connection reset by peer'):
       self._getConnection()
 
     # ban event is logged
@@ -190,7 +190,7 @@ class TestBan(ProFTPdTestCase):
                            'var',
                            'log',
                            'proftpd-ban.log')) as ban_log_file:
-      self.assertRegexpMatches(
+      self.assertRegex(
           ban_log_file.readlines()[-1],
           'login from host .* denied due to host ban')
 
@@ -203,7 +203,7 @@ class TestInstanceParameterPort(ProFTPdTestCase):
 
   def test_instance_parameter_port(self):
     parameter_dict = self.computer_partition.getConnectionParameterDict()
-    sftp_url = urlparse.urlparse(parameter_dict['url'])
+    sftp_url = urlparse(parameter_dict['url'])
     self.assertEqual(self.free_port, sftp_url.port)
     self.assertTrue(self._getConnection())
 
diff --git a/software/slapos-sr-testing/software-py3.cfg b/software/slapos-sr-testing/software-py3.cfg
index 5731b173b..60de21eac 100644
--- a/software/slapos-sr-testing/software-py3.cfg
+++ b/software/slapos-sr-testing/software-py3.cfg
@@ -14,3 +14,4 @@ eggs -=
 extra =
   ${slapos.test.monitor-setup:setup}
   ${slapos.test.powerdns-setup:setup}
+  ${slapos.test.proftpd-setup:setup}
diff --git a/software/slapos-sr-testing/software.cfg b/software/slapos-sr-testing/software.cfg
index 3436e2e6d..2a6c46f24 100644
--- a/software/slapos-sr-testing/software.cfg
+++ b/software/slapos-sr-testing/software.cfg
@@ -257,7 +257,6 @@ extra =
   ${slapos.test.htmlvalidatorserver-setup:setup}
   ${slapos.test.slapos-master-setup:setup}
   ${slapos.test.plantuml-setup:setup}
-  ${slapos.test.proftpd-setup:setup}
   ${slapos.test.re6stnet-setup:setup}
   ${slapos.test.seleniumserver-setup:setup}
   ${slapos.test.helloworld-setup:setup}
-- 
2.30.9