@@ -934,6 +934,56 @@ def test_unpin_connection_returns_whether_transaction_has_been_rolledback
934
934
assert_equal false , @pool . unpin_connection!
935
935
end
936
936
937
+ def test_pin_connection_nesting
938
+ assert_instance_of NullTransaction , @pool . lease_connection . current_transaction
939
+ @pool . pin_connection! ( true )
940
+ assert_instance_of RealTransaction , @pool . lease_connection . current_transaction
941
+ @pool . pin_connection! ( true )
942
+ assert_instance_of SavepointTransaction , @pool . lease_connection . current_transaction
943
+ @pool . unpin_connection!
944
+ assert_instance_of RealTransaction , @pool . lease_connection . current_transaction
945
+ @pool . unpin_connection!
946
+ assert_instance_of NullTransaction , @pool . lease_connection . current_transaction
947
+
948
+ assert_raises ( RuntimeError , match : /There isn't a pinned connection/ ) do
949
+ @pool . unpin_connection!
950
+ end
951
+ end
952
+
953
+ def test_pin_connection_nesting_lock
954
+ assert_equal ActiveSupport ::Concurrency ::NullLock , @pool . lease_connection . lock
955
+
956
+ @pool . pin_connection! ( true )
957
+ actual_lock = @pool . lease_connection . lock
958
+ assert_not_equal ActiveSupport ::Concurrency ::NullLock , actual_lock
959
+
960
+ @pool . pin_connection! ( false )
961
+ assert_same actual_lock , @pool . lease_connection . lock
962
+
963
+ @pool . unpin_connection!
964
+ assert_same actual_lock , @pool . lease_connection . lock
965
+
966
+ @pool . unpin_connection!
967
+ assert_equal ActiveSupport ::Concurrency ::NullLock , @pool . lease_connection . lock
968
+ end
969
+
970
+ def test_pin_connection_nesting_lock_inverse
971
+ assert_equal ActiveSupport ::Concurrency ::NullLock , @pool . lease_connection . lock
972
+
973
+ @pool . pin_connection! ( false )
974
+ assert_equal ActiveSupport ::Concurrency ::NullLock , @pool . lease_connection . lock
975
+
976
+ @pool . pin_connection! ( true )
977
+ actual_lock = @pool . lease_connection . lock
978
+ assert_not_equal ActiveSupport ::Concurrency ::NullLock , actual_lock
979
+
980
+ @pool . unpin_connection!
981
+ assert_same actual_lock , @pool . lease_connection . lock # The lock persist until full unpin
982
+
983
+ @pool . unpin_connection!
984
+ assert_equal ActiveSupport ::Concurrency ::NullLock , @pool . lease_connection . lock
985
+ end
986
+
937
987
private
938
988
def active_connections ( pool )
939
989
pool . connections . find_all ( &:in_use? )
0 commit comments