em-test 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in em-test.gemspec
4
+ gemspec
@@ -0,0 +1,46 @@
1
+ About
2
+ =====
3
+
4
+ Simple TDD API for testing asynchronous EventMachine code. Extracted from em-spec.
5
+
6
+ (c) 2008 Aman Gupta (tmm1)
7
+
8
+ Usage
9
+ =====
10
+
11
+ There are two ways to use the `Test::Unit` extension. To use it as a helper, include `EM::TestHelper` in your test unit class. You then use the `em` method to wrap your evented test code. Inside the `em` block, you must call `#done` after your expectations. Everything works normally otherwise.
12
+
13
+ ```ruby
14
+ require 'em-test'
15
+
16
+ class EmTestHelperTest < Test::Unit::TestCase
17
+ include EventMachine::TestHelper
18
+
19
+ def test_trivial
20
+ em do
21
+ assert_equal 1, 1
22
+ done
23
+ end
24
+ end
25
+ end
26
+ ```
27
+
28
+ The other option is to include `EM::Test` in your test class. This will patch `Test::Unit` so that all of your examples run inside an `em` block automatically:
29
+
30
+ ```ruby
31
+ require 'em-test'
32
+
33
+ class EmTestTest < Test::Unit::TestCase
34
+ include EventMachine::Test
35
+
36
+ def test_timer
37
+ start = Time.now
38
+
39
+ EM.add_timer(0.5){
40
+ assert_in_delta 0.5, Time.now-start, 0.1
41
+ done
42
+ }
43
+ end
44
+ end
45
+ ```
46
+
@@ -0,0 +1,8 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new(:test) do |test|
5
+ test.pattern = 'test/**/*_test.rb'
6
+ test.libs << 'lib' << 'test'
7
+ end
8
+
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "em-test/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "em-test"
7
+ s.version = EventMachine::Test::VERSION
8
+ s.authors = ["Paweł Pacana"]
9
+ s.email = ["pawel.pacana@gmail.com"]
10
+ s.homepage = ""
11
+ s.summary = "TDD for EventMachine"
12
+ s.description = "Simple TDD API for testing asynchronous EventMachine code. Extracted from em-spec to remove dependencies."
13
+ s.rubyforge_project = "em-test"
14
+ s.files = `git ls-files`.split("\n")
15
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
+ s.require_paths = ["lib"]
18
+ s.required_ruby_version = '~> 1.9.2'
19
+
20
+ s.add_dependency 'eventmachine', '>= 1.0.0.beta.1'
21
+ end
@@ -0,0 +1,95 @@
1
+ require 'em-test/version'
2
+ require 'eventmachine'
3
+
4
+ module EventMachine
5
+ TestTimeoutExceededError = Class.new(RuntimeError)
6
+
7
+ module TestHelper
8
+
9
+ def self.included(cls)
10
+ cls.class_eval(<<-HERE_DOC, __FILE__, __LINE__)
11
+ DefaultTimeout = nil unless const_defined?(:DefaultTimeout)
12
+
13
+ def self.default_timeout(timeout)
14
+
15
+ if self.const_defined? :DefaultTimeout
16
+ self.ancestors.each do |cls|
17
+ begin
18
+ cls.send(:remove_const, :DefaultTimeout)
19
+ cls.send(:const_set, :DefaultTimeout, timeout)
20
+ break
21
+ rescue
22
+ end
23
+ end
24
+ else
25
+ self.send(:const_set, :DefaultTimeout, timeout)
26
+ end
27
+ end
28
+
29
+ def current_default_timeout
30
+ DefaultTimeout
31
+ end
32
+ HERE_DOC
33
+ end
34
+
35
+ def timeout(time_to_run)
36
+ EM.cancel_timer(@_em_timer) if @_em_timer
37
+ @_em_timer = EM.add_timer(time_to_run) { done('timeout exceeded') }
38
+ end
39
+
40
+ def em(time_to_run = current_default_timeout, &block)
41
+ @flunk_test = nil
42
+ EM.run do
43
+ timeout(time_to_run) if time_to_run
44
+ em_spec_exception = nil
45
+ @_em_spec_fiber = Fiber.new do
46
+ @_output = begin
47
+ block.call
48
+ rescue Exception => em_spec_exception
49
+ done
50
+ end
51
+ Fiber.yield
52
+ end
53
+ @_em_spec_fiber.resume
54
+
55
+ raise em_spec_exception if em_spec_exception
56
+ end
57
+ raise(@flunk_test) if @flunk_test
58
+ @_output
59
+ end
60
+
61
+ def done(flunk_reason = nil)
62
+ EM.next_tick {
63
+ @flunk_test = flunk_reason
64
+ finish_em_spec_fiber
65
+ }
66
+ end
67
+
68
+ private
69
+ def finish_em_spec_fiber
70
+ EM.stop_event_loop if EM.reactor_running?
71
+ @_em_spec_fiber.resume if @_em_spec_fiber.alive?
72
+ end
73
+
74
+ end
75
+
76
+ module Test
77
+ def self.included(cls)
78
+ cls.class_eval(<<-HERE_DOC, __FILE__, __LINE__)
79
+ include TestHelper
80
+
81
+ alias_method :run_without_em, :run
82
+ def run(result, &block)
83
+ em(DefaultTimeout) { run_without_em(result, &block) }
84
+ rescue Exception => e
85
+ if RUBY_VERSION >= "1.9.1"
86
+ result.puke(self.class, @name, e)
87
+ else
88
+ add_error($!)
89
+ end
90
+ end
91
+
92
+ HERE_DOC
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,5 @@
1
+ module EventMachine
2
+ module Test
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,88 @@
1
+ require 'test_helper'
2
+
3
+ class NormalTest < Test::Unit::TestCase
4
+ def test_trivial
5
+ assert_equal 1, 1
6
+ end
7
+ end
8
+
9
+ class EmTestHelperTest < Test::Unit::TestCase
10
+ include EventMachine::TestHelper
11
+
12
+ def test_trivial
13
+ em do
14
+ assert_equal 1, 1
15
+ done
16
+ end
17
+ end
18
+
19
+ def test_timer
20
+ em do
21
+ start = Time.now
22
+
23
+ EM.add_timer(0.5){
24
+ assert_in_delta 0.5, Time.now-start, 0.1
25
+ done
26
+ }
27
+ end
28
+ end
29
+ end
30
+
31
+ class EmTestTest < Test::Unit::TestCase
32
+ include EventMachine::Test
33
+
34
+ def test_working
35
+ done
36
+ end
37
+
38
+ def test_timer
39
+ start = Time.now
40
+
41
+ EM.add_timer(0.5){
42
+ assert_in_delta 0.5, Time.now-start, 0.1
43
+ done
44
+ }
45
+ end
46
+
47
+ def test_deferrable
48
+ defr = EM::DefaultDeferrable.new
49
+ defr.timeout(1)
50
+ defr.errback{
51
+ done
52
+ }
53
+ end
54
+ end
55
+
56
+ class EmTestWithTimeoutTest < Test::Unit::TestCase
57
+ include EventMachine::Test
58
+
59
+ default_timeout 2
60
+
61
+ # if this test fails with RuntimeError: timeout exceeded
62
+ # this is good and expected
63
+ def test_should_fail_to_timeout
64
+ EM.add_timer(3) {
65
+ done
66
+ }
67
+ end
68
+ end
69
+
70
+ class EmTestWithTimeoutOverrideTest < Test::Unit::TestCase
71
+ include EventMachine::Test
72
+
73
+ default_timeout 2
74
+
75
+ def test_timeout_override
76
+ timeout(4)
77
+ EM.add_timer(3) {
78
+ done
79
+ }
80
+ end
81
+ end
82
+
83
+ class AnotherNormalTest < Test::Unit::TestCase
84
+ def test_normal
85
+ assert_equal 1, 1
86
+ end
87
+ end
88
+
@@ -0,0 +1,6 @@
1
+ require 'bundler/setup'
2
+ require 'eventmachine'
3
+ require 'test/unit'
4
+ require 'fiber'
5
+ require 'em-test'
6
+
metadata ADDED
@@ -0,0 +1,66 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: em-test
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Paweł Pacana
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-02-17 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: eventmachine
16
+ requirement: &23665160 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 1.0.0.beta.1
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *23665160
25
+ description: Simple TDD API for testing asynchronous EventMachine code. Extracted
26
+ from em-spec to remove dependencies.
27
+ email:
28
+ - pawel.pacana@gmail.com
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - .gitignore
34
+ - Gemfile
35
+ - README.md
36
+ - Rakefile
37
+ - em-test.gemspec
38
+ - lib/em-test.rb
39
+ - lib/em-test/version.rb
40
+ - test/api_test.rb
41
+ - test/test_helper.rb
42
+ homepage: ''
43
+ licenses: []
44
+ post_install_message:
45
+ rdoc_options: []
46
+ require_paths:
47
+ - lib
48
+ required_ruby_version: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 1.9.2
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ! '>='
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ requirements: []
61
+ rubyforge_project: em-test
62
+ rubygems_version: 1.8.10
63
+ signing_key:
64
+ specification_version: 3
65
+ summary: TDD for EventMachine
66
+ test_files: []