Issue #23883: Add missing APIs to __all__; patch by Jacek KoƂodziej
diff --git a/Lib/test/test_csv.py b/Lib/test/test_csv.py
index 8e9c2b4..4763bbb 100644
--- a/Lib/test/test_csv.py
+++ b/Lib/test/test_csv.py
@@ -1084,5 +1084,11 @@
             self.assertEqual(fileobj.read(), expected)
 
 
+class MiscTestCase(unittest.TestCase):
+    def test__all__(self):
+        extra = {'__doc__', '__version__'}
+        support.check__all__(self, csv, ('csv', '_csv'), extra=extra)
+
+
 if __name__ == '__main__':
     unittest.main()
diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py
index 0f7b769..e4e6c2b 100644
--- a/Lib/test/test_enum.py
+++ b/Lib/test/test_enum.py
@@ -6,6 +6,7 @@
 from enum import Enum, IntEnum, EnumMeta, unique
 from io import StringIO
 from pickle import dumps, loads, PicklingError, HIGHEST_PROTOCOL
+from test import support
 
 # for pickle tests
 try:
@@ -1708,5 +1709,11 @@
         if failed:
             self.fail("result does not equal expected, see print above")
 
+
+class MiscTestCase(unittest.TestCase):
+    def test__all__(self):
+        support.check__all__(self, enum)
+
+
 if __name__ == '__main__':
     unittest.main()
diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py
index aef66da..9d8de21 100644
--- a/Lib/test/test_ftplib.py
+++ b/Lib/test/test_ftplib.py
@@ -1049,10 +1049,19 @@
         ftp.close()
 
 
+class MiscTestCase(TestCase):
+    def test__all__(self):
+        blacklist = {'MSG_OOB', 'FTP_PORT', 'MAXLINE', 'CRLF', 'B_CRLF',
+                     'Error', 'parse150', 'parse227', 'parse229', 'parse257',
+                     'print_line', 'ftpcp', 'test'}
+        support.check__all__(self, ftplib, blacklist=blacklist)
+
+
 def test_main():
     tests = [TestFTPClass, TestTimeouts,
              TestIPv6Environment,
-             TestTLS_FTPClassMixin, TestTLS_FTPClass]
+             TestTLS_FTPClassMixin, TestTLS_FTPClass,
+             MiscTestCase]
 
     thread_info = support.threading_setup()
     try:
diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py
index 95575bf..9c4344f 100644
--- a/Lib/test/test_logging.py
+++ b/Lib/test/test_logging.py
@@ -4159,6 +4159,17 @@
         msg = 'Record not found in event log, went back %d records' % GO_BACK
         self.assertTrue(found, msg=msg)
 
+
+class MiscTestCase(unittest.TestCase):
+    def test__all__(self):
+        blacklist = {'logThreads', 'logMultiprocessing',
+                     'logProcesses', 'currentframe',
+                     'PercentStyle', 'StrFormatStyle', 'StringTemplateStyle',
+                     'Filterer', 'PlaceHolder', 'Manager', 'RootLogger',
+                     'root'}
+        support.check__all__(self, logging, blacklist=blacklist)
+
+
 # Set the locale to the platform-dependent default.  I have no idea
 # why the test does this, but in any case we save the current locale
 # first and restore it at the end.
@@ -4175,7 +4186,8 @@
         RotatingFileHandlerTest,  LastResortTest, LogRecordTest,
         ExceptionTest, SysLogHandlerTest, HTTPHandlerTest,
         NTEventLogHandlerTest, TimedRotatingFileHandlerTest,
-        UnixSocketHandlerTest, UnixDatagramHandlerTest, UnixSysLogHandlerTest)
+        UnixSocketHandlerTest, UnixDatagramHandlerTest, UnixSysLogHandlerTest,
+        MiscTestCase)
 
 if __name__ == "__main__":
     test_main()
diff --git a/Lib/test/test_optparse.py b/Lib/test/test_optparse.py
index 7621c24..91a0319 100644
--- a/Lib/test/test_optparse.py
+++ b/Lib/test/test_optparse.py
@@ -16,6 +16,7 @@
 from test import support
 
 
+import optparse
 from optparse import make_option, Option, \
      TitledHelpFormatter, OptionParser, OptionGroup, \
      SUPPRESS_USAGE, OptionError, OptionConflictError, \
@@ -1650,6 +1651,12 @@
                              "option -l: invalid integer value: '0x12x'")
 
 
+class MiscTestCase(unittest.TestCase):
+    def test__all__(self):
+        blacklist = {'check_builtin', 'AmbiguousOptionError', 'NO_DEFAULT'}
+        support.check__all__(self, optparse, blacklist=blacklist)
+
+
 def test_main():
     support.run_unittest(__name__)
 
diff --git a/Lib/test/test_pickletools.py b/Lib/test/test_pickletools.py
index bbe6875..80221f0 100644
--- a/Lib/test/test_pickletools.py
+++ b/Lib/test/test_pickletools.py
@@ -4,6 +4,7 @@
 from test import support
 from test.pickletester import AbstractPickleTests
 from test.pickletester import AbstractPickleModuleTests
+import unittest
 
 class OptimizedPickleTests(AbstractPickleTests, AbstractPickleModuleTests):
 
@@ -59,8 +60,40 @@
         self.assertNotIn(pickle.BINPUT, pickled2)
 
 
+class MiscTestCase(unittest.TestCase):
+    def test__all__(self):
+        blacklist = {'bytes_types',
+                     'UP_TO_NEWLINE', 'TAKEN_FROM_ARGUMENT1',
+                     'TAKEN_FROM_ARGUMENT4', 'TAKEN_FROM_ARGUMENT4U',
+                     'TAKEN_FROM_ARGUMENT8U', 'ArgumentDescriptor',
+                     'read_uint1', 'read_uint2', 'read_int4', 'read_uint4',
+                     'read_uint8', 'read_stringnl', 'read_stringnl_noescape',
+                     'read_stringnl_noescape_pair', 'read_string1',
+                     'read_string4', 'read_bytes1', 'read_bytes4',
+                     'read_bytes8', 'read_unicodestringnl',
+                     'read_unicodestring1', 'read_unicodestring4',
+                     'read_unicodestring8', 'read_decimalnl_short',
+                     'read_decimalnl_long', 'read_floatnl', 'read_float8',
+                     'read_long1', 'read_long4',
+                     'uint1', 'uint2', 'int4', 'uint4', 'uint8', 'stringnl',
+                     'stringnl_noescape', 'stringnl_noescape_pair', 'string1',
+                     'string4', 'bytes1', 'bytes4', 'bytes8',
+                     'unicodestringnl', 'unicodestring1', 'unicodestring4',
+                     'unicodestring8', 'decimalnl_short', 'decimalnl_long',
+                     'floatnl', 'float8', 'long1', 'long4',
+                     'StackObject',
+                     'pyint', 'pylong', 'pyinteger_or_bool', 'pybool', 'pyfloat',
+                     'pybytes_or_str', 'pystring', 'pybytes', 'pyunicode',
+                     'pynone', 'pytuple', 'pylist', 'pydict', 'pyset',
+                     'pyfrozenset', 'anyobject', 'markobject', 'stackslice',
+                     'OpcodeInfo', 'opcodes', 'code2op',
+                     }
+        support.check__all__(self, pickletools, blacklist=blacklist)
+
+
 def test_main():
     support.run_unittest(OptimizedPickleTests)
+    support.run_unittest(MiscTestCase)
     support.run_doctest(pickletools)
 
 
diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py
index 3b11bf6..45564f7 100644
--- a/Lib/test/test_threading.py
+++ b/Lib/test/test_threading.py
@@ -18,6 +18,7 @@
 import subprocess
 
 from test import lock_tests
+from test import support
 
 
 # Between fork() and exec(), only async-safe functions are allowed (issues
@@ -1098,5 +1099,12 @@
 class BarrierTests(lock_tests.BarrierTests):
     barriertype = staticmethod(threading.Barrier)
 
+class MiscTestCase(unittest.TestCase):
+    def test__all__(self):
+        extra = {"ThreadError"}
+        blacklist = {'currentThread', 'activeCount'}
+        support.check__all__(self, threading, ('threading', '_thread'),
+                             extra=extra, blacklist=blacklist)
+
 if __name__ == "__main__":
     unittest.main()
diff --git a/Lib/test/test_wave.py b/Lib/test/test_wave.py
index 3eff773..a67a8b0 100644
--- a/Lib/test/test_wave.py
+++ b/Lib/test/test_wave.py
@@ -1,6 +1,7 @@
 from test.support import TESTFN
 import unittest
 from test import audiotests
+from test import support
 from audioop import byteswap
 import sys
 import wave
@@ -103,5 +104,11 @@
         frames = byteswap(frames, 4)
 
 
+class MiscTestCase(unittest.TestCase):
+    def test__all__(self):
+        blacklist = {'WAVE_FORMAT_PCM'}
+        support.check__all__(self, wave, blacklist=blacklist)
+
+
 if __name__ == '__main__':
     unittest.main()