tmm1-em-spec 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. data/README +40 -0
  2. data/lib/em/spec.rb +58 -0
  3. data/lib/ext/em.rb +37 -0
  4. data/lib/ext/fiber18.rb +70 -0
  5. metadata +64 -0
data/README ADDED
@@ -0,0 +1,40 @@
1
+ Simple BDD API for testing asynchronous Ruby/EventMachine code
2
+ (c) 2008 Aman Gupta (tmm1)
3
+
4
+
5
+ The API is identical to Bacon, except that you must explicitly call 'done' after all the current behavior's assertions have been made:
6
+
7
+ require 'em/spec'
8
+
9
+ EM.describe EventMachine do
10
+
11
+ should 'have timers' do
12
+ start = Time.now
13
+
14
+ EM.add_timer(0.5){
15
+ (Time.now-start).should.be.close 0.5, 0.1
16
+ done
17
+ }
18
+ end
19
+
20
+ should 'have periodic timers' do
21
+ num = 0
22
+ start = Time.now
23
+
24
+ timer = EM.add_periodic_timer(0.5){
25
+ if (num += 1) == 2
26
+ (Time.now-start).should.be.close 1.0, 0.1
27
+ EM.__send__ :cancel_timer, timer
28
+ done
29
+ end
30
+ }
31
+ end
32
+
33
+ end
34
+
35
+
36
+ Resources:
37
+
38
+ Git repository: http://github.com/tmm1/em-spec
39
+ Bacon: http://groups.google.com/group/comp.lang.ruby/browse_thread/thread/30b07b651b0662fd
40
+ Initial announcement: http://groups.google.com/group/eventmachine/browse_thread/thread/8b4e7ead72f9d013
data/lib/em/spec.rb ADDED
@@ -0,0 +1,58 @@
1
+ require File.dirname(__FILE__) + '/../ext/fiber18'
2
+
3
+ require 'bacon'
4
+
5
+ class Bacon::Context
6
+ unless method_defined? :_it
7
+ alias :_it :it
8
+ def it *args
9
+ _it(*args){ if block_given? then yield; Fiber.yield end }
10
+ end
11
+ def done() $bacon_fiber.resume if $bacon_fiber end
12
+ alias :resume :done
13
+ end
14
+ end
15
+
16
+ require 'eventmachine'
17
+
18
+ module EventMachine
19
+ def self.spec *args, &blk
20
+ raise ArgumentError, 'block required' unless block_given?
21
+ raise 'EventMachine reactor already running' if EM.reactor_running?
22
+
23
+ EM.run{
24
+ Bacon.summary_on_exit
25
+ ($bacon_fiber = Fiber.new{
26
+ Bacon::Context.new(args.join(' '), &blk)
27
+ EM.stop_event_loop
28
+ }).resume
29
+ }
30
+ end
31
+ class << self; alias :describe :spec; end
32
+ end
33
+
34
+ EM.describe EventMachine do
35
+
36
+ should 'have timers' do
37
+ start = Time.now
38
+
39
+ EM.add_timer(0.5){
40
+ (Time.now-start).should.be.close 0.5, 0.1
41
+ done
42
+ }
43
+ end
44
+
45
+ should 'have periodic timers' do
46
+ num = 0
47
+ start = Time.now
48
+
49
+ timer = EM.add_periodic_timer(0.5){
50
+ if (num += 1) == 2
51
+ (Time.now-start).should.be.close 1.0, 0.1
52
+ EM.__send__ :cancel_timer, timer
53
+ done
54
+ end
55
+ }
56
+ end
57
+
58
+ end if __FILE__ == $0
data/lib/ext/em.rb ADDED
@@ -0,0 +1,37 @@
1
+ begin
2
+ require 'eventmachine'
3
+ rescue LoadError
4
+ require 'rubygems'
5
+ require 'eventmachine'
6
+ end
7
+
8
+ # copied from EM trunk, will be removed when 0.12.1 is released
9
+ if EM::VERSION < '0.12.1'
10
+
11
+ def EventMachine::run blk=nil, tail=nil, &block
12
+ @tails ||= []
13
+ tail and @tails.unshift(tail)
14
+
15
+ if reactor_running?
16
+ (b = blk || block) and b.call # next_tick(b)
17
+ else
18
+ @conns = {}
19
+ @acceptors = {}
20
+ @timers = {}
21
+ begin
22
+ @reactor_running = true
23
+ initialize_event_machine
24
+ (b = blk || block) and add_timer(0, b)
25
+ run_machine
26
+ ensure
27
+ release_machine
28
+ @reactor_running = false
29
+ end
30
+
31
+ until @tails.empty?
32
+ @tails.pop.call
33
+ end
34
+ end
35
+ end
36
+
37
+ end
@@ -0,0 +1,70 @@
1
+ # Poor Man's Fiber (API compatible Thread based Fiber implementation for Ruby 1.8)
2
+ # (c) 2008 Aman Gupta (tmm1)
3
+
4
+ unless defined? Fiber
5
+ require 'thread'
6
+
7
+ class FiberError < StandardError; end
8
+
9
+ class Fiber
10
+ def initialize
11
+ raise ArgumentError, 'new Fiber requires a block' unless block_given?
12
+
13
+ @yield = Queue.new
14
+ @resume = Queue.new
15
+
16
+ @thread = Thread.new{ @yield.push [ *yield(*@resume.pop) ] }
17
+ @thread.abort_on_exception = true
18
+ @thread[:fiber] = self
19
+ end
20
+ attr_reader :thread
21
+
22
+ def resume *args
23
+ raise FiberError, 'dead fiber called' unless @thread.alive?
24
+ @resume.push(args)
25
+ result = @yield.pop
26
+ result.size > 1 ? result : result.first
27
+ end
28
+
29
+ def yield *args
30
+ @yield.push(args)
31
+ result = @resume.pop
32
+ result.size > 1 ? result : result.first
33
+ end
34
+
35
+ def self.yield *args
36
+ raise FiberError, "can't yield from root fiber" unless fiber = Thread.current[:fiber]
37
+ fiber.yield(*args)
38
+ end
39
+
40
+ def self.current
41
+ Thread.current[:fiber] or raise FiberError, 'not inside a fiber'
42
+ end
43
+
44
+ def inspect
45
+ "#<#{self.class}:0x#{self.object_id.to_s(16)}>"
46
+ end
47
+ end
48
+ end
49
+
50
+ if __FILE__ == $0
51
+ f = Fiber.new{ puts 'hi'; p Fiber.yield(1); puts 'bye'; :done }
52
+ p f.resume
53
+ p f.resume(2)
54
+ end
55
+
56
+ __END__
57
+
58
+ $ ruby fbr.rb
59
+ hi
60
+ 1
61
+ 2
62
+ bye
63
+ :done
64
+
65
+ $ ruby1.9 fbr.rb
66
+ hi
67
+ 1
68
+ 2
69
+ bye
70
+ :done
metadata ADDED
@@ -0,0 +1,64 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tmm1-em-spec
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Aman Gupta
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-08-01 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: eventmachine
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 0.12.0
23
+ version:
24
+ description: Bacon based BDD API for Ruby/EventMachine
25
+ email: em-spec@tmm1.net
26
+ executables: []
27
+
28
+ extensions: []
29
+
30
+ extra_rdoc_files: []
31
+
32
+ files:
33
+ - README
34
+ - lib/em/spec.rb
35
+ - lib/ext/em.rb
36
+ - lib/ext/fiber18.rb
37
+ has_rdoc: false
38
+ homepage: http://github.com/tmm1/em-spec
39
+ post_install_message:
40
+ rdoc_options: []
41
+
42
+ require_paths:
43
+ - lib
44
+ required_ruby_version: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: "0"
49
+ version:
50
+ required_rubygems_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: "0"
55
+ version:
56
+ requirements: []
57
+
58
+ rubyforge_project:
59
+ rubygems_version: 1.2.0
60
+ signing_key:
61
+ specification_version: 2
62
+ summary: Bacon based BDD API for Ruby/EventMachine
63
+ test_files: []
64
+