adhearsion 1.2.6 → 2.0.0.alpha1

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.
Files changed (236) hide show
  1. data/.gitignore +17 -10
  2. data/CHANGELOG.md +273 -0
  3. data/Gemfile +1 -1
  4. data/Guardfile +17 -0
  5. data/README.markdown +61 -9
  6. data/Rakefile +16 -48
  7. data/adhearsion.gemspec +21 -7
  8. data/bin/ahn +3 -1
  9. data/cucumber.yml +4 -0
  10. data/features/app_generator.feature +42 -0
  11. data/features/cli.feature +108 -0
  12. data/features/step_definitions/app_generator_steps.rb +6 -0
  13. data/features/step_definitions/cli_steps.rb +74 -0
  14. data/features/support/aruba_helper.rb +22 -0
  15. data/features/support/env.rb +37 -0
  16. data/features/support/utils.rb +8 -0
  17. data/lib/adhearsion.rb +85 -41
  18. data/lib/adhearsion/call.rb +176 -0
  19. data/lib/adhearsion/call_controller.rb +134 -0
  20. data/lib/adhearsion/call_controller/dial.rb +70 -0
  21. data/lib/adhearsion/call_controller/input.rb +173 -0
  22. data/lib/adhearsion/call_controller/menu.rb +124 -0
  23. data/lib/adhearsion/call_controller/output.rb +267 -0
  24. data/lib/adhearsion/call_controller/record.rb +42 -0
  25. data/lib/adhearsion/call_controller/utility.rb +60 -0
  26. data/lib/adhearsion/calls.rb +81 -0
  27. data/lib/adhearsion/cli.rb +1 -3
  28. data/lib/adhearsion/cli_commands.rb +142 -0
  29. data/lib/adhearsion/configuration.rb +149 -0
  30. data/lib/adhearsion/console.rb +19 -8
  31. data/lib/adhearsion/dialplan_controller.rb +9 -0
  32. data/lib/adhearsion/events.rb +84 -0
  33. data/lib/adhearsion/foundation/all.rb +0 -7
  34. data/lib/adhearsion/foundation/custom_daemonizer.rb +4 -6
  35. data/lib/adhearsion/foundation/exception_handler.rb +9 -0
  36. data/lib/adhearsion/foundation/object.rb +26 -8
  37. data/lib/adhearsion/foundation/synchronized_hash.rb +3 -6
  38. data/lib/adhearsion/foundation/thread_safety.rb +17 -1
  39. data/lib/adhearsion/generators/app/app_generator.rb +4 -13
  40. data/lib/adhearsion/generators/app/templates/Gemfile +10 -5
  41. data/lib/adhearsion/generators/app/templates/Procfile +1 -0
  42. data/lib/adhearsion/generators/app/templates/README.md +28 -0
  43. data/lib/adhearsion/generators/app/templates/config/adhearsion.rb +41 -0
  44. data/lib/adhearsion/generators/app/templates/{components/simon_game → lib}/simon_game.rb +6 -18
  45. data/lib/adhearsion/generators/app/templates/script/ahn +2 -2
  46. data/lib/adhearsion/initializer.rb +151 -293
  47. data/lib/adhearsion/initializer/logging.rb +33 -0
  48. data/lib/adhearsion/logging.rb +65 -69
  49. data/lib/adhearsion/menu_dsl.rb +15 -0
  50. data/lib/adhearsion/menu_dsl/calculated_match.rb +39 -0
  51. data/lib/adhearsion/menu_dsl/calculated_match_collection.rb +41 -0
  52. data/lib/adhearsion/menu_dsl/fixnum_match_calculator.rb +18 -0
  53. data/lib/adhearsion/menu_dsl/match_calculator.rb +36 -0
  54. data/lib/adhearsion/{voip/menu_state_machine/menu_class.rb → menu_dsl/menu.rb} +38 -40
  55. data/lib/adhearsion/menu_dsl/menu_builder.rb +69 -0
  56. data/lib/adhearsion/menu_dsl/range_match_calculator.rb +55 -0
  57. data/lib/adhearsion/menu_dsl/string_match_calculator.rb +21 -0
  58. data/lib/adhearsion/outbound_call.rb +64 -0
  59. data/lib/adhearsion/plugin.rb +319 -0
  60. data/lib/adhearsion/plugin/collection.rb +19 -0
  61. data/lib/adhearsion/plugin/initializer.rb +37 -0
  62. data/lib/adhearsion/plugin/methods_container.rb +6 -0
  63. data/lib/adhearsion/process.rb +94 -0
  64. data/lib/adhearsion/punchblock_plugin.rb +29 -0
  65. data/lib/adhearsion/punchblock_plugin/initializer.rb +137 -0
  66. data/lib/adhearsion/router.rb +30 -0
  67. data/lib/adhearsion/router/route.rb +42 -0
  68. data/lib/adhearsion/script_ahn_loader.rb +2 -2
  69. data/lib/adhearsion/tasks.rb +14 -9
  70. data/lib/adhearsion/tasks/configuration.rb +26 -0
  71. data/lib/adhearsion/tasks/plugins.rb +17 -0
  72. data/lib/adhearsion/version.rb +8 -14
  73. data/spec/adhearsion/call_controller/dial_spec.rb +138 -0
  74. data/spec/adhearsion/call_controller/input_spec.rb +278 -0
  75. data/spec/adhearsion/call_controller/menu_spec.rb +120 -0
  76. data/spec/adhearsion/call_controller/output_spec.rb +466 -0
  77. data/spec/adhearsion/call_controller/record_spec.rb +125 -0
  78. data/spec/adhearsion/call_controller_spec.rb +395 -0
  79. data/spec/adhearsion/call_spec.rb +438 -0
  80. data/spec/adhearsion/calls_spec.rb +47 -0
  81. data/spec/adhearsion/configuration_spec.rb +308 -0
  82. data/spec/adhearsion/dialplan_controller_spec.rb +26 -0
  83. data/spec/adhearsion/events_spec.rb +112 -0
  84. data/spec/adhearsion/initializer/logging_spec.rb +58 -0
  85. data/spec/adhearsion/initializer_spec.rb +209 -122
  86. data/spec/adhearsion/logging_spec.rb +58 -47
  87. data/spec/adhearsion/menu_dsl/calculated_match_collection_spec.rb +56 -0
  88. data/spec/adhearsion/menu_dsl/calculated_match_spec.rb +57 -0
  89. data/spec/adhearsion/menu_dsl/fixnum_match_calculator_spec.rb +33 -0
  90. data/spec/adhearsion/menu_dsl/match_calculator_spec.rb +13 -0
  91. data/spec/adhearsion/menu_dsl/menu_builder_spec.rb +118 -0
  92. data/spec/adhearsion/menu_dsl/menu_spec.rb +210 -0
  93. data/spec/adhearsion/menu_dsl/range_match_calculator_spec.rb +28 -0
  94. data/spec/adhearsion/menu_dsl/string_match_calculator_spec.rb +36 -0
  95. data/spec/adhearsion/menu_dsl_spec.rb +12 -0
  96. data/spec/adhearsion/outbound_call_spec.rb +174 -0
  97. data/spec/adhearsion/plugin_spec.rb +489 -0
  98. data/spec/adhearsion/process_spec.rb +34 -0
  99. data/spec/adhearsion/punchblock_plugin/initializer_spec.rb +294 -0
  100. data/spec/adhearsion/router/route_spec.rb +99 -0
  101. data/spec/adhearsion/router_spec.rb +106 -0
  102. data/spec/adhearsion_spec.rb +46 -0
  103. data/spec/spec_helper.rb +14 -14
  104. data/spec/support/call_controller_test_helpers.rb +48 -0
  105. data/spec/support/initializer_stubs.rb +8 -13
  106. data/spec/support/punchblock_mocks.rb +6 -0
  107. metadata +255 -253
  108. data/CHANGELOG +0 -174
  109. data/bin/ahnctl +0 -68
  110. data/bin/jahn +0 -43
  111. data/examples/asterisk_manager_interface/standalone.rb +0 -51
  112. data/lib/adhearsion/commands.rb +0 -302
  113. data/lib/adhearsion/component_manager.rb +0 -278
  114. data/lib/adhearsion/component_manager/component_tester.rb +0 -54
  115. data/lib/adhearsion/component_manager/spec_framework.rb +0 -18
  116. data/lib/adhearsion/events_support.rb +0 -65
  117. data/lib/adhearsion/foundation/blank_slate.rb +0 -3
  118. data/lib/adhearsion/foundation/event_socket.rb +0 -205
  119. data/lib/adhearsion/foundation/future_resource.rb +0 -36
  120. data/lib/adhearsion/foundation/metaprogramming.rb +0 -17
  121. data/lib/adhearsion/foundation/numeric.rb +0 -13
  122. data/lib/adhearsion/foundation/pseudo_guid.rb +0 -10
  123. data/lib/adhearsion/foundation/relationship_properties.rb +0 -42
  124. data/lib/adhearsion/foundation/string.rb +0 -26
  125. data/lib/adhearsion/generators/app/templates/.ahnrc +0 -34
  126. data/lib/adhearsion/generators/app/templates/README +0 -8
  127. data/lib/adhearsion/generators/app/templates/components/ami_remote/ami_remote.rb +0 -15
  128. data/lib/adhearsion/generators/app/templates/components/disabled/HOW_TO_ENABLE +0 -7
  129. data/lib/adhearsion/generators/app/templates/components/disabled/stomp_gateway/README.markdown +0 -47
  130. data/lib/adhearsion/generators/app/templates/components/disabled/stomp_gateway/stomp_gateway.rb +0 -34
  131. data/lib/adhearsion/generators/app/templates/components/disabled/stomp_gateway/stomp_gateway.yml +0 -12
  132. data/lib/adhearsion/generators/app/templates/components/disabled/xmpp_gateway/README.markdown +0 -3
  133. data/lib/adhearsion/generators/app/templates/components/disabled/xmpp_gateway/xmpp_gateway.rb +0 -11
  134. data/lib/adhearsion/generators/app/templates/components/disabled/xmpp_gateway/xmpp_gateway.yml +0 -0
  135. data/lib/adhearsion/generators/app/templates/config/startup.rb +0 -81
  136. data/lib/adhearsion/generators/app/templates/dialplan.rb +0 -3
  137. data/lib/adhearsion/generators/app/templates/events.rb +0 -33
  138. data/lib/adhearsion/host_definitions.rb +0 -67
  139. data/lib/adhearsion/initializer/asterisk.rb +0 -86
  140. data/lib/adhearsion/initializer/configuration.rb +0 -324
  141. data/lib/adhearsion/initializer/database.rb +0 -60
  142. data/lib/adhearsion/initializer/drb.rb +0 -31
  143. data/lib/adhearsion/initializer/freeswitch.rb +0 -22
  144. data/lib/adhearsion/initializer/ldap.rb +0 -57
  145. data/lib/adhearsion/initializer/rails.rb +0 -41
  146. data/lib/adhearsion/initializer/xmpp.rb +0 -42
  147. data/lib/adhearsion/tasks/components.rb +0 -32
  148. data/lib/adhearsion/tasks/database.rb +0 -5
  149. data/lib/adhearsion/tasks/deprecations.rb +0 -59
  150. data/lib/adhearsion/tasks/generating.rb +0 -20
  151. data/lib/adhearsion/tasks/lint.rb +0 -4
  152. data/lib/adhearsion/voip/asterisk.rb +0 -4
  153. data/lib/adhearsion/voip/asterisk/agi_server.rb +0 -121
  154. data/lib/adhearsion/voip/asterisk/commands.rb +0 -1966
  155. data/lib/adhearsion/voip/asterisk/config_generators/agents.conf.rb +0 -140
  156. data/lib/adhearsion/voip/asterisk/config_generators/config_generator.rb +0 -102
  157. data/lib/adhearsion/voip/asterisk/config_generators/queues.conf.rb +0 -250
  158. data/lib/adhearsion/voip/asterisk/config_generators/voicemail.conf.rb +0 -240
  159. data/lib/adhearsion/voip/asterisk/config_manager.rb +0 -64
  160. data/lib/adhearsion/voip/asterisk/manager_interface.rb +0 -697
  161. data/lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rb +0 -1681
  162. data/lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb +0 -341
  163. data/lib/adhearsion/voip/asterisk/manager_interface/ami_messages.rb +0 -78
  164. data/lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl +0 -87
  165. data/lib/adhearsion/voip/asterisk/special_dial_plan_managers.rb +0 -80
  166. data/lib/adhearsion/voip/call.rb +0 -521
  167. data/lib/adhearsion/voip/call_routing.rb +0 -64
  168. data/lib/adhearsion/voip/commands.rb +0 -17
  169. data/lib/adhearsion/voip/constants.rb +0 -39
  170. data/lib/adhearsion/voip/conveniences.rb +0 -18
  171. data/lib/adhearsion/voip/dial_plan.rb +0 -252
  172. data/lib/adhearsion/voip/dsl/dialing_dsl.rb +0 -151
  173. data/lib/adhearsion/voip/dsl/dialing_dsl/dialing_dsl_monkey_patches.rb +0 -37
  174. data/lib/adhearsion/voip/dsl/dialplan/control_passing_exception.rb +0 -27
  175. data/lib/adhearsion/voip/dsl/dialplan/dispatcher.rb +0 -124
  176. data/lib/adhearsion/voip/dsl/dialplan/parser.rb +0 -69
  177. data/lib/adhearsion/voip/dsl/dialplan/thread_mixin.rb +0 -16
  178. data/lib/adhearsion/voip/dsl/numerical_string.rb +0 -128
  179. data/lib/adhearsion/voip/freeswitch/basic_connection_manager.rb +0 -48
  180. data/lib/adhearsion/voip/freeswitch/event_handler.rb +0 -58
  181. data/lib/adhearsion/voip/freeswitch/freeswitch_dialplan_command_factory.rb +0 -129
  182. data/lib/adhearsion/voip/freeswitch/inbound_connection_manager.rb +0 -38
  183. data/lib/adhearsion/voip/freeswitch/oes_server.rb +0 -195
  184. data/lib/adhearsion/voip/menu_state_machine/calculated_match.rb +0 -80
  185. data/lib/adhearsion/voip/menu_state_machine/matchers.rb +0 -123
  186. data/lib/adhearsion/voip/menu_state_machine/menu_builder.rb +0 -57
  187. data/lib/adhearsion/xmpp/connection.rb +0 -61
  188. data/lib/theatre.rb +0 -147
  189. data/lib/theatre/README.markdown +0 -64
  190. data/lib/theatre/callback_definition_loader.rb +0 -86
  191. data/lib/theatre/guid.rb +0 -23
  192. data/lib/theatre/invocation.rb +0 -131
  193. data/lib/theatre/namespace_manager.rb +0 -153
  194. data/lib/theatre/version.rb +0 -2
  195. data/spec/adhearsion/cli_spec.rb +0 -306
  196. data/spec/adhearsion/component_manager_spec.rb +0 -292
  197. data/spec/adhearsion/constants_spec.rb +0 -8
  198. data/spec/adhearsion/drb_spec.rb +0 -65
  199. data/spec/adhearsion/fixtures/dialplan.rb +0 -3
  200. data/spec/adhearsion/foundation/event_socket_spec.rb +0 -168
  201. data/spec/adhearsion/host_definitions_spec.rb +0 -79
  202. data/spec/adhearsion/initializer/configuration_spec.rb +0 -291
  203. data/spec/adhearsion/initializer/loading_spec.rb +0 -154
  204. data/spec/adhearsion/initializer/paths_spec.rb +0 -74
  205. data/spec/adhearsion/relationship_properties_spec.rb +0 -54
  206. data/spec/adhearsion/voip/asterisk/agi_server_spec.rb +0 -473
  207. data/spec/adhearsion/voip/asterisk/ami/ami_spec.rb +0 -550
  208. data/spec/adhearsion/voip/asterisk/ami/lexer/ami_fixtures.yml +0 -30
  209. data/spec/adhearsion/voip/asterisk/ami/lexer/lexer_story +0 -291
  210. data/spec/adhearsion/voip/asterisk/ami/lexer/lexer_story.rb +0 -241
  211. data/spec/adhearsion/voip/asterisk/ami/lexer/story_helper.rb +0 -124
  212. data/spec/adhearsion/voip/asterisk/commands_spec.rb +0 -3241
  213. data/spec/adhearsion/voip/asterisk/config_file_generators/agents_spec.rb +0 -251
  214. data/spec/adhearsion/voip/asterisk/config_file_generators/queues_spec.rb +0 -323
  215. data/spec/adhearsion/voip/asterisk/config_file_generators/voicemail_spec.rb +0 -306
  216. data/spec/adhearsion/voip/asterisk/config_manager_spec.rb +0 -127
  217. data/spec/adhearsion/voip/asterisk/menu_command/calculated_match_spec.rb +0 -109
  218. data/spec/adhearsion/voip/asterisk/menu_command/matchers_spec.rb +0 -97
  219. data/spec/adhearsion/voip/call_routing_spec.rb +0 -125
  220. data/spec/adhearsion/voip/dialplan_manager_spec.rb +0 -468
  221. data/spec/adhearsion/voip/dsl/dialing_dsl_spec.rb +0 -270
  222. data/spec/adhearsion/voip/dsl/dispatcher_spec.rb +0 -82
  223. data/spec/adhearsion/voip/dsl/dispatcher_spec_helper.rb +0 -45
  224. data/spec/adhearsion/voip/dsl/parser_spec.rb +0 -69
  225. data/spec/adhearsion/voip/freeswitch/basic_connection_manager_spec.rb +0 -39
  226. data/spec/adhearsion/voip/freeswitch/inbound_connection_manager_spec.rb +0 -39
  227. data/spec/adhearsion/voip/freeswitch/oes_server_spec.rb +0 -9
  228. data/spec/adhearsion/voip/numerical_string_spec.rb +0 -61
  229. data/spec/adhearsion/voip/phone_number_spec.rb +0 -45
  230. data/spec/support/the_following_code.rb +0 -3
  231. data/spec/theatre/dsl_examples/simple_before_call.rb +0 -7
  232. data/spec/theatre/dsl_spec.rb +0 -69
  233. data/spec/theatre/invocation_spec.rb +0 -182
  234. data/spec/theatre/namespace_spec.rb +0 -125
  235. data/spec/theatre/spec_helper_spec.rb +0 -28
  236. data/spec/theatre/theatre_class_spec.rb +0 -148
