tengine_core 0.5.28

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 (156) hide show
  1. data/.document +5 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +40 -0
  4. data/Gemfile.lock +95 -0
  5. data/README.md +54 -0
  6. data/Rakefile +44 -0
  7. data/VERSION +1 -0
  8. data/bin/tengine_atd +8 -0
  9. data/bin/tengine_heartbeat_watchd +8 -0
  10. data/bin/tengined +182 -0
  11. data/examples/VERSION +1 -0
  12. data/examples/uc01_execute_processing_for_event.rb +11 -0
  13. data/examples/uc02_fire_another_event.rb +16 -0
  14. data/examples/uc03_2handlers_for_1event.rb +16 -0
  15. data/examples/uc08_if_both_a_and_b_occurs.rb +11 -0
  16. data/examples/uc10_if_the_event_occurs_at_the_server.rb +15 -0
  17. data/examples/uc50_commit_event_at_first.rb +17 -0
  18. data/examples/uc51_commit_event_at_first_submit.rb +29 -0
  19. data/examples/uc52_commit_event_after_all_handler_submit.rb +31 -0
  20. data/examples/uc52_never_commit_event_unless_all_handler_submit.rb +31 -0
  21. data/examples/uc60_event_in_handler.rb +18 -0
  22. data/examples/uc62_session_in_driver.rb +16 -0
  23. data/examples/uc64_safety_countup.rb +14 -0
  24. data/examples/uc70_driver_enabled_on_activation.rb +13 -0
  25. data/examples/uc71_driver_disabled_on_activation.rb +14 -0
  26. data/examples/uc72_setup_eventmachine.rb +17 -0
  27. data/examples/uc80_raise_io_error.rb +10 -0
  28. data/examples/uc81_raise_runtime_error.rb +10 -0
  29. data/examples2/driver01.rb +18 -0
  30. data/examples2/driver02.rb +19 -0
  31. data/examples2/uc08_if_both_a_and_b_occurs.rb +13 -0
  32. data/examples2/uc10_if_the_event_occurs_at_the_server.rb +18 -0
  33. data/examples2/uc51_commit_event_at_first_submit_1.rb +16 -0
  34. data/examples2/uc51_commit_event_at_first_submit_2.rb +17 -0
  35. data/examples2/uc51_commit_event_at_first_submit_3.rb +17 -0
  36. data/examples2/uc62_session_in_driver.rb +16 -0
  37. data/examples2/uc71_driver_disabled_on_activation.rb +16 -0
  38. data/failure_examples/VERSION +1 -0
  39. data/failure_examples/uc53_submit_outside_of_handler.rb +15 -0
  40. data/failure_examples/uc61_event_outside_of_handler.rb +12 -0
  41. data/failure_examples/uc63_session_outside_of_driver.rb +13 -0
  42. data/lib/tengine/core.rb +74 -0
  43. data/lib/tengine/core/bootstrap.rb +123 -0
  44. data/lib/tengine/core/collection_accessible.rb +34 -0
  45. data/lib/tengine/core/config.rb +10 -0
  46. data/lib/tengine/core/config/atd.rb +225 -0
  47. data/lib/tengine/core/config/core.rb +319 -0
  48. data/lib/tengine/core/config/heartbeat_watcher.rb +229 -0
  49. data/lib/tengine/core/connection_test/.gitignore +1 -0
  50. data/lib/tengine/core/connection_test/fire_bar_on_foo.rb +16 -0
  51. data/lib/tengine/core/driveable.rb +213 -0
  52. data/lib/tengine/core/driver.rb +69 -0
  53. data/lib/tengine/core/driver/finder.rb +42 -0
  54. data/lib/tengine/core/dsl_evaluator.rb +110 -0
  55. data/lib/tengine/core/dsl_filter_def.rb +11 -0
  56. data/lib/tengine/core/dsl_loader.rb +108 -0
  57. data/lib/tengine/core/event.rb +145 -0
  58. data/lib/tengine/core/event/finder.rb +82 -0
  59. data/lib/tengine/core/event_exception_reportable.rb +88 -0
  60. data/lib/tengine/core/event_wrapper.rb +21 -0
  61. data/lib/tengine/core/find_by_name.rb +31 -0
  62. data/lib/tengine/core/handler.rb +152 -0
  63. data/lib/tengine/core/handler_path.rb +33 -0
  64. data/lib/tengine/core/heartbeat_watcher.rb +161 -0
  65. data/lib/tengine/core/io_to_logger.rb +22 -0
  66. data/lib/tengine/core/kernel.rb +510 -0
  67. data/lib/tengine/core/kernel_runtime.rb +91 -0
  68. data/lib/tengine/core/method_traceable.rb +38 -0
  69. data/lib/tengine/core/mongoid_fix.rb +19 -0
  70. data/lib/tengine/core/mutex.rb +177 -0
  71. data/lib/tengine/core/optimistic_lock.rb +69 -0
  72. data/lib/tengine/core/plugins.rb +54 -0
  73. data/lib/tengine/core/schedule.rb +21 -0
  74. data/lib/tengine/core/scheduler.rb +156 -0
  75. data/lib/tengine/core/selectable_attr.rb +29 -0
  76. data/lib/tengine/core/session.rb +21 -0
  77. data/lib/tengine/core/session_wrapper.rb +68 -0
  78. data/lib/tengine/core/setting.rb +21 -0
  79. data/lib/tengine/core/validation.rb +36 -0
  80. data/lib/tengine/errors.rb +18 -0
  81. data/lib/tengine/rspec.rb +8 -0
  82. data/lib/tengine/rspec/context_wrapper.rb +51 -0
  83. data/lib/tengine/rspec/extension.rb +53 -0
  84. data/lib/tengine_core.rb +23 -0
  85. data/spec/factories/tengine_core_drivers.rb +10 -0
  86. data/spec/factories/tengine_core_events.rb +14 -0
  87. data/spec/factories/tengine_core_handler_paths.rb +9 -0
  88. data/spec/factories/tengine_core_handlers.rb +9 -0
  89. data/spec/factories/tengine_core_sessions.rb +9 -0
  90. data/spec/mongoid.yml +35 -0
  91. data/spec/spec_helper.rb +48 -0
  92. data/spec/support/mongo_index_key_log.rb +91 -0
  93. data/spec/tengine/core/bootstrap_spec.rb +278 -0
  94. data/spec/tengine/core/bugfix/bind_dsl_file_in_multi_byte_dir_spec.rb +21 -0
  95. data/spec/tengine/core/bugfix/enabled_on_activation_spec.rb +112 -0
  96. data/spec/tengine/core/bugfix/receive_event_spec.rb +133 -0
  97. data/spec/tengine/core/bugfix/use_dsl_version_method.rb +12 -0
  98. data/spec/tengine/core/bugfix/use_dsl_version_method_spec.rb +28 -0
  99. data/spec/tengine/core/bugfix/use_event_in_handler_dsl.rb +11 -0
  100. data/spec/tengine/core/bugfix//351/235/236ACSII/343/201/256/343/203/206/343/202/231/343/202/243/343/203/254/343/202/257/343/203/210/343/203/252/345/220/215/source_location_encoding.rb +35 -0
  101. data/spec/tengine/core/bugfix//351/235/236ACSII/343/201/256/343/203/206/343/202/231/343/202/243/343/203/254/343/202/257/343/203/210/343/203/252/345/220/215//351/235/236ASCII/343/201/256/343/203/225/343/202/241/343/202/244/343/203/253/345/220/215_dsl.rb +38 -0
  102. data/spec/tengine/core/bugfix//351/235/236ACSII/343/201/256/343/203/207/343/202/243/343/203/254/343/202/257/343/203/210/343/203/252/345/220/215/source_location_encoding.rb +35 -0
  103. data/spec/tengine/core/bugfix//351/235/236ACSII/343/201/256/343/203/207/343/202/243/343/203/254/343/202/257/343/203/210/343/203/252/345/220/215//351/235/236ASCII/343/201/256/343/203/225/343/202/241/343/202/244/343/203/253/345/220/215_dsl.rb +38 -0
  104. data/spec/tengine/core/config/atd_spec.rb +62 -0
  105. data/spec/tengine/core/config/core_spec.rb +479 -0
  106. data/spec/tengine/core/config/heartbeat_watcher_spec.rb +62 -0
  107. data/spec/tengine/core/config/syntax_error_in_erb.yml.erb +13 -0
  108. data/spec/tengine/core/config/wrong_category_name.yml.erb +13 -0
  109. data/spec/tengine/core/config/wrong_field_name.yml.erb +12 -0
  110. data/spec/tengine/core/config/wrong_yaml.yml.erb +13 -0
  111. data/spec/tengine/core/config_spec/another_port.yml +54 -0
  112. data/spec/tengine/core/config_spec/config_with_dir_absolute_load_path.yml +16 -0
  113. data/spec/tengine/core/config_spec/config_with_dir_relative_load_path.yml +16 -0
  114. data/spec/tengine/core/config_spec/config_with_file_absolute_load_path.yml +16 -0
  115. data/spec/tengine/core/config_spec/config_with_file_relative_load_path.yml +16 -0
  116. data/spec/tengine/core/config_spec/log_config_spec.rb +235 -0
  117. data/spec/tengine/core/driveable_spec.rb +240 -0
  118. data/spec/tengine/core/driver_spec.rb +159 -0
  119. data/spec/tengine/core/dsl_loader_spec.rb +172 -0
  120. data/spec/tengine/core/dsls/uc08_if_both_a_and_b_occurs_spec.rb +35 -0
  121. data/spec/tengine/core/dsls/uc10_if_the_event_occurs_at_the_server_spec.rb +58 -0
  122. data/spec/tengine/core/dsls/uc50_commit_event_at_first_spec.rb +29 -0
  123. data/spec/tengine/core/dsls/uc52_commit_event_after_all_handler_submit_spec.rb +33 -0
  124. data/spec/tengine/core/dsls/uc52_never_commit_event_unless_all_handler_submit_spec.rb +37 -0
  125. data/spec/tengine/core/dsls/uc53_submit_outside_of_handler_spec.rb +37 -0
  126. data/spec/tengine/core/dsls/uc60_event_in_handler_spec.rb +31 -0
  127. data/spec/tengine/core/dsls/uc61_event_outside_of_handler_spec.rb +37 -0
  128. data/spec/tengine/core/dsls/uc62_session_in_driver_spec.rb +36 -0
  129. data/spec/tengine/core/dsls/uc63_session_outside_of_driver_spec.rb +35 -0
  130. data/spec/tengine/core/dsls/uc64_safety_countup_spec.rb +134 -0
  131. data/spec/tengine/core/dsls/uc70_driver_enabled_on_activation_spec.rb +39 -0
  132. data/spec/tengine/core/dsls/uc71_driver_disabled_on_activation_spec.rb +36 -0
  133. data/spec/tengine/core/dsls/uc72_setup_eventmachine_spec.rb +39 -0
  134. data/spec/tengine/core/dsls/uc80_raise_io_error_spec.rb +53 -0
  135. data/spec/tengine/core/dsls/uc81_raise_runtime_error_spec.rb +49 -0
  136. data/spec/tengine/core/event/finder_spec.rb +136 -0
  137. data/spec/tengine/core/event_exception_reportable_spec.rb +33 -0
  138. data/spec/tengine/core/event_spec.rb +161 -0
  139. data/spec/tengine/core/event_wrapper_spec.rb +35 -0
  140. data/spec/tengine/core/handler_path_spec.rb +87 -0
  141. data/spec/tengine/core/handler_spec.rb +190 -0
  142. data/spec/tengine/core/heartbeat_watcher_spec.rb +131 -0
  143. data/spec/tengine/core/io_to_logger_spec.rb +30 -0
  144. data/spec/tengine/core/kernel_spec.rb +885 -0
  145. data/spec/tengine/core/mutex_spec.rb +184 -0
  146. data/spec/tengine/core/optimistic_lock_spec.rb +55 -0
  147. data/spec/tengine/core/scheculer_spec.rb +121 -0
  148. data/spec/tengine/core/selectable_attr_spec.rb +30 -0
  149. data/spec/tengine/core/session_spec.rb +104 -0
  150. data/spec/tengine/core/setting_spec.rb +79 -0
  151. data/spec/tengine/core_spec.rb +13 -0
  152. data/spec/tengine_spec.rb +14 -0
  153. data/tengine_core.gemspec +248 -0
  154. data/tmp/log/.gitignore +1 -0
  155. data/tmp/tengined_status/.gitignore +1 -0
  156. metadata +421 -0
