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,240 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe Tengine::Core::Driveable do
5
+
6
+ describe :handling_by_instance_method do
7
+ before do
8
+ Tengine::Core::Setting.delete_all
9
+ Tengine::Core::Setting.create!(:name => "dsl_version", :value => "123")
10
+ Tengine::Core::Driver.delete_all
11
+ Tengine::Core::HandlerPath.delete_all
12
+ end
13
+
14
+ def driveable_test_class_index
15
+ $dtcindex ||= 0
16
+ end
17
+
18
+ def define_driveable_test_class
19
+ $dtcindex ||= 0
20
+ $dtcindex += 1
21
+ @klass = Class.new
22
+ Object.const_set(:"DriveableTestClass#{$dtcindex}", @klass)
23
+ @klass.module_eval do
24
+ include Tengine::Core::Driveable
25
+
26
+ on:event01
27
+ def foo # 引数なしでもOK
28
+ STDOUT.puts "#{self.class.name}#foo"
29
+ end
30
+
31
+ on :event02, :event3 # 複数のイベント種別をハンドリング
32
+ def bar(with_event) # 引数ありでもOK
33
+ STDOUT.puts "#{self.class.name}#foo with event"
34
+ end
35
+
36
+ class << self # クラスメソッドの定義
37
+ on:event04
38
+ def baz # 引数なしでもOK
39
+ STDOUT.puts "#{self.name}#baz"
40
+ end
41
+ end
42
+
43
+ on :event05, :event6 # 複数のイベント種別をハンドリング
44
+ def self.hoge(with_event) # 引数ありでもOK
45
+ STDOUT.puts "#{self.name}#hoge with event"
46
+ end
47
+ end
48
+ end
49
+
50
+ context "[Bug]tenginedのデプロイコマンド bundle exec cap deploy:start を実行すると起動しないことがある" do
51
+ context "nameとversionが同じものを2度書きもうとして" do
52
+ before do
53
+ @klass1, @klass2 = Class.new, Class.new
54
+ end
55
+
56
+ it "nameとversionのuniquenessバリデーションにひっかかる場合にはMongoid::Errors::Validationsをraiseしない" do
57
+ Tengine::Core::Setting.should_receive(:dsl_version).exactly(3).times.and_return("123")
58
+ @klass1.should_receive(:driver).and_return(nil)
59
+ @klass1.should_receive(:driver_name).and_return("foo")
60
+ @klass1.module_eval { include Tengine::Core::Driveable }
61
+
62
+ @klass2.should_receive(:driver).and_return(nil)
63
+ @klass2.should_receive(:driver_name).exactly(2).times.and_return("foo")
64
+ @klass2.module_eval { include Tengine::Core::Driveable }
65
+ end
66
+
67
+ it "versionのformatバリデーションにひっかかる場合にはMongoid::Errors::Validationsをraiseする" do
68
+ [@klass1, @klass2].each do |k|
69
+ Tengine::Core::Setting.should_receive(:dsl_version).and_return("123")
70
+ k.should_receive(:driver).and_return(nil)
71
+ k.should_receive(:driver_name).and_return("123")
72
+ expect { k.module_eval { include Tengine::Core::Driveable } }.to raise_error
73
+ end
74
+ end
75
+
76
+ it "バリデーションで引っかからずにユニークインデックスの一意キー制約違反で落ちる場合にはMongo::OperationFailureをraiseしない" do
77
+ # バリデーションのチェックをくぐり抜けてインサートを行わせるため
78
+ Mongoid::Persistence::Operations::Insert.class_eval do
79
+ def persist
80
+ prepare do |doc|
81
+ Fiber.yield
82
+ collection.insert(doc.as_document, options)
83
+ Mongoid::IdentityMap.set(doc)
84
+ end
85
+ end
86
+ end
87
+
88
+ f1 = Fiber.new {
89
+ Tengine::Core::Setting.should_receive(:dsl_version).and_return("123")
90
+ @klass1.should_receive(:driver).and_return(nil)
91
+ @klass1.should_receive(:driver_name).and_return("bar")
92
+ @klass1.module_eval { include Tengine::Core::Driveable }
93
+ }
94
+ f1.resume
95
+
96
+ f2 = Fiber.new {
97
+ Tengine::Core::Setting.should_receive(:dsl_version).exactly(2).times.and_return("123")
98
+ @klass2.should_receive(:driver).and_return(nil)
99
+ @klass2.should_receive(:driver_name).exactly(2).times.and_return("bar")
100
+ @klass2.module_eval { include Tengine::Core::Driveable }
101
+ }
102
+ f2.resume
103
+ f1.resume
104
+ f2.resume
105
+ f1.resume
106
+ f2.resume
107
+
108
+ # 元に戻しておく
109
+ Mongoid::Persistence::Operations::Insert.class_eval do
110
+ def persist
111
+ prepare do |doc|
112
+ collection.insert(doc.as_document, options)
113
+ Mongoid::IdentityMap.set(doc)
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
120
+
121
+ it "クラスを定義するファイルをloadするとドライバが登録されます" do
122
+ expect{
123
+ expect{
124
+ # load(File.expand_path('driveable_spec/driveable_test_class.rb', File.dirname(__FILE__)))
125
+ define_driveable_test_class
126
+ }.to change(Tengine::Core::Driver, :count).by(1)
127
+ }.to change(Tengine::Core::HandlerPath, :count).by(6)
128
+ end
129
+
130
+ context "すでにロードされている場合" do
131
+ before do
132
+ driver = Tengine::Core::Driver.new(
133
+ :name => "DriveableTestClass#{driveable_test_class_index + 1}",
134
+ :version => Tengine::Core::Setting.dsl_version,
135
+ :target_class_name => "DriveableTestClass#{driveable_test_class_index + 1}"
136
+ )
137
+ options = {:filepath => __FILE__, :lineno => __LINE__}
138
+ handler1 = driver.handlers.new({:target_method_name => 'foo' , :target_instantiation_key => :instance_method, :event_type_names => ['event01']}.update(options))
139
+ handler2 = driver.handlers.new({:target_method_name => 'bar' , :target_instantiation_key => :instance_method, :event_type_names => ['event02', 'event03']}.update(options))
140
+ handler3 = driver.handlers.new({:target_method_name => 'baz' , :target_instantiation_key => :static , :event_type_names => ['event04']}.update(options))
141
+ handler4 = driver.handlers.new({:target_method_name => 'hoge', :target_instantiation_key => :static , :event_type_names => ['event05', 'event06']}.update(options))
142
+ driver.save!
143
+ driver.handler_paths.create!(:handler_id => handler1.id, :event_type_name => "event01")
144
+ driver.handler_paths.create!(:handler_id => handler2.id, :event_type_name => "event02")
145
+ driver.handler_paths.create!(:handler_id => handler2.id, :event_type_name => "event03")
146
+ driver.handler_paths.create!(:handler_id => handler3.id, :event_type_name => "event04")
147
+ driver.handler_paths.create!(:handler_id => handler4.id, :event_type_name => "event05")
148
+ driver.handler_paths.create!(:handler_id => handler4.id, :event_type_name => "event06")
149
+ end
150
+ it "ドライバの件数は増えない" do
151
+ expect{
152
+ expect{
153
+ define_driveable_test_class
154
+ }.to_not change(Tengine::Core::Driver, :count)
155
+ }.to_not change(Tengine::Core::HandlerPath, :count)
156
+ end
157
+ end
158
+
159
+ context "ロードされたドライバ" do
160
+ before do
161
+ # load(File.expand_path('driveable_spec/driveable_test_class.rb', File.dirname(__FILE__)))
162
+ define_driveable_test_class
163
+ end
164
+
165
+ subject{ Tengine::Core::Driver.first }
166
+ its(:name){ should =~ /\ADriveableTestClass/ }
167
+ its(:version){ should_not == nil }
168
+ its(:enabled){ should == true }
169
+ its(:enabled_on_activation){ should == true }
170
+ its(:target_class_name){ should =~ /\ADriveableTestClass/ }
171
+
172
+ context "handlers[0]" do
173
+ subject{ Tengine::Core::Driver.first.handlers[0] }
174
+ its(:target_instantiation_key){ should == :instance_method }
175
+ its(:target_method_name){ should == 'foo' }
176
+ end
177
+
178
+ context "handlers[1]" do
179
+ subject{ Tengine::Core::Driver.first.handlers[1] }
180
+ its(:target_instantiation_key){ should == :instance_method }
181
+ its(:target_method_name){ should == 'bar' }
182
+ end
183
+
184
+ context "handlers[2]" do
185
+ subject{ Tengine::Core::Driver.first.handlers[2] }
186
+ its(:target_instantiation_key){ should == :static }
187
+ its(:target_method_name){ should == 'baz' }
188
+ end
189
+
190
+ context "handlers[3]" do
191
+ subject{ Tengine::Core::Driver.first.handlers[3] }
192
+ its(:target_instantiation_key){ should == :static }
193
+ its(:target_method_name){ should == 'hoge' }
194
+ end
195
+
196
+ context "インスタンスメソッドによるイベントハンドリング" do
197
+ (0..1).each do |idx|
198
+ context "handlers[#{idx}]" do
199
+ subject{ Tengine::Core::Driver.first.handlers[idx] }
200
+ before do
201
+ @event = mock(:event)
202
+ end
203
+ it "インスタンスが生成される" do
204
+ instance = @klass.new
205
+ @klass.should_receive(:new).with(no_args).and_return(instance)
206
+ STDOUT.should_receive(:puts)
207
+ subject.process_event(@event)
208
+ end
209
+ end
210
+ end
211
+
212
+ context "class << self...endで定義したクラスメソッドによるハンドリング" do
213
+ subject{ Tengine::Core::Driver.first.handlers[2] }
214
+ before do
215
+ @event = mock(:event)
216
+ end
217
+ it "インスタンスが生成される" do
218
+ STDOUT.should_receive(:puts)
219
+ subject.process_event(@event)
220
+ end
221
+ end
222
+
223
+ context "def self.hogeで定義したクラスメソッドによるハンドリング" do
224
+ subject{ Tengine::Core::Driver.first.handlers[3] }
225
+ before do
226
+ @event = mock(:event)
227
+ end
228
+ it "インスタンスが生成される" do
229
+ STDOUT.should_receive(:puts)
230
+ subject.process_event(@event)
231
+ end
232
+ end
233
+
234
+ end
235
+ end
236
+
237
+ end
238
+
239
+
240
+ end
@@ -0,0 +1,159 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ require 'mongoid/version'
5
+
6
+ describe Tengine::Core::Driver do
7
+
8
+ valid_attributes1 = {
9
+ :name => "driver100",
10
+ :version => "100",
11
+ }.freeze
12
+
13
+ context "nameとversionは必須" do
14
+ it "正常系" do
15
+ Tengine::Core::Driver.delete_all
16
+ driver1 = Tengine::Core::Driver.new(valid_attributes1)
17
+ driver1.valid?.should == true
18
+ end
19
+
20
+ [:name, :version].each do |key|
21
+ it "#{key}なし" do
22
+ attrs = valid_attributes1.dup
23
+ attrs.delete(key)
24
+ driver1 = Tengine::Core::Driver.new(attrs)
25
+ driver1.valid?.should == false
26
+ end
27
+ end
28
+ end
29
+
30
+ context "nameはバージョン毎にユニーク" do
31
+ before do
32
+ Tengine::Core::Driver.delete_all
33
+ Tengine::Core::Driver.create!(valid_attributes1)
34
+ end
35
+
36
+ it "同じ名前で登録されているものが存在する場合エラー" do
37
+ msg =
38
+ case Mongoid::VERSION
39
+ when /^2\.2\./ then
40
+ "Validation failed - Name is already taken in same version."
41
+ else
42
+ "Validation failed - Name is already taken."
43
+ end
44
+ expect{
45
+ Tengine::Core::Driver.create!(valid_attributes1)
46
+ }.to raise_error(Mongoid::Errors::Validations, msg)
47
+ end
48
+
49
+ it "同じバージョンでも異なる名前ならばOK" do
50
+ Tengine::Core::Driver.create!(valid_attributes1.merge(:name => "driver200"))
51
+ end
52
+
53
+ it "同じ名前でも異なるバージョンならばOK" do
54
+ Tengine::Core::Driver.create!(valid_attributes1.merge(:version => "101"))
55
+ end
56
+ end
57
+
58
+ context "nameのフォーマットはベース名に準拠する" do
59
+ it "スラッシュ'/’はリソース識別子で使われるのでnameには使用できません" do
60
+ driver1 = Tengine::Core::Driver.new(:name => "foo/bar")
61
+ driver1.valid?.should == false
62
+ driver1.errors[:name].should == [Tengine::Core::Validation::BASE_NAME.message]
63
+ end
64
+
65
+ it "コロン':'はリソース識別子で使われるのでnameには使用できません" do
66
+ driver1 = Tengine::Core::Driver.new(:name => "foo:bar")
67
+ driver1.valid?.should == false
68
+ driver1.errors[:name].should == [Tengine::Core::Validation::BASE_NAME.message]
69
+ end
70
+ end
71
+
72
+ context "保存時にHandlerPathを自動的に登録します" do
73
+ before do
74
+ Tengine::Core::Driver.delete_all
75
+ Tengine::Core::HandlerPath.delete_all
76
+ @d11 = Tengine::Core::Driver.new(:name => "driver1", :version => "1", :enabled => true)
77
+ @d11h1 = @d11.handlers.new(:event_type_names => ["foo" ], :filepath => "path/to/driver.rb", :lineno => 3)
78
+ @d11h2 = @d11.handlers.new(:event_type_names => ["boo" ], :filepath => "path/to/driver.rb", :lineno => 5)
79
+ @d11h3 = @d11.handlers.new(:event_type_names => ["blah"], :filepath => "path/to/driver.rb", :lineno => 7)
80
+ @d11.save!
81
+ end
82
+ it do
83
+ Tengine::Core::HandlerPath.count.should == 3
84
+ Tengine::Core::HandlerPath.event_type_name("foo").map(&:handler_id).should == [@d11h1.id]
85
+ Tengine::Core::HandlerPath.event_type_name("boo").map(&:handler_id).should == [@d11h2.id]
86
+ Tengine::Core::HandlerPath.event_type_name("blah").map(&:handler_id).should == [@d11h3.id]
87
+ end
88
+ end
89
+
90
+ context "must have only one session" do
91
+ subject do
92
+ Tengine::Core::Driver.delete_all
93
+ Tengine::Core::Driver.create!(:name => "driver1", :version => "1", :enabled => true)
94
+ end
95
+ its(:session){ should be_a(Tengine::Core::Session)}
96
+ end
97
+
98
+ describe "名前で検索" do
99
+ before do
100
+ Tengine::Core::Setting.delete_all
101
+ Tengine::Core::Setting.create!(:name => "dsl_version", :value => "2")
102
+ Tengine::Core::Driver.delete_all
103
+ Tengine::Core::Driver.create!(:name => "driver1", :version => "1", :enabled => true)
104
+ Tengine::Core::Driver.create!(:name => "driver2", :version => "1", :enabled => true)
105
+ Tengine::Core::Driver.create!(:name => "driver3", :version => "2", :enabled => true)
106
+ Tengine::Core::Driver.create!(:name => "driver4", :version => "2", :enabled => true)
107
+ end
108
+
109
+ [:find_by_name, :find_by_name!].each do |method_name|
110
+ context "存在する場合はそれを返す" do
111
+ it "バージョン指定なし" do
112
+ driver = Tengine::Core::Driver.send(method_name, "driver3")
113
+ driver.should be_a(Tengine::Core::Driver)
114
+ driver.name.should == "driver3"
115
+ driver.version.should == "2"
116
+ end
117
+
118
+ it "バージョン指定あり" do
119
+ driver = Tengine::Core::Driver.send(method_name, "driver1", :version => "1")
120
+ driver.should be_a(Tengine::Core::Driver)
121
+ driver.name.should == "driver1"
122
+ driver.version.should == "1"
123
+ end
124
+ end
125
+ end
126
+
127
+ context ":find_by_nameは見つからなかった場合はnilを返す" do
128
+ it "バージョン指定なし" do
129
+ Tengine::Core::Driver.find_by_name("driver1").should == nil
130
+ end
131
+
132
+ it "バージョン指定あり" do
133
+ Tengine::Core::Driver.find_by_name("driver3", :version => "1").should == nil
134
+ end
135
+ end
136
+
137
+ context ":find_by_name!は見つからなかった場合はTengine::Errors::NotFoundをraiseする" do
138
+ it "バージョン指定なし" do
139
+ begin
140
+ Tengine::Core::Driver.find_by_name!("driver2")
141
+ fail
142
+ rescue Tengine::Errors::NotFound => e
143
+ e.message.should == "Tengine::Core::Driver named \"driver2\" not found"
144
+ end
145
+ end
146
+
147
+ it "バージョン指定あり" do
148
+ begin
149
+ Tengine::Core::Driver.find_by_name!("driver4", :version => "1")
150
+ fail
151
+ rescue Tengine::Errors::NotFound => e
152
+ e.message.should == "Tengine::Core::Driver named \"driver4\" with {:version=>\"1\"} not found"
153
+ end
154
+ end
155
+ end
156
+
157
+ end
158
+
159
+ end
@@ -0,0 +1,172 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe Tengine::Core::DslLoader do
5
+
6
+ describe :__evaluate__ do
7
+ before do
8
+ Tengine::Core::Driver.delete_all
9
+ Tengine::Core::HandlerPath.delete_all
10
+ end
11
+
12
+ context "DSLのファイルを指定する場合" do
13
+ context "Driverを有効化して登録(シングルプロセスモード)" do
14
+ before do
15
+ config = Tengine::Core::Config::Core.new({
16
+ :tengined => {
17
+ :load_path => File.expand_path('../../../examples/uc01_execute_processing_for_event.rb', File.dirname(__FILE__))
18
+ }
19
+ })
20
+ @kernel = Tengine::Core::Kernel.new(config)
21
+ end
22
+
23
+ it "イベントハンドラ定義を評価して、ドライバとハンドラを登録する" do
24
+ @kernel.evaluate
25
+ # $LOAD_PATH.include?(@config[:dsl_store_path]).should be_true
26
+ # driver01 = Tengine::Core::Driver.find(:conditions => {:name => "driver01"})
27
+ Tengine::Core::Driver.count.should == 1
28
+ driver01 = Tengine::Core::Driver.first
29
+ driver01.should_not be_nil
30
+ driver01.name.should == "driver01"
31
+ driver01.version.should == "20110902213500"
32
+ driver01.enabled.should == true
33
+ driver01.handlers.count.should == 1
34
+ handler1 = driver01.handlers.first
35
+ handler1.event_type_names.should == %w[event01]
36
+ Tengine::Core::HandlerPath.where(:driver_id => driver01.id).count.should == 1
37
+ Tengine::Core::HandlerPath.default_driver_version = "20110902213500"
38
+ Tengine::Core::HandlerPath.find_handlers("event01").count.should == 1
39
+ end
40
+ end
41
+
42
+
43
+ context "Driverを無効化して登録(マルチプロセスモード)" do
44
+ before do
45
+ config = Tengine::Core::Config::Core.new({
46
+ :tengined => {
47
+ :load_path => File.expand_path('../../../examples/uc01_execute_processing_for_event.rb', File.dirname(__FILE__)),
48
+ :skip_enablement => true
49
+ }
50
+ })
51
+ @kernel = Tengine::Core::Kernel.new(config)
52
+ end
53
+
54
+ it "イベントハンドラ定義を評価して、ドライバとハンドラを登録する" do
55
+ @kernel.evaluate
56
+ Tengine::Core::Driver.count.should == 1
57
+ driver01 = Tengine::Core::Driver.first
58
+ driver01.should_not be_nil
59
+ driver01.name.should == "driver01"
60
+ driver01.version.should == "20110902213500"
61
+ driver01.handlers.count.should == 1
62
+ handler1 = driver01.handlers.first
63
+ handler1.event_type_names.should == %w[event01]
64
+ Tengine::Core::HandlerPath.where(:driver_id => driver01.id).count.should == 1
65
+ Tengine::Core::HandlerPath.default_driver_version = "20110902213500"
66
+ Tengine::Core::HandlerPath.find_handlers("event01").count.should == 0
67
+ end
68
+ end
69
+ end
70
+
71
+ context "DSLのファイルを指定しない場合" do
72
+ before do
73
+ config = Tengine::Core::Config::Core.new({
74
+ :tengined => {
75
+ :load_path => File.expand_path('../../../examples', File.dirname(__FILE__))
76
+ }
77
+ })
78
+ @kernel = Tengine::Core::Kernel.new(config)
79
+ @loader = @kernel.dsl_context
80
+
81
+ @loader.config.should_receive(:dsl_file_paths).and_return([
82
+ "#{config[:tengined][:load_path]}/uc01_execute_processing_for_event.rb",
83
+ "#{config[:tengined][:load_path]}/uc02_fire_another_event.rb",
84
+ "#{config[:tengined][:load_path]}/uc03_2handlers_for_1event.rb",
85
+ ])
86
+ end
87
+
88
+ it "イベントハンドラ定義を評価して、ドライバとハンドラを登録する" do
89
+ # driver03にevent03が複数定義されているための警告メッセージ
90
+ # Tengine::Core.stdout_logger.should_receive(:warn).with("driver\"driver03\"には、同一のevent_type_name\"event03\"が複数存在します")
91
+
92
+ @kernel.evaluate
93
+
94
+ Tengine::Core::Driver.count.should == 3
95
+ drivers = Tengine::Core::Driver.all
96
+ drivers.map(&:name).sort.should == ["driver01", "driver02", "driver03"]
97
+ drivers.each do |driver|
98
+ driver.version.should == "20110902213500"
99
+ end
100
+
101
+ driver01 = Tengine::Core::Driver.where(:name => "driver01").first
102
+ handler1 = driver01.handlers.first
103
+ handler1.event_type_names.should == %w[event01]
104
+ Tengine::Core::HandlerPath.where(:driver_id => driver01.id).count.should == 1
105
+
106
+ driver02 = Tengine::Core::Driver.where(:name => "driver02").first
107
+ driver02.handlers.count.should == 2
108
+ handler2_1, handler2_2 = driver02.handlers
109
+ handler2_1.event_type_names.should == %w[event02_1]
110
+ handler2_2.event_type_names.should == %w[event02_2]
111
+ Tengine::Core::HandlerPath.where(:driver_id => driver02.id).count.should == 2
112
+
113
+ driver03 = Tengine::Core::Driver.where(:name => "driver03").first
114
+ driver03.handlers.count.should == 2
115
+ handler3_1 = driver03.handlers.first
116
+ handler3_1.filepath.should == "uc03_2handlers_for_1event.rb"
117
+ handler3_1.lineno.should == 8
118
+ handler3_1.event_type_names.should == %w[event03]
119
+ handler3_2 = driver03.handlers.last
120
+ handler3_2.filepath.should == "uc03_2handlers_for_1event.rb"
121
+ handler3_2.lineno.should == 12
122
+ handler3_2.event_type_names.should == %w[event03]
123
+ Tengine::Core::HandlerPath.where(:driver_id => driver03.id).count.should == 2
124
+ end
125
+ end
126
+ end
127
+
128
+ describe "フィルタの登録" do
129
+ before do
130
+ Tengine::Core::Driver.delete_all
131
+ Tengine::Core::HandlerPath.delete_all
132
+ end
133
+
134
+ context "Driverを有効化して登録(シングルプロセスモード)" do
135
+ before do
136
+ config = Tengine::Core::Config::Core.new({
137
+ :tengined => {
138
+ :load_path => File.expand_path('../../../examples/uc08_if_both_a_and_b_occurs.rb', File.dirname(__FILE__))
139
+ }
140
+ })
141
+ @kernel = Tengine::Core::Kernel.new(config)
142
+ end
143
+
144
+ it "イベントハンドラ定義を評価して、ドライバとハンドラを登録する" do
145
+ @kernel.evaluate
146
+ Tengine::Core::Driver.count.should == 1
147
+ driver = Tengine::Core::Driver.first
148
+ driver.should_not be_nil
149
+ driver.name.should == "driver08"
150
+ driver.version.should == "20110902213500"
151
+ driver.handlers.count.should == 1
152
+ handler1 = driver.handlers.first
153
+ handler1.event_type_names.should == %w[event08_a event_08_b]
154
+ handler1.filter.should == {
155
+ 'method' => :and,
156
+ 'children' => [
157
+ { 'pattern' => :event08_a , 'method' => :find_or_mark_in_session },
158
+ { 'pattern' => :event_08_b, 'method' => :find_or_mark_in_session },
159
+ ]
160
+ }
161
+ Tengine::Core::HandlerPath.where(:driver_id => driver.id).count.should == 2
162
+ Tengine::Core::HandlerPath.default_driver_version = "20110902213500"
163
+ handler_a = Tengine::Core::HandlerPath.find_handlers("event08_a").first
164
+ handler_b = Tengine::Core::HandlerPath.find_handlers("event_08_b").last
165
+ handler_a.id.should == handler1.id
166
+ handler_b.id.should == handler1.id
167
+ end
168
+ end
169
+
170
+ end
171
+
172
+ end