Sha256: 1b3954527b73e46964997ead47012894c3720dcdf11ad0d99757a16c06dd5d48

Contents?: true

Size: 1.55 KB

Versions: 3

Compression:

Stored size: 1.55 KB

Contents

require 'minitest_helper'

describe "lock nesting" do
  it "doesn't request the same lock twice" do
    impl = WithAdvisoryLock::Base.new(nil, nil, nil)
    impl.lock_stack.must_be_empty
    Tag.with_advisory_lock("first") do
      impl.lock_stack.must_equal %w(first)
      # Even MySQL should be OK with this:
      Tag.with_advisory_lock("first") do
        impl.lock_stack.must_equal %w(first)
      end
      impl.lock_stack.must_equal %w(first)
    end
    impl.lock_stack.must_be_empty
  end

  it "raises errors with MySQL when acquiring nested lock" do
    skip if env_db != 'mysql'
    exc = proc {
      Tag.with_advisory_lock("first") do
        Tag.with_advisory_lock("second") do
        end
      end
    }.must_raise WithAdvisoryLock::NestedAdvisoryLockError
    exc.lock_stack.must_equal %w(first)
  end

  it "supports nested advisory locks with !MySQL" do
    skip if env_db == 'mysql'
    impl = WithAdvisoryLock::Base.new(nil, nil, nil)
    impl.lock_stack.must_be_empty
    Tag.with_advisory_lock("first") do
      impl.lock_stack.must_equal %w(first)
      Tag.with_advisory_lock("second") do
        impl.lock_stack.must_equal %w(first second)
        Tag.with_advisory_lock("first") do
          # Shouldn't ask for another lock:
          impl.lock_stack.must_equal %w(first second)
          Tag.with_advisory_lock("second") do
            # Shouldn't ask for another lock:
            impl.lock_stack.must_equal %w(first second)
          end
        end
      end
      impl.lock_stack.must_equal %w(first)
    end
    impl.lock_stack.must_be_empty
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
with_advisory_lock-0.0.8 test/nesting_test.rb
with_advisory_lock-0.0.7 test/nesting_test.rb
with_advisory_lock-0.0.6 test/nesting_test.rb