48 lines
1.5 KiB
Ruby
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
|