mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			109 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
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)
 |