Files
datapipeline/test/core/lock_test.rb
T

48 lines
1.5 KiB
Ruby

require_relative '../test_helper'
class LockTest < PipelineTest
def test_second_lock_on_the_same_file_fails
with_tmpdir do |dir|
first = DataPipeline::Lock.new("#{dir}/sub/.lock").acquire
assert first.locked?
error = assert_raises(DataPipeline::LockError) { DataPipeline::Lock.new("#{dir}/sub/.lock").acquire }
assert_includes error.message, "pid #{Process.pid}"
first.release
DataPipeline::Lock.new("#{dir}/sub/.lock").synchronize { assert true }
end
end
def test_pipeline_holds_the_lock_during_run_and_releases_it
with_tmpdir do |dir|
file = "#{dir}/.lock"
inside = nil
run_pipeline([{ 'a' => 1 }]) do
lock file
map { |row| inside = (DataPipeline::Lock.new(file).acquire rescue $!); row }
end
assert_kind_of DataPipeline::LockError, inside
DataPipeline::Lock.new(file).synchronize { assert true } # released after run
end
end
def test_locked_pipeline_aborts_with_lock_error_and_writes_nothing
with_tmpdir do |dir|
holder = DataPipeline::Lock.new("#{dir}/.lock").acquire
target = MemoryStorage.new
finished = nil
assert_raises(DataPipeline::LockError) do
DataPipeline.new do
logger PipelineHelper::QUIET
lock "#{dir}/.lock"
read MemoryStorage.new(rows: [{ 'a' => 1 }])
write target
on_finish { |stats| finished = stats }
end.run
end
assert_nil target.written
assert_kind_of DataPipeline::LockError, finished.error
holder.release
end
end
end