blob: 0b778b2056e5bf6db1acbbf19980254e46869cfd [file] [log] [blame]
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001# -*- coding: utf-8 -*-
Guido van Rossumde598552000-03-28 20:36:51 +00002# Test the windows specific win32reg module.
3# Only win32reg functions not hit here: FlushKey, LoadKey and SaveKey
4
Guido van Rossumde598552000-03-28 20:36:51 +00005import os, sys
Thomas Woutersed03b412007-08-28 21:37:11 +00006import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00007from test import support
Fredrik Lundhf7850422001-01-17 21:51:36 +00008
R. David Murraya21e4ca2009-03-31 23:16:50 +00009# Do this first so test will be skipped if module doesn't exist
10support.import_module('winreg')
11# Now import everything
12from winreg import *
13
Guido van Rossumde598552000-03-28 20:36:51 +000014test_key_name = "SOFTWARE\\Python Registry Test Key - Delete Me"
15
16test_data = [
17 ("Int Value", 45, REG_DWORD),
Guido van Rossum0a185522003-11-30 22:46:18 +000018 ("String Val", "A string value", REG_SZ),
Guido van Rossumde598552000-03-28 20:36:51 +000019 ("StringExpand", "The path is %path%", REG_EXPAND_SZ),
Guido van Rossumde598552000-03-28 20:36:51 +000020 ("Multi-string", ["Lots", "of", "string", "values"], REG_MULTI_SZ),
Thomas Woutersed03b412007-08-28 21:37:11 +000021 ("Raw Data", b"binary\x00data", REG_BINARY),
Guido van Rossum291481b2003-12-03 15:24:02 +000022 ("Big String", "x"*(2**14-1), REG_SZ),
Guido van Rossuma8c360e2007-07-17 20:50:43 +000023 ("Big Binary", b"x"*(2**14), REG_BINARY),
Martin v. Löwisf82d9b52007-09-03 07:43:05 +000024 # Two and three kanjis, meaning: "Japan" and "Japanese")
25 ("Japanese 日本", "日本語", REG_SZ),
Guido van Rossumde598552000-03-28 20:36:51 +000026]
27
Thomas Woutersed03b412007-08-28 21:37:11 +000028class WinregTests(unittest.TestCase):
Guido van Rossumde598552000-03-28 20:36:51 +000029 remote_name = None
30
Martin v. Löwisf82d9b52007-09-03 07:43:05 +000031 def WriteTestData(self, root_key, subkeystr="sub_key"):
Thomas Woutersed03b412007-08-28 21:37:11 +000032 # Set the default value for this key.
33 SetValue(root_key, test_key_name, REG_SZ, "Default value")
34 key = CreateKey(root_key, test_key_name)
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +000035 self.assert_(key.handle != 0)
Thomas Woutersed03b412007-08-28 21:37:11 +000036 # Create a sub-key
Martin v. Löwisf82d9b52007-09-03 07:43:05 +000037 sub_key = CreateKey(key, subkeystr)
Thomas Woutersed03b412007-08-28 21:37:11 +000038 # Give the sub-key some named values
39
40 for value_name, value_data, value_type in test_data:
41 SetValueEx(sub_key, value_name, 0, value_type, value_data)
42
43 # Check we wrote as many items as we thought.
44 nkeys, nvalues, since_mod = QueryInfoKey(key)
45 self.assertEquals(nkeys, 1, "Not the correct number of sub keys")
46 self.assertEquals(nvalues, 1, "Not the correct number of values")
47 nkeys, nvalues, since_mod = QueryInfoKey(sub_key)
48 self.assertEquals(nkeys, 0, "Not the correct number of sub keys")
49 self.assertEquals(nvalues, len(test_data),
50 "Not the correct number of values")
51 # Close this key this way...
52 # (but before we do, copy the key as an integer - this allows
53 # us to test that the key really gets closed).
54 int_sub_key = int(sub_key)
55 CloseKey(sub_key)
56 try:
57 QueryInfoKey(int_sub_key)
58 self.fail("It appears the CloseKey() function does "
59 "not close the actual key!")
60 except EnvironmentError:
61 pass
62 # ... and close that key that way :-)
63 int_key = int(key)
64 key.Close()
65 try:
66 QueryInfoKey(int_key)
67 self.fail("It appears the key.Close() function "
68 "does not close the actual key!")
69 except EnvironmentError:
70 pass
71
Martin v. Löwisf82d9b52007-09-03 07:43:05 +000072 def ReadTestData(self, root_key, subkeystr="sub_key"):
Thomas Woutersed03b412007-08-28 21:37:11 +000073 # Check we can get default value for this key.
74 val = QueryValue(root_key, test_key_name)
75 self.assertEquals(val, "Default value",
76 "Registry didn't give back the correct value")
77
78 key = OpenKey(root_key, test_key_name)
79 # Read the sub-keys
Thomas Hellere83ebd92008-01-24 10:31:31 +000080 with OpenKey(key, subkeystr) as sub_key:
Christian Heimes2380ac72008-01-09 00:17:24 +000081 # Check I can enumerate over the values.
82 index = 0
83 while 1:
84 try:
85 data = EnumValue(sub_key, index)
86 except EnvironmentError:
87 break
88 self.assertEquals(data in test_data, True,
89 "Didn't read back the correct test data")
90 index = index + 1
91 self.assertEquals(index, len(test_data),
92 "Didn't read the correct number of items")
93 # Check I can directly access each item
94 for value_name, value_data, value_type in test_data:
95 read_val, read_typ = QueryValueEx(sub_key, value_name)
96 self.assertEquals(read_val, value_data,
97 "Could not directly read the value")
98 self.assertEquals(read_typ, value_type,
99 "Could not directly read the value")
Thomas Woutersed03b412007-08-28 21:37:11 +0000100 sub_key.Close()
101 # Enumerate our main key.
102 read_val = EnumKey(key, 0)
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000103 self.assertEquals(read_val, subkeystr, "Read subkey value wrong")
Thomas Woutersed03b412007-08-28 21:37:11 +0000104 try:
105 EnumKey(key, 1)
106 self.fail("Was able to get a second key when I only have one!")
107 except EnvironmentError:
108 pass
109
110 key.Close()
111
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000112 def DeleteTestData(self, root_key, subkeystr="sub_key"):
Thomas Woutersed03b412007-08-28 21:37:11 +0000113 key = OpenKey(root_key, test_key_name, 0, KEY_ALL_ACCESS)
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000114 sub_key = OpenKey(key, subkeystr, 0, KEY_ALL_ACCESS)
Thomas Woutersed03b412007-08-28 21:37:11 +0000115 # It is not necessary to delete the values before deleting
116 # the key (although subkeys must not exist). We delete them
117 # manually just to prove we can :-)
118 for value_name, value_data, value_type in test_data:
119 DeleteValue(sub_key, value_name)
120
121 nkeys, nvalues, since_mod = QueryInfoKey(sub_key)
122 self.assertEquals(nkeys, 0, "subkey not empty before delete")
123 self.assertEquals(nvalues, 0, "subkey not empty before delete")
124 sub_key.Close()
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000125 DeleteKey(key, subkeystr)
Thomas Woutersed03b412007-08-28 21:37:11 +0000126
127 try:
128 # Shouldnt be able to delete it twice!
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000129 DeleteKey(key, subkeystr)
Thomas Woutersed03b412007-08-28 21:37:11 +0000130 self.fail("Deleting the key twice succeeded")
131 except EnvironmentError:
132 pass
133 key.Close()
134 DeleteKey(root_key, test_key_name)
135 # Opening should now fail!
136 try:
137 key = OpenKey(root_key, test_key_name)
138 self.fail("Could open the non-existent key")
139 except WindowsError: # Use this error name this time
140 pass
141
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000142 def TestAll(self, root_key, subkeystr="sub_key"):
143 self.WriteTestData(root_key, subkeystr)
144 self.ReadTestData(root_key, subkeystr)
145 self.DeleteTestData(root_key, subkeystr)
Thomas Woutersed03b412007-08-28 21:37:11 +0000146
147 def testLocalMachineRegistryWorks(self):
148 self.TestAll(HKEY_CURRENT_USER)
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000149 self.TestAll(HKEY_CURRENT_USER, "日本-subkey")
Thomas Woutersed03b412007-08-28 21:37:11 +0000150
151 def testConnectRegistryToLocalMachineWorks(self):
152 # perform minimal ConnectRegistry test which just invokes it
153 h = ConnectRegistry(None, HKEY_LOCAL_MACHINE)
154 h.Close()
155
156 def testRemoteMachineRegistryWorks(self):
157 if not self.remote_name:
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000158 return # remote machine name not specified
Thomas Woutersed03b412007-08-28 21:37:11 +0000159 remote_key = ConnectRegistry(self.remote_name, HKEY_CURRENT_USER)
160 self.TestAll(remote_key)
161
Christian Heimes2380ac72008-01-09 00:17:24 +0000162 def testExpandEnvironmentStrings(self):
163 r = ExpandEnvironmentStrings("%windir%\\test")
164 self.assertEqual(type(r), str)
165 self.assertEqual(r, os.environ["windir"] + "\\test")
166
Thomas Woutersed03b412007-08-28 21:37:11 +0000167def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000168 support.run_unittest(WinregTests)
Thomas Woutersed03b412007-08-28 21:37:11 +0000169
170if __name__ == "__main__":
Guido van Rossumde598552000-03-28 20:36:51 +0000171 try:
Thomas Woutersed03b412007-08-28 21:37:11 +0000172 WinregTests.remote_name = sys.argv[sys.argv.index("--remote")+1]
173 except (IndexError, ValueError):
174 print("Remote registry calls can be tested using",
175 "'test_winreg.py --remote \\\\machine_name'")
176 WinregTests.remote_name = None
177 test_main()