zk 1.9.3 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.github/workflows/build.yml +55 -0
- data/.gitignore +1 -0
- data/Gemfile +18 -8
- data/README.markdown +9 -9
- data/RELEASES.markdown +28 -1
- data/lib/zk/client/base.rb +15 -0
- data/lib/zk/client/threaded.rb +3 -3
- data/lib/zk/client.rb +1 -1
- data/lib/zk/election.rb +1 -1
- data/lib/zk/event_handler.rb +16 -8
- data/lib/zk/event_handler_subscription/base.rb +1 -1
- data/lib/zk/fork_hook.rb +9 -4
- data/lib/zk/locker/locker_base.rb +14 -2
- data/lib/zk/locker/semaphore.rb +1 -3
- data/lib/zk/logger.rb +34 -0
- data/lib/zk/node_deletion_watcher.rb +4 -5
- data/lib/zk/pool.rb +12 -12
- data/lib/zk/subscription.rb +1 -1
- data/lib/zk/threaded_callback.rb +1 -1
- data/lib/zk/threadpool.rb +1 -1
- data/lib/zk/version.rb +1 -1
- data/lib/zk.rb +1 -5
- data/spec/event_catcher_spec.rb +1 -1
- data/spec/logging_progress_bar_formatter.rb +1 -1
- data/spec/message_queue_spec.rb +6 -6
- data/spec/shared/client_examples.rb +81 -81
- data/spec/shared/locker_examples.rb +13 -13
- data/spec/spec_helper.rb +12 -13
- data/spec/support/bogus_mongoid.rb +1 -1
- data/spec/support/client_forker.rb +1 -1
- data/spec/support/event_catcher.rb +1 -1
- data/spec/support/logging.rb +15 -47
- data/spec/zk/00_forked_client_integration_spec.rb +3 -3
- data/spec/zk/client/locking_and_session_death_spec.rb +2 -2
- data/spec/zk/client_spec.rb +19 -19
- data/spec/zk/election_spec.rb +44 -44
- data/spec/zk/extensions_spec.rb +2 -2
- data/spec/zk/locker/exclusive_locker_spec.rb +41 -41
- data/spec/zk/locker/locker_basic_spec.rb +55 -33
- data/spec/zk/locker/semaphore_spec.rb +39 -32
- data/spec/zk/locker/shared_exclusive_integration_spec.rb +37 -37
- data/spec/zk/locker/shared_locker_spec.rb +43 -43
- data/spec/zk/locker_spec.rb +2 -2
- data/spec/zk/module_spec.rb +25 -25
- data/spec/zk/mongoid_spec.rb +47 -47
- data/spec/zk/node_deletion_watcher_spec.rb +39 -31
- data/spec/zk/pool_spec.rb +56 -65
- data/spec/zk/threaded_callback_spec.rb +10 -10
- data/spec/zk/threadpool_spec.rb +25 -25
- data/spec/zk/watch_spec.rb +67 -79
- data/spec/zk/zookeeper_spec.rb +36 -30
- data/zk.gemspec +1 -2
- metadata +26 -47
- data/.travis.yml +0 -25
- data/lib/zk/logging.rb +0 -36
    
        data/lib/zk.rb
    CHANGED
    
    | @@ -1,6 +1,5 @@ | |
| 1 1 | 
             
            require 'rubygems'
         | 
| 2 2 |  | 
| 3 | 
            -
            require 'logging'
         | 
| 4 3 | 
             
            require 'zookeeper'
         | 
| 5 4 |  | 
| 6 5 | 
             
            # XXX: after 1.0 we'll need this
         | 
| @@ -23,7 +22,7 @@ end | |
| 23 22 | 
             
            require 'zk/core_ext'
         | 
| 24 23 | 
             
            require 'zk/exceptions'
         | 
| 25 24 | 
             
            require 'zk/extensions'
         | 
| 26 | 
            -
            require 'zk/ | 
| 25 | 
            +
            require 'zk/logger'
         | 
| 27 26 | 
             
            require 'zk/event'
         | 
| 28 27 | 
             
            require 'zk/stat'
         | 
| 29 28 | 
             
            require 'zk/subscription'
         | 
| @@ -307,6 +306,3 @@ module ZK | |
| 307 306 | 
             
                  cnx_str   # the possibly-modified connection string (with chroot info)
         | 
| 308 307 | 
             
                end
         | 
| 309 308 | 
             
            end
         | 
| 310 | 
            -
             | 
| 311 | 
            -
            ZK::Logging.set_default
         | 
| 312 | 
            -
             | 
    
        data/spec/event_catcher_spec.rb
    CHANGED
    
    
| @@ -5,7 +5,7 @@ require 'rspec/core/formatters/progress_formatter' | |
| 5 5 | 
             
            # easier to match up tests with the SQL they produce
         | 
| 6 6 | 
             
            class LoggingProgressBarFormatter < RSpec::Core::Formatters::ProgressFormatter
         | 
| 7 7 | 
             
              def example_started(example)
         | 
| 8 | 
            -
                 | 
| 8 | 
            +
                SpecGlobalLogger.logger << yellow("\n=====<([ #{example.full_description} ])>=====\n")
         | 
| 9 9 | 
             
                super
         | 
| 10 10 | 
             
              end
         | 
| 11 11 | 
             
            end
         | 
    
        data/spec/message_queue_spec.rb
    CHANGED
    
    | @@ -22,35 +22,35 @@ describe ZK::MessageQueue do | |
| 22 22 | 
             
              it "should be able to receive a published message" do
         | 
| 23 23 | 
             
                message_received = false
         | 
| 24 24 | 
             
                @consume_queue.subscribe do |title, data|
         | 
| 25 | 
            -
                  data. | 
| 25 | 
            +
                  expect(data).to eq('mydata')
         | 
| 26 26 | 
             
                  message_received = true
         | 
| 27 27 | 
             
                end
         | 
| 28 28 | 
             
                @publish_queue.publish("mydata")
         | 
| 29 29 | 
             
                wait_until {message_received }
         | 
| 30 | 
            -
                message_received. | 
| 30 | 
            +
                expect(message_received).to be(true)
         | 
| 31 31 | 
             
              end
         | 
| 32 32 |  | 
| 33 33 | 
             
              it "should be able to receive a custom message title" do
         | 
| 34 34 | 
             
                message_title = false
         | 
| 35 35 | 
             
                @consume_queue.subscribe do |title, data|
         | 
| 36 | 
            -
                  title. | 
| 36 | 
            +
                  expect(title).to eq('title')
         | 
| 37 37 | 
             
                  message_title = true
         | 
| 38 38 | 
             
                end
         | 
| 39 39 | 
             
                @publish_queue.publish("data", "title")
         | 
| 40 40 | 
             
                wait_until { message_title }
         | 
| 41 | 
            -
                message_title. | 
| 41 | 
            +
                expect(message_title).to be(true)
         | 
| 42 42 | 
             
              end
         | 
| 43 43 |  | 
| 44 44 | 
             
              it "should work even after processing a message from before" do
         | 
| 45 45 | 
             
                @publish_queue.publish("data1", "title")
         | 
| 46 46 | 
             
                message_times = 0
         | 
| 47 47 | 
             
                @consume_queue.subscribe do |title, data|
         | 
| 48 | 
            -
                  title. | 
| 48 | 
            +
                  expect(title).to eq("title")
         | 
| 49 49 | 
             
                  message_times += 1
         | 
| 50 50 | 
             
                end
         | 
| 51 51 |  | 
| 52 52 | 
             
                @publish_queue.publish("data2", "title")
         | 
| 53 53 | 
             
                wait_until { message_times == 2 }
         | 
| 54 | 
            -
                message_times. | 
| 54 | 
            +
                expect(message_times).to eq(2)
         | 
| 55 55 | 
             
              end
         | 
| 56 56 | 
             
            end
         | 
| @@ -6,29 +6,29 @@ shared_examples_for 'client' do | |
| 6 6 | 
             
                  @path_ary = %W[#{base} test mkdir_p path creation]
         | 
| 7 7 | 
             
                  @bogus_path = File.join('', *@path_ary)
         | 
| 8 8 | 
             
                end
         | 
| 9 | 
            -
             | 
| 9 | 
            +
             | 
| 10 10 | 
             
                it %[should create all intermediate paths for the path givem] do
         | 
| 11 | 
            -
                  @zk. | 
| 12 | 
            -
                  @zk. | 
| 11 | 
            +
                  expect(@zk.exists?(@bogus_path)).to be(false)
         | 
| 12 | 
            +
                  expect(@zk.exists?(File.dirname(@bogus_path))).to be(false)
         | 
| 13 13 | 
             
                  @zk.mkdir_p(@bogus_path)
         | 
| 14 | 
            -
                  @zk. | 
| 14 | 
            +
                  expect(@zk.exists?(@bogus_path)).to be(true)
         | 
| 15 15 | 
             
                end
         | 
| 16 16 |  | 
| 17 17 | 
             
                it %[should place the data only at the leaf node] do
         | 
| 18 18 | 
             
                  @zk.mkdir_p(@bogus_path, :data => 'foobar')
         | 
| 19 | 
            -
                  @zk.get(@bogus_path).first. | 
| 19 | 
            +
                  expect(@zk.get(@bogus_path).first).to eq('foobar')
         | 
| 20 20 |  | 
| 21 21 | 
             
                  path = ''
         | 
| 22 22 | 
             
                  @path_ary[0..-2].each do |el|
         | 
| 23 23 | 
             
                    path = File.join(path, el)
         | 
| 24 | 
            -
                    @zk.get(path).first. | 
| 24 | 
            +
                    expect(@zk.get(path).first).to eq('')
         | 
| 25 25 | 
             
                  end
         | 
| 26 26 | 
             
                end
         | 
| 27 27 |  | 
| 28 28 | 
             
                it %[should replace the data at the leaf node if it already exists] do
         | 
| 29 29 | 
             
                  @zk.mkdir_p(@bogus_path, :data => 'blahfoo')
         | 
| 30 30 | 
             
                  @zk.mkdir_p(@bogus_path, :data => 'foodink')
         | 
| 31 | 
            -
                  @zk.get(@bogus_path).first. | 
| 31 | 
            +
                  expect(@zk.get(@bogus_path).first).to eq('foodink')
         | 
| 32 32 | 
             
                end
         | 
| 33 33 | 
             
              end
         | 
| 34 34 |  | 
| @@ -37,14 +37,14 @@ shared_examples_for 'client' do | |
| 37 37 | 
             
                describe 'only path given' do
         | 
| 38 38 | 
             
                  it %[should create a node with blank data] do
         | 
| 39 39 | 
             
                    @zk.create(@base_path)
         | 
| 40 | 
            -
                    @zk.get(@base_path).first. | 
| 40 | 
            +
                    expect(@zk.get(@base_path).first).to eq('')
         | 
| 41 41 | 
             
                  end
         | 
| 42 42 | 
             
                end
         | 
| 43 43 |  | 
| 44 44 | 
             
                describe 'path and data given' do
         | 
| 45 45 | 
             
                  it %[should create a node with the path and data] do
         | 
| 46 46 | 
             
                    @zk.create(@base_path, 'blah')
         | 
| 47 | 
            -
                    @zk.get(@base_path).first. | 
| 47 | 
            +
                    expect(@zk.get(@base_path).first).to eq('blah')
         | 
| 48 48 | 
             
                  end
         | 
| 49 49 | 
             
                end
         | 
| 50 50 |  | 
| @@ -52,37 +52,37 @@ shared_examples_for 'client' do | |
| 52 52 | 
             
                  it %[should create a sequential node with blank data] do
         | 
| 53 53 | 
             
                    @zk.create(@base_path)
         | 
| 54 54 | 
             
                    path = @zk.create("#{@base_path}/v", :sequential => true)
         | 
| 55 | 
            -
                    path.start_with?(@base_path). | 
| 55 | 
            +
                    expect(path.start_with?(@base_path)).to be(true)
         | 
| 56 56 |  | 
| 57 | 
            -
                    File.basename(path). | 
| 57 | 
            +
                    expect(File.basename(path)).to match(/v\d+/)
         | 
| 58 58 |  | 
| 59 | 
            -
                    @zk.get(path).first. | 
| 59 | 
            +
                    expect(@zk.get(path).first).to eq('')
         | 
| 60 60 | 
             
                  end
         | 
| 61 61 |  | 
| 62 62 | 
             
                  it %[should create a sequential node with given data] do
         | 
| 63 63 | 
             
                    @zk.create(@base_path)
         | 
| 64 64 | 
             
                    path = @zk.create("#{@base_path}/v", 'thedata', :sequential => true)
         | 
| 65 | 
            -
                    path.start_with?(@base_path). | 
| 65 | 
            +
                    expect(path.start_with?(@base_path)).to be(true)
         | 
| 66 66 |  | 
| 67 | 
            -
                    File.basename(path). | 
| 67 | 
            +
                    expect(File.basename(path)).to match(/v\d+/)
         | 
| 68 68 |  | 
| 69 69 | 
             
                    data, st = @zk.get(path)
         | 
| 70 | 
            -
                    data. | 
| 71 | 
            -
                    st. | 
| 70 | 
            +
                    expect(data).to eq('thedata')
         | 
| 71 | 
            +
                    expect(st).not_to be_ephemeral
         | 
| 72 72 | 
             
                  end
         | 
| 73 73 | 
             
                end
         | 
| 74 74 |  | 
| 75 75 | 
             
                describe 'path and ephemeral' do
         | 
| 76 76 | 
             
                  it %[should create an ephemeral node with blank data] do
         | 
| 77 77 | 
             
                    @zk.create(@base_path, :ephemeral => true)
         | 
| 78 | 
            -
                    @zk.get(@base_path).last. | 
| 78 | 
            +
                    expect(@zk.get(@base_path).last).to be_ephemeral
         | 
| 79 79 | 
             
                  end
         | 
| 80 80 |  | 
| 81 81 | 
             
                  it %[should create an ephemeral node with given data] do
         | 
| 82 82 | 
             
                    @zk.create(@base_path, 'thedata', :ephemeral => true)
         | 
| 83 83 | 
             
                    data, stat = @zk.get(@base_path)
         | 
| 84 | 
            -
                    data. | 
| 85 | 
            -
                    stat. | 
| 84 | 
            +
                    expect(data).to eq('thedata')
         | 
| 85 | 
            +
                    expect(stat).to be_ephemeral
         | 
| 86 86 | 
             
                  end
         | 
| 87 87 | 
             
                end
         | 
| 88 88 |  | 
| @@ -90,45 +90,45 @@ shared_examples_for 'client' do | |
| 90 90 | 
             
                  it %[should create a sequential ephemeral node with blank data] do
         | 
| 91 91 | 
             
                    @zk.create(@base_path)
         | 
| 92 92 | 
             
                    path = @zk.create("#{@base_path}/v", :sequential => true, :ephemeral => true)
         | 
| 93 | 
            -
                    path.start_with?(@base_path). | 
| 93 | 
            +
                    expect(path.start_with?(@base_path)).to be(true)
         | 
| 94 94 |  | 
| 95 | 
            -
                    File.basename(path). | 
| 95 | 
            +
                    expect(File.basename(path)).to match(/v\d+/)
         | 
| 96 96 |  | 
| 97 97 | 
             
                    data, st = @zk.get(path)
         | 
| 98 | 
            -
                    data. | 
| 99 | 
            -
                    st. | 
| 98 | 
            +
                    expect(data).to eq('')
         | 
| 99 | 
            +
                    expect(st).to be_ephemeral
         | 
| 100 100 | 
             
                  end
         | 
| 101 101 |  | 
| 102 102 | 
             
                  it %[should create a sequential ephemeral node with given data] do
         | 
| 103 103 | 
             
                    @zk.create(@base_path)
         | 
| 104 104 | 
             
                    path = @zk.create("#{@base_path}/v", 'thedata', :sequential => true, :ephemeral => true)
         | 
| 105 | 
            -
                    path.start_with?(@base_path). | 
| 105 | 
            +
                    expect(path.start_with?(@base_path)).to be(true)
         | 
| 106 106 |  | 
| 107 | 
            -
                    File.basename(path). | 
| 107 | 
            +
                    expect(File.basename(path)).to match(/v\d+/)
         | 
| 108 108 |  | 
| 109 109 | 
             
                    data, st = @zk.get(path)
         | 
| 110 | 
            -
                    data. | 
| 111 | 
            -
                    st. | 
| 110 | 
            +
                    expect(data).to eq('thedata')
         | 
| 111 | 
            +
                    expect(st).to be_ephemeral
         | 
| 112 112 | 
             
                  end
         | 
| 113 113 | 
             
                end
         | 
| 114 114 |  | 
| 115 115 | 
             
                it %[should barf if someone hands 3 params] do
         | 
| 116 | 
            -
                   | 
| 116 | 
            +
                  expect { @zk.create(@base_path, 'data', :sequence) }.to raise_error(ArgumentError)
         | 
| 117 117 | 
             
                end
         | 
| 118 118 |  | 
| 119 119 | 
             
                it %[should barf if both :sequence and :sequential are given] do
         | 
| 120 | 
            -
                   | 
| 120 | 
            +
                  expect { @zk.create(@base_path, 'data', :sequence => true, :sequential => true) }.to raise_error(ArgumentError)
         | 
| 121 121 | 
             
                end
         | 
| 122 122 |  | 
| 123 123 | 
             
                describe %[:ignore option] do
         | 
| 124 124 | 
             
                  it %[should squelch node_exists] do
         | 
| 125 125 | 
             
                    @zk.create(@base_path)
         | 
| 126 126 |  | 
| 127 | 
            -
                     | 
| 127 | 
            +
                    expect { expect(@zk.create(@base_path, :ignore => :node_exists)).to be_nil }.not_to raise_error
         | 
| 128 128 | 
             
                  end
         | 
| 129 129 |  | 
| 130 130 | 
             
                  it %[should squelch no_node] do
         | 
| 131 | 
            -
                     | 
| 131 | 
            +
                    expect { expect(@zk.create("#{@base_path}/foo/bar/baz", :ignore => :no_node)).to be_nil }.not_to raise_error
         | 
| 132 132 | 
             
                  end
         | 
| 133 133 | 
             
                end
         | 
| 134 134 |  | 
| @@ -136,11 +136,11 @@ shared_examples_for 'client' do | |
| 136 136 | 
             
                  let(:path) { "#{@base_path}/foo/bar" }
         | 
| 137 137 |  | 
| 138 138 | 
             
                  it %[should barf if anything but the the :set value is given] do
         | 
| 139 | 
            -
                     | 
| 139 | 
            +
                    expect { @zk.create(path, :or => :GFY) }.to raise_error(ArgumentError)
         | 
| 140 140 | 
             
                  end
         | 
| 141 141 |  | 
| 142 142 | 
             
                  def create_args(opts={})
         | 
| 143 | 
            -
                    proc do | 
| 143 | 
            +
                    proc do
         | 
| 144 144 | 
             
                      begin
         | 
| 145 145 | 
             
                        @zk.create(path, opts.merge(:or => :set))
         | 
| 146 146 | 
             
                      ensure
         | 
| @@ -150,24 +150,24 @@ shared_examples_for 'client' do | |
| 150 150 | 
             
                  end
         | 
| 151 151 |  | 
| 152 152 | 
             
                  it %[should barf if any node option besides 'persistent' is given] do
         | 
| 153 | 
            -
                    create_args(:persistent => true). | 
| 154 | 
            -
                    create_args(:sequential => true). | 
| 155 | 
            -
                    create_args(:mode => :ephemeral). | 
| 156 | 
            -
                    create_args(:mode => :ephemeral_sequential). | 
| 157 | 
            -
                    create_args(:mode => :sequential). | 
| 153 | 
            +
                    expect(create_args(:persistent => true)).not_to         raise_error
         | 
| 154 | 
            +
                    expect(create_args(:sequential => true)).to             raise_error(ArgumentError)
         | 
| 155 | 
            +
                    expect(create_args(:mode => :ephemeral)).to             raise_error(ArgumentError)
         | 
| 156 | 
            +
                    expect(create_args(:mode => :ephemeral_sequential)).to  raise_error(ArgumentError)
         | 
| 157 | 
            +
                    expect(create_args(:mode => :sequential)).to            raise_error(ArgumentError)
         | 
| 158 158 | 
             
                  end
         | 
| 159 159 |  | 
| 160 160 | 
             
                  it %[should replace the data at the leaf node if it already exists] do
         | 
| 161 161 | 
             
                    @zk.mkdir_p(path, :data => 'foodink')
         | 
| 162 162 | 
             
                    @zk.create(path, 'blahfoo', :or => :set)
         | 
| 163 | 
            -
                    @zk.get(path).first. | 
| 163 | 
            +
                    expect(@zk.get(path).first).to eq('blahfoo')
         | 
| 164 164 | 
             
                  end
         | 
| 165 165 |  | 
| 166 166 | 
             
                  it %[should create the intermediate paths] do
         | 
| 167 | 
            -
                     | 
| 167 | 
            +
                    expect { @zk.create(path, 'foobar', :or => :set) }.not_to raise_error
         | 
| 168 168 |  | 
| 169 | 
            -
                    @zk.stat(@base_path). | 
| 170 | 
            -
                    @zk.stat("#{@base_path}/foo"). | 
| 169 | 
            +
                    expect(@zk.stat(@base_path)).to exist
         | 
| 170 | 
            +
                    expect(@zk.stat("#{@base_path}/foo")).to exist
         | 
| 171 171 | 
             
                  end
         | 
| 172 172 | 
             
                end
         | 
| 173 173 | 
             
              end
         | 
| @@ -178,16 +178,16 @@ shared_examples_for 'client' do | |
| 178 178 | 
             
                    @zk.create(@base_path)
         | 
| 179 179 | 
             
                    @zk.create("#{@base_path}/blah")
         | 
| 180 180 |  | 
| 181 | 
            -
                     | 
| 181 | 
            +
                    expect { expect(@zk.delete(@base_path, :ignore => :not_empty)).to be_nil }.not_to raise_error
         | 
| 182 182 | 
             
                  end
         | 
| 183 183 |  | 
| 184 184 | 
             
                  it %[should squelch no_node] do
         | 
| 185 | 
            -
                     | 
| 185 | 
            +
                    expect { expect(@zk.delete("#{@base_path}/foo/bar/baz", :ignore => :no_node)).to be_nil }.not_to raise_error
         | 
| 186 186 | 
             
                  end
         | 
| 187 187 |  | 
| 188 188 | 
             
                  it %[should squelch bad_version] do
         | 
| 189 189 | 
             
                    @zk.create(@base_path)
         | 
| 190 | 
            -
                     | 
| 190 | 
            +
                    expect { expect(@zk.delete("#{@base_path}", :version => 7, :ignore => :bad_version)).to be_nil }.not_to raise_error
         | 
| 191 191 | 
             
                  end
         | 
| 192 192 | 
             
                end
         | 
| 193 193 | 
             
              end
         | 
| @@ -197,21 +197,21 @@ shared_examples_for 'client' do | |
| 197 197 | 
             
                  before do
         | 
| 198 198 | 
             
                    @missing_path = '/thispathdoesnotexist'
         | 
| 199 199 | 
             
                    begin
         | 
| 200 | 
            -
                      @zk.delete(@missing_path) | 
| 200 | 
            +
                      @zk.delete(@missing_path)
         | 
| 201 201 | 
             
                    rescue ZK::Exceptions::NoNode
         | 
| 202 202 | 
             
                    end
         | 
| 203 203 | 
             
                  end
         | 
| 204 204 |  | 
| 205 205 | 
             
                  it %[should not raise any error] do
         | 
| 206 | 
            -
                     | 
| 206 | 
            +
                    expect { @zk.stat(@missing_path) }.not_to raise_error
         | 
| 207 207 | 
             
                  end
         | 
| 208 208 |  | 
| 209 209 | 
             
                  it %[should return a Stat object] do
         | 
| 210 | 
            -
                    @zk.stat(@missing_path). | 
| 210 | 
            +
                    expect(@zk.stat(@missing_path)).to be_kind_of(Zookeeper::Stat)
         | 
| 211 211 | 
             
                  end
         | 
| 212 212 |  | 
| 213 213 | 
             
                  it %[should return a stat that not exists?] do
         | 
| 214 | 
            -
                    @zk.stat(@missing_path). | 
| 214 | 
            +
                    expect(@zk.stat(@missing_path)).not_to be_exists
         | 
| 215 215 | 
             
                  end
         | 
| 216 216 | 
             
                end
         | 
| 217 217 | 
             
              end
         | 
| @@ -219,12 +219,12 @@ shared_examples_for 'client' do | |
| 219 219 | 
             
              describe :set do
         | 
| 220 220 | 
             
                describe %[:ignore option] do
         | 
| 221 221 | 
             
                  it %[should squelch no_node] do
         | 
| 222 | 
            -
                     | 
| 222 | 
            +
                    expect { expect(@zk.set("#{@base_path}/foo/bar/baz", '', :ignore => :no_node)).to be_nil }.not_to raise_error
         | 
| 223 223 | 
             
                  end
         | 
| 224 224 |  | 
| 225 225 | 
             
                  it %[should squelch bad_version] do
         | 
| 226 226 | 
             
                    @zk.create(@base_path)
         | 
| 227 | 
            -
                     | 
| 227 | 
            +
                    expect { expect(@zk.set("#{@base_path}", '', :version => 7, :ignore => :bad_version)).to be_nil }.not_to raise_error
         | 
| 228 228 | 
             
                  end
         | 
| 229 229 | 
             
                end
         | 
| 230 230 | 
             
              end
         | 
| @@ -236,7 +236,7 @@ shared_examples_for 'client' do | |
| 236 236 |  | 
| 237 237 | 
             
                describe 'no node initially' do
         | 
| 238 238 | 
             
                  before do
         | 
| 239 | 
            -
                    @zk.exists?(@path). | 
| 239 | 
            +
                    expect(@zk.exists?(@path)).to be(false)
         | 
| 240 240 | 
             
                  end
         | 
| 241 241 |  | 
| 242 242 | 
             
                  it %[should not block] do
         | 
| @@ -248,42 +248,42 @@ shared_examples_for 'client' do | |
| 248 248 | 
             
                    end
         | 
| 249 249 |  | 
| 250 250 | 
             
                    th.join(2)
         | 
| 251 | 
            -
                    @a. | 
| 251 | 
            +
                    expect(@a).to be(true)
         | 
| 252 252 | 
             
                  end
         | 
| 253 253 | 
             
                end
         | 
| 254 254 |  | 
| 255 255 | 
             
                describe 'node exists initially' do
         | 
| 256 256 | 
             
                  before do
         | 
| 257 257 | 
             
                    @zk.create(@path, :mode => :ephemeral)
         | 
| 258 | 
            -
                    @zk.exists?(@path). | 
| 258 | 
            +
                    expect(@zk.exists?(@path)).to be(true)
         | 
| 259 259 | 
             
                  end
         | 
| 260 260 |  | 
| 261 261 | 
             
                  it %[should block until the node is deleted] do
         | 
| 262 262 | 
             
                    @a = false
         | 
| 263 263 |  | 
| 264 | 
            -
                     | 
| 264 | 
            +
                    Thread.new do
         | 
| 265 265 | 
             
                      @zk.block_until_node_deleted(@path)
         | 
| 266 266 | 
             
                      @a = true
         | 
| 267 267 | 
             
                    end
         | 
| 268 268 |  | 
| 269 269 | 
             
                    Thread.pass
         | 
| 270 | 
            -
                    @a. | 
| 270 | 
            +
                    expect(@a).to be(false)
         | 
| 271 271 |  | 
| 272 272 | 
             
                    @zk.delete(@path)
         | 
| 273 273 |  | 
| 274 274 | 
             
                    wait_until(2) { @a }
         | 
| 275 | 
            -
                    @a. | 
| 275 | 
            +
                    expect(@a).to be(true)
         | 
| 276 276 | 
             
                  end
         | 
| 277 277 | 
             
                end
         | 
| 278 278 | 
             
              end
         | 
| 279 279 |  | 
| 280 280 | 
             
              describe 'session_id and session_passwd' do
         | 
| 281 281 | 
             
                it %[should expose the underlying session_id] do
         | 
| 282 | 
            -
                  @zk.session_id. | 
| 282 | 
            +
                  expect(@zk.session_id).to be_kind_of(Integer)
         | 
| 283 283 | 
             
                end
         | 
| 284 284 |  | 
| 285 285 | 
             
                it %[should expose the underlying session_passwd] do
         | 
| 286 | 
            -
                  @zk.session_passwd. | 
| 286 | 
            +
                  expect(@zk.session_passwd).to be_kind_of(String)
         | 
| 287 287 | 
             
                end
         | 
| 288 288 | 
             
              end
         | 
| 289 289 |  | 
| @@ -296,22 +296,22 @@ shared_examples_for 'client' do | |
| 296 296 | 
             
                  end
         | 
| 297 297 |  | 
| 298 298 | 
             
            #       after do
         | 
| 299 | 
            -
            #         logger.info { "AFTER EACH" } | 
| 299 | 
            +
            #         logger.info { "AFTER EACH" }
         | 
| 300 300 | 
             
            #         @zk.delete(@path)
         | 
| 301 301 | 
             
            #       end
         | 
| 302 302 |  | 
| 303 303 | 
             
                  def ensure_event_delivery!
         | 
| 304 304 | 
             
                    @sub ||= @zk.event_handler.register(@path) do |event|
         | 
| 305 | 
            -
                      logger.debug { "got event: #{event.inspect}" } | 
| 305 | 
            +
                      logger.debug { "got event: #{event.inspect}" }
         | 
| 306 306 | 
             
                      @queue << event
         | 
| 307 307 | 
             
                    end
         | 
| 308 308 |  | 
| 309 | 
            -
                    @zk.exists?(@path, :watch => true). | 
| 309 | 
            +
                    expect(@zk.exists?(@path, :watch => true)).to be(false)
         | 
| 310 310 | 
             
                    @zk.create(@path)
         | 
| 311 311 |  | 
| 312 | 
            -
                    logger.debug { "waiting for event delivery" } | 
| 312 | 
            +
                    logger.debug { "waiting for event delivery" }
         | 
| 313 313 |  | 
| 314 | 
            -
                    wait_until(2) do | 
| 314 | 
            +
                    wait_until(2) do
         | 
| 315 315 | 
             
                      begin
         | 
| 316 316 | 
             
                        event = @queue.pop(true)
         | 
| 317 317 | 
             
                        logger.debug { "got event: #{event}" }
         | 
| @@ -323,7 +323,7 @@ shared_examples_for 'client' do | |
| 323 323 | 
             
                    end
         | 
| 324 324 |  | 
| 325 325 | 
             
                    # first watch delivered correctly
         | 
| 326 | 
            -
                    @events.length. | 
| 326 | 
            +
                    expect(@events.length).to be > 0
         | 
| 327 327 | 
             
                  end
         | 
| 328 328 |  | 
| 329 329 | 
             
                  it %[should fire re-registered watchers after reopen (#9)] do
         | 
| @@ -357,14 +357,14 @@ shared_examples_for 'client' do | |
| 357 357 | 
             
                  # note: we can't trust the events to be delivered in any particular order
         | 
| 358 358 | 
             
                  # since they're happening on two different threads. if we see we're connected
         | 
| 359 359 | 
             
                  # in the beginning, that there was a disconnection, then a reopen, that's
         | 
| 360 | 
            -
                  # probably fine. | 
| 360 | 
            +
                  # probably fine.
         | 
| 361 361 | 
             
                  #
         | 
| 362 362 | 
             
                  # we also check that the session_id was changed, which is the desired effect
         | 
| 363 363 |  | 
| 364 364 | 
             
                  orig_session_id = @zk.session_id
         | 
| 365 | 
            -
                  @zk. | 
| 365 | 
            +
                  expect(@zk).to be_connected
         | 
| 366 366 |  | 
| 367 | 
            -
                  props = { | 
| 367 | 
            +
                  props = {
         | 
| 368 368 | 
             
                    :session_event?   => true,
         | 
| 369 369 | 
             
                    :node_event?      => false,
         | 
| 370 370 | 
             
                    :client_invalid?  => true,
         | 
| @@ -372,8 +372,8 @@ shared_examples_for 'client' do | |
| 372 372 | 
             
                    :state            => Zookeeper::ZOO_EXPIRED_SESSION_STATE,
         | 
| 373 373 | 
             
                  }
         | 
| 374 374 |  | 
| 375 | 
            -
                  bogus_event =  | 
| 376 | 
            -
                  bogus_event. | 
| 375 | 
            +
                  bogus_event = instance_double(Zookeeper::Callbacks::WatcherCallback, props)
         | 
| 376 | 
            +
                  expect(bogus_event).to receive(:zk=).with(@zk).once
         | 
| 377 377 |  | 
| 378 378 | 
             
                  mutex = Monitor.new
         | 
| 379 379 | 
             
                  cond  = mutex.new_cond
         | 
| @@ -388,20 +388,20 @@ shared_examples_for 'client' do | |
| 388 388 | 
             
                  end
         | 
| 389 389 |  | 
| 390 390 | 
             
                  mutex.synchronize do
         | 
| 391 | 
            -
                    events. | 
| 391 | 
            +
                    expect(events).to be_empty
         | 
| 392 392 | 
             
                    @zk.event_handler.process(bogus_event)
         | 
| 393 393 | 
             
                  end
         | 
| 394 394 |  | 
| 395 | 
            -
                  logger.debug { "events: #{events.inspect}" } | 
| 395 | 
            +
                  logger.debug { "events: #{events.inspect}" }
         | 
| 396 396 |  | 
| 397 397 | 
             
                  mutex.synchronize do
         | 
| 398 398 | 
             
                    time_to_stop = Time.now + 2
         | 
| 399 399 | 
             
                    cond.wait_while { (events.length < 2 ) && (Time.now < time_to_stop) }
         | 
| 400 400 | 
             
                  end
         | 
| 401 401 |  | 
| 402 | 
            -
                  events. | 
| 403 | 
            -
                  events. | 
| 404 | 
            -
                  @zk.session_id. | 
| 402 | 
            +
                  expect(events).to include(Zookeeper::ZOO_EXPIRED_SESSION_STATE)
         | 
| 403 | 
            +
                  expect(events).to include(Zookeeper::ZOO_CONNECTED_STATE)
         | 
| 404 | 
            +
                  expect(@zk.session_id).not_to eq(orig_session_id)
         | 
| 405 405 | 
             
                end
         | 
| 406 406 | 
             
              end # reconnection
         | 
| 407 407 |  | 
| @@ -410,17 +410,17 @@ shared_examples_for 'client' do | |
| 410 410 | 
             
                  @ary = []
         | 
| 411 411 |  | 
| 412 412 | 
             
                  @zk.on_exception { |exc| @ary << exc }
         | 
| 413 | 
            -
             | 
| 413 | 
            +
             | 
| 414 414 | 
             
                  @zk.defer { raise "ZOMG!" }
         | 
| 415 415 |  | 
| 416 416 | 
             
                  wait_while(2) { @ary.empty? }
         | 
| 417 417 |  | 
| 418 | 
            -
                  @ary.length. | 
| 418 | 
            +
                  expect(@ary.length).to eq(1)
         | 
| 419 419 |  | 
| 420 420 | 
             
                  e = @ary.shift
         | 
| 421 421 |  | 
| 422 | 
            -
                  e. | 
| 423 | 
            -
                  e.message. | 
| 422 | 
            +
                  expect(e).to be_kind_of(RuntimeError)
         | 
| 423 | 
            +
                  expect(e.message).to eq('ZOMG!')
         | 
| 424 424 | 
             
                end
         | 
| 425 425 | 
             
              end
         | 
| 426 426 |  | 
| @@ -431,8 +431,8 @@ shared_examples_for 'client' do | |
| 431 431 | 
             
                  @zk.defer { @ary << @zk.on_threadpool? }
         | 
| 432 432 |  | 
| 433 433 | 
             
                  wait_while(2) { @ary.empty? }
         | 
| 434 | 
            -
                  @ary.length. | 
| 435 | 
            -
                  @ary.first. | 
| 434 | 
            +
                  expect(@ary.length).to eq(1)
         | 
| 435 | 
            +
                  expect(@ary.first).to be(true)
         | 
| 436 436 | 
             
                end
         | 
| 437 437 | 
             
              end
         | 
| 438 438 | 
             
            end
         | 
| @@ -6,50 +6,50 @@ | |
| 6 6 | 
             
            shared_examples_for 'LockerBase#assert!' do
         | 
| 7 7 | 
             
              it %[should raise LockAssertionFailedError if its connection is no longer connected?] do
         | 
| 8 8 | 
             
                zk.close!
         | 
| 9 | 
            -
                 | 
| 9 | 
            +
                expect { locker.assert! }.to raise_error(ZK::Exceptions::LockAssertionFailedError)
         | 
| 10 10 | 
             
              end
         | 
| 11 11 |  | 
| 12 12 | 
             
              it %[should raise LockAssertionFailedError if locked? is false] do
         | 
| 13 | 
            -
                locker. | 
| 14 | 
            -
                 | 
| 13 | 
            +
                expect(locker).not_to be_locked
         | 
| 14 | 
            +
                expect { locker.assert! }.to raise_error(ZK::Exceptions::LockAssertionFailedError)
         | 
| 15 15 | 
             
              end
         | 
| 16 16 |  | 
| 17 17 | 
             
              it %[should raise LockAssertionFailedError lock_path does not exist] do
         | 
| 18 18 | 
             
                locker.lock
         | 
| 19 | 
            -
                 | 
| 19 | 
            +
                expect { locker.assert! }.not_to raise_error
         | 
| 20 20 |  | 
| 21 21 | 
             
                zk.delete(locker.lock_path)
         | 
| 22 | 
            -
                 | 
| 22 | 
            +
                expect { locker.assert! }.to raise_error(ZK::Exceptions::LockAssertionFailedError)
         | 
| 23 23 | 
             
              end
         | 
| 24 24 |  | 
| 25 25 | 
             
              it %[should raise LockAssertionFailedError if our parent node's ctime is different than what we think it should be] do
         | 
| 26 | 
            -
                locker.lock. | 
| 26 | 
            +
                expect(locker.lock).to be(true)
         | 
| 27 27 |  | 
| 28 28 | 
             
                zk.rm_rf(File.dirname(locker.lock_path)) # remove the parent node
         | 
| 29 29 | 
             
                zk.mkdir_p(locker.lock_path)
         | 
| 30 30 |  | 
| 31 | 
            -
                 | 
| 31 | 
            +
                expect { locker.assert! }.to raise_error(ZK::Exceptions::LockAssertionFailedError)
         | 
| 32 32 | 
             
              end
         | 
| 33 33 | 
             
            end
         | 
| 34 34 |  | 
| 35 35 | 
             
            shared_examples_for 'LockerBase#unlock' do
         | 
| 36 36 | 
             
              it %[should not delete a lock path it does not own] do
         | 
| 37 | 
            -
                locker.lock. | 
| 37 | 
            +
                expect(locker.lock).to be(true)
         | 
| 38 38 |  | 
| 39 39 | 
             
                zk.rm_rf(File.dirname(locker.lock_path)) # remove the parent node
         | 
| 40 40 | 
             
                zk.mkdir_p(File.dirname(locker.lock_path))
         | 
| 41 41 |  | 
| 42 | 
            -
                locker2.lock. | 
| 42 | 
            +
                expect(locker2.lock).to be(true)
         | 
| 43 43 |  | 
| 44 | 
            -
                locker2.lock_path. | 
| 44 | 
            +
                expect(locker2.lock_path).to eq(locker.lock_path)
         | 
| 45 45 |  | 
| 46 | 
            -
                 | 
| 46 | 
            +
                expect { locker2.assert! }.not_to raise_error
         | 
| 47 47 |  | 
| 48 48 | 
             
                lock_path = locker.lock_path
         | 
| 49 49 |  | 
| 50 | 
            -
                locker.unlock. | 
| 50 | 
            +
                expect(locker.unlock).to be(false)
         | 
| 51 51 |  | 
| 52 | 
            -
                zk.stat(lock_path). | 
| 52 | 
            +
                expect(zk.stat(lock_path)).to exist
         | 
| 53 53 | 
             
              end
         | 
| 54 54 | 
             
            end
         | 
| 55 55 |  |