spec/zk/client_spec.rb in zk-1.4.0 vs spec/zk/client_spec.rb in zk-1.4.1
- old
+ new
@@ -30,160 +30,155 @@
wait_until(5) { @zk.closed? }.should be_true
end
end
end
- unless defined?(::JRUBY_VERSION)
- describe :forked do
- include_context 'connection opts'
+ describe :forked, :fork_required => true, :rbx => :broken do
+ include_context 'connection opts'
- before do
- @base_path = '/zktests'
- @pids_root = "#{@base_path}/pid"
+ before do
+ @base_path = '/zktests'
+ @pids_root = "#{@base_path}/pid"
- ZK.open(*connection_args) do |z|
- z.rm_rf(@base_path)
- z.mkdir_p(@pids_root)
- end
+ ZK.open(*connection_args) do |z|
+ z.rm_rf(@base_path)
+ z.mkdir_p(@pids_root)
end
+ end
- after do
- if @pid
- begin
- Process.kill('TERM', @pid)
- pid, st = Process.wait2(@pid)
- logger.debug { "child #{@pid} exited with status: #{st.inspect}" }
- rescue Errno::ESRCH
- end
+ after do
+ if @pid
+ begin
+ Process.kill('TERM', @pid)
+ pid, st = Process.wait2(@pid)
+ logger.debug { "child #{@pid} exited with status: #{st.inspect}" }
+ rescue Errno::ESRCH
end
-
- @zk.close! if @zk
- ZK.open(*connection_args) { |z| z.rm_rf(@base_path) }
end
- it %[should deliver callbacks in the child], :fork => true do
-# pending_in_travis "skip this test, flaky in travis"
- pending_rbx('fails in rubinius')
-
- logger.debug { "Process.pid of parent: #{Process.pid}" }
+ @zk.close! if @zk
+ ZK.open(*connection_args) { |z| z.rm_rf(@base_path) }
+ end
- @zk = ZK.new do |z|
- z.on_connected do
- logger.debug { "on_connected fired, writing pid to path #{@pids_root}/#{$$}" }
- begin
- z.create("#{@pids_root}/#{Process.pid}", Process.pid.to_s)
- rescue ZK::Exceptions::NodeExists
- end
+ it %[should deliver callbacks in the child], :fork => true do
+ logger.debug { "Process.pid of parent: #{Process.pid}" }
+
+ @zk = ZK.new do |z|
+ z.on_connected do
+ logger.debug { "on_connected fired, writing pid to path #{@pids_root}/#{$$}" }
+ begin
+ z.create("#{@pids_root}/#{Process.pid}", Process.pid.to_s)
+ rescue ZK::Exceptions::NodeExists
end
end
+ end
- @parent_pid = $$
-
- @zk.create("#{@pids_root}/#{$$}", $$.to_s)
+ @parent_pid = $$
+
+ @zk.create("#{@pids_root}/#{$$}", $$.to_s)
- event_catcher = EventCatcher.new
+ event_catcher = EventCatcher.new
- @zk.register(@pids_root) do |event|
- if event.node_child?
- event_catcher << event
- else
- @zk.children(@pids_root, :watch => true)
- end
+ @zk.register(@pids_root) do |event|
+ if event.node_child?
+ event_catcher << event
+ else
+ @zk.children(@pids_root, :watch => true)
end
+ end
- logger.debug { "parent watching for children on #{@pids_root}" }
- @zk.children(@pids_root, :watch => true) # side-effect, register watch
+ logger.debug { "parent watching for children on #{@pids_root}" }
+ @zk.children(@pids_root, :watch => true) # side-effect, register watch
- @pid = fork do
- @zk.reopen
- @zk.wait_until_connected
+ @pid = fork do
+ @zk.reopen
+ @zk.wait_until_connected
- child_pid_path = "#{@pids_root}/#{$$}"
+ child_pid_path = "#{@pids_root}/#{$$}"
- create_latch = Zookeeper::Latch.new
+ create_latch = Zookeeper::Latch.new
- create_sub = @zk.register(child_pid_path) do |event|
- if event.node_created?
- logger.debug { "got created event, releasing create_latch" }
- create_latch.release
- else
- if @zk.exists?(child_pid_path, :watch => true)
- logger.debug { "created behind our backs, releasing create_latch" }
- create_latch.release
- end
+ create_sub = @zk.register(child_pid_path) do |event|
+ if event.node_created?
+ logger.debug { "got created event, releasing create_latch" }
+ create_latch.release
+ else
+ if @zk.exists?(child_pid_path, :watch => true)
+ logger.debug { "created behind our backs, releasing create_latch" }
+ create_latch.release
end
end
+ end
- if @zk.exists?(child_pid_path, :watch => true)
- logger.debug { "woot! #{child_pid_path} exists!" }
- create_sub.unregister
- else
- logger.debug { "awaiting the create_latch to release" }
- create_latch.await
- end
+ if @zk.exists?(child_pid_path, :watch => true)
+ logger.debug { "woot! #{child_pid_path} exists!" }
+ create_sub.unregister
+ else
+ logger.debug { "awaiting the create_latch to release" }
+ create_latch.await
+ end
- logger.debug { "now testing for delete event totally created in child" }
+ logger.debug { "now testing for delete event totally created in child" }
- delete_latch = Zookeeper::Latch.new
+ delete_latch = Zookeeper::Latch.new
- delete_event = nil
+ delete_event = nil
- delete_sub = @zk.register(child_pid_path) do |event|
- if event.node_deleted?
- delete_event = event
- logger.debug { "child got delete event on #{child_pid_path}" }
- delete_latch.release
- else
- unless @zk.exists?(child_pid_path, :watch => true)
- logger.debug { "child: someone deleted #{child_pid_path} behind our back" }
- delete_latch.release
- end
+ delete_sub = @zk.register(child_pid_path) do |event|
+ if event.node_deleted?
+ delete_event = event
+ logger.debug { "child got delete event on #{child_pid_path}" }
+ delete_latch.release
+ else
+ unless @zk.exists?(child_pid_path, :watch => true)
+ logger.debug { "child: someone deleted #{child_pid_path} behind our back" }
+ delete_latch.release
end
end
+ end
- @zk.exists?(child_pid_path, :watch => true)
+ @zk.exists?(child_pid_path, :watch => true)
- @zk.delete(child_pid_path)
+ @zk.delete(child_pid_path)
- logger.debug { "awaiting deletion event notification" }
- delete_latch.await unless delete_event
+ logger.debug { "awaiting deletion event notification" }
+ delete_latch.await unless delete_event
- logger.debug { "deletion event: #{delete_event}" }
+ logger.debug { "deletion event: #{delete_event}" }
- if delete_event
- exit! 0
- else
- exit! 1
- end
+ if delete_event
+ exit! 0
+ else
+ exit! 1
end
+ end
- # replicates deletion watcher inside child
- child_pid_path = "#{@pids_root}/#{@pid}"
+ # replicates deletion watcher inside child
+ child_pid_path = "#{@pids_root}/#{@pid}"
- delete_latch = Latch.new
+ delete_latch = Latch.new
- delete_sub = @zk.register(child_pid_path) do |event|
- if event.node_deleted?
- logger.debug { "parent got delete event on #{child_pid_path}" }
+ delete_sub = @zk.register(child_pid_path) do |event|
+ if event.node_deleted?
+ logger.debug { "parent got delete event on #{child_pid_path}" }
+ delete_latch.release
+ else
+ unless @zk.exists?(child_pid_path, :watch => true)
+ logger.debug { "child: someone deleted #{child_pid_path} behind our back" }
delete_latch.release
- else
- unless @zk.exists?(child_pid_path, :watch => true)
- logger.debug { "child: someone deleted #{child_pid_path} behind our back" }
- delete_latch.release
- end
end
end
+ end
- delete_latch.await if @zk.exists?(child_pid_path, :watch => true)
+ delete_latch.await if @zk.exists?(child_pid_path, :watch => true)
- _, stat = Process.wait2(@pid)
+ _, stat = Process.wait2(@pid)
- stat.should_not be_signaled
- stat.should be_exited
- stat.should be_success
+ stat.should_not be_signaled
+ stat.should be_exited
+ stat.should be_success
- end # should deliver callbacks in the child
- end # forked
- end # # jruby guard
+ end # should deliver callbacks in the child
+ end # forked
end # ZK::Client::Threaded