mirror of
https://github.com/python/cpython.git
synced 2025-09-26 10:19:53 +00:00
Fix #2810 - handle the case where some registry calls return
ERROR_MORE_DATA, requiring another call to get the remaining data. Patch by Daniel Stutzbach
This commit is contained in:
parent
264acad721
commit
b64c89bd7a
3 changed files with 159 additions and 33 deletions
|
@ -4,6 +4,7 @@
|
|||
import os, sys
|
||||
import unittest
|
||||
from test import test_support
|
||||
threading = test_support.import_module("threading")
|
||||
from platform import machine
|
||||
|
||||
# Do this first so test will be skipped if module doesn't exist
|
||||
|
@ -231,6 +232,58 @@ class LocalWinregTests(BaseWinregTests):
|
|||
except WindowsError:
|
||||
self.assertEqual(h.handle, 0)
|
||||
|
||||
def test_changing_value(self):
|
||||
# Issue2810: A race condition in 2.6 and 3.1 may cause
|
||||
# EnumValue or QueryValue to throw "WindowsError: More data is
|
||||
# available"
|
||||
done = False
|
||||
|
||||
class VeryActiveThread(threading.Thread):
|
||||
def run(self):
|
||||
with CreateKey(HKEY_CURRENT_USER, test_key_name) as key:
|
||||
use_short = True
|
||||
long_string = 'x'*2000
|
||||
while not done:
|
||||
s = 'x' if use_short else long_string
|
||||
use_short = not use_short
|
||||
SetValue(key, 'changing_value', REG_SZ, s)
|
||||
|
||||
thread = VeryActiveThread()
|
||||
thread.start()
|
||||
try:
|
||||
with CreateKey(HKEY_CURRENT_USER,
|
||||
test_key_name+'\\changing_value') as key:
|
||||
for _ in range(1000):
|
||||
num_subkeys, num_values, t = QueryInfoKey(key)
|
||||
for i in range(num_values):
|
||||
name = EnumValue(key, i)
|
||||
QueryValue(key, name[0])
|
||||
finally:
|
||||
done = True
|
||||
thread.join()
|
||||
DeleteKey(HKEY_CURRENT_USER, test_key_name+'\\changing_value')
|
||||
DeleteKey(HKEY_CURRENT_USER, test_key_name)
|
||||
|
||||
def test_long_key(self):
|
||||
# Issue2810, in 2.6 and 3.1 when the key name was exactly 256
|
||||
# characters, EnumKey threw "WindowsError: More data is
|
||||
# available"
|
||||
name = 'x'*256
|
||||
try:
|
||||
with CreateKey(HKEY_CURRENT_USER, test_key_name) as key:
|
||||
SetValue(key, name, REG_SZ, 'x')
|
||||
num_subkeys, num_values, t = QueryInfoKey(key)
|
||||
EnumKey(key, 0)
|
||||
finally:
|
||||
DeleteKey(HKEY_CURRENT_USER, '\\'.join((test_key_name, name)))
|
||||
DeleteKey(HKEY_CURRENT_USER, test_key_name)
|
||||
|
||||
def test_dynamic_key(self):
|
||||
# Issue2810, when the value is dynamically generated, these
|
||||
# throw "WindowsError: More data is available" in 2.6 and 3.1
|
||||
EnumValue(HKEY_PERFORMANCE_DATA, 0)
|
||||
QueryValueEx(HKEY_PERFORMANCE_DATA, None)
|
||||
|
||||
# Reflection requires XP x64/Vista at a minimum. XP doesn't have this stuff
|
||||
# or DeleteKeyEx so make sure their use raises NotImplementedError
|
||||
@unittest.skipUnless(WIN_VER < (5, 2), "Requires Windows XP")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue