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 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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
require "spec/helper/all"
require "em-synchrony/activerecord"
require "em-synchrony/fiber_iterator"
# mysql < spec/widgets.sql
class Widget < ActiveRecord::Base; end;
describe "Fiberized ActiveRecord driver for mysql2" do
DELAY = 0.25
QUERY = "SELECT sleep(#{DELAY})"
LOGGER = Logger.new(STDOUT).tap do |logger|
logger.formatter = proc do |_severity, datetime, _progname, msg|
"[#{datetime.strftime('%Y-%m-%d %H:%M:%S')} ##{Fiber.current.object_id}] -- : #{msg}\n"
end
end
before(:all) do
ActiveRecord::Base.logger = LOGGER if ENV['LOGGER']
end
def establish_connection
ActiveRecord::Base.establish_connection(
:adapter => 'em_mysql2',
:database => 'widgets',
:username => 'root',
:pool => 10
)
Widget.delete_all
end
xit "should establish AR connection" do
EventMachine.synchrony do
establish_connection
result = Widget.find_by_sql(QUERY)
result.size.should eql(1)
EventMachine.stop
end
end
xit "should fire sequential, synchronous requests within single fiber" do
EventMachine.synchrony do
establish_connection
start = now
res = []
res.push Widget.find_by_sql(QUERY)
res.push Widget.find_by_sql(QUERY)
(now - start.to_f).should be_within(DELAY * res.size * 0.15).of(DELAY * res.size)
res.size.should eql(2)
EventMachine.stop
end
end
xit "should fire 100 requests in fibers" do
EM.synchrony do
establish_connection
EM::Synchrony::FiberIterator.new(1..100, 40).each do |i|
widget = Widget.create title: 'hi'
widget.update_attributes title: 'hello'
end
EM.stop
end
end
xit "should create widget" do
EM.synchrony do
establish_connection
Widget.create
Widget.create
Widget.count.should eql(2)
EM.stop
end
end
xit "should update widget" do
EM.synchrony do
establish_connection
ActiveRecord::Base.connection.execute("TRUNCATE TABLE widgets;")
widget = Widget.create title: 'hi'
widget.update_attributes title: 'hello'
Widget.find(widget.id).title.should eql('hello')
EM.stop
end
end
describe "transactions" do
xit "should work properly" do
EM.synchrony do
establish_connection
EM::Synchrony::FiberIterator.new(1..50, 30).each do |i|
widget = Widget.create title: "hi#{i}"
ActiveRecord::Base.transaction do
widget.update_attributes title: "hello"
end
ActiveRecord::Base.transaction do
widget.update_attributes(title: 'hey')
raise ActiveRecord::Rollback
end
end
Widget.all.each do |widget|
widget.title.should eq('hello')
end
EM.stop
end
end
end
end
|