1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
|
# frozen_string_literal: true
require 'test/unit'
require 'pstore'
require 'tmpdir'
class PStoreTest < Test::Unit::TestCase
def setup
@pstore_file = File.join(Dir.tmpdir, "pstore.tmp.#{Process.pid}")
@pstore = PStore.new(@pstore_file)
end
def teardown
File.unlink(@pstore_file) rescue nil
end
def test_opening_new_file_in_readonly_mode_should_result_in_empty_values
@pstore.transaction(true) do
assert_nil @pstore[:foo]
assert_nil @pstore[:bar]
end
end
def test_opening_new_file_in_readwrite_mode_should_result_in_empty_values
@pstore.transaction do
assert_nil @pstore[:foo]
assert_nil @pstore[:bar]
end
end
def test_data_should_be_loaded_correctly_when_in_readonly_mode
@pstore.transaction do
@pstore[:foo] = "bar"
end
@pstore.transaction(true) do
assert_equal "bar", @pstore[:foo]
end
end
def test_data_should_be_loaded_correctly_when_in_readwrite_mode
@pstore.transaction do
@pstore[:foo] = "bar"
end
@pstore.transaction do
assert_equal "bar", @pstore[:foo]
end
end
def test_changes_after_commit_are_discarded
@pstore.transaction do
@pstore[:foo] = "bar"
@pstore.commit
@pstore[:foo] = "baz"
end
@pstore.transaction(true) do
assert_equal "bar", @pstore[:foo]
end
end
def test_changes_are_not_written_on_abort
@pstore.transaction do
@pstore[:foo] = "bar"
@pstore.abort
end
@pstore.transaction(true) do
assert_nil @pstore[:foo]
end
end
def test_writing_inside_readonly_transaction_raises_error
assert_raise(PStore::Error) do
@pstore.transaction(true) do
@pstore[:foo] = "bar"
end
end
end
def test_thread_safe
q1 = Thread::Queue.new
assert_raise(PStore::Error) do
th = Thread.new do
@pstore.transaction do
@pstore[:foo] = "bar"
q1.push true
sleep
end
end
begin
q1.pop
@pstore.transaction {}
ensure
th.kill
th.join
end
end
q2 = Thread::Queue.new
begin
pstore = PStore.new(second_file, true)
cur = Thread.current
th = Thread.new do
pstore.transaction do
pstore[:foo] = "bar"
q1.push true
q2.pop
# wait for cur to enter a transaction
sleep 0.1 until cur.stop?
end
end
begin
q1.pop
q2.push true
assert_equal("bar", pstore.transaction { pstore[:foo] })
ensure
th.join
end
end
ensure
File.unlink(second_file) rescue nil
end
def test_nested_transaction_raises_error
assert_raise(PStore::Error) do
@pstore.transaction { @pstore.transaction { } }
end
pstore = PStore.new(second_file, true)
assert_raise(PStore::Error) do
pstore.transaction { pstore.transaction { } }
end
ensure
File.unlink(second_file) rescue nil
end
# Test that PStore's file operations do not blow up when default encodings are set
def test_pstore_files_are_accessed_as_binary_files
bug5311 = '[ruby-core:39503]'
n = 128
assert_in_out_err(["-Eutf-8:utf-8", "-rpstore", "-", @pstore_file], <<-SRC, [bug5311], [], bug5311, timeout: 30)
@pstore = PStore.new(ARGV[0])
(1..#{n}).each do |i|
@pstore.transaction {@pstore["Key\#{i}"] = "value \#{i}"}
end
@pstore.transaction {@pstore["Bug5311"] = '#{bug5311}'}
puts @pstore.transaction {@pstore["Bug5311"]}
SRC
assert_equal(bug5311, @pstore.transaction {@pstore["Bug5311"]}, bug5311)
end
def second_file
File.join(Dir.tmpdir, "pstore.tmp2.#{Process.pid}")
end
end
|