tengine_core 0.5.28

Sign up to get free protection for your applications and to get access to all the features.
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
+ require 'tengine/event'
5
+
6
+ describe Tengine::Core::EventWrapper do
7
+ context "[]でpropertiesの属性にアクセス可能" do
8
+ before do
9
+ @event = Tengine::Core::Event.create!(
10
+ :key => Tengine::Event.uuid_gen.generate,
11
+ :event_type_name => "foo",
12
+ :sender_name => "server1",
13
+ :properties => {
14
+ :foo => [1,2,3,4],
15
+ :bar => "BAR"
16
+ })
17
+ @event.reload
18
+ end
19
+
20
+ subject do
21
+ Tengine::Core::EventWrapper.new(@event)
22
+ end
23
+
24
+ it do
25
+ @event.properties['foo'].should == [1,2,3,4]
26
+ @event.properties[:foo].should == nil
27
+ subject.properties['foo'].should == [1,2,3,4]
28
+ subject.properties[:foo].should == nil
29
+ subject['foo'].should == [1,2,3,4]
30
+ subject[:foo].should == [1,2,3,4]
31
+ subject['bar'].should == "BAR"
32
+ subject[:bar].should == "BAR"
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,87 @@
1
+ require 'spec_helper'
2
+
3
+ describe Tengine::Core::HandlerPath do
4
+
5
+ describe :find_handlers do
6
+ before do
7
+ Tengine::Core::Driver.delete_all
8
+ @d11 = Tengine::Core::Driver.find_or_create_by(name:"driver1", version:"1", enabled:true)
9
+ @d11h1 = @d11.handlers.find_or_create_by(:event_type_names => ["foo" ], :filepath => "path/to/driver1.rb", :lineno => 5)
10
+ @d11h2 = @d11.handlers.find_or_create_by(:event_type_names => ["boo" ], :filepath => "path/to/driver1.rb", :lineno => 10)
11
+ @d11h3 = @d11.handlers.find_or_create_by(:event_type_names => ["blah"], :filepath => "path/to/driver1.rb", :lineno => 15)
12
+ Tengine::Core::HandlerPath.create(:event_type_name => "foo", :driver => @d11, :handler_id => @d11h1.id)
13
+ Tengine::Core::HandlerPath.create(:event_type_name => "boo", :driver => @d11, :handler_id => @d11h2.id)
14
+ Tengine::Core::HandlerPath.create(:event_type_name => "blah", :driver => @d11, :handler_id => @d11h3.id)
15
+ @d21 = Tengine::Core::Driver.find_or_create_by(name:"driver1", version:"2", enabled:true)
16
+ @d21h1 = @d21.handlers.find_or_create_by(:event_type_names => ["foo"], :filepath => "path/to/driver1.rb", :lineno => 5)
17
+ @d21h2 = @d21.handlers.find_or_create_by(:event_type_names => ["boo"], :filepath => "path/to/driver1.rb", :lineno => 12)
18
+ Tengine::Core::HandlerPath.create(:event_type_name => "foo", :driver => @d21, :handler_id => @d21h1.id)
19
+ Tengine::Core::HandlerPath.create(:event_type_name => "boo", :driver => @d21, :handler_id => @d21h2.id)
20
+ @d22 = Tengine::Core::Driver.find_or_create_by(name:"driver2", version:"2", enabled:true)
21
+ @d22h1 = @d22.handlers.find_or_create_by(:event_type_names => ["foo"], :filepath => "path/to/driver2.rb", :lineno => 20)
22
+ @d22h2 = @d22.handlers.find_or_create_by(:event_type_names => ["bar"], :filepath => "path/to/driver2.rb", :lineno => 30)
23
+ Tengine::Core::HandlerPath.create(:event_type_name => "foo", :driver => @d22, :handler_id => @d22h1.id)
24
+ Tengine::Core::HandlerPath.create(:event_type_name => "bar", :driver => @d22, :handler_id => @d22h2.id)
25
+ @d23 = Tengine::Core::Driver.find_or_create_by(name:"driver3", version:"2", enabled:false)
26
+ @d23h1 = @d23.handlers.find_or_create_by(:event_type_names => ["bar"], :filepath => "path/to/driver3.rb", :lineno => 2)
27
+ @d23h2 = @d23.handlers.find_or_create_by(:event_type_names => ["baz"], :filepath => "path/to/driver3.rb", :lineno => 10)
28
+ Tengine::Core::HandlerPath.create(:event_type_name => "bar", :driver => @d23, :handler_id => @d23h1.id)
29
+ Tengine::Core::HandlerPath.create(:event_type_name => "baz", :driver => @d23, :handler_id => @d23h2.id)
30
+ end
31
+
32
+ context "with default_driver_version" do
33
+ it "should return handlers" do
34
+ Tengine::Core::HandlerPath.default_driver_version = "2"
35
+ Tengine::Core::HandlerPath.find_handlers("foo").map(&:id).should == [@d21h1.id, @d22h1.id]
36
+ Tengine::Core::HandlerPath.find_handlers("boo").map(&:id).should == [@d21h2.id]
37
+ Tengine::Core::HandlerPath.find_handlers("bar").map(&:id).should == [@d22h2.id]
38
+ Tengine::Core::HandlerPath.find_handlers("baz").map(&:id).should == []
39
+ Tengine::Core::HandlerPath.find_handlers("FOO").map(&:id).should == []
40
+ Tengine::Core::HandlerPath.find_handlers("blah").map(&:id).should == []
41
+ end
42
+
43
+ it "should return old handlers" do
44
+ Tengine::Core::HandlerPath.default_driver_version = "1"
45
+ Tengine::Core::HandlerPath.find_handlers("foo").map(&:id).should == [@d11h1.id]
46
+ Tengine::Core::HandlerPath.find_handlers("boo").map(&:id).should == [@d11h2.id]
47
+ Tengine::Core::HandlerPath.find_handlers("blah").map(&:id).should == [@d11h3.id]
48
+ Tengine::Core::HandlerPath.find_handlers("bar").map(&:id).should == []
49
+ Tengine::Core::HandlerPath.find_handlers("baz").map(&:id).should == []
50
+ end
51
+ end
52
+
53
+ context "generated handler_paths" do
54
+ before do
55
+ Tengine::Core::Driver.delete_all
56
+ Tengine::Core::HandlerPath.delete_all
57
+ end
58
+
59
+ it "should return handlers for enabled driver" do
60
+ @driver = Tengine::Core::Driver.new(:name => "driver01", :version => "123", :enabled => true)
61
+ @handler1 = @driver.handlers.new(:event_type_names => ["event01"],
62
+ :filepath => "path/to/driver01.rb", :lineno => 8)
63
+ @driver.save!
64
+
65
+ Tengine::Core::HandlerPath.all.count.should == 1
66
+ Tengine::Core::HandlerPath.default_driver_version = "123"
67
+ handlers = Tengine::Core::HandlerPath.find_handlers("event01")
68
+ handlers.count.should == 1
69
+ handlers.each do |handler|
70
+ handler.id.should == @handler1.id
71
+ end
72
+ end
73
+
74
+ it "should return handlers for disabled driver" do
75
+ @driver = Tengine::Core::Driver.new(:name => "driver01", :version => "123", :enabled => false)
76
+ @handler1 = @driver.handlers.new(:event_type_names => ["event01"],
77
+ :filepath => "path/to/driver01.rb", :lineno => 8)
78
+ @driver.save!
79
+
80
+ Tengine::Core::HandlerPath.all.count.should == 1
81
+ Tengine::Core::HandlerPath.default_driver_version = "123"
82
+ Tengine::Core::HandlerPath.find_handlers("event01").count.should == 0
83
+ end
84
+ end
85
+ end
86
+
87
+ end
@@ -0,0 +1,190 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe Tengine::Core::Handler do
5
+ valid_attributes1 = {
6
+ :filepath => "path/to/driver.rb",
7
+ :lineno => 100,
8
+ }.freeze
9
+
10
+ context "filepathとlinenoは必須" do
11
+ it "正常系" do
12
+ driver1 = Tengine::Core::Handler.new(valid_attributes1)
13
+ driver1.valid?.should == true
14
+ end
15
+
16
+ [:filepath, :lineno].each do |key|
17
+ it "#{key}なし" do
18
+ attrs = valid_attributes1.dup
19
+ attrs.delete(key)
20
+ driver1 = Tengine::Core::Handler.new(attrs)
21
+ driver1.valid?.should == false
22
+ end
23
+ end
24
+ end
25
+
26
+ # context :process_event do
27
+ # before do
28
+ # @driver = Tengine::Core::Driver.new
29
+ # @handler = Tengine::Core::Handler.new(:driver => @driver)
30
+ # end
31
+
32
+ # it "マッチするかどうかと関係なくブロックが呼び出されます" do
33
+ # mock_dsl_context = mock(:dsl_context)
34
+ # mock_kernel = mock(:kernel)
35
+ # mock_event = mock(:event)
36
+ # mock_caller = mock(:caller)
37
+ # mock_block = nil
38
+ # mock_caller.instance_eval do
39
+ # mock_block = lambda{}
40
+ # end
41
+ # mock_event.stub(:kernel).and_return(mock_kernel)
42
+ # mock_kernel.stub(:dsl_context).and_return(mock_dsl_context)
43
+ # mock_dsl_context.stub(:__block_for__).and_return(mock_block)
44
+ # # @handler.should_receive(:instance_eval).with(&mock_block)
45
+ # mock_caller.should_receive(:__safety_driver__).and_yield
46
+ # mock_caller.should_receive(:__safety_event__).and_yield
47
+ # mock_caller.should_receive(:instance_eval)
48
+ # @handler.process_event(mock_event, &mock_block)
49
+ # end
50
+ # end
51
+
52
+ describe :match? do
53
+ context "without session" do
54
+ # it "by source_name"
55
+ # it "by sender_name"
56
+ # it "by occurred_at"
57
+ end
58
+
59
+ context "with session" do
60
+ context "foo & bar" do
61
+ before do
62
+ Tengine::Core::Driver.delete_all
63
+ Tengine::Core::Session.delete_all
64
+ @driver1 = Tengine::Core::Driver.new(:name => "driver1", :version => "123")
65
+ @handler = @driver1.handlers.new(:event_type_names => [:foo, :bar],
66
+ :filepath => "path/to/driver.rb",
67
+ :lineno => 11,
68
+ :filter => {
69
+ 'method' => :and,
70
+ 'children' => [
71
+ { 'pattern' => 'foo', 'method' => :find_or_mark_in_session },
72
+ { 'pattern' => 'bar', 'method' => :find_or_mark_in_session },
73
+ ]
74
+ })
75
+ @driver1.save!
76
+ @handler
77
+ end
78
+ subject{ @handler }
79
+
80
+ it "最初にfooが受信したらセッションに記録してfalse" do
81
+ event_foo = FactoryGirl.create(:"tengine/core/event", :event_type_name => "foo")
82
+ subject.match?(event_foo).should == false
83
+ @driver1.session.system_properties.should == {'mark_foo' => true}
84
+ end
85
+
86
+ it "最初にbarが受信したらセッションに記録してfalse" do
87
+ # 実装がall?などを使って全てのフィルタを評価しない場合は失敗することがあります。
88
+ event_bar = FactoryGirl.create(:"tengine/core/event", :event_type_name => "bar")
89
+ subject.match?(event_bar).should == false
90
+ @driver1.session.system_properties.should == {'mark_bar' => true}
91
+ end
92
+
93
+ context "一度fooを受信した場合" do
94
+ before do
95
+ session = @driver1.session
96
+ session.system_properties = {'mark_foo' => true}
97
+ session.save!
98
+ end
99
+
100
+ it "再度fooが来るとセッションは変更なくfalse" do
101
+ event_foo = FactoryGirl.create(:"tengine/core/event", :event_type_name => "foo")
102
+ subject.match?(event_foo).should == false
103
+ @driver1.reload
104
+ @driver1.session.system_properties.should == {'mark_foo' => true}
105
+ end
106
+
107
+ it "barが来るとセッションを変更してtrue" do
108
+ event_bar = FactoryGirl.create(:"tengine/core/event", :event_type_name => "bar")
109
+ subject.match?(event_bar).should == true
110
+ @driver1.reload
111
+ @driver1.session.system_properties.should == {'mark_foo' => true, 'mark_bar' => true}
112
+ end
113
+ end
114
+
115
+ context "一度barを受信した場合" do
116
+ before do
117
+ session = @driver1.session
118
+ session.system_properties = {'mark_bar' => true}
119
+ session.save!
120
+ end
121
+
122
+ it "fooが来るとセッションを変更してtrue" do
123
+ event_foo = FactoryGirl.create(:"tengine/core/event", :event_type_name => "foo")
124
+ subject.match?(event_foo).should == true
125
+ @driver1.reload
126
+ @driver1.session.system_properties.should == {'mark_foo' => true, 'mark_bar' => true}
127
+ end
128
+ end
129
+
130
+
131
+ end
132
+
133
+ end
134
+
135
+ end
136
+
137
+
138
+ describe 'filter persistence' do
139
+ before do
140
+ Tengine::Core::Driver.delete_all
141
+ @driver1 = Tengine::Core::Driver.new(:name => "driver1", :version => "123")
142
+ end
143
+
144
+ it "デフォルトでは空のHash" do
145
+ @driver1.handlers.new(:event_type_names => [:foo, :bar],
146
+ :filepath => "path/to/driver.rb", :lineno => 8)
147
+ @driver1.save!
148
+ loaded = Tengine::Core::Driver.find(@driver1.id)
149
+ handler1 = loaded.handlers.first
150
+ handler1.filter.should == {}
151
+ end
152
+
153
+ it "はネストしたフィルタの情報を保持できる" do
154
+ expected_hash = {
155
+ :method => :or,
156
+ :children => [
157
+ {
158
+ :method => :and,
159
+ :children => [
160
+ { :pattern => 'foo', :method => :find_or_mark_in_session },
161
+ { :pattern => 'bar', :method => :find_or_mark_in_session },
162
+ ]
163
+ },
164
+ { :method => :equal, :pattern => "baz"}
165
+ ]
166
+ }
167
+ @driver1.handlers.new(:event_type_names => [:foo, :bar],
168
+ :filepath => "path/to/driver.rb", :lineno => 8,
169
+ :filter => expected_hash)
170
+ @driver1.save!
171
+ loaded = Tengine::Core::Driver.find(@driver1.id)
172
+ handler1 = loaded.handlers.first
173
+ # mongoの制約でSymbolのキーは文字列に変換される。
174
+ handler1.filter.should == {
175
+ 'method' => :or,
176
+ 'children' => [
177
+ {
178
+ 'method' => :and,
179
+ 'children' => [
180
+ { 'pattern' => 'foo', 'method' => :find_or_mark_in_session },
181
+ { 'pattern' => 'bar', 'method' => :find_or_mark_in_session },
182
+ ]
183
+ },
184
+ { 'method' => :equal, 'pattern' => "baz"}
185
+ ]
186
+ }
187
+ end
188
+ end
189
+
190
+ end
@@ -0,0 +1,131 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+ require 'amqp'
4
+
5
+ require_relative '../../../lib/tengine/core/heartbeat_watcher'
6
+ require 'tengine/mq/suite'
7
+
8
+ describe Tengine::Core::HeartbeatWatcher do
9
+ before do
10
+ Tengine::Core::Event.delete_all
11
+ @uuid = UUID.new
12
+ end
13
+
14
+ subject do
15
+ Tengine::Core::HeartbeatWatcher.new(%w[--heartbeat-hbw-interval=30])
16
+ end
17
+
18
+ describe "#search_for_invalid_heartbeat" do
19
+
20
+ before do
21
+ @fixtures = Array.new
22
+ @fixtures << Tengine::Core::Event.new(key: @uuid.generate, event_type_name: "job.heartbeat.tengine", occurred_at: 1.day.ago)
23
+ @fixtures << Tengine::Core::Event.new(key: @uuid.generate, event_type_name: "job.heartbeat.tengine", occurred_at: 1.second.ago)
24
+ @fixtures.each {|i| i.save! }
25
+ end
26
+
27
+ it "古いものを検索してくる" do
28
+ set = []
29
+ EM.run do
30
+ subject.search_for_invalid_heartbeat do |i|
31
+ set << i
32
+ end
33
+ EM.add_timer 0.1 do EM.stop end
34
+ end
35
+
36
+ set.should include(@fixtures[0])
37
+ set.should_not include(@fixtures[1])
38
+ end
39
+ end
40
+
41
+ describe "#search_for_invalid_heartbeat, kind_of" do
42
+
43
+ before do
44
+ @fixtures = Array.new
45
+ @fixtures << Tengine::Core::Event.new(key: "job1", event_type_name: "job.heartbeat.tengine", occurred_at: 1.day.ago)
46
+ @fixtures << Tengine::Core::Event.new(key: "job2", event_type_name: "job.heartbeat.tengine", occurred_at: 1.second.ago)
47
+ @fixtures << Tengine::Core::Event.new(key: "cor1", event_type_name: "core.heartbeat.tengine", occurred_at: 1.day.ago)
48
+ @fixtures << Tengine::Core::Event.new(key: "cor2", event_type_name: "core.heartbeat.tengine", occurred_at: 10.second.ago)
49
+ @fixtures << Tengine::Core::Event.new(key: "hbw1", event_type_name: "hbw.heartbeat.tengine", occurred_at: 1.day.ago)
50
+ @fixtures << Tengine::Core::Event.new(key: "hbw2", event_type_name: "hbw.heartbeat.tengine", occurred_at: 1.second.ago)
51
+ @fixtures << Tengine::Core::Event.new(key: "rsw1", event_type_name: "resourcew.heartbeat.tengine", occurred_at: 1.day.ago)
52
+ @fixtures << Tengine::Core::Event.new(key: "rsw2", event_type_name: "resourcew.heartbeat.tengine", occurred_at: 10.second.ago)
53
+ @fixtures << Tengine::Core::Event.new(key: "atd1", event_type_name: "atd.heartbeat.tengine", occurred_at: 1.day.ago)
54
+ @fixtures << Tengine::Core::Event.new(key: "atd2", event_type_name: "atd.heartbeat.tengine", occurred_at: 10.second.ago)
55
+ @fixtures << Tengine::Core::Event.new(key: "hog1", event_type_name: "hoge.heartbeat.tengine", occurred_at: 1.day.ago)
56
+ @fixtures << Tengine::Core::Event.new(key: "hog2", event_type_name: "hoge.heartbeat.tengine", occurred_at: 10.second.ago)
57
+ @fixtures.each {|i| i.save! }
58
+ end
59
+
60
+ it "古い job,core,hbw,resourcew,atd を検索してくる" do
61
+ EM.run do
62
+ subject.search_for_invalid_heartbeat do |i|
63
+ (i.key =~ /job1|cor1|hbw1|rsw1|atd1/).should be_true
64
+ (i.key =~ /job2|cor2|hbw2|rsw2|atd2|hog1|hog2/).should be_false
65
+ end
66
+ EM.add_timer 0.1 do EM.stop end
67
+ end
68
+ end
69
+ end
70
+
71
+ describe "#send_last_event" do
72
+ it "finished.process.hbw.tengineの発火" do
73
+ sender = mock(:sender)
74
+ subject.stub(:sender).and_return(sender)
75
+ sender.should_receive(:fire).with("finished.process.hbw.tengine", an_instance_of(Hash))
76
+ sender.should_receive(:stop)
77
+ subject.send_last_event
78
+ end
79
+ end
80
+
81
+ describe "#send_periodic_event" do
82
+ it "hbw.heartbeat.tengineの発火" do
83
+ sender = mock(:sender)
84
+ subject.stub(:sender).and_return(sender)
85
+ sender.should_receive(:fire).with("hbw.heartbeat.tengine", an_instance_of(Hash))
86
+ sender.stub(:fire).with("finished.process.hbw.tengine", an_instance_of(Hash)) # 来るかも
87
+ subject.send_periodic_event
88
+ end
89
+ end
90
+
91
+ describe "#send_invalidate_event" do
92
+ it "引数のイベントのtypeを書き換えて、他は同じで発火" do
93
+ e0 = Tengine::Core::Event.new(key: @uuid.generate, event_type_name: "job.heartbeat.tengine", occurred_at: 1.day.ago)
94
+ sender = mock(:sender)
95
+ subject.stub(:sender).and_return(sender)
96
+ sender.should_receive(:fire).with(an_instance_of(Tengine::Event), an_instance_of(Hash)) do |e1, h|
97
+ e1.event_type_name.should == "foobar"
98
+ e1.occurred_at.should == e0.occurred_at
99
+ e1.key.should == e0.key
100
+ end
101
+
102
+ subject.send_invalidate_event "foobar", e0
103
+ end
104
+ end
105
+
106
+ describe "#sender" do
107
+ before do
108
+ conn = mock(:connection)
109
+ conn.stub(:on_tcp_connection_loss)
110
+ conn.stub(:after_recovery)
111
+ conn.stub(:on_closed)
112
+ AMQP.stub(:connect).with(an_instance_of(Hash)).and_return(conn)
113
+ end
114
+ subject { Tengine::Core::HeartbeatWatcher.new([]).sender }
115
+ it { should be_kind_of(Tengine::Event::Sender) }
116
+ end
117
+
118
+ describe "#run" do
119
+ it "各種timerを登録する" do
120
+ EM.stub(:run).and_yield
121
+ Daemons.stub(:run_proc).with(anything, anything).and_yield
122
+ EM.should_receive(:add_periodic_timer).exactly(2).times
123
+ Tengine::Core::MethodTraceable.stub(:disabled=)
124
+ sender = mock(:sender)
125
+ sender.stub(:wait_for_connection).and_yield
126
+ subject.stub(:sender).and_return(sender)
127
+ subject.instance_eval { @config }.stub(:setup_loggers)
128
+ subject.run __FILE__
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,30 @@
1
+
2
+
3
+
4
+ # -*- coding: utf-8 -*-
5
+ require 'spec_helper'
6
+
7
+ require 'stringio'
8
+
9
+ describe Tengine::Core::IoToLogger do
10
+
11
+ context "redirect from io to logger" do
12
+ before do
13
+ @io = StringIO.new
14
+ @logger = Logger.new(@io)
15
+ @logger.level = Logger::INFO
16
+ end
17
+ subject{ Tengine::Core::IoToLogger.new(@logger) }
18
+ it "should provide puts method" do
19
+ subject.puts("foo")
20
+ @io.rewind
21
+ @io.readlines.should == ["foo\n"]
22
+ end
23
+ it "should provide write method" do
24
+ subject.write("foo")
25
+ @io.rewind
26
+ @io.readlines.should == ["foo\n"]
27
+ end
28
+ end
29
+
30
+ end