@@ -1,125 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module NamespaceHelper
4
- class BeValidNamespace
5
-
6
- def matches?(target)
7
- @target = target
8
- Theatre::ActorNamespaceManager.valid_namespace_path? target
9
- end
10
-
11
- def failure_message
12
- "expected #{@target.inspect} to be a valid namespace"
13
- end
14
-
15
- def negative_failure_message
16
- "expected #{@target.inspect} not to be a valid namespace"
17
- end
18
-
19
- end
20
-
21
- def be_valid_actor_event_namespace
22
- BeValidNamespace.new
23
- end
24
-
25
- end
26
-
27
- describe "ActorNamespaceManager" do
28
-
29
- it "should make a registered namespace findable once registered" do
30
- nm = Theatre::ActorNamespaceManager.new
31
- nm.register_namespace_name "/foo/bar/qaz"
32
- nm.search_for_namespace("/foo/bar/qaz").should be_kind_of(Theatre::ActorNamespaceManager::NamespaceNode)
33
- end
34
-
35
- it "should return the new namespace when registering it" do
36
-
37
- end
38
-
39
- it "#search_for_namespace should raise a NamespaceNotFound exception if a namespace one level deep was not found" do
40
- nm = Theatre::ActorNamespaceManager.new
41
- lambda do
42
- nm.search_for_namespace "/foo"
43
- end.should raise_error(Theatre::NamespaceNotFound)
44
- end
45
-
46
- it "#search_for_namespace should raise a NamespaceNotFound exception if a namespace two levels deep was not found" do
47
- nm = Theatre::ActorNamespaceManager.new
48
- lambda do
49
- nm.search_for_namespace "/foo/bar"
50
- end.should raise_error(Theatre::NamespaceNotFound)
51
- end
52
-
53
- describe '::normalize_path_to_array' do
54
- it "should split a standard path properly" do
55
- Theatre::ActorNamespaceManager.normalize_path_to_array("/foo/bar/qaz").should == [:foo, :bar, :qaz]
56
- end
57
-
58
- it "should split out Array()'d form of a String path properly" do
59
- Theatre::ActorNamespaceManager.normalize_path_to_array(["/jay/thomas/phillips"]).should == [:jay,:thomas,:phillips]
60
- end
61
- end
62
-
63
- end
64
-
65
- describe "NamespaceNode" do
66
-
67
- it "when registering a new namespace, the new NamespaceNode should be returned" do
68
- node = Theatre::ActorNamespaceManager::NamespaceNode.new "foobar"
69
- node.register_namespace_name("foobar").should be_instance_of(Theatre::ActorNamespaceManager::NamespaceNode)
70
- end
71
-
72
- it "should not blow away an existing callback when registering a new one with the same name" do
73
- name = "blah"
74
- node = Theatre::ActorNamespaceManager::NamespaceNode.new name
75
- node.register_namespace_name name
76
- before = node.child_named(name)
77
- before.should be_instance_of(Theatre::ActorNamespaceManager::NamespaceNode)
78
- node.register_namespace_name name
79
- before.should eql(node.child_named(name))
80
- end
81
-
82
- describe '#register_namespace_name' do
83
- it "should return the NamespaceNode" do
84
- Theatre::ActorNamespaceManager::NamespaceNode.new("foo").register_namespace_name("bar").should \
85
- be_instance_of(Theatre::ActorNamespaceManager::NamespaceNode)
86
- end
87
- end
88
-
89
- end
90
-
91
- describe "Valid namespace segments" do
92
-
93
- include NamespaceHelper
94
-
95
- describe "a valid namespace path" do
96
-
97
- it "should require a namespace path start with a /" do
98
- "/foo". should be_valid_actor_event_namespace
99
- "foo". should_not be_valid_actor_event_namespace
100
- "foo/bar".should_not be_valid_actor_event_namespace
101
- end
102
-
103
- it "should allow multiple namespace segments" do
104
- "/foo_foo/bar".should be_valid_actor_event_namespace
105
- end
106
-
107
- it "should not allow a trailing forward slash" do
108
- "/foo/bar/".should_not be_valid_actor_event_namespace
109
- end
110
-
111
- it "should not allow backslashes" do
112
- '\foo'.should_not be_valid_actor_event_namespace
113
- '\foo\bar'.should_not be_valid_actor_event_namespace
114
- 'foo\bar'.should_not be_valid_actor_event_namespace
115
- '\bar\\'.should_not be_valid_actor_event_namespace
116
- end
117
-
118
- it "should not allow weird characters" do
119
- %w[ ! @ # $ % ^ & * ( ) { } | ' : ? > < - = ].each do |bad_character|
120
- "/foo#{bad_character}foo/bar".should_not be_valid_actor_event_namespace
121
- end
122
- end
123
-
124
- end
125
- end
@@ -1,28 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "Example" do
4
-
5
- it "should properly load the YAML in a file" do
6
- example_name = :kewlz0rz
7
- data_structure = {:foo => :bar, :qaz => [1,2,3,4,5]}
8
- yaml = data_structure.to_yaml
9
- file_contents = <<-FILE
10
- # Some comment here
11
- =begin YAML
12
- #{yaml}
13
- =end
14
- events.blah.each { |event| }
15
- events.blah2.each { |event| }
16
-
17
- # More comments
18
- =begin
19
- another block
20
- =end
21
- FILE
22
-
23
- flexmock(File).should_receive(:read).once.with(/kewlz0rz\.rb$/).and_return file_contents
24
- example = Example.new(example_name)
25
- example.metadata.should == data_structure
26
- end
27
-
28
- end
@@ -1,148 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "Theatre::Theatre" do
4
-
5
- it "should start the quantity of threads given to its constructor" do
6
- number_of_threads = 13
7
- theatre = Theatre::Theatre.new(number_of_threads)
8
-
9
- flexmock(Thread).should_receive(:new).times(number_of_threads).and_return
10
- flexstub(theatre.send(:instance_variable_get, :@thread_group)).should_receive(:add).and_return
11
-
12
- theatre.start!
13
- end
14
-
15
- it "should not spawn new threads when calling start twice" do
16
- number_of_threads = 5
17
-
18
- theatre = Theatre::Theatre.new(number_of_threads)
19
-
20
- threads = Array.new(number_of_threads) { Thread.new(&theatre.method(:thread_loop)) }
21
- flexmock(Thread).should_receive(:new).times(number_of_threads).and_return *threads
22
-
23
- theatre.start!
24
- theatre.start!
25
- theatre.start!
26
- theatre.start!
27
- theatre.graceful_stop!
28
- end
29
-
30
- describe '#trigger' do
31
-
32
- it "should properly execute the block given" do
33
-
34
- has_ran = false
35
-
36
- theatre = Theatre::Theatre.new
37
- theatre.register_namespace_name "cheezburger"
38
- theatre.register_callback_at_namespace "cheezburger", lambda { |payload| has_ran = payload }
39
-
40
- theatre.start!
41
-
42
- theatre.trigger "cheezburger", :yes
43
- theatre.graceful_stop!
44
- theatre.join
45
-
46
- has_ran.should equal(:yes)
47
- end
48
-
49
- it "should return an Array of Invocation objects" do
50
- theatre = Theatre::Theatre.new
51
- theatre.register_namespace_name "qaz"
52
- theatre.register_callback_at_namespace "qaz", lambda {}
53
- return_value = theatre.trigger("qaz")
54
- return_value.should be_instance_of(Array)
55
- return_value.should have(1).item
56
- return_value.first.should be_instance_of(Theatre::Invocation)
57
- end
58
-
59
- end
60
-
61
- describe '#trigger_immediately' do
62
- it "should continue executing callbacks when a link in the chain raises an Exception" do
63
- callbacks = [lambda { 1 }, lambda { raise LocalJumpError }, lambda { 3 }]
64
-
65
- theatre = Theatre::Theatre.new
66
- theatre.register_namespace_name "breakage"
67
-
68
- callbacks.each do |callback|
69
- theatre.register_callback_at_namespace "breakage", callback
70
- end
71
-
72
- flexmock(Adhearsion::Events).should_receive(:trigger).once.with('/exception', FlexMock.on {|e| e.is_a?(StandardError)})
73
- return_value = theatre.trigger_immediately("breakage")
74
- return_value.first.should equal(1)
75
- return_value[1].should be_instance_of(LocalJumpError)
76
- return_value.last.should equal(3)
77
- end
78
- end
79
-
80
- describe '#callbacks_for_namespaces' do
81
- it "should properly return Procs which have been registered against a namespace" do
82
- callback = lambda { :callback }
83
- theatre = Theatre::Theatre.new
84
- theatre.register_namespace_name "pumpkin"
85
- theatre.register_callback_at_namespace "pumpkin", callback
86
- theatre.namespace_manager.callbacks_for_namespaces("pumpkin").should eql([callback])
87
- end
88
- end
89
-
90
- describe '#join' do
91
- it "should execute join() on every ThreadGroup thread" do
92
- thread_mocks = Array(3) do
93
- bogus_thread = flexmock "bogus thread"
94
- bogus_thread.should_receive(:join).once.and_return
95
- bogus_thread
96
- end
97
- bogus_thread_group = flexmock "A ThreadGroup which returns an Array of mock Threads", :list => thread_mocks
98
- theatre = Theatre::Theatre.new
99
- theatre.send(:instance_variable_set, :@thread_group, bogus_thread_group)
100
- theatre.join
101
- end
102
- end
103
-
104
- describe '#thread_loop' do
105
-
106
- it "should continue looping even after an exception been raised" do
107
- mock_invocation = flexmock "mock Invocation which raises when started"
108
- mock_invocation.should_receive(:start).once.and_raise ArgumentError # Simulate logic error
109
-
110
- theatre = Theatre::Theatre.new
111
- master_queue = theatre.send(:instance_variable_get, :@master_queue)
112
- flexmock(theatre).should_receive(:loop).once.and_yield
113
- flexmock(master_queue).should_receive(:pop).once.and_return mock_invocation
114
-
115
- lambda do
116
- theatre.send(:thread_loop).should equal(:stopped)
117
- end.should_not raise_error(ArgumentError)
118
- end
119
-
120
- it "should run the callback of the Invocation it receives from the master_queue" do
121
- has_executed = false
122
-
123
- invocation = Theatre::Invocation.new("/foo/bar", lambda { has_executed = true })
124
- invocation.queued
125
-
126
- theatre = Theatre::Theatre.new
127
-
128
- master_queue = theatre.send(:instance_variable_get, :@master_queue)
129
-
130
- flexmock(theatre).should_receive(:loop).and_yield
131
- flexmock(master_queue).should_receive(:pop).once.and_return invocation
132
-
133
- theatre.send :thread_loop
134
-
135
- has_executed.should be_true
136
- end
137
-
138
- it "should stop when receiving the shutdown command and return :stopped" do
139
- theatre = Theatre::Theatre.new
140
- master_queue = theatre.send(:instance_variable_get, :@master_queue)
141
- flexmock(theatre).should_receive(:loop).once.and_yield
142
- flexmock(master_queue).should_receive(:pop).once.and_return :THEATRE_SHUTDOWN!
143
- theatre.send(:thread_loop).should equal(:stopped)
144
- end
145
-
146
- end
147
-
148
- end