@@ -0,0 +1,35 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe "uc08_if_both_a_and_b_occurs" do
5
+ before do
6
+ Tengine::Core::Driver.delete_all
7
+ Tengine::Core::Session.delete_all
8
+ config = Tengine::Core::Config::Core.new({
9
+ :tengined => {
10
+ :load_path => File.expand_path('../../../../examples/uc08_if_both_a_and_b_occurs.rb', File.dirname(__FILE__)),
11
+ },
12
+ })
13
+ @bootstrap = Tengine::Core::Bootstrap.new(config)
14
+ @bootstrap.load_dsl
15
+ @kernel = Tengine::Core::Kernel.new(config)
16
+ @kernel.bind
17
+ end
18
+
19
+ it "aとbが両方起きたらハンドラが実行されます" do
20
+ driver = Tengine::Core::Driver.first
21
+ klass = driver.target_class_name.constantize
22
+ obj = klass.new
23
+ klass.should_receive(:new).and_return(obj)
24
+
25
+ mock_headers = mock(:headers)
26
+ mock_headers.should_receive(:ack).exactly(3).times
27
+ raw_event = Tengine::Event.new(:event_type_name => "event08_a")
28
+ @kernel.process_message(mock_headers, raw_event.to_json)
29
+ raw_event = Tengine::Event.new(:event_type_name => "event08_a")
30
+ @kernel.process_message(mock_headers, raw_event.to_json)
31
+ obj.should_receive(:puts).with("handler08")
32
+ raw_event = Tengine::Event.new(:event_type_name => "event_08_b")
33
+ @kernel.process_message(mock_headers, raw_event.to_json)
34
+ end
35
+ end
@@ -0,0 +1,58 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe "uc10_if_the_eent_occures_at_the_server" do
5
+ before(:all) do
6
+ Tengine::Core::Driver.delete_all
7
+ Tengine::Core::Session.delete_all
8
+ @dsl_path = File.expand_path('../../../../examples/uc10_if_the_event_occurs_at_the_server.rb', File.dirname(__FILE__))
9
+ @config = Tengine::Core::Config::Core.new({
10
+ :tengined => {
11
+ :load_path => @dsl_path,
12
+ },
13
+ })
14
+ @bootstrap = Tengine::Core::Bootstrap.new(@config)
15
+ @kernel = Tengine::Core::Kernel.new(@config)
16
+ @bootstrap.load_dsl
17
+ @kernel.bind
18
+ end
19
+
20
+ before do
21
+ driver = Tengine::Core::Driver.first
22
+ driver.handlers.count.should > 0
23
+ klass = driver.target_class_name.constantize
24
+ @obj = klass.new
25
+ klass.stub(:new).and_return(@obj)
26
+ end
27
+
28
+ it "localhostから発火された場合" do
29
+ mock_headers = mock(:headers)
30
+ mock_headers.should_receive(:ack)
31
+ raw_event = Tengine::Event.new(
32
+ :event_type_name => "event10",
33
+ :source_name => "process:localhost/123")
34
+ @obj.should_receive(:puts).with("handler10 for localhost")
35
+ @kernel.process_message(mock_headers, raw_event.to_json)
36
+ end
37
+
38
+ it "test_server1から発火された場合" do
39
+ mock_headers = mock(:headers)
40
+ mock_headers.should_receive(:ack)
41
+ raw_event = Tengine::Event.new(
42
+ :event_type_name => "event10",
43
+ :source_name => "process:test_server1/123")
44
+ @obj.should_receive(:puts).with("handler10 for test_server1")
45
+ @kernel.process_message(mock_headers, raw_event.to_json)
46
+ end
47
+
48
+ it "another_server1から発火された場合" do
49
+ mock_headers = mock(:headers)
50
+ mock_headers.should_receive(:ack)
51
+ raw_event = Tengine::Event.new(
52
+ :event_type_name => "event10",
53
+ :source_name => "process:another_server1/123")
54
+ @obj.should_not_receive(:puts)
55
+ @kernel.process_message(mock_headers, raw_event.to_json)
56
+ end
57
+
58
+ end
@@ -0,0 +1,29 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe "uc50_commit_event_at_first" do
5
+ before do
6
+ config = Tengine::Core::Config::Core.new({
7
+ :tengined => {
8
+ :load_path => File.expand_path('../../../../examples/uc50_commit_event_at_first.rb', File.dirname(__FILE__)),
9
+ },
10
+ })
11
+ @bootstrap = Tengine::Core::Bootstrap.new(config)
12
+ @kernel = @bootstrap.send(:kernel)
13
+ @bootstrap.load_dsl
14
+ @kernel.bind
15
+ end
16
+
17
+ it "必ずACKされている" do
18
+ STDOUT.should_receive(:puts).with("handler50 acknowledged")
19
+ mock_headers = mock(:headers)
20
+ mock_headers.should_receive(:ack)
21
+ raw_event = Tengine::Event.new(:event_type_name => "event50")
22
+ @kernel.before_delegate = lambda do
23
+ # ハンドラへの処理の委譲後(=すべてのハンドラの実行終了後)ackが呼び出されるはず
24
+ mock_headers.should_not_receive(:ack)
25
+ end
26
+ @kernel.process_message(mock_headers, raw_event.to_json)
27
+ end
28
+
29
+ end
@@ -0,0 +1,33 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe "uc52_commit_event_after_all_handler_submit" do
5
+ before do
6
+ Tengine::Core::Driver.delete_all
7
+ Tengine::Core::Session.delete_all
8
+ config = Tengine::Core::Config::Core.new({
9
+ :tengined => {
10
+ :load_path => File.expand_path('../../../../examples/uc52_commit_event_after_all_handler_submit.rb', File.dirname(__FILE__)),
11
+ },
12
+ })
13
+ @bootstrap = Tengine::Core::Bootstrap.new(config)
14
+ @kernel = @bootstrap.send(:kernel)
15
+ @bootstrap.load_dsl
16
+ @kernel.bind
17
+ end
18
+
19
+ it "必ずACKされている" do
20
+ context = @kernel.context
21
+ STDOUT.should_receive(:puts).with("handler52_1 unacknowledged")
22
+ STDOUT.should_receive(:puts).with("handler52_2 unacknowledged")
23
+ STDOUT.should_receive(:puts).with("handler52_3 unacknowledged")
24
+ mock_headers = mock(:headers)
25
+ @kernel.after_delegate = lambda do
26
+ # ハンドラへの処理の委譲後(=すべてのハンドラの実行終了後)ackが呼び出されるはず
27
+ mock_headers.should_receive(:ack)
28
+ end
29
+ raw_event = Tengine::Event.new(:event_type_name => "event52")
30
+ @kernel.process_message(mock_headers, raw_event.to_json)
31
+ end
32
+
33
+ end
@@ -0,0 +1,37 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe "uc52_commit_event_after_all_handler_submit" do
5
+ before do
6
+ Tengine::Core::HandlerPath.delete_all
7
+ Tengine::Core::Driver.delete_all
8
+ Tengine::Core::Session.delete_all
9
+ config = Tengine::Core::Config::Core.new({
10
+ :tengined => {
11
+ :load_path => File.expand_path('../../../../examples/uc52_never_commit_event_unless_all_handler_submit.rb', File.dirname(__FILE__)),
12
+ },
13
+ })
14
+ @bootstrap = Tengine::Core::Bootstrap.new(config)
15
+ @kernel = @bootstrap.send(:kernel)
16
+ @bootstrap.load_dsl
17
+ @kernel.bind
18
+ end
19
+
20
+ it "一つsubmitしないハンドラがあるのでackされません" do
21
+ context = @kernel.context
22
+ @kernel.ack_policies.should == {"event52_alt1"=>:after_all_handler_submit}
23
+ @kernel.ack?.should == nil
24
+ STDOUT.should_receive(:puts).with("handler52_alt1_1 unacknowledged")
25
+ STDOUT.should_receive(:puts).with("handler52_alt1_2 unacknowledged")
26
+ STDOUT.should_receive(:puts).with("handler52_alt1_3 unacknowledged")
27
+ mock_headers = mock(:headers)
28
+ mock_headers.should_not_receive(:ack)
29
+ raw_event = Tengine::Event.new(:event_type_name => "event52_alt1")
30
+ @kernel.before_delegate = lambda do
31
+ @kernel.all_submitted?.should == false
32
+ end
33
+ @kernel.process_message(mock_headers, raw_event.to_json)
34
+ @kernel.ack?.should == false
35
+ end
36
+
37
+ end
@@ -0,0 +1,37 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe "uc53_submit_outside_of_handler" do
5
+ before do
6
+ Tengine::Core::Driver.delete_all
7
+ Tengine::Core::Session.delete_all
8
+ @dsl_path = File.expand_path('../../../../failure_examples/uc53_submit_outside_of_handler.rb', File.dirname(__FILE__))
9
+ @config = Tengine::Core::Config::Core.new({
10
+ :tengined => {
11
+ :load_path => @dsl_path,
12
+ },
13
+ })
14
+ end
15
+
16
+ it "ロードは失敗してdriver53は登録されず起動できない" do
17
+ @bootstrap = Tengine::Core::Bootstrap.new(@config)
18
+ expect{
19
+ expect{
20
+ @bootstrap.load_dsl
21
+ # }.to raise_error(Tengine::Core::DslError, "submit is not available outside of event handler block.")
22
+ # 仕様変更しました。使うことができないメソッドはRubyで普通にメソッドがない場合と同じように振る舞います
23
+ }.to raise_error(NameError, "undefined local variable or method `submit' for Driver53:Class")
24
+ }.to_not change(Tengine::Core::Driver, :count)
25
+ end
26
+
27
+ it "仮にロードされていてもbindに失敗して起動できない" do
28
+ @kernel = Tengine::Core::Kernel.new(@config)
29
+ driver = Tengine::Core::Driver.new(:name => :driver53, :version => @config.dsl_version)
30
+ driver.handlers.new(:event_type_names => ["event53"], :filepath => @dsl_path, :lineno => 11)
31
+ driver.save!
32
+ expect{
33
+ @kernel.bind
34
+ # }.to raise_error(Tengine::Core::DslError, "submit is not available outside of event handler block.")
35
+ }.to_not raise_error # bindはほとんど何もしなくなりました
36
+ end
37
+ end
@@ -0,0 +1,31 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe "uc62_session_in_driver" do
5
+ before do
6
+ Tengine::Core::Driver.delete_all
7
+ Tengine::Core::Session.delete_all
8
+ config = Tengine::Core::Config::Core.new({
9
+ :tengined => {
10
+ :load_path => File.expand_path('../../../../examples/uc60_event_in_handler.rb', File.dirname(__FILE__)),
11
+ },
12
+ })
13
+ @bootstrap = Tengine::Core::Bootstrap.new(config)
14
+ @bootstrap.load_dsl
15
+ @kernel = Tengine::Core::Kernel.new(config)
16
+ @kernel.bind
17
+ end
18
+
19
+ it "ロード後にはsessionに値が入っている" do
20
+ driver = Tengine::Core::Driver.first
21
+ klass = driver.target_class_name.constantize
22
+ obj = klass.new
23
+ klass.should_receive(:new).and_return(obj)
24
+ obj.should_receive(:puts).with(/^handler60: \[.*\]$/)
25
+
26
+ mock_headers = mock(:headers)
27
+ mock_headers.should_receive(:ack)
28
+ raw_event = Tengine::Event.new(:event_type_name => "event60")
29
+ @kernel.process_message(mock_headers, raw_event.to_json)
30
+ end
31
+ end
@@ -0,0 +1,37 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe "uc61_event_outside_of_handler" do
5
+ before do
6
+ Tengine::Core::Driver.delete_all
7
+ Tengine::Core::Session.delete_all
8
+ @dsl_path = File.expand_path('../../../../failure_examples/uc61_event_outside_of_handler.rb', File.dirname(__FILE__))
9
+ @config = Tengine::Core::Config::Core.new({
10
+ :tengined => {
11
+ :load_path => @dsl_path,
12
+ },
13
+ })
14
+ end
15
+
16
+ it "ロードは失敗してdriver53は登録されず起動できない" do
17
+ @bootstrap = Tengine::Core::Bootstrap.new(@config)
18
+ expect{
19
+ expect{
20
+ @bootstrap.load_dsl
21
+ # }.to raise_error(Tengine::Core::DslError, "event is not available outside of event handler block.")
22
+ # 仕様変更しました。使うことができないメソッドはRubyで普通にメソッドがない場合と同じように振る舞います
23
+ }.to raise_error(NameError, "undefined local variable or method `event' for Driver61:Class")
24
+ }.to_not change(Tengine::Core::Driver, :count)
25
+ end
26
+
27
+ it "仮にロードされていてもbindに失敗して起動できない" do
28
+ @kernel = Tengine::Core::Kernel.new(@config)
29
+ driver = Tengine::Core::Driver.new(:name => :driver61, :version => @config.dsl_version)
30
+ driver.handlers.new(:event_type_names => ["event61"], :filepath => @dsl_path, :lineno => 10)
31
+ driver.save!
32
+ expect{
33
+ @kernel.bind
34
+ # }.to raise_error(Tengine::Core::DslError, "event is not available outside of event handler block.")
35
+ }.to_not raise_error # bindはほとんど何もしなくなりました
36
+ end
37
+ end
@@ -0,0 +1,36 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe "uc62_session_in_driver" do
5
+ before do
6
+ Tengine::Core::Driver.delete_all
7
+ Tengine::Core::Session.delete_all
8
+ config = Tengine::Core::Config::Core.new({
9
+ :tengined => {
10
+ :load_path => File.expand_path('../../../../examples/uc62_session_in_driver.rb', File.dirname(__FILE__)),
11
+ },
12
+ })
13
+ @bootstrap = Tengine::Core::Bootstrap.new(config)
14
+ @kernel = Tengine::Core::Kernel.new(config)
15
+ end
16
+
17
+ it "ロード後にはsessionに値が入っている" do
18
+ @bootstrap.load_dsl
19
+ driver62 = Tengine::Core::Driver.first
20
+ session = driver62.session
21
+ session.should_not be_nil
22
+ session.properties.should == { 'foo' => 100}
23
+ @kernel.bind
24
+ mock_headers = mock(:headers)
25
+ mock_headers.should_receive(:ack).twice
26
+ raw_event = Tengine::Event.new(:event_type_name => "event62")
27
+ @kernel.process_message(mock_headers, raw_event.to_json)
28
+ session.reload
29
+ session.properties.should == { 'foo' => 101}
30
+ raw_event = Tengine::Event.new(:event_type_name => "event62")
31
+ @kernel.process_message(mock_headers, raw_event.to_json)
32
+ session.reload
33
+ session.properties.should == { 'foo' => 102}
34
+ end
35
+
36
+ end
@@ -0,0 +1,35 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe "uc63_session_outside_of_driver" do
5
+ before do
6
+ Tengine::Core::Driver.delete_all
7
+ Tengine::Core::Session.delete_all
8
+ @dsl_path = File.expand_path('../../../../failure_examples/uc63_session_outside_of_driver.rb', File.dirname(__FILE__))
9
+ @config = Tengine::Core::Config::Core.new({
10
+ :tengined => {
11
+ :load_path => @dsl_path,
12
+ },
13
+ })
14
+ end
15
+
16
+ it "ロードは失敗してdriver63は登録されず起動できない" do
17
+ @bootstrap = Tengine::Core::Bootstrap.new(@config)
18
+ expect{
19
+ expect{
20
+ @bootstrap.load_dsl
21
+ }.to raise_error(Tengine::Core::DslError, "session is not available outside of event driver block.")
22
+ }.to_not change(Tengine::Core::Driver, :count)
23
+ end
24
+
25
+ it "仮にロードされていてもbindに失敗して起動できない" do
26
+ @kernel = Tengine::Core::Kernel.new(@config)
27
+ driver = Tengine::Core::Driver.new(:name => :driver63, :version => @config.dsl_version)
28
+ driver.handlers.new(:event_type_names => ["event63"], :filepath => @dsl_path, :lineno => 11)
29
+ driver.save!
30
+ expect{
31
+ @kernel.bind
32
+ # }.to raise_error(Tengine::Core::DslError, "session is not available outside of event driver block.")
33
+ }.to_not raise_error # bindはほとんど何もしなくなりました
34
+ end
35
+ end
@@ -0,0 +1,134 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe "uc64_safety_countup" do
5
+ before do
6
+ Tengine::Core::Driver.delete_all
7
+ Tengine::Core::Session.delete_all
8
+ @dsl_path = File.expand_path('../../../../examples/uc64_safety_countup.rb', File.dirname(__FILE__))
9
+ config = Tengine::Core::Config::Core.new({
10
+ :tengined => {
11
+ :load_path => @dsl_path,
12
+ },
13
+ })
14
+ @bootstrap = Tengine::Core::Bootstrap.new(config)
15
+ @bootstrap.load_dsl
16
+ @kernel1 = Tengine::Core::Kernel.new(config)
17
+ @kernel2 = Tengine::Core::Kernel.new(config)
18
+ end
19
+
20
+ it "同時にロードして、同時に更新しても正しく更新することができる" do
21
+ driver64 = Tengine::Core::Driver.first
22
+ session = driver64.session
23
+ session.should_not be_nil
24
+ session.properties.should == { 'foo' => 100}
25
+ @kernel1.bind
26
+ @kernel2.bind
27
+ mock_headers = mock(:headers)
28
+ mock_headers.should_receive(:ack).twice
29
+
30
+ test_session_wrapper_class = Class.new(Tengine::Core::SessionWrapper) do
31
+ def __get_properties__(*args)
32
+ result = super
33
+ Fiber.yield
34
+ result
35
+ end
36
+ end
37
+
38
+ f1 = Fiber.new{
39
+ raw_event1 = Tengine::Event.new(:event_type_name => "event64")
40
+ session_wrapper1 = test_session_wrapper_class.new(Tengine::Core::Session.find(session.id))
41
+ klass = driver64.target_class_name.constantize
42
+ klass.should_receive(:session).and_return(session_wrapper1)
43
+ # @kernel1.context.should_receive(:session).and_return(session_wrapper1)
44
+ @kernel1.process_message(mock_headers, raw_event1.to_json)
45
+ }
46
+ f1.resume
47
+
48
+ f2 = Fiber.new{
49
+ raw_event2 = Tengine::Event.new(:event_type_name => "event64")
50
+ session_wrapper2 = test_session_wrapper_class.new(Tengine::Core::Session.find(session.id))
51
+ klass = driver64.target_class_name.constantize
52
+ klass.should_receive(:session).and_return(session_wrapper2)
53
+ # @kernel2.context.should_receive(:session).and_return(session_wrapper2)
54
+ @kernel2.process_message(mock_headers, raw_event2.to_json)
55
+ }
56
+ f2.resume
57
+
58
+ f1.resume
59
+ session.reload
60
+ session.properties.should == { 'foo' => 101}
61
+
62
+ f2.resume
63
+ session.reload
64
+ session.properties.should == { 'foo' => 101}
65
+
66
+ f2.resume
67
+ session.reload
68
+ session.properties.should == { 'foo' => 102}
69
+ end
70
+
71
+
72
+ it "リトライの回数を超えたら例外をraiseする" do
73
+ driver64 = Tengine::Core::Driver.first
74
+ session = driver64.session
75
+ session.should_not be_nil
76
+ session.properties.should == { 'foo' => 100}
77
+ @kernel1.bind
78
+ @kernel2.bind
79
+ mock_headers = mock(:headers)
80
+ mock_headers.should_receive(:ack).exactly(4).times
81
+
82
+ test_session_wrapper_class = Class.new(Tengine::Core::SessionWrapper) do
83
+ def __get_properties__(*args)
84
+ result = super
85
+ Fiber.yield
86
+ result
87
+ end
88
+ end
89
+
90
+ # @kernel1の経路で3回イベントがくる間、@kernel2は常に先を越されて、最初のイベントによる更新もできないケース
91
+ f1 = Fiber.new{
92
+ 3.times do
93
+ raw_event1 = Tengine::Event.new(:event_type_name => "event64")
94
+ session_wrapper1 = test_session_wrapper_class.new(Tengine::Core::Session.find(session.id))
95
+ klass = driver64.target_class_name.constantize
96
+ klass.should_receive(:session).and_return(session_wrapper1)
97
+ # @kernel1.context.should_receive(:session).and_return(session_wrapper1)
98
+ @kernel1.process_message(mock_headers, raw_event1.to_json)
99
+ end
100
+ }
101
+ f1.resume
102
+
103
+ f2 = Fiber.new{
104
+ raw_event2 = Tengine::Event.new(:event_type_name => "event64")
105
+ session_wrapper2 = test_session_wrapper_class.new(Tengine::Core::Session.find(session.id))
106
+ klass = driver64.target_class_name.constantize
107
+ klass.should_receive(:session).and_return(session_wrapper2)
108
+ # @kernel2.context.should_receive(:session).and_return(session_wrapper2)
109
+ expect{
110
+ @kernel2.process_message(mock_headers, raw_event2.to_json)
111
+ }.to raise_error(Tengine::Core::OptimisticLock::RetryOverError)
112
+ }
113
+ f2.resume
114
+
115
+ f1.resume
116
+ session.reload
117
+ session.properties.should == { 'foo' => 101}
118
+ f2.resume
119
+ session.reload
120
+ session.properties.should == { 'foo' => 101}
121
+
122
+ f1.resume
123
+ session.reload
124
+ session.properties.should == { 'foo' => 102}
125
+ f2.resume
126
+ session.reload
127
+ session.properties.should == { 'foo' => 102}
128
+
129
+ f1.resume
130
+ session.reload
131
+ session.properties.should == { 'foo' => 103}
132
+ end
133
+
134
+ end