File: activerecord_spec.rb

package info (click to toggle)
ruby-em-synchrony 1.0.5-3.1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye
  • size: 572 kB
  • sloc: ruby: 3,458; sh: 37; sql: 7; makefile: 2
file content (113 lines) | stat: -rw-r--r-- 2,835 bytes parent folder | download | duplicates (2)
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