Index: Lib/test/test_winreg.py =================================================================== --- Lib/test/test_winreg.py (revision 79880) +++ Lib/test/test_winreg.py (working copy) @@ -2,7 +2,7 @@ # Only win32reg functions not hit here: FlushKey, LoadKey and SaveKey import os, sys -import unittest +import unittest, threading from test import test_support from platform import machine @@ -231,6 +231,60 @@ except WindowsError: self.assertEqual(h.handle, 0) + def test_changing_value(self): + root_key = HKEY_CURRENT_USER + done = [False] + + class VeryActiveThread(threading.Thread): + def run(self): + with CreateKey(root_key, test_key_name) as key: + short = True + while not done[0]: + if short: + s = 'x' + else: + s = 'x'*2000 + short = not short + SetValue(key, 'changing_value', REG_SZ, s) + + thread = VeryActiveThread() + thread.start() + try: + with CreateKey(root_key, test_key_name+'\\changing_value') as key: + for _ in range(100): + num_subkeys, num_values, t = QueryInfoKey(key) + for i in range(num_values): + # Issue2810: 2.6 and 3.1 throw + # "WindowsError: More data is available" + name = EnumValue(key, i) + QueryValue(key, name[0]) + finally: + done[0] = True + thread.join() + DeleteKey(root_key, test_key_name+'\\changing_value') + DeleteKey(root_key, test_key_name) + + def test_long_key(self): + root_key = HKEY_CURRENT_USER + name = 'x'*256 + try: + with CreateKey(root_key, test_key_name) as key: + SetValue(key, name, REG_SZ, 'x') + num_subkeys, num_values, t = QueryInfoKey(key) + for i in range(num_subkeys): + # Issue2810 + # EnumKey throws WindowsError: More data is available + EnumKey(key, i) + finally: + DeleteKey(root_key, '\\'.join((test_key_name, name))) + DeleteKey(root_key, test_key_name) + + def test_dynamic_key(self): + # Issue2810 + # 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")