зеркало из
https://github.com/glebtv/telegram-bot.git
synced 2026-09-04 02:05:52 +03:00
Thread-safety for async config methods
Этот коммит содержится в:
@@ -34,6 +34,60 @@ RSpec.shared_examples 'async' do |request_args: -> {}|
|
||||
end.to_not change(instance, :async).from(described_class.default_async_job)
|
||||
end
|
||||
end
|
||||
|
||||
context 'in multi-threaded environment' do
|
||||
it 'changes only in current thread' do
|
||||
thread = nil
|
||||
expect do
|
||||
thread = Thread.new do
|
||||
expect do
|
||||
subject.call(false) do
|
||||
expect(subject[]).to eq false
|
||||
end
|
||||
end.to_not change(instance, :async).from(described_class.default_async_job)
|
||||
sleep 0.2
|
||||
end
|
||||
end.to_not change(instance, :async).from(described_class.default_async_job)
|
||||
thread.join
|
||||
end
|
||||
|
||||
it 'uses default value after block' do
|
||||
thread = Thread.new do
|
||||
subject.call(false) {}
|
||||
expect { sleep 0.2 }.to change(instance, :async).
|
||||
from(described_class.default_async_job).to(nil)
|
||||
end
|
||||
sleep 0.1
|
||||
instance.async = nil
|
||||
thread.join
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe '#async=' do
|
||||
subject { ->(val = new_val) { instance.async = val } }
|
||||
let(:async) {}
|
||||
|
||||
context 'when true is given' do
|
||||
let(:new_val) { true }
|
||||
it { should change(instance, :async).to described_class.default_async_job }
|
||||
end
|
||||
|
||||
context 'when false is given' do
|
||||
let(:new_val) { false }
|
||||
it { should change(instance, :async).to false }
|
||||
end
|
||||
|
||||
context 'when string is given' do
|
||||
let(:new_val) { 'Telegram::Bot::Client' }
|
||||
it { should change(instance, :async).to Object.const_get(new_val) }
|
||||
end
|
||||
|
||||
context 'in multi-threaded environment' do
|
||||
subject { ->(val = new_val) { Thread.new { instance.async = val }.join } }
|
||||
let(:new_val) { true }
|
||||
it { should change(instance, :async).to described_class.default_async_job }
|
||||
end
|
||||
end
|
||||
|
||||
describe '.default_async_job' do
|
||||
|
||||
Ссылка в новой задаче
Block a user