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,62 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ require 'tengine/event'
5
+
6
+ describe Tengine::Core::Config::Atd do
7
+
8
+ describe :[] do
9
+ it "should convert a Hash to a Tengine::Core::Config::Atd" do
10
+ converted = Tengine::Core::Config::Atd[{:process => {:daemon => true}}]
11
+ converted.should be_a(Tengine::Core::Config::Atd)
12
+ converted[:process][:daemon].should be_true
13
+ end
14
+
15
+ it "should return same Tengine::Core::Config::Atd" do
16
+ converted = Tengine::Core::Config::Atd.new(:process => {:daemon => true})
17
+ Tengine::Core::Config::Atd[converted].should == converted
18
+ end
19
+ end
20
+
21
+ context "デフォルト" do
22
+ subject do
23
+ Tengine::Core::Config::Atd.new
24
+ end
25
+ its(:db){ should == {
26
+ 'host' => 'localhost',
27
+ 'port' => 27017,
28
+ 'username' => nil,
29
+ 'password' => nil,
30
+ 'database' => 'tengine_production',
31
+ }}
32
+
33
+ it "db" do
34
+ subject.db.should == {
35
+ 'host' => 'localhost',
36
+ 'port' => 27017,
37
+ 'username' => nil,
38
+ 'password' => nil,
39
+ 'database' => 'tengine_production',
40
+ }
41
+ end
42
+
43
+ it "process_daemon" do
44
+ subject[:process][:daemon].should be_false
45
+ end
46
+
47
+ it "heartbeat_atd" do
48
+ subject[:heartbeat][:atd][:interval].should == 0
49
+ end
50
+
51
+ end
52
+
53
+ context "指定した設定ファイルが存在しない場合" do
54
+ it "例外を生成します" do
55
+ config_path = File.expand_path("../config_spec/unexist_config.yml", File.dirname(__FILE__))
56
+ expect{
57
+ Tengine::Core::Config::Atd.new(:config => config_path)
58
+ }.to raise_error(Tengine::Core::ConfigError, /No such file or directory - #{config_path}/)
59
+ end
60
+ end
61
+
62
+ end
@@ -0,0 +1,479 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ require 'tengine/event'
5
+
6
+ describe Tengine::Core::Config::Core do
7
+
8
+ # log_configのテストは spec/models/tengine/core/config_spec/log_config_spec.rb にあります。
9
+
10
+ describe :[] do
11
+ it "should convert a Hash to a Tengine::Core::Config::Core" do
12
+ converted = Tengine::Core::Config::Core[{ :process => { :daemon => true}}]
13
+ converted.should be_a(Tengine::Core::Config::Core)
14
+ converted[:process][:daemon].should be_true
15
+ end
16
+
17
+ it "should return same Tengine::Core::Config::Core" do
18
+ converted = Tengine::Core::Config::Core.new(:process => { :daemon => true})
19
+ Tengine::Core::Config::Core[converted].should == converted
20
+ end
21
+ end
22
+
23
+ context "デフォルト" do
24
+ subject do
25
+ Tengine::Core::Config::Core.new
26
+ end
27
+ its(:status_dir){ should == "./tmp/tengined_status" }
28
+ its(:activation_dir){ should == "./tmp/tengined_activations" }
29
+
30
+ its(:confirmation_threshold){ should == Tengine::Event::LEVELS_INV[:info] }
31
+ its(:heartbeat_enabled?){ should == false }
32
+
33
+ its(:db){ should == {
34
+ 'host' => 'localhost',
35
+ 'port' => 27017,
36
+ 'username' => nil,
37
+ 'password' => nil,
38
+ 'database' => 'tengine_production',
39
+ }}
40
+
41
+ it do
42
+ subject.db.should == {
43
+ 'host' => 'localhost',
44
+ 'port' => 27017,
45
+ 'username' => nil,
46
+ 'password' => nil,
47
+ 'database' => 'tengine_production',
48
+ }
49
+ end
50
+ end
51
+
52
+
53
+ shared_examples_for "ディレクトリもファイルも存在しない場合はエラー" do |path|
54
+ before do
55
+ @error_message = "file or directory doesn't exist. #{path}"
56
+ Dir.should_receive(:exist?).with(path).and_return(false)
57
+ File.should_receive(:exist?).with(path).and_return(false)
58
+ end
59
+ it :dsl_dir_path do
60
+ expect{ subject.dsl_dir_path }.should raise_error(Tengine::Core::ConfigError, @error_message)
61
+ end
62
+ it :dsl_file_paths do
63
+ expect{ subject.dsl_file_paths }.should raise_error(Tengine::Core::ConfigError, @error_message)
64
+ end
65
+ it :dsl_version_path do
66
+ expect{ subject.dsl_version_path }.should raise_error(Tengine::Core::ConfigError, @error_message)
67
+ end
68
+ it :dsl_version do
69
+ expect{ subject.dsl_version }.should raise_error(Tengine::Core::ConfigError, @error_message)
70
+ end
71
+ end
72
+
73
+
74
+
75
+ context "load_pathに相対パス" do
76
+ before do
77
+ # capistranoのデフォルトのデプロイ先を想定しています
78
+ # see "BACK TO CONFIGURATION" in https://github.com/capistrano/capistrano/wiki/2.x-From-The-Beginning
79
+ # http://www.slideshare.net/T2J/capistrano-tips-tips
80
+ Dir.stub!(:pwd).and_return("/u/apps/app1/current")
81
+ end
82
+
83
+ shared_examples_for "相対パス指定時のパスの振る舞い" do
84
+ it :dsl_dir_path do
85
+ subject.dsl_dir_path.should == "/u/apps/app1/current/tengine_dsls"
86
+ end
87
+
88
+ it :dsl_version_path do
89
+ subject.dsl_version_path.should == "/u/apps/app1/current/tengine_dsls/VERSION"
90
+ end
91
+
92
+ it "VERSIONファイルがある場合" do
93
+ File.should_receive(:exist?).with("/u/apps/app1/current/tengine_dsls/VERSION").and_return(true)
94
+ File.should_receive(:read).and_return("TEST20110905164100")
95
+ subject.dsl_version.should == "TEST20110905164100"
96
+ end
97
+
98
+ it "VERSIONファイルがない場合" do
99
+ File.should_receive(:exist?).with("/u/apps/app1/current/tengine_dsls/VERSION").and_return(false)
100
+ t = Time.local(2011,9,5,17,28,30)
101
+ Time.stub!(:now).and_return(t)
102
+ subject.dsl_version.should == "20110905172830"
103
+ end
104
+ end
105
+
106
+ context "のディレクトリを指定する設定ファイル" do
107
+ subject do
108
+ Tengine::Core::Config::Core.new(:config => File.expand_path("../config_spec/config_with_dir_relative_load_path.yml", File.dirname(__FILE__)))
109
+ end
110
+ it "should allow to read value by using []" do
111
+ expected = {
112
+ # :daemon => true,
113
+ :activation_timeout => 300,
114
+ :load_path => "tengine_dsls",
115
+ :cache_drivers => true,
116
+ # :pid_dir => "tmp/tengined_pids",
117
+ :status_dir => "tmp/tengined_status",
118
+ :activation_dir => "tmp/tengined_activations",
119
+ # :heartbeat_period => 600,
120
+ :confirmation_threshold => "warn",
121
+ :skip_load=>nil,
122
+ :skip_enablement=>nil,
123
+ :wait_activation=>nil,
124
+ }
125
+ subject[:tengined].to_hash.should == expected
126
+ subject['tengined'].to_hash.should == expected
127
+ subject[:process]['daemon'].should == true
128
+ subject[:process][:daemon].should == true
129
+ subject[:event_queue][:connection][:host].should == "localhost"
130
+ subject['event_queue']['connection']['host'].should == "localhost"
131
+ subject[:event_queue][:queue][:name].should == "tengine_event_queue2"
132
+ subject['event_queue']['queue']['name'].should == "tengine_event_queue2"
133
+ end
134
+ its(:heartbeat_enabled?){ should == true }
135
+
136
+ describe :relative_path_from_dsl_dir do
137
+ it "絶対パスが指定されるとdsl_dir_pathからの相対パスを返します" do
138
+ Dir.should_receive(:exist?).with("/u/apps/app1/current/tengine_dsls").and_return(true)
139
+ subject.relative_path_from_dsl_dir("/u/apps/app1/shared/config").should == "../../shared/config"
140
+ end
141
+
142
+ it "相対パスが指定されると(計算のしようがないので)そのまま返します" do
143
+ subject.relative_path_from_dsl_dir("lib/tengine/foo/bar").should == "lib/tengine/foo/bar"
144
+ end
145
+ end
146
+
147
+ describe :confirmation_threshold do
148
+ it "--tengined-confirmation-levelで設定した値を数値に変換する" do
149
+ subject.confirmation_threshold.should == Tengine::Event::LEVELS_INV[:warn]
150
+ end
151
+ end
152
+
153
+ context "ディレクトリが存在する場合" do
154
+ before do
155
+ Dir.should_receive(:exist?).with("/u/apps/app1/current/tengine_dsls").and_return(true)
156
+ end
157
+
158
+ it :dsl_file_paths do
159
+ Dir.should_receive(:glob).
160
+ with("/u/apps/app1/current/tengine_dsls/**/*.rb").
161
+ and_return(["/u/apps/app1/current/tengine_dsls/foo/bar.rb"])
162
+ subject.dsl_file_paths.should == ["/u/apps/app1/current/tengine_dsls/foo/bar.rb"]
163
+ end
164
+
165
+ it_should_behave_like "相対パス指定時のパスの振る舞い"
166
+ end
167
+
168
+ it_should_behave_like "ディレクトリもファイルも存在しない場合はエラー", "/u/apps/app1/current/tengine_dsls"
169
+ end
170
+
171
+ context "のファイルを指定する設定ファイル" do
172
+ subject do
173
+ Tengine::Core::Config::Core.new(:config => File.expand_path("../config_spec/config_with_file_relative_load_path.yml", File.dirname(__FILE__)))
174
+ end
175
+ it "should allow to read value by using []" do
176
+ expected = {
177
+ # :daemon => true,
178
+ :activation_timeout => 300,
179
+ :load_path => "tengine_dsls/init.rb",
180
+ :cache_drivers => true,
181
+ # :pid_dir => "tmp/tengined_pids",
182
+ :status_dir => "tmp/tengined_status",
183
+ :activation_dir => "tmp/tengined_activations",
184
+ # :heartbeat_period => 600,
185
+ :confirmation_threshold => "warn",
186
+ :skip_load=>nil,
187
+ :skip_enablement=>nil,
188
+ :wait_activation=>nil,
189
+ }
190
+ subject[:tengined].to_hash.should == expected
191
+ subject['tengined'].to_hash.should == expected
192
+ subject[:tengined]['load_path'].should == "tengine_dsls/init.rb"
193
+ subject[:tengined][:load_path].should == "tengine_dsls/init.rb"
194
+ end
195
+
196
+ describe :relative_path_from_dsl_dir do
197
+ it "絶対パスが指定されるとdsl_dir_pathからの相対パスを返します" do
198
+ Dir.should_receive(:exist?).with("/u/apps/app1/current/tengine_dsls/init.rb").and_return(false)
199
+ File.should_receive(:exist?).with("/u/apps/app1/current/tengine_dsls/init.rb").and_return(true)
200
+ subject.relative_path_from_dsl_dir("/u/apps/app1/shared/config").should == "../../shared/config"
201
+ end
202
+
203
+ it "相対パスが指定されると(計算のしようがないので)そのまま返します" do
204
+ subject.relative_path_from_dsl_dir("lib/tengine/foo/bar").should == "lib/tengine/foo/bar"
205
+ end
206
+ end
207
+
208
+ context "ファイルが存在する場合" do
209
+ before do
210
+ Dir.should_receive(:exist?).with("/u/apps/app1/current/tengine_dsls/init.rb").and_return(false)
211
+ File.should_receive(:exist?).with("/u/apps/app1/current/tengine_dsls/init.rb").and_return(true)
212
+ end
213
+
214
+ it :dsl_file_paths do
215
+ subject.dsl_file_paths.should == ["/u/apps/app1/current/tengine_dsls/init.rb"]
216
+ end
217
+
218
+ it_should_behave_like "相対パス指定時のパスの振る舞い"
219
+ end
220
+
221
+ it_should_behave_like "ディレクトリもファイルも存在しない場合はエラー", "/u/apps/app1/current/tengine_dsls/init.rb"
222
+ end
223
+ end
224
+
225
+
226
+ context "load_pathに絶対パス" do
227
+
228
+ shared_examples_for "絶対パス指定時のパスの振る舞い" do
229
+ it :dsl_dir_path do
230
+ subject.dsl_dir_path.should == "/var/lib/tengine"
231
+ end
232
+
233
+ it :dsl_version_path do
234
+ subject.dsl_version_path.should == "/var/lib/tengine/VERSION"
235
+ end
236
+
237
+ it "VERSIONファイルがある場合" do
238
+ File.should_receive(:exist?).with("/var/lib/tengine/VERSION").and_return(true)
239
+ File.should_receive(:read).and_return("TEST20110905164100")
240
+ subject.dsl_version.should == "TEST20110905164100"
241
+ end
242
+
243
+ it "VERSIONファイルがない場合" do
244
+ File.should_receive(:exist?).with("/var/lib/tengine/VERSION").and_return(false)
245
+ t = Time.local(2011,9,5,17,28,30)
246
+ Time.stub!(:now).and_return(t)
247
+ subject.dsl_version.should == "20110905172830"
248
+ end
249
+ end
250
+
251
+ context "のディレクトリを指定する設定ファイル" do
252
+ subject do
253
+ Tengine::Core::Config::Core.new(:config => File.expand_path("../config_spec/config_with_dir_absolute_load_path.yml", File.dirname(__FILE__)))
254
+ end
255
+ it "should allow to read value by using []" do
256
+ expected = {
257
+ # :daemon => true,
258
+ :activation_timeout => 300,
259
+ :load_path => "/var/lib/tengine",
260
+ :cache_drivers => true,
261
+ # :pid_dir => "/var/run/tengined_pids",
262
+ :status_dir => "/var/run/tengined_status",
263
+ :activation_dir => "/var/run/tengined_activations",
264
+ # :heartbeat_period => 600,
265
+ :confirmation_threshold => "warn",
266
+ :skip_load=>nil,
267
+ :skip_enablement=>nil,
268
+ :wait_activation=>nil,
269
+ }
270
+ subject[:tengined].to_hash.should == expected
271
+ subject['tengined'].to_hash.should == expected
272
+ subject[:process]['daemon'].should == true
273
+ subject[:process][:daemon].should == true
274
+ subject[:event_queue][:connection][:host].should == "localhost"
275
+ subject['event_queue']['connection']['host'].should == "localhost"
276
+ subject[:event_queue][:queue][:name].should == "tengine_event_queue2"
277
+ subject['event_queue']['queue']['name'].should == "tengine_event_queue2"
278
+ end
279
+ its(:heartbeat_enabled?){ should == true }
280
+
281
+ describe :relative_path_from_dsl_dir do
282
+ it "絶対パスが指定されるとdsl_dir_pathからの相対パスを返します" do
283
+ Dir.should_receive(:exist?).with("/var/lib/tengine").and_return(true)
284
+ subject.relative_path_from_dsl_dir("/var/lib/tengine/foo/bar").should == "foo/bar"
285
+ end
286
+
287
+ it "相対パスが指定されると(計算のしようがないので)そのまま返します" do
288
+ subject.relative_path_from_dsl_dir("lib/tengine/foo/bar").should == "lib/tengine/foo/bar"
289
+ end
290
+ end
291
+
292
+ describe :confirmation_threshold do
293
+ it "--tengined-confirmation-levelで設定した値を数値に変換する" do
294
+ subject.confirmation_threshold.should == Tengine::Event::LEVELS_INV[:warn]
295
+ end
296
+ end
297
+
298
+ context "ディレクトリが存在する場合" do
299
+ before do
300
+ Dir.should_receive(:exist?).with("/var/lib/tengine").and_return(true)
301
+ end
302
+
303
+ it :dsl_file_paths do
304
+ Dir.should_receive(:glob).
305
+ with("/var/lib/tengine/**/*.rb").
306
+ and_return(["/var/lib/tengine/foo/bar.rb"])
307
+ subject.dsl_file_paths.should == ["/var/lib/tengine/foo/bar.rb"]
308
+ end
309
+
310
+ # C0カバレッジを100%にするために追加しています
311
+ it "dsl_dir_path and dsl_file_paths" do
312
+ Dir.should_receive(:glob).
313
+ with("/var/lib/tengine/**/*.rb").
314
+ and_return(["/var/lib/tengine/foo/bar.rb"])
315
+ subject.dsl_dir_path.should == "/var/lib/tengine"
316
+ subject.dsl_file_paths.should == ["/var/lib/tengine/foo/bar.rb"]
317
+ end
318
+
319
+ it_should_behave_like "絶対パス指定時のパスの振る舞い"
320
+ end
321
+
322
+ it_should_behave_like "ディレクトリもファイルも存在しない場合はエラー", "/var/lib/tengine"
323
+ end
324
+
325
+ context "のファイルを指定する設定ファイル" do
326
+ subject do
327
+ Tengine::Core::Config::Core.new(:config => File.expand_path("../config_spec/config_with_file_absolute_load_path.yml", File.dirname(__FILE__)))
328
+ end
329
+ it "should allow to read value by using []" do
330
+ expected = {
331
+ # :daemon => true,
332
+ :activation_timeout => 300,
333
+ :load_path => "/var/lib/tengine/init.rb",
334
+ :cache_drivers => true,
335
+ # :pid_dir => "/var/run/tengined_pids",
336
+ :status_dir => "/var/run/tengined_status",
337
+ :activation_dir => "/var/run/tengined_activations",
338
+ # :heartbeat_period => 600,
339
+ :confirmation_threshold => "warn",
340
+ :skip_load=>nil,
341
+ :skip_enablement=>nil,
342
+ :wait_activation=>nil,
343
+ }
344
+ subject[:tengined].to_hash.should == expected
345
+ subject['tengined'].to_hash.should == expected
346
+ subject[:tengined]['load_path'].should == "/var/lib/tengine/init.rb"
347
+ subject[:tengined][:load_path].should == "/var/lib/tengine/init.rb"
348
+ end
349
+
350
+ describe :relative_path_from_dsl_dir do
351
+ it "絶対パスが指定されるとdsl_dir_pathからの相対パスを返します" do
352
+ Dir.should_receive(:exist?).with("/var/lib/tengine/init.rb").and_return(false)
353
+ File.should_receive(:exist?).with("/var/lib/tengine/init.rb").and_return(true)
354
+ subject.relative_path_from_dsl_dir("/var/lib/tengine/foo/bar").should == "foo/bar"
355
+ end
356
+
357
+ it "相対パスが指定されると(計算のしようがないので)そのまま返します" do
358
+ subject.relative_path_from_dsl_dir("lib/tengine/foo/bar").should == "lib/tengine/foo/bar"
359
+ end
360
+ end
361
+
362
+ context "ファイルが存在する場合" do
363
+ before do
364
+ Dir.should_receive(:exist?).with("/var/lib/tengine/init.rb").and_return(false)
365
+ File.should_receive(:exist?).with("/var/lib/tengine/init.rb").and_return(true)
366
+ end
367
+
368
+ it :dsl_file_paths do
369
+ subject.dsl_file_paths.should == ["/var/lib/tengine/init.rb"]
370
+ end
371
+
372
+ it_should_behave_like "絶対パス指定時のパスの振る舞い"
373
+ end
374
+
375
+ it_should_behave_like "ディレクトリもファイルも存在しない場合はエラー", "/var/lib/tengine/init.rb"
376
+ end
377
+ end
378
+
379
+ context "指定した設定ファイルが存在しない場合" do
380
+ it "例外を生成します" do
381
+ config_path = File.expand_path("../config_spec/unexist_config.yml", File.dirname(__FILE__))
382
+ expect{
383
+ Tengine::Core::Config::Core.new(:config => config_path)
384
+ }.to raise_error(Tengine::Core::ConfigError, /No such file or directory - #{config_path}/)
385
+ end
386
+ end
387
+
388
+
389
+ context "[BUG] tengined起動時に-fオプションで設定ファイルを指定した際に、設定ファイルに記載したdb-portの設定が有効でない" do
390
+ before do
391
+ @config_path = File.expand_path("../config_spec/another_port.yml", File.dirname(__FILE__))
392
+ end
393
+
394
+ shared_examples_for "正しく読み込む" do
395
+ it "DBについて" do
396
+ @config.should be_a(Tengine::Core::Config::Core) if @config
397
+ hash = @config || @hash
398
+ hash[:db]['port'].should == 21039
399
+ hash[:db]['host'].should == 'localhost'
400
+ hash[:db]['username'].should == nil
401
+ hash[:db]['password'].should == nil
402
+ hash[:db]['database'].should == "tengine_production"
403
+ end
404
+ end
405
+
406
+ context "バグストーリーに添付された設定ファイルをロード" do
407
+ # このテストは元々パスしてました
408
+ before do
409
+ @config = Tengine::Core::Config::Core.new(:config => @config_path)
410
+ end
411
+ it_should_behave_like "正しく読み込む"
412
+ end
413
+
414
+ context "起動コマンドの引数を解釈したConfig" do
415
+ before do
416
+ @config = Tengine::Core::Config::Core.parse(["-f", @config_path]) # bin/tenginedではARGVが渡されます
417
+ end
418
+ it_should_behave_like "正しく読み込む"
419
+ end
420
+
421
+ context "起動コマンドの引数を解釈したHash" do
422
+ before do
423
+ @hash = Tengine::Core::Config::Core.parse_to_hash(["-f", @config_path]) # bin/tenginedではARGVが渡されます
424
+ end
425
+ it ":configを除いてスケルトンとほとんど同じ" do
426
+ @hash[:config].should == @config_path
427
+ @hash[:config] = nil
428
+ @hash.should == Tengine::Core::Config::Core.skelton_hash
429
+ end
430
+ end
431
+ end
432
+
433
+ context "tenginedの設定ファイルが不正でエラーになった場合原因が分からないので、不正な箇所が解るようにする" do
434
+ it "erbの式の中に間違ったrubyのコードがある設定ファイル" do
435
+ path = File.expand_path("../config/syntax_error_in_erb.yml.erb", File.dirname(__FILE__))
436
+ begin
437
+ Tengine::Core::Config::Core.parse(["-f", path])
438
+ fail
439
+ rescue Tengine::Core::ConfigError => e
440
+ e.message.should =~ /syntax_error_in_erb.yml.erb:9: syntax error/
441
+ e.message.should include(path)
442
+ end
443
+ end
444
+
445
+ it "YAMLとして間違っている設定ファイル" do
446
+ path = File.expand_path("../config/wrong_yaml.yml.erb", File.dirname(__FILE__))
447
+ begin
448
+ Tengine::Core::Config::Core.parse(["-f", path])
449
+ fail
450
+ rescue Tengine::Core::ConfigError => e
451
+ e.message.should =~ /couldn't parse YAML at line \d+ column \d+/
452
+ e.message.should include(path)
453
+ end
454
+ end
455
+
456
+ it "項目名が間違っている設定ファイル" do
457
+ path = File.expand_path("../config/wrong_field_name.yml.erb", File.dirname(__FILE__))
458
+ begin
459
+ Tengine::Core::Config::Core.parse(["-f", path])
460
+ fail
461
+ rescue Tengine::Core::ConfigError => e
462
+ e.message.should =~ /undefined method `load_path='/
463
+ e.message.should include(path)
464
+ end
465
+ end
466
+
467
+ it "カテゴリ名が間違っている設定ファイル" do
468
+ path = File.expand_path("../config/wrong_category_name.yml.erb", File.dirname(__FILE__))
469
+ begin
470
+ Tengine::Core::Config::Core.parse(["-f", path])
471
+ fail
472
+ rescue Tengine::Core::ConfigError => e
473
+ e.message.should =~ /child not found for \"process_configs\"/
474
+ e.message.should include(path)
475
+ end
476
+ end
477
+ end
478
+
479
+ end