[ruby/win32-registry] 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.

https://github.com/ruby/win32-registry/commit/3c186ae7dd
This commit is contained in:
Lars Kanis 2024-10-04 22:30:02 +02:00 committed by git
parent 36b7ad3caa
commit 6a49bbd734

View File

@ -12,18 +12,38 @@ end
if defined?(Win32::Registry)
class TestWin32Registry < Test::Unit::TestCase
COMPUTERNAME = 'SYSTEM\\CurrentControlSet\\Control\\ComputerName\\ComputerName'
TEST_REGISTRY_PATH = 'Volatile Environment'
TEST_REGISTRY_KEY = 'ruby-win32-registry-test-<RND>'
private def backslachs(path)
path.gsub("/", "\\")
# Create a new registry key per test in an atomic way, which is deleted on teardown.
#
# Fills the following instance variables:
#
# @test_registry_key - A registry path which is not yet created,
# but can be created without collisions even when running
# multiple test processes.
# @test_registry_rnd - The part of the registry path with a random number.
# @createopts - Required parameters (desired, opt) for create method in
# the volatile environment of the registry.
def setup
@createopts = [Win32::Registry::KEY_ALL_ACCESS, Win32::Registry::REG_OPTION_VOLATILE]
100.times do |i|
k = TEST_REGISTRY_KEY.gsub("<RND>", i.to_s)
next unless Win32::Registry::HKEY_CURRENT_USER.create(
TEST_REGISTRY_PATH + "\\" + k,
*@createopts
).created?
@test_registry_key = TEST_REGISTRY_PATH + "\\" + k + "\\" + "test\\"
@test_registry_rnd = k
break
end
omit "Unused registry subkey not found in #{TEST_REGISTRY_KEY}" unless @test_registry_key
end
TEST_REGISTRY_KEY = "SOFTWARE/ruby-win32-registry-test/"
def setup
Win32::Registry::HKEY_CURRENT_USER.open(backslachs(File.dirname(TEST_REGISTRY_KEY))) do |reg|
reg.delete_key File.basename(TEST_REGISTRY_KEY), true
def teardown
Win32::Registry::HKEY_CURRENT_USER.open(TEST_REGISTRY_PATH) do |reg|
reg.delete_key @test_registry_rnd, true
end
rescue Win32::Registry::Error
end
def test_predefined
@ -39,9 +59,9 @@ if defined?(Win32::Registry)
end
def test_open_no_block
Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)).close
Win32::Registry::HKEY_CURRENT_USER.create(@test_registry_key, *@createopts).close
reg = Win32::Registry::HKEY_CURRENT_USER.open(backslachs(TEST_REGISTRY_KEY), Win32::Registry::KEY_ALL_ACCESS)
reg = Win32::Registry::HKEY_CURRENT_USER.open(@test_registry_key, Win32::Registry::KEY_ALL_ACCESS)
assert_kind_of Win32::Registry, reg
assert_equal true, reg.open?
assert_equal false, reg.created?
@ -53,10 +73,10 @@ if defined?(Win32::Registry)
end
def test_open_with_block
Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)).close
Win32::Registry::HKEY_CURRENT_USER.create(@test_registry_key, *@createopts).close
regs = []
Win32::Registry::HKEY_CURRENT_USER.open(backslachs(TEST_REGISTRY_KEY), Win32::Registry::KEY_ALL_ACCESS) do |reg|
Win32::Registry::HKEY_CURRENT_USER.open(@test_registry_key, Win32::Registry::KEY_ALL_ACCESS) do |reg|
regs << reg
assert_equal true, reg.open?
assert_equal false, reg.created?
@ -92,17 +112,8 @@ if defined?(Win32::Registry)
end
end
def test_create_volatile
desired = Win32::Registry::KEY_ALL_ACCESS
option = Win32::Registry::REG_OPTION_VOLATILE
Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY), desired) do |reg|
reg.create("volkey", desired, option) {}
reg.delete_key("volkey", true)
end
end
def test_create_no_block
reg = Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY))
reg = Win32::Registry::HKEY_CURRENT_USER.create(@test_registry_key, *@createopts)
assert_kind_of Win32::Registry, reg
assert_equal true, reg.open?
assert_equal true, reg.created?
@ -116,7 +127,7 @@ if defined?(Win32::Registry)
def test_create_with_block
regs = []
Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)) do |reg|
Win32::Registry::HKEY_CURRENT_USER.create(@test_registry_key, *@createopts) do |reg|
regs << reg
reg["test"] = "abc"
assert_equal true, reg.open?
@ -132,8 +143,7 @@ if defined?(Win32::Registry)
end
def test_write
desired = Win32::Registry::KEY_ALL_ACCESS
Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY), desired) do |reg|
Win32::Registry::HKEY_CURRENT_USER.create(@test_registry_key, *@createopts) do |reg|
reg.write_s("key1", "data")
assert_equal [Win32::Registry::REG_SZ, "data"], reg.read("key1")
reg.write_i("key2", 0x5fe79027)
@ -142,32 +152,32 @@ if defined?(Win32::Registry)
end
def test_accessors
Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)) do |reg|
Win32::Registry::HKEY_CURRENT_USER.create(@test_registry_key, *@createopts) do |reg|
assert_kind_of Integer, reg.hkey
assert_kind_of Win32::Registry, reg.parent
assert_equal "HKEY_CURRENT_USER", reg.parent.name
assert_equal "SOFTWARE\\ruby-win32-registry-test\\", reg.keyname
assert_equal "Volatile Environment\\#{@test_registry_rnd}\\test\\", reg.keyname
assert_equal Win32::Registry::REG_CREATED_NEW_KEY, reg.disposition
end
end
def test_name
Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)) do |reg|
assert_equal "HKEY_CURRENT_USER\\SOFTWARE\\ruby-win32-registry-test\\", reg.name
Win32::Registry::HKEY_CURRENT_USER.create(@test_registry_key, *@createopts) do |reg|
assert_equal "HKEY_CURRENT_USER\\Volatile Environment\\#{@test_registry_rnd}\\test\\", reg.name
end
end
def test_keys
Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)) do |reg|
reg.create("key1")
Win32::Registry::HKEY_CURRENT_USER.create(@test_registry_key, *@createopts) do |reg|
reg.create("key1", *@createopts)
assert_equal ["key1"], reg.keys
end
end
def test_each_key
keys = []
Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)) do |reg|
reg.create("key1")
Win32::Registry::HKEY_CURRENT_USER.create(@test_registry_key, *@createopts) do |reg|
reg.create("key1", *@createopts)
reg.each_key { |*a| keys << a }
end
assert_equal [2], keys.map(&:size)
@ -177,10 +187,10 @@ if defined?(Win32::Registry)
def test_each_key_enum
keys = nil
Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)) do |reg|
reg.create("key1")
reg.create("key2")
reg.create("key3")
Win32::Registry::HKEY_CURRENT_USER.create(@test_registry_key, *@createopts) do |reg|
reg.create("key1", *@createopts)
reg.create("key2", *@createopts)
reg.create("key3", *@createopts)
reg["value1"] = "abcd"
keys = reg.each_key.to_a
end
@ -190,8 +200,8 @@ if defined?(Win32::Registry)
end
def test_values
Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)) do |reg|
reg.create("key1")
Win32::Registry::HKEY_CURRENT_USER.create(@test_registry_key, *@createopts) do |reg|
reg.create("key1", *@createopts)
reg["value1"] = "abcd"
assert_equal ["abcd"], reg.values
end
@ -199,8 +209,8 @@ if defined?(Win32::Registry)
def test_each_value
vals = []
Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)) do |reg|
reg.create("key1")
Win32::Registry::HKEY_CURRENT_USER.create(@test_registry_key, *@createopts) do |reg|
reg.create("key1", *@createopts)
reg["value1"] = "abcd"
reg.each_value { |*a| vals << a }
end
@ -209,8 +219,8 @@ if defined?(Win32::Registry)
def test_each_value_enum
vals = nil
Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)) do |reg|
reg.create("key1")
Win32::Registry::HKEY_CURRENT_USER.create(@test_registry_key, *@createopts) do |reg|
reg.create("key1", *@createopts)
reg["value1"] = "abcd"
reg["value2"] = 42
vals = reg.each_value.to_a
@ -221,9 +231,9 @@ if defined?(Win32::Registry)
def test_utf8_encoding
keys = []
Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)) do |reg|
reg.create("abc EUR")
reg.create("abc €")
Win32::Registry::HKEY_CURRENT_USER.create(@test_registry_key, *@createopts) do |reg|
reg.create("abc EUR", *@createopts)
reg.create("abc €", *@createopts)
reg.each_key do |subkey|
keys << subkey
end