# frozen_string_literal: true require_relative "abstract_unit" class IsolatedExecutionStateTest < ActiveSupport::TestCase setup do ActiveSupport::IsolatedExecutionState.clear @original_isolation_level = ActiveSupport::IsolatedExecutionState.isolation_level end teardown do ActiveSupport::IsolatedExecutionState.clear ActiveSupport::IsolatedExecutionState.isolation_level = @original_isolation_level end test "#[] when isolation level is :fiber" do ActiveSupport::IsolatedExecutionState.isolation_level = :fiber ActiveSupport::IsolatedExecutionState[:test] = 42 assert_equal 42, ActiveSupport::IsolatedExecutionState[:test] enumerator = Enumerator.new do |yielder| yielder.yield ActiveSupport::IsolatedExecutionState[:test] end assert_nil enumerator.next assert_nil Thread.new { ActiveSupport::IsolatedExecutionState[:test] }.value end test "#[] when isolation level is :thread" do ActiveSupport::IsolatedExecutionState.isolation_level = :thread ActiveSupport::IsolatedExecutionState[:test] = 42 assert_equal 42, ActiveSupport::IsolatedExecutionState[:test] enumerator = Enumerator.new do |yielder| yielder.yield ActiveSupport::IsolatedExecutionState[:test] end assert_equal 42, enumerator.next assert_nil Thread.new { ActiveSupport::IsolatedExecutionState[:test] }.value end test "changing the isolation level clear the old store" do original = ActiveSupport::IsolatedExecutionState.isolation_level other = ActiveSupport::IsolatedExecutionState.isolation_level == :fiber ? :thread : :fiber ActiveSupport::IsolatedExecutionState[:test] = 42 ActiveSupport::IsolatedExecutionState.isolation_level = original assert_equal 42, ActiveSupport::IsolatedExecutionState[:test] ActiveSupport::IsolatedExecutionState.isolation_level = other assert_nil ActiveSupport::IsolatedExecutionState[:test] ActiveSupport::IsolatedExecutionState.isolation_level = original assert_nil ActiveSupport::IsolatedExecutionState[:test] end end