| from . import util as test_util |
| machinery = test_util.import_importlib('importlib.machinery') |
| |
| import os |
| import re |
| import sys |
| import unittest |
| from test import support |
| from distutils.util import get_platform |
| from contextlib import contextmanager |
| from .util import temp_module |
| |
| support.import_module('winreg', required_on=['win']) |
| from winreg import ( |
| CreateKey, HKEY_CURRENT_USER, |
| SetValue, REG_SZ, KEY_ALL_ACCESS, |
| EnumKey, CloseKey, DeleteKey, OpenKey |
| ) |
| |
| def delete_registry_tree(root, subkey): |
| try: |
| hkey = OpenKey(root, subkey, access=KEY_ALL_ACCESS) |
| except OSError: |
| # subkey does not exist |
| return |
| while True: |
| try: |
| subsubkey = EnumKey(hkey, 0) |
| except OSError: |
| # no more subkeys |
| break |
| delete_registry_tree(hkey, subsubkey) |
| CloseKey(hkey) |
| DeleteKey(root, subkey) |
| |
| @contextmanager |
| def setup_module(machinery, name, path=None): |
| if machinery.WindowsRegistryFinder.DEBUG_BUILD: |
| root = machinery.WindowsRegistryFinder.REGISTRY_KEY_DEBUG |
| else: |
| root = machinery.WindowsRegistryFinder.REGISTRY_KEY |
| key = root.format(fullname=name, |
| sys_version=sys.version[:3]) |
| try: |
| with temp_module(name, "a = 1") as location: |
| subkey = CreateKey(HKEY_CURRENT_USER, key) |
| if path is None: |
| path = location + ".py" |
| SetValue(subkey, "", REG_SZ, path) |
| yield |
| finally: |
| if machinery.WindowsRegistryFinder.DEBUG_BUILD: |
| key = os.path.dirname(key) |
| delete_registry_tree(HKEY_CURRENT_USER, key) |
| |
| |
| @unittest.skipUnless(sys.platform.startswith('win'), 'requires Windows') |
| class WindowsRegistryFinderTests: |
| # The module name is process-specific, allowing for |
| # simultaneous runs of the same test on a single machine. |
| test_module = "spamham{}".format(os.getpid()) |
| |
| def test_find_spec_missing(self): |
| spec = self.machinery.WindowsRegistryFinder.find_spec('spam') |
| self.assertIs(spec, None) |
| |
| def test_find_module_missing(self): |
| loader = self.machinery.WindowsRegistryFinder.find_module('spam') |
| self.assertIs(loader, None) |
| |
| def test_module_found(self): |
| with setup_module(self.machinery, self.test_module): |
| loader = self.machinery.WindowsRegistryFinder.find_module(self.test_module) |
| spec = self.machinery.WindowsRegistryFinder.find_spec(self.test_module) |
| self.assertIsNot(loader, None) |
| self.assertIsNot(spec, None) |
| |
| def test_module_not_found(self): |
| with setup_module(self.machinery, self.test_module, path="."): |
| loader = self.machinery.WindowsRegistryFinder.find_module(self.test_module) |
| spec = self.machinery.WindowsRegistryFinder.find_spec(self.test_module) |
| self.assertIsNone(loader) |
| self.assertIsNone(spec) |
| |
| (Frozen_WindowsRegistryFinderTests, |
| Source_WindowsRegistryFinderTests |
| ) = test_util.test_both(WindowsRegistryFinderTests, machinery=machinery) |
| |
| @unittest.skipUnless(sys.platform.startswith('win'), 'requires Windows') |
| class WindowsExtensionSuffixTests: |
| def test_tagged_suffix(self): |
| suffixes = self.machinery.EXTENSION_SUFFIXES |
| expected_tag = ".cp{0.major}{0.minor}-{1}.pyd".format(sys.version_info, |
| re.sub('[^a-zA-Z0-9]', '_', get_platform())) |
| try: |
| untagged_i = suffixes.index(".pyd") |
| except ValueError: |
| untagged_i = suffixes.index("_d.pyd") |
| expected_tag = "_d" + expected_tag |
| |
| self.assertIn(expected_tag, suffixes) |
| |
| # Ensure the tags are in the correct order |
| tagged_i = suffixes.index(expected_tag) |
| self.assertLess(tagged_i, untagged_i) |
| |
| (Frozen_WindowsExtensionSuffixTests, |
| Source_WindowsExtensionSuffixTests |
| ) = test_util.test_both(WindowsExtensionSuffixTests, machinery=machinery) |