connection_pool_test.rb 3.4 KB
Newer Older
1
require "cases/helper"
2 3 4 5

module ActiveRecord
  module ConnectionAdapters
    class ConnectionPoolTest < ActiveRecord::TestCase
6
      def setup
7 8
        super

9 10
        # Keep a duplicate pool so we do not bother others
        @pool = ConnectionPool.new ActiveRecord::Base.connection_pool.spec
11 12 13 14 15 16 17 18 19 20

        if in_memory_db?
          # Separate connections to an in-memory database create an entirely new database,
          # with an empty schema etc, so we just stub out this schema on the fly.
          @pool.with_connection do |connection|
            connection.create_table :posts do |t|
              t.integer :cololumn
            end
          end
        end
21 22
      end

23 24
      def teardown
        super
25
        @pool.disconnect!
26 27
      end

28 29 30 31 32 33 34 35
      def test_full_pool_exception
        assert_raises(PoolFullError) do
          (@pool.size + 1).times do
            @pool.checkout
          end
        end
      end

36
      def test_reap_and_active
37 38 39 40 41 42 43 44 45
        @pool.checkout
        @pool.checkout
        @pool.checkout
        @pool.timeout = 0

        connections = @pool.connections.dup

        @pool.reap

46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
        assert_equal connections.length, @pool.connections.length
      end

      def test_reap_inactive
        @pool.checkout
        @pool.checkout
        @pool.checkout
        @pool.timeout = 0

        connections = @pool.connections.dup
        connections.each do |conn|
          conn.extend(Module.new { def active?; false; end; })
        end

        @pool.reap

62 63
        assert_equal 0, @pool.connections.length
      ensure
64
        connections.each(&:close)
65 66
      end

67 68 69 70 71 72 73 74 75 76 77 78
      def test_remove_connection
        conn = @pool.checkout
        assert conn.in_use?

        length = @pool.connections.length
        @pool.remove conn
        assert conn.in_use?
        assert_equal(length - 1, @pool.connections.length)
      ensure
        conn.close
      end

79 80 81 82 83
      def test_remove_connection_for_thread
        conn = @pool.connection
        @pool.remove conn
        assert_not_equal(conn, @pool.connection)
      ensure
84
        conn.close if conn
85 86
      end

87 88 89 90 91 92 93 94
      def test_active_connection?
        assert !@pool.active_connection?
        assert @pool.connection
        assert @pool.active_connection?
        @pool.release_connection
        assert !@pool.active_connection?
      end

95 96 97 98 99 100 101 102 103
      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
104
            connection.close
105 106
          end
        end
A
Aaron Patterson 已提交
107

108
        threads.each(&:join)
A
Aaron Patterson 已提交
109

110
        Thread.new do
111
          assert pool.connection
112 113
          pool.connection.close
        end.join
114
      end
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134

      def test_automatic_reconnect=
        pool = ConnectionPool.new ActiveRecord::Base.connection_pool.spec
        assert pool.automatic_reconnect
        assert pool.connection

        pool.disconnect!
        assert pool.connection

        pool.disconnect!
        pool.automatic_reconnect = false

        assert_raises(ConnectionNotEstablished) do
          pool.connection
        end

        assert_raises(ConnectionNotEstablished) do
          pool.with_connection
        end
      end
135 136 137 138

      def test_pool_sets_connection_visitor
        assert @pool.connection.visitor.is_a?(Arel::Visitors::ToSql)
      end
139 140 141
    end
  end
end