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,39 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe "uc70_driver_enabled_on_activation" 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/uc70_driver_enabled_on_activation.rb', File.dirname(__FILE__)),
11
+ :skip_enablement => true,
12
+ },
13
+ })
14
+ @bootstrap = Tengine::Core::Bootstrap.new(@config)
15
+ @kernel = Tengine::Core::Kernel.new(@config)
16
+ end
17
+
18
+ it "普通に登録されて、起動後は有効になっている" do
19
+ @bootstrap.load_dsl
20
+ driver = Tengine::Core::Driver.first
21
+ driver.enabled.should == false
22
+ driver.enabled_on_activation.should == true
23
+ @bootstrap.enable_drivers
24
+ driver.reload
25
+ driver.enabled.should == true
26
+ driver.enabled_on_activation.should == true
27
+ @kernel.bind
28
+ #
29
+ klass = driver.target_class_name.constantize
30
+ obj = klass.new
31
+ klass.should_receive(:new).and_return(obj)
32
+ obj.should_receive(:puts).with("handler70")
33
+ mock_headers = mock(:headers)
34
+ mock_headers.should_receive(:ack)
35
+ raw_event = Tengine::Event.new(:event_type_name => "event70")
36
+ @kernel.process_message(mock_headers, raw_event.to_json)
37
+ end
38
+
39
+ end
@@ -0,0 +1,36 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe "uc71_driver_disabled_on_activation" 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/uc71_driver_disabled_on_activation.rb', File.dirname(__FILE__)),
11
+ :skip_enablement => true,
12
+ },
13
+ })
14
+ @bootstrap = Tengine::Core::Bootstrap.new(@config)
15
+ @kernel = Tengine::Core::Kernel.new(@config)
16
+ end
17
+
18
+ it "普通に登録されて、起動後は有効になっている" do
19
+ @bootstrap.load_dsl
20
+ driver = Tengine::Core::Driver.first
21
+ driver.enabled.should == false
22
+ driver.enabled_on_activation.should == false
23
+ @bootstrap.enable_drivers
24
+ driver.reload
25
+ driver.enabled.should == false
26
+ driver.enabled_on_activation.should == false
27
+ @kernel.bind
28
+ #
29
+ @kernel.context.should_not_receive(:puts).with("handler71")
30
+ mock_headers = mock(:headers)
31
+ mock_headers.should_receive(:ack)
32
+ raw_event = Tengine::Event.new(:event_type_name => "event71")
33
+ @kernel.process_message(mock_headers, raw_event.to_json)
34
+ end
35
+
36
+ end
@@ -0,0 +1,39 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe "uc72_setup_eventmachine_spec" do
5
+ before do
6
+ Tengine::Core::Driver.delete_all
7
+ Tengine::Core::Session.delete_all
8
+ @dsl_path = File.expand_path('../../../../examples/uc72_setup_eventmachine.rb', File.dirname(__FILE__))
9
+ config = Tengine::Core::Config::Core.new({
10
+ :tengined => {
11
+ :load_path => @dsl_path,
12
+ },
13
+ })
14
+ @kernel = Tengine::Core::Kernel.new(config)
15
+ @bootstrap = Tengine::Core::Bootstrap.new(config)
16
+ @bootstrap.kernel = @kernel
17
+ end
18
+
19
+ it "EM.run実行時にsetup_eventmachineに渡されたブロックが実行されます" do
20
+ @kernel.em_setup_blocks.length.should == 0
21
+ expect{
22
+ @bootstrap.load_dsl
23
+ }.to change(@kernel.em_setup_blocks, :length).by(1)
24
+ @kernel.em_setup_blocks.length.should == 1
25
+ expect{
26
+ @kernel.bind
27
+ }.to_not change(@kernel.em_setup_blocks, :length)
28
+ @kernel.em_setup_blocks.length.should == 1
29
+ EM.should_receive(:run).and_yield
30
+ EM.stub(:defer) # #enable_heartbeat
31
+ mq = mock(:mq, :queue => nil)
32
+ @kernel.stub(:mq).at_least(1).times.and_return(mq)
33
+ @kernel.should_receive(:setup_mq_connection)
34
+ @kernel.should_receive(:subscribe_queue).and_yield
35
+ @kernel.context.should_receive(:puts).with("setup_eventmachine")
36
+ EM.should_receive(:add_periodic_timer).with(3)
37
+ @kernel.activate
38
+ end
39
+ end
@@ -0,0 +1,53 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ require 'stringio'
5
+
6
+ describe "uc80_raise_io_error" do
7
+ before(:all) do
8
+ @logger = Tengine.logger
9
+ end
10
+ after(:all) do
11
+ Tengine.logger = @logger
12
+ end
13
+
14
+ before do
15
+ Tengine::Core::Driver.delete_all
16
+ Tengine::Core::Session.delete_all
17
+ @dsl_path = File.expand_path('../../../../examples/uc80_raise_io_error.rb', File.dirname(__FILE__))
18
+ @config = Tengine::Core::Config::Core.new({
19
+ :tengined => {
20
+ :load_path => @dsl_path,
21
+ },
22
+ })
23
+ @bootstrap = Tengine::Core::Bootstrap.new(@config)
24
+ @kernel = Tengine::Core::Kernel.new(@config)
25
+ end
26
+
27
+ it "例外がraiseされると、その例外の内容がログに出力され、イベント処理エラーイベントをfireする" do
28
+ @bootstrap.load_dsl
29
+ @kernel.bind
30
+ mock_headers = mock(:headers)
31
+ mock_headers.should_receive(:ack)
32
+ raw_event = Tengine::Event.new(:event_type_name => "event80")
33
+ @buffer = StringIO.new
34
+ Tengine.logger = Logger.new(@buffer)
35
+ Tengine.logger.level = Logger::ERROR
36
+ @kernel.should_receive(:fire).with("event80.error.tengined",
37
+ :properties => {
38
+ :original_event => instance_of(String),
39
+ :error_class_name => "IOError",
40
+ :error_message => "by driver80",
41
+ :error_backtrace => instance_of(Array),
42
+ # :block_source_location => "#{@dsl_path}:6" # 6はブロックの行番号
43
+ })
44
+ Tengine::Core::Kernel.temp_exception_reporter(:except_test) do
45
+ expect{
46
+ @kernel.process_message(mock_headers, raw_event.to_json)
47
+ }.to_not raise_error
48
+ end
49
+ @buffer.rewind
50
+ @buffer.string.should =~ /\[IOError\] by driver80/
51
+ end
52
+
53
+ end
@@ -0,0 +1,49 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe "uc81_raise_runtime_error" do
5
+ before do
6
+ Tengine::Core::HandlerPath.delete_all
7
+ Tengine::Core::Driver.delete_all
8
+ Tengine::Core::Session.delete_all
9
+ @dsl_path = File.expand_path('../../../../examples/uc81_raise_runtime_error.rb', File.dirname(__FILE__))
10
+ @config = Tengine::Core::Config::Core.new({
11
+ :tengined => {
12
+ :load_path => @dsl_path,
13
+ },
14
+ })
15
+ @bootstrap = Tengine::Core::Bootstrap.new(@config)
16
+ @kernel = Tengine::Core::Kernel.new(@config)
17
+ end
18
+
19
+ it "例外がraiseされると、イベント処理エラーイベントをfireする" do
20
+ @bootstrap.load_dsl
21
+ @kernel.bind
22
+
23
+ driver = Tengine::Core::Driver.first
24
+ driver.enabled.should == true
25
+ driver.version.should == @config.dsl_version
26
+ path = Tengine::Core::HandlerPath.first
27
+ path.event_type_name.should == "event81"
28
+ path.driver_id.should == driver.id
29
+ Tengine::Core::HandlerPath.default_driver_version.should == @config.dsl_version
30
+
31
+ mock_headers = mock(:headers)
32
+ mock_headers.should_receive(:ack)
33
+ raw_event = Tengine::Event.new(:event_type_name => "event81")
34
+ @kernel.should_receive(:fire).with("event81.error.tengined",
35
+ :properties => {
36
+ :original_event => instance_of(String),
37
+ :error_class_name => "RuntimeError",
38
+ :error_message => "by driver81",
39
+ :error_backtrace => instance_of(Array),
40
+ # :block_source_location => "#{@dsl_path}:6" # 6はブロックの行番号
41
+ })
42
+ Tengine::Core::Kernel.temp_exception_reporter(:except_test) do
43
+ expect{
44
+ @kernel.process_message(mock_headers, raw_event.to_json)
45
+ }.to_not raise_error
46
+ end
47
+ end
48
+
49
+ end
@@ -0,0 +1,136 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe Tengine::Core::Event::Finder do
5
+
6
+ context "検索" do
7
+ before(:all) do
8
+ Tengine::Core::Event.delete_all
9
+ occured_at_base = Time.now
10
+ base = {
11
+ :sender_name => "agent:server1/99326/tengine_job_agent",
12
+ :level => 2,
13
+ }
14
+ uuid_gen = Tengine::Event.uuid_gen
15
+ [
16
+ {:event_type_name => "start.execution.job.tengine", :source_name => "execution:localhost/123/1111/1111"}.update(base),
17
+ {:event_type_name => "start.jobnet.job.tengine", :source_name => "job:localhost/123/2222/3333"}.update(base),
18
+ {:event_type_name => "start.job.job.tengine", :source_name => "job:localhost/123/2222/4444"}.update(base),
19
+ {:event_type_name => "finished.process.job.tengine", :source_name => "job:localhost/123/2222/4444"}.update(base),
20
+ {:event_type_name => "success.job.job.tengine", :source_name => "job:localhost/123/2222/4444"}.update(base),
21
+ {:event_type_name => "success.jobnet.job.tengine", :source_name => "job:localhost/123/2222/3333"}.update(base),
22
+ {:event_type_name => "success.execution.job.tengine", :source_name => "execution:localhost/123/1111/1111"}.update(base),
23
+ ].each_with_index do |attrs, i|
24
+ Tengine::Core::Event.create!(attrs.update(:key => uuid_gen.generate, :occurred_at => occured_at_base + (i*10)))
25
+ end
26
+ end
27
+
28
+
29
+ context "event_type_name" do
30
+ it ".jobnet.job.tengine" do
31
+ f = Tengine::Core::Event::Finder.new(:event_type_name => "/.jobnet.job.tengine$/")
32
+ result = f.paginate
33
+ result.map{|h| h[:event_type_name]}.should == [
34
+ "success.jobnet.job.tengine",
35
+ "start.jobnet.job.tengine",
36
+ ]
37
+ end
38
+
39
+ it "start.job." do
40
+ f = Tengine::Core::Event::Finder.new(:event_type_name => "start.job.")
41
+ result = f.paginate
42
+ result.map{|h| h[:event_type_name]}.should == [
43
+ "start.job.job.tengine",
44
+ ]
45
+ end
46
+
47
+ it "/start.job./" do
48
+ f = Tengine::Core::Event::Finder.new(:event_type_name => "/start.job./")
49
+ result = f.paginate
50
+ result.map{|h| h[:event_type_name]}.should == [
51
+ "start.job.job.tengine",
52
+ "start.jobnet.job.tengine",
53
+ ]
54
+ end
55
+ end
56
+
57
+ context "source_name" do
58
+ it "execution" do
59
+ f = Tengine::Core::Event::Finder.new(:source_name => "execution:localhost/123")
60
+ result = f.paginate
61
+ result.map{|h| h[:event_type_name]}.should == [
62
+ "success.execution.job.tengine",
63
+ "start.execution.job.tengine",
64
+ ]
65
+ end
66
+
67
+ it "job" do
68
+ f = Tengine::Core::Event::Finder.new(:source_name => "job:localhost/123/2222")
69
+ result = f.paginate
70
+ result.map{|h| h[:event_type_name]}.should == [
71
+ "success.jobnet.job.tengine",
72
+ "success.job.job.tengine",
73
+ "finished.process.job.tengine",
74
+ "start.job.job.tengine",
75
+ "start.jobnet.job.tengine",
76
+ ]
77
+ end
78
+ end
79
+
80
+ context "sender_name" do
81
+ it "string" do
82
+ f = Tengine::Core::Event::Finder.new(:sender_name => "server1")
83
+ result = f.paginate
84
+ result.map{|h| h[:event_type_name]}.should == []
85
+ end
86
+
87
+ it "regexp" do
88
+ f = Tengine::Core::Event::Finder.new(:sender_name => "/server1/")
89
+ result = f.paginate
90
+ result.map{|h| h[:event_type_name]}.should == [
91
+ "success.execution.job.tengine",
92
+ "success.jobnet.job.tengine",
93
+ "success.job.job.tengine",
94
+ "finished.process.job.tengine",
95
+ "start.job.job.tengine",
96
+ "start.jobnet.job.tengine",
97
+ "start.execution.job.tengine",
98
+ ]
99
+ end
100
+ end
101
+
102
+ context "scope" do
103
+ it "ソート順は発生時刻の降順であること" do
104
+ f = Tengine::Core::Event::Finder.new
105
+ result = f.paginate
106
+ result.map{|h| h[:event_type_name]}.should == [
107
+ "success.execution.job.tengine",
108
+ "success.jobnet.job.tengine",
109
+ "success.job.job.tengine",
110
+ "finished.process.job.tengine",
111
+ "start.job.job.tengine",
112
+ "start.jobnet.job.tengine",
113
+ "start.execution.job.tengine",
114
+ ]
115
+
116
+ occurred_at_base = Time.now
117
+ result.each_with_index do |event, i|
118
+ event.occurred_at = occurred_at_base + i
119
+ event.save!
120
+ end
121
+
122
+ f = Tengine::Core::Event::Finder.new
123
+ result = f.paginate
124
+ result.map{|h| h[:event_type_name]}.should == [
125
+ "start.execution.job.tengine",
126
+ "start.jobnet.job.tengine",
127
+ "start.job.job.tengine",
128
+ "finished.process.job.tengine",
129
+ "success.job.job.tengine",
130
+ "success.jobnet.job.tengine",
131
+ "success.execution.job.tengine",
132
+ ]
133
+ end
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,33 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ require 'tengine/event'
5
+
6
+ describe Tengine::Core::EventExceptionReportable do
7
+
8
+ describe :to_reporter do
9
+ context "Symbolで指定" do
10
+ Tengine::Core::EventExceptionReportable::EVENT_EXCEPTION_REPORTERS.keys.each do |reporter_name|
11
+ it reporter_name do
12
+ Tengine::Core::EventExceptionReportable.to_reporter(reporter_name).should_not == nil
13
+ end
14
+ end
15
+ it "存在しないreporter名" do
16
+ expect{
17
+ Tengine::Core::EventExceptionReportable.to_reporter(:unexist_reporter)
18
+ }.to raise_error(NameError, "Unknown reporter: :unexist_reporter")
19
+ end
20
+ end
21
+
22
+ it "Procを指定" do
23
+ proc1 = Proc.new{ puts "foo" }
24
+ Tengine::Core::EventExceptionReportable.to_reporter(proc1).should == proc1
25
+ end
26
+
27
+ it "不正なreporterを指定" do
28
+ expect{
29
+ Tengine::Core::EventExceptionReportable.to_reporter(100)
30
+ }.to raise_error(ArgumentError, "Invalid reporter: 100")
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,161 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe Tengine::Core::Event do
5
+
6
+ valid_attributes1 = {
7
+ :event_type_name => "valid.event-type_name1",
8
+ :key => "some_unique_key1",
9
+ }.freeze
10
+
11
+ context "event_type_nameとkeyは必須" do
12
+ it "正常系" do
13
+ Tengine::Core::Event.delete_all
14
+ driver1 = Tengine::Core::Event.new(valid_attributes1)
15
+ driver1.valid?.should == true
16
+ end
17
+
18
+ [:event_type_name, :key].each do |key|
19
+ it "#{key}なし" do
20
+ attrs = valid_attributes1.dup
21
+ attrs.delete(key)
22
+ driver1 = Tengine::Core::Event.new(attrs)
23
+ driver1.valid?.should == false
24
+ end
25
+ end
26
+ end
27
+
28
+ context "keyはバージョン毎にユニーク" do
29
+ before do
30
+ Tengine::Core::Event.delete_all
31
+ Tengine::Core::Event.create!(valid_attributes1)
32
+ end
33
+
34
+ it "同じ名前で登録されているものが存在する場合エラー、しかしunique indexによるエラーが発生します" do
35
+ begin
36
+ Tengine::Core::Event.create!(valid_attributes1)
37
+ fail
38
+ rescue Mongo::OperationFailure => e
39
+ e.message.should =~ /E11000/
40
+ e.message.should =~ /duplicate key error/
41
+ e.message.should =~ /tengine_core_events/
42
+ e.message.should =~ /some_unique_key1/
43
+ end
44
+ end
45
+ end
46
+
47
+ context "must be unique with key and sender_name" do
48
+ it "raise an exception when violate unique consistent" do
49
+ Mongoid.persist_in_safe_mode.should == true
50
+
51
+ unique_key_name = "key1"
52
+ Tengine::Core::Event.delete_all
53
+ Tengine::Core::Event.create!(:event_type_name => "foo", :key => unique_key_name, :sender_name => "server1")
54
+ expect {
55
+ Tengine::Core::Event.create!(:event_type_name => "foo", :key => unique_key_name, :sender_name => "server2")
56
+ }.to raise_error # (Mongo::OperationFailure, /duplicate key error/)
57
+ end
58
+ end
59
+
60
+ context "event_type_name" do
61
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => "foo").should be_valid }
62
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => "Foo").should be_valid }
63
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => "F00").should be_valid }
64
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => "foo.bar.baz").should be_valid }
65
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => "foo."*1024+"bar").should be_valid }
66
+
67
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => "").should_not be_valid }
68
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => "\0").should_not be_valid }
69
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => " ").should_not be_valid }
70
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => " ").should_not be_valid }
71
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => "\t").should_not be_valid }
72
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => "\n").should_not be_valid }
73
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => ";").should_not be_valid }
74
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => ",").should_not be_valid }
75
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => "#").should_not be_valid }
76
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => "-->").should_not be_valid }
77
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => """).should_not be_valid }
78
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => "javascript:alert('hello')").should_not be_valid }
79
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => "javascript:alert(String.fromCharCode(88,83,83))").should_not be_valid }
80
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => "<script>alert('hello')</script>").should_not be_valid }
81
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => '<img src="javascript:alert(\'hello\')">').should_not be_valid }
82
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => " foo").should_not be_valid }
83
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => "foo ").should_not be_valid }
84
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => " foo ").should_not be_valid }
85
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => "'foo'").should_not be_valid }
86
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => '"foo"').should_not be_valid }
87
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => "foo bar baz").should_not be_valid }
88
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => "(foo(bar(baz)))").should_not be_valid }
89
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => "ふぅ").should_not be_valid }
90
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => "נד בייקר").should_not be_valid } # hebrew
91
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => ".error.tengined").should_not be_valid }
92
+
93
+ # 実在のイベント種別名
94
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => "start.job.job.tengine").should be_valid }
95
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => "job.heartbeat.tengine").should be_valid }
96
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => "alert.execution.job.tengine").should be_valid }
97
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => "finished.process.job.tengine.failed.tengined").should be_valid }
98
+ it { Tengine::Core::Event.new(:key => "k", :event_type_name => "Tengine::Resource::VirtualServer.created.tengine_resource_watchd").should be_valid }
99
+ end
100
+
101
+
102
+ describe :level do
103
+
104
+ it "i18n_scopeが設定される" do
105
+ Tengine::Core::Event.level_enum.i18n_scope.should == ['selectable_attrs', 'tengine/core/event', 'level']
106
+ end
107
+
108
+ context :i18n_scope do
109
+ before(:all) do
110
+ @default_locale_backup = I18n.default_locale
111
+ @locale_backup = I18n.locale
112
+ end
113
+
114
+ after(:all) do
115
+ I18n.locale = @locale_backup
116
+ I18n.default_locale = @default_locale_backup
117
+ end
118
+
119
+ before do
120
+ I18n.backend = I18n::Backend::Simple.new
121
+ I18n.backend.store_translations 'en', 'selectable_attrs' => {'tengine/core/event' => {'level' => {
122
+ 'debug' => 'DEBUG',
123
+ 'info' => 'INFO',
124
+ 'warn' => 'WARN',
125
+ 'error' => 'ERROR',
126
+ 'fatal' => 'FATAL',
127
+ } } }
128
+ I18n.backend.store_translations 'ja', 'selectable_attrs' => {'tengine/core/event' => {'level' => {
129
+ 'debug' => 'デバッグ',
130
+ 'info' => '情報',
131
+ 'warn' => '警告',
132
+ 'error' => 'エラー',
133
+ 'fatal' => '致命的なエラー',
134
+ } } }
135
+ end
136
+
137
+ context "#level_name" do
138
+ {
139
+ :debug => {:en => "DEBUG", :ja => "デバッグ"},
140
+ :info => {:en => "INFO" , :ja => "情報"},
141
+ :warn => {:en => "WARN" , :ja => "警告"},
142
+ :error => {:en => "ERROR", :ja => "エラー"},
143
+ :fatal => {:en => "FATAL", :ja => "致命的なエラー"},
144
+ }.each do |level_key, hash|
145
+ context level_key.inspect do
146
+ subject{ Tengine::Core::Event.new(:level_key => level_key)}
147
+ hash.each do |locale, level_name|
148
+ it do
149
+ I18n.locale = locale.to_s
150
+ subject.level_name.should == level_name
151
+ end
152
+ end
153
+ end
154
+
155
+ end
156
+ end
157
+
158
+ end
159
+ end
160
+
161
+ end