diff options
author | Brian Curtin <brian.curtin@gmail.com> | 2010-05-25 15:06:15 +0000 |
---|---|---|
committer | Brian Curtin <brian.curtin@gmail.com> | 2010-05-25 15:06:15 +0000 |
commit | b64c89bd7abf05baad517b50cef7bc7de7b4eb74 (patch) | |
tree | b6d6545bede935d810aa83e26f67845cfba48f15 /Lib/test | |
parent | 264acad721612174c3424946786ac32ca9b9318d (diff) | |
download | cpython-git-b64c89bd7abf05baad517b50cef7bc7de7b4eb74.tar.gz |
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
Diffstat (limited to 'Lib/test')
-rw-r--r-- | Lib/test/test_winreg.py | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/Lib/test/test_winreg.py b/Lib/test/test_winreg.py index 753be74604..da3a9187fd 100644 --- a/Lib/test/test_winreg.py +++ b/Lib/test/test_winreg.py @@ -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") |