Skip to content

Commit 3c186ae

Browse files
committed
Move all tests to volatile environment and use per-test individual registry key
This allows to run all tests in parallel. Usage of `File` methods is avoided. Since all tests are executed in the volatile environment of the registry, the dedicated 'create_volatile' test is removed now. Also add some documentation to the test setup. Downside of this use of the "Volatile Environment" is that we can not use or test the `create` method with default options. This is because within this path only keys with option `REG_OPTION_VOLATILE` are allowed.
1 parent b80ba00 commit 3c186ae

File tree

1 file changed

+57
-47
lines changed

1 file changed

+57
-47
lines changed

test/win32/test_registry.rb

Lines changed: 57 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,38 @@
1212
if defined?(Win32::Registry)
1313
class TestWin32Registry < Test::Unit::TestCase
1414
COMPUTERNAME = 'SYSTEM\\CurrentControlSet\\Control\\ComputerName\\ComputerName'
15-
16-
private def backslachs(path)
17-
path.gsub("/", "\\")
15+
TEST_REGISTRY_PATH = 'Volatile Environment'
16+
TEST_REGISTRY_KEY = 'ruby-win32-registry-test-<RND>'
17+
18+
# Create a new registry key per test in an atomic way, which is deleted on teardown.
19+
#
20+
# Fills the following instance variables:
21+
#
22+
# @test_registry_key - A registry path which is not yet created,
23+
# but can be created without collisions even when running
24+
# multiple test processes.
25+
# @test_registry_rnd - The part of the registry path with a random number.
26+
# @createopts - Required parameters (desired, opt) for create method in
27+
# the volatile environment of the registry.
28+
def setup
29+
@createopts = [Win32::Registry::KEY_ALL_ACCESS, Win32::Registry::REG_OPTION_VOLATILE]
30+
100.times do |i|
31+
k = TEST_REGISTRY_KEY.gsub("<RND>", i.to_s)
32+
next unless Win32::Registry::HKEY_CURRENT_USER.create(
33+
TEST_REGISTRY_PATH + "\\" + k,
34+
*@createopts
35+
).created?
36+
@test_registry_key = TEST_REGISTRY_PATH + "\\" + k + "\\" + "test\\"
37+
@test_registry_rnd = k
38+
break
39+
end
40+
omit "Unused registry subkey not found in #{TEST_REGISTRY_KEY}" unless @test_registry_key
1841
end
1942

20-
TEST_REGISTRY_KEY = "SOFTWARE/ruby-win32-registry-test/"
21-
22-
def setup
23-
Win32::Registry::HKEY_CURRENT_USER.open(backslachs(File.dirname(TEST_REGISTRY_KEY))) do |reg|
24-
reg.delete_key File.basename(TEST_REGISTRY_KEY), true
43+
def teardown
44+
Win32::Registry::HKEY_CURRENT_USER.open(TEST_REGISTRY_PATH) do |reg|
45+
reg.delete_key @test_registry_rnd, true
2546
end
26-
rescue Win32::Registry::Error
2747
end
2848

2949
def test_predefined
@@ -39,9 +59,9 @@ def test_predefined
3959
end
4060

4161
def test_open_no_block
42-
Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)).close
62+
Win32::Registry::HKEY_CURRENT_USER.create(@test_registry_key, *@createopts).close
4363

44-
reg = Win32::Registry::HKEY_CURRENT_USER.open(backslachs(TEST_REGISTRY_KEY), Win32::Registry::KEY_ALL_ACCESS)
64+
reg = Win32::Registry::HKEY_CURRENT_USER.open(@test_registry_key, Win32::Registry::KEY_ALL_ACCESS)
4565
assert_kind_of Win32::Registry, reg
4666
assert_equal true, reg.open?
4767
assert_equal false, reg.created?
@@ -53,10 +73,10 @@ def test_open_no_block
5373
end
5474

5575
def test_open_with_block
56-
Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)).close
76+
Win32::Registry::HKEY_CURRENT_USER.create(@test_registry_key, *@createopts).close
5777

5878
regs = []
59-
Win32::Registry::HKEY_CURRENT_USER.open(backslachs(TEST_REGISTRY_KEY), Win32::Registry::KEY_ALL_ACCESS) do |reg|
79+
Win32::Registry::HKEY_CURRENT_USER.open(@test_registry_key, Win32::Registry::KEY_ALL_ACCESS) do |reg|
6080
regs << reg
6181
assert_equal true, reg.open?
6282
assert_equal false, reg.created?
@@ -92,17 +112,8 @@ def test_read
92112
end
93113
end
94114

95-
def test_create_volatile
96-
desired = Win32::Registry::KEY_ALL_ACCESS
97-
option = Win32::Registry::REG_OPTION_VOLATILE
98-
Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY), desired) do |reg|
99-
reg.create("volkey", desired, option) {}
100-
reg.delete_key("volkey", true)
101-
end
102-
end
103-
104115
def test_create_no_block
105-
reg = Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY))
116+
reg = Win32::Registry::HKEY_CURRENT_USER.create(@test_registry_key, *@createopts)
106117
assert_kind_of Win32::Registry, reg
107118
assert_equal true, reg.open?
108119
assert_equal true, reg.created?
@@ -116,7 +127,7 @@ def test_create_no_block
116127

117128
def test_create_with_block
118129
regs = []
119-
Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)) do |reg|
130+
Win32::Registry::HKEY_CURRENT_USER.create(@test_registry_key, *@createopts) do |reg|
120131
regs << reg
121132
reg["test"] = "abc"
122133
assert_equal true, reg.open?
@@ -132,8 +143,7 @@ def test_create_with_block
132143
end
133144

134145
def test_write
135-
desired = Win32::Registry::KEY_ALL_ACCESS
136-
Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY), desired) do |reg|
146+
Win32::Registry::HKEY_CURRENT_USER.create(@test_registry_key, *@createopts) do |reg|
137147
reg.write_s("key1", "data")
138148
assert_equal [Win32::Registry::REG_SZ, "data"], reg.read("key1")
139149
reg.write_i("key2", 0x5fe79027)
@@ -142,32 +152,32 @@ def test_write
142152
end
143153

144154
def test_accessors
145-
Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)) do |reg|
155+
Win32::Registry::HKEY_CURRENT_USER.create(@test_registry_key, *@createopts) do |reg|
146156
assert_kind_of Integer, reg.hkey
147157
assert_kind_of Win32::Registry, reg.parent
148158
assert_equal "HKEY_CURRENT_USER", reg.parent.name
149-
assert_equal "SOFTWARE\\ruby-win32-registry-test\\", reg.keyname
159+
assert_equal "Volatile Environment\\#{@test_registry_rnd}\\test\\", reg.keyname
150160
assert_equal Win32::Registry::REG_CREATED_NEW_KEY, reg.disposition
151161
end
152162
end
153163

154164
def test_name
155-
Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)) do |reg|
156-
assert_equal "HKEY_CURRENT_USER\\SOFTWARE\\ruby-win32-registry-test\\", reg.name
165+
Win32::Registry::HKEY_CURRENT_USER.create(@test_registry_key, *@createopts) do |reg|
166+
assert_equal "HKEY_CURRENT_USER\\Volatile Environment\\#{@test_registry_rnd}\\test\\", reg.name
157167
end
158168
end
159169

160170
def test_keys
161-
Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)) do |reg|
162-
reg.create("key1")
171+
Win32::Registry::HKEY_CURRENT_USER.create(@test_registry_key, *@createopts) do |reg|
172+
reg.create("key1", *@createopts)
163173
assert_equal ["key1"], reg.keys
164174
end
165175
end
166176

167177
def test_each_key
168178
keys = []
169-
Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)) do |reg|
170-
reg.create("key1")
179+
Win32::Registry::HKEY_CURRENT_USER.create(@test_registry_key, *@createopts) do |reg|
180+
reg.create("key1", *@createopts)
171181
reg.each_key { |*a| keys << a }
172182
end
173183
assert_equal [2], keys.map(&:size)
@@ -177,10 +187,10 @@ def test_each_key
177187

178188
def test_each_key_enum
179189
keys = nil
180-
Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)) do |reg|
181-
reg.create("key1")
182-
reg.create("key2")
183-
reg.create("key3")
190+
Win32::Registry::HKEY_CURRENT_USER.create(@test_registry_key, *@createopts) do |reg|
191+
reg.create("key1", *@createopts)
192+
reg.create("key2", *@createopts)
193+
reg.create("key3", *@createopts)
184194
reg["value1"] = "abcd"
185195
keys = reg.each_key.to_a
186196
end
@@ -190,17 +200,17 @@ def test_each_key_enum
190200
end
191201

192202
def test_values
193-
Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)) do |reg|
194-
reg.create("key1")
203+
Win32::Registry::HKEY_CURRENT_USER.create(@test_registry_key, *@createopts) do |reg|
204+
reg.create("key1", *@createopts)
195205
reg["value1"] = "abcd"
196206
assert_equal ["abcd"], reg.values
197207
end
198208
end
199209

200210
def test_each_value
201211
vals = []
202-
Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)) do |reg|
203-
reg.create("key1")
212+
Win32::Registry::HKEY_CURRENT_USER.create(@test_registry_key, *@createopts) do |reg|
213+
reg.create("key1", *@createopts)
204214
reg["value1"] = "abcd"
205215
reg.each_value { |*a| vals << a }
206216
end
@@ -209,8 +219,8 @@ def test_each_value
209219

210220
def test_each_value_enum
211221
vals = nil
212-
Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)) do |reg|
213-
reg.create("key1")
222+
Win32::Registry::HKEY_CURRENT_USER.create(@test_registry_key, *@createopts) do |reg|
223+
reg.create("key1", *@createopts)
214224
reg["value1"] = "abcd"
215225
reg["value2"] = 42
216226
vals = reg.each_value.to_a
@@ -221,9 +231,9 @@ def test_each_value_enum
221231

222232
def test_utf8_encoding
223233
keys = []
224-
Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)) do |reg|
225-
reg.create("abc EUR")
226-
reg.create("abc €")
234+
Win32::Registry::HKEY_CURRENT_USER.create(@test_registry_key, *@createopts) do |reg|
235+
reg.create("abc EUR", *@createopts)
236+
reg.create("abc €", *@createopts)
227237
reg.each_key do |subkey|
228238
keys << subkey
229239
end

0 commit comments

Comments
 (0)