connection_pool_test.rb 1.7 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
require "cases/helper"

module ActiveRecord
  module ConnectionAdapters
    class ConnectionPoolTest < ActiveRecord::TestCase
      def test_clear_stale_cached_connections!
        pool = ConnectionPool.new ActiveRecord::Base.connection_pool.spec

        threads = [
          Thread.new { pool.connection },
          Thread.new { pool.connection }]

        threads.map { |t| t.join }

        pool.extend Module.new {
          attr_accessor :checkins
          def checkin conn
            @checkins << conn
            conn.object_id
          end
        }
        pool.checkins = []

        cleared_threads = pool.clear_stale_cached_connections!
        assert((cleared_threads - threads.map { |x| x.object_id }).empty?,
               "threads should have been removed")
        assert_equal pool.checkins.length, threads.length
      end
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

      def test_checkout_behaviour
        pool = ConnectionPool.new ActiveRecord::Base.connection_pool.spec
        connection = pool.connection
        assert_not_nil connection
        threads = []
        4.times do |i|
          threads << Thread.new(i) do |pool_count|
            connection = pool.connection
            assert_not_nil connection
          end
        end
        
        threads.each {|t| t.join}
        
        Thread.new do
          threads.each do |t|
            thread_ids = pool.instance_variable_get(:@reserved_connections).keys
            assert thread_ids.include?(t.object_id)
          end

          pool.connection
          threads.each do |t|
            thread_ids = pool.instance_variable_get(:@reserved_connections).keys
            assert !thread_ids.include?(t.object_id)
          end
        end.join()

      end
58 59 60
    end
  end
end