From f548593f374bcf499c358faa1f56c6d85a4acf9e Mon Sep 17 00:00:00 2001
From: Itamar Turner-Trauring <itamar@itamarst.org>
Date: Mon, 6 Jul 2020 14:18:18 -0400
Subject: [PATCH] Fix test_python3, and mark these two modules as being ported
 as well.

---
 src/allmydata/test/test_python3.py | 40 +++++++++++++++++++++++-------
 src/allmydata/util/_python3.py     | 17 ++++++++++++-
 2 files changed, 47 insertions(+), 10 deletions(-)

diff --git a/src/allmydata/test/test_python3.py b/src/allmydata/test/test_python3.py
index 8a25af889..294323b68 100644
--- a/src/allmydata/test/test_python3.py
+++ b/src/allmydata/test/test_python3.py
@@ -1,6 +1,18 @@
 """
 Tests related to the Python 3 porting effort itself.
+
+This module has been ported to Python 3.
 """
+from __future__ import unicode_literals
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+from future.utils import PY2
+if False:#PY2:
+    from builtins import filter, map, zip, ascii, chr, hex, input, next, oct, open, pow, round, super, bytes, dict, int, list, object, range, str, max, min  # noqa: F401
+
+from unittest import expectedFailure
 
 from pkg_resources import (
     resource_stream,
@@ -13,11 +25,18 @@ from twisted.trial.unittest import (
     SynchronousTestCase,
 )
 
+from allmydata.util._python3 import PORTED_MODULES, PORTED_TEST_MODULES
+
 
 class Python3PortingEffortTests(SynchronousTestCase):
+
     def test_finished_porting(self):
         """
         Tahoe-LAFS has been ported to Python 3.
+
+        Once
+        https://tahoe-lafs.org/trac/tahoe-lafs/milestone/Support%20Python%203
+        is completed this test should pass (and can be deleted!).
         """
         tahoe_lafs_module_names = set(all_module_names("allmydata"))
         ported_names = set(ported_module_names())
@@ -31,7 +50,10 @@ class Python3PortingEffortTests(SynchronousTestCase):
                 ),
             ),
         )
-    test_finished_porting.todo = "https://tahoe-lafs.org/trac/tahoe-lafs/milestone/Support%20Python%203 should be completed"
+    if PY2:
+        test_finished_porting.skip = "For some reason todo isn't working on Python 2 now"
+    else:
+        test_finished_porting.todo = "https://tahoe-lafs.org/trac/tahoe-lafs/milestone/Support%20Python%203 should be completed"
 
     def test_ported_modules_exist(self):
         """
@@ -70,18 +92,18 @@ def all_module_names(toplevel):
     """
     allmydata = getModule(toplevel)
     for module in allmydata.walkModules():
-        yield module.name.decode("utf-8")
+        name = module.name
+        if PY2:
+            name = name.decode("utf-8")
+        yield name
 
 
 def ported_module_names():
     """
-    :return list[unicode]: A ``set`` of ``unicode`` giving the names of
+    :return list[unicode]: A ``list`` of ``unicode`` giving the names of
         Tahoe-LAFS modules which have been ported to Python 3.
     """
-    return resource_stream(
-        "allmydata",
-        u"ported-modules.txt",
-    ).read().splitlines()
+    return PORTED_MODULES + PORTED_TEST_MODULES
 
 
 def unported_report(tahoe_lafs_module_names, ported_names):
@@ -100,8 +122,8 @@ def count_lines(module_name):
     try:
         source = module.filePath.getContent()
     except Exception as e:
-        print(module_name, e)
+        print((module_name, e))
         return 0
     lines = source.splitlines()
-    nonblank = filter(None, lines)
+    nonblank = [_f for _f in lines if _f]
     return len(nonblank)
diff --git a/src/allmydata/util/_python3.py b/src/allmydata/util/_python3.py
index 4f023ade7..fd679e014 100644
--- a/src/allmydata/util/_python3.py
+++ b/src/allmydata/util/_python3.py
@@ -1,11 +1,26 @@
-"""Track the port to Python 3."""
+"""
+Track the port to Python 3.
+
+This module has been ported to Python 3.
+"""
+
+from __future__ import unicode_literals
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+from future.utils import PY2
+if PY2:
+    from builtins import filter, map, zip, ascii, chr, hex, input, next, oct, open, pow, round, super, bytes, dict, int, list, object, range, str, max, min  # noqa: F401
 
 # Keep these sorted alphabetically, to reduce merge conflicts:
 PORTED_MODULES = [
     "allmydata.util.humanreadable",
     "allmydata.util.namespace",
+    "allmydata.util._python3",
 ]
 
 PORTED_TEST_MODULES = [
     "allmydata.test.test_humanreadable",
+    "allmydata.test.test_python3",
 ]