cuboid 0.0.0 → 0.0.1alpha

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 (221) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +0 -0
  3. data/Gemfile +20 -5
  4. data/LICENSE.md +22 -0
  5. data/README.md +158 -19
  6. data/Rakefile +56 -3
  7. data/config/paths.yml +15 -0
  8. data/cuboid.gemspec +61 -23
  9. data/lib/cuboid.rb +96 -4
  10. data/lib/cuboid/application.rb +326 -0
  11. data/lib/cuboid/application/parts/data.rb +18 -0
  12. data/lib/cuboid/application/parts/report.rb +29 -0
  13. data/lib/cuboid/application/parts/state.rb +274 -0
  14. data/lib/cuboid/application/runtime.rb +25 -0
  15. data/lib/cuboid/banner.rb +13 -0
  16. data/lib/cuboid/data.rb +86 -0
  17. data/lib/cuboid/data/application.rb +52 -0
  18. data/lib/cuboid/error.rb +9 -0
  19. data/lib/cuboid/option_group.rb +129 -0
  20. data/lib/cuboid/option_groups.rb +8 -0
  21. data/lib/cuboid/option_groups/datastore.rb +23 -0
  22. data/lib/cuboid/option_groups/dispatcher.rb +38 -0
  23. data/lib/cuboid/option_groups/output.rb +14 -0
  24. data/lib/cuboid/option_groups/paths.rb +184 -0
  25. data/lib/cuboid/option_groups/report.rb +39 -0
  26. data/lib/cuboid/option_groups/rpc.rb +105 -0
  27. data/lib/cuboid/option_groups/scheduler.rb +27 -0
  28. data/lib/cuboid/option_groups/snapshot.rb +13 -0
  29. data/lib/cuboid/option_groups/system.rb +10 -0
  30. data/lib/cuboid/options.rb +254 -0
  31. data/lib/cuboid/processes.rb +13 -0
  32. data/lib/cuboid/processes/dispatchers.rb +140 -0
  33. data/lib/cuboid/processes/executables/base.rb +54 -0
  34. data/lib/cuboid/processes/executables/dispatcher.rb +5 -0
  35. data/lib/cuboid/processes/executables/instance.rb +12 -0
  36. data/lib/cuboid/processes/executables/rest_service.rb +13 -0
  37. data/lib/cuboid/processes/executables/scheduler.rb +5 -0
  38. data/lib/cuboid/processes/helpers.rb +4 -0
  39. data/lib/cuboid/processes/helpers/dispatchers.rb +23 -0
  40. data/lib/cuboid/processes/helpers/instances.rb +39 -0
  41. data/lib/cuboid/processes/helpers/processes.rb +23 -0
  42. data/lib/cuboid/processes/helpers/schedulers.rb +23 -0
  43. data/lib/cuboid/processes/instances.rb +203 -0
  44. data/lib/cuboid/processes/manager.rb +262 -0
  45. data/lib/cuboid/processes/schedulers.rb +128 -0
  46. data/lib/cuboid/report.rb +220 -0
  47. data/lib/cuboid/rest/server.rb +165 -0
  48. data/lib/cuboid/rest/server/instance_helpers.rb +99 -0
  49. data/lib/cuboid/rest/server/routes/dispatcher.rb +41 -0
  50. data/lib/cuboid/rest/server/routes/grid.rb +41 -0
  51. data/lib/cuboid/rest/server/routes/instances.rb +131 -0
  52. data/lib/cuboid/rest/server/routes/scheduler.rb +140 -0
  53. data/lib/cuboid/rpc/client.rb +3 -0
  54. data/lib/cuboid/rpc/client/base.rb +58 -0
  55. data/lib/cuboid/rpc/client/dispatcher.rb +58 -0
  56. data/lib/cuboid/rpc/client/instance.rb +100 -0
  57. data/lib/cuboid/rpc/client/instance/service.rb +37 -0
  58. data/lib/cuboid/rpc/client/scheduler.rb +46 -0
  59. data/lib/cuboid/rpc/serializer.rb +92 -0
  60. data/lib/cuboid/rpc/server/active_options.rb +38 -0
  61. data/lib/cuboid/rpc/server/application_wrapper.rb +138 -0
  62. data/lib/cuboid/rpc/server/base.rb +63 -0
  63. data/lib/cuboid/rpc/server/dispatcher.rb +317 -0
  64. data/lib/cuboid/rpc/server/dispatcher/node.rb +247 -0
  65. data/lib/cuboid/rpc/server/dispatcher/service.rb +145 -0
  66. data/lib/cuboid/rpc/server/instance.rb +338 -0
  67. data/lib/cuboid/rpc/server/output.rb +92 -0
  68. data/lib/cuboid/rpc/server/scheduler.rb +482 -0
  69. data/lib/cuboid/ruby.rb +4 -0
  70. data/lib/cuboid/ruby/array.rb +17 -0
  71. data/lib/cuboid/ruby/hash.rb +41 -0
  72. data/lib/cuboid/ruby/object.rb +32 -0
  73. data/lib/cuboid/snapshot.rb +186 -0
  74. data/lib/cuboid/state.rb +94 -0
  75. data/lib/cuboid/state/application.rb +309 -0
  76. data/lib/cuboid/state/options.rb +27 -0
  77. data/lib/cuboid/support.rb +11 -0
  78. data/lib/cuboid/support/buffer.rb +3 -0
  79. data/lib/cuboid/support/buffer/autoflush.rb +61 -0
  80. data/lib/cuboid/support/buffer/base.rb +91 -0
  81. data/lib/cuboid/support/cache.rb +7 -0
  82. data/lib/cuboid/support/cache/base.rb +226 -0
  83. data/lib/cuboid/support/cache/least_cost_replacement.rb +77 -0
  84. data/lib/cuboid/support/cache/least_recently_pushed.rb +21 -0
  85. data/lib/cuboid/support/cache/least_recently_used.rb +31 -0
  86. data/lib/cuboid/support/cache/preference.rb +31 -0
  87. data/lib/cuboid/support/cache/random_replacement.rb +20 -0
  88. data/lib/cuboid/support/crypto.rb +2 -0
  89. data/lib/cuboid/support/crypto/rsa_aes_cbc.rb +86 -0
  90. data/lib/cuboid/support/database.rb +5 -0
  91. data/lib/cuboid/support/database/base.rb +177 -0
  92. data/lib/cuboid/support/database/categorized_queue.rb +195 -0
  93. data/lib/cuboid/support/database/hash.rb +300 -0
  94. data/lib/cuboid/support/database/queue.rb +149 -0
  95. data/lib/cuboid/support/filter.rb +3 -0
  96. data/lib/cuboid/support/filter/base.rb +110 -0
  97. data/lib/cuboid/support/filter/set.rb +29 -0
  98. data/lib/cuboid/support/glob.rb +27 -0
  99. data/lib/cuboid/support/mixins.rb +8 -0
  100. data/lib/cuboid/support/mixins/observable.rb +99 -0
  101. data/lib/cuboid/support/mixins/parts.rb +20 -0
  102. data/lib/cuboid/support/mixins/profiler.rb +93 -0
  103. data/lib/cuboid/support/mixins/spec_instances.rb +65 -0
  104. data/lib/cuboid/support/mixins/terminal.rb +57 -0
  105. data/lib/cuboid/system.rb +119 -0
  106. data/lib/cuboid/system/platforms.rb +84 -0
  107. data/lib/cuboid/system/platforms/linux.rb +26 -0
  108. data/lib/cuboid/system/platforms/mixins/unix.rb +46 -0
  109. data/lib/cuboid/system/platforms/osx.rb +25 -0
  110. data/lib/cuboid/system/platforms/windows.rb +81 -0
  111. data/lib/cuboid/system/slots.rb +143 -0
  112. data/lib/cuboid/ui/output.rb +52 -0
  113. data/lib/cuboid/ui/output_interface.rb +43 -0
  114. data/lib/cuboid/ui/output_interface/abstract.rb +68 -0
  115. data/lib/cuboid/ui/output_interface/controls.rb +84 -0
  116. data/lib/cuboid/ui/output_interface/error_logging.rb +119 -0
  117. data/lib/cuboid/ui/output_interface/implemented.rb +58 -0
  118. data/lib/cuboid/ui/output_interface/personalization.rb +62 -0
  119. data/lib/cuboid/utilities.rb +155 -0
  120. data/lib/cuboid/version.rb +4 -3
  121. data/lib/version +1 -0
  122. data/logs/placeholder +0 -0
  123. data/spec/cuboid/application/parts/data_spec.rb +12 -0
  124. data/spec/cuboid/application/parts/report_spec.rb +6 -0
  125. data/spec/cuboid/application/parts/state_spec.rb +192 -0
  126. data/spec/cuboid/application/runtime_spec.rb +21 -0
  127. data/spec/cuboid/application_spec.rb +37 -0
  128. data/spec/cuboid/data/application_spec.rb +22 -0
  129. data/spec/cuboid/data_spec.rb +47 -0
  130. data/spec/cuboid/error_spec.rb +23 -0
  131. data/spec/cuboid/option_groups/datastore_spec.rb +54 -0
  132. data/spec/cuboid/option_groups/dispatcher_spec.rb +12 -0
  133. data/spec/cuboid/option_groups/output_spec.rb +11 -0
  134. data/spec/cuboid/option_groups/paths_spec.rb +184 -0
  135. data/spec/cuboid/option_groups/report_spec.rb +26 -0
  136. data/spec/cuboid/option_groups/rpc_spec.rb +53 -0
  137. data/spec/cuboid/option_groups/snapshot_spec.rb +26 -0
  138. data/spec/cuboid/option_groups/system.rb +12 -0
  139. data/spec/cuboid/options_spec.rb +218 -0
  140. data/spec/cuboid/report_spec.rb +221 -0
  141. data/spec/cuboid/rest/server_spec.rb +1205 -0
  142. data/spec/cuboid/rpc/client/base_spec.rb +151 -0
  143. data/spec/cuboid/rpc/client/dispatcher_spec.rb +13 -0
  144. data/spec/cuboid/rpc/client/instance_spec.rb +38 -0
  145. data/spec/cuboid/rpc/server/active_options_spec.rb +21 -0
  146. data/spec/cuboid/rpc/server/base_spec.rb +60 -0
  147. data/spec/cuboid/rpc/server/dispatcher/node_spec.rb +222 -0
  148. data/spec/cuboid/rpc/server/dispatcher/service_spec.rb +112 -0
  149. data/spec/cuboid/rpc/server/dispatcher_spec.rb +317 -0
  150. data/spec/cuboid/rpc/server/instance_spec.rb +307 -0
  151. data/spec/cuboid/rpc/server/output_spec.rb +32 -0
  152. data/spec/cuboid/rpc/server/scheduler_spec.rb +400 -0
  153. data/spec/cuboid/ruby/array_spec.rb +77 -0
  154. data/spec/cuboid/ruby/hash_spec.rb +63 -0
  155. data/spec/cuboid/ruby/object_spec.rb +22 -0
  156. data/spec/cuboid/snapshot_spec.rb +123 -0
  157. data/spec/cuboid/state/application_spec.rb +538 -0
  158. data/spec/cuboid/state/options_spec.rb +37 -0
  159. data/spec/cuboid/state_spec.rb +53 -0
  160. data/spec/cuboid/support/buffer/autoflush_spec.rb +78 -0
  161. data/spec/cuboid/support/buffer/base_spec.rb +193 -0
  162. data/spec/cuboid/support/cache/least_cost_replacement_spec.rb +61 -0
  163. data/spec/cuboid/support/cache/least_recently_pushed_spec.rb +90 -0
  164. data/spec/cuboid/support/cache/least_recently_used_spec.rb +80 -0
  165. data/spec/cuboid/support/cache/preference_spec.rb +37 -0
  166. data/spec/cuboid/support/cache/random_replacement_spec.rb +42 -0
  167. data/spec/cuboid/support/crypto/rsa_aes_cbc_spec.rb +28 -0
  168. data/spec/cuboid/support/database/categorized_queue_spec.rb +327 -0
  169. data/spec/cuboid/support/database/hash_spec.rb +204 -0
  170. data/spec/cuboid/support/database/scheduler_spec.rb +325 -0
  171. data/spec/cuboid/support/filter/set_spec.rb +19 -0
  172. data/spec/cuboid/support/glob_spec.rb +75 -0
  173. data/spec/cuboid/support/mixins/observable_spec.rb +95 -0
  174. data/spec/cuboid/system/platforms/linux_spec.rb +31 -0
  175. data/spec/cuboid/system/platforms/osx_spec.rb +32 -0
  176. data/spec/cuboid/system/platforms/windows_spec.rb +41 -0
  177. data/spec/cuboid/system/slots_spec.rb +202 -0
  178. data/spec/cuboid/system_spec.rb +105 -0
  179. data/spec/cuboid/utilities_spec.rb +131 -0
  180. data/spec/spec_helper.rb +46 -0
  181. data/spec/support/factories/placeholder +0 -0
  182. data/spec/support/factories/scan_report.rb +18 -0
  183. data/spec/support/fixtures/empty/placeholder +0 -0
  184. data/spec/support/fixtures/executables/node.rb +50 -0
  185. data/spec/support/fixtures/mock_app.rb +61 -0
  186. data/spec/support/fixtures/mock_app/test_service.rb +64 -0
  187. data/spec/support/fixtures/services/echo.rb +64 -0
  188. data/spec/support/helpers/framework.rb +3 -0
  189. data/spec/support/helpers/matchers.rb +5 -0
  190. data/spec/support/helpers/misc.rb +3 -0
  191. data/spec/support/helpers/paths.rb +15 -0
  192. data/spec/support/helpers/request_helpers.rb +38 -0
  193. data/spec/support/helpers/requires.rb +8 -0
  194. data/spec/support/helpers/resets.rb +52 -0
  195. data/spec/support/helpers/web_server.rb +15 -0
  196. data/spec/support/lib/factory.rb +107 -0
  197. data/spec/support/lib/web_server_client.rb +41 -0
  198. data/spec/support/lib/web_server_dispatcher.rb +25 -0
  199. data/spec/support/lib/web_server_manager.rb +118 -0
  200. data/spec/support/logs/placeholder +0 -0
  201. data/spec/support/pems/cacert.pem +37 -0
  202. data/spec/support/pems/client/cert.pem +37 -0
  203. data/spec/support/pems/client/foo-cert.pem +39 -0
  204. data/spec/support/pems/client/foo-key.pem +51 -0
  205. data/spec/support/pems/client/key.pem +51 -0
  206. data/spec/support/pems/server/cert.pem +37 -0
  207. data/spec/support/pems/server/key.pem +51 -0
  208. data/spec/support/reports/placeholder +0 -0
  209. data/spec/support/shared/application.rb +10 -0
  210. data/spec/support/shared/component.rb +31 -0
  211. data/spec/support/shared/component/options/base.rb +187 -0
  212. data/spec/support/shared/option_group.rb +98 -0
  213. data/spec/support/shared/support/cache.rb +419 -0
  214. data/spec/support/shared/support/filter.rb +143 -0
  215. data/spec/support/shared/system/platforms/base.rb +25 -0
  216. data/spec/support/shared/system/platforms/mixins/unix.rb +37 -0
  217. data/spec/support/snapshots/placeholder +0 -0
  218. metadata +566 -21
  219. data/.gitignore +0 -8
  220. data/bin/console +0 -15
  221. data/bin/setup +0 -8
@@ -0,0 +1,105 @@
1
+ require 'spec_helper'
2
+
3
+ describe Cuboid::System do
4
+ subject { described_class.instance }
5
+
6
+ describe '#utilization' do
7
+ it 'returns the utilization ratio of the system'
8
+ end
9
+
10
+ describe '#max_utilization?' do
11
+ context 'when #utilization is 1' do
12
+ it 'returns true' do
13
+ expect(subject).to receive(:utilization).and_return( 1 )
14
+ expect(subject).to be_max_utilization
15
+ end
16
+ end
17
+
18
+ context 'when #utilization is < 1' do
19
+ it 'returns false' do
20
+ expect(subject).to receive(:utilization).and_return( 0.2 )
21
+ expect(subject).to_not be_max_utilization
22
+ end
23
+ end
24
+ end
25
+
26
+ describe '#memory_free' do
27
+ it 'delegates to #platform' do
28
+ expect(subject.platform).to receive(:memory_free).and_return(10)
29
+ expect(subject.memory_free).to eq 10
30
+ end
31
+ end
32
+
33
+ describe '#memory_for_process_group' do
34
+ it 'delegates to #platform' do
35
+ expect(subject.platform).to receive(:memory_for_process_group).with(123).and_return(10)
36
+ expect(subject.memory_for_process_group(123)).to eq 10
37
+ end
38
+ end
39
+
40
+ describe '#disk_space_free' do
41
+ it 'delegates to #platform' do
42
+ expect(subject.platform).to receive(:disk_space_free).and_return(10)
43
+ expect(subject.disk_space_free).to eq 10
44
+ end
45
+ end
46
+
47
+ describe '#disk_space_for_process' do
48
+ it 'delegates to #platform' do
49
+ expect(subject.platform).to receive(:disk_space_for_process).with(123).and_return(10)
50
+ expect(subject.disk_space_for_process(123)).to eq 10
51
+ end
52
+ end
53
+
54
+ describe '#disk_directory' do
55
+ it "delegates to #platform" do
56
+ expect(subject.platform).to receive(:disk_directory).and_return('10')
57
+ expect(subject.disk_directory).to eq '10'
58
+ end
59
+ end
60
+
61
+ describe '#cpu_count' do
62
+ it 'delegates to #platform' do
63
+ expect(subject.platform).to receive(:cpu_count).and_return(10)
64
+ expect(subject.cpu_count).to eq 10
65
+ end
66
+ end
67
+
68
+ describe '#platform' do
69
+ it 'returns the current platform' do
70
+ platform_stub = Class.new do
71
+ def self.current?
72
+ true
73
+ end
74
+ end
75
+
76
+ subject.platforms.unshift platform_stub
77
+
78
+ expect(subject.platform).to be_instance_of platform_stub
79
+
80
+ subject.platforms.delete platform_stub
81
+ end
82
+
83
+ context 'when the platform could not be identified' do
84
+ it 'raises error' do
85
+ subject.platforms.each do |platform|
86
+ expect(platform).to receive(:current?).and_return(false)
87
+ end
88
+
89
+ expect do
90
+ subject.platform
91
+ end.to raise_error "Unsupported platform: #{RUBY_PLATFORM}"
92
+ end
93
+ end
94
+ end
95
+
96
+ describe '#platforms' do
97
+ it 'returns all supported platforms' do
98
+ expect(subject.platforms.map(&:to_s).sort).to eq [
99
+ described_class::Platforms::Linux,
100
+ described_class::Platforms::OSX,
101
+ described_class::Platforms::Windows
102
+ ].map(&:to_s).sort
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,131 @@
1
+ require 'spec_helper'
2
+
3
+ class Subject
4
+ include Cuboid::UI::Output
5
+ include Cuboid::Utilities
6
+ end
7
+
8
+ describe Cuboid::Utilities do
9
+
10
+ subject { Subject.new }
11
+
12
+ let(:response) { Factory[:response] }
13
+ let(:page) { Factory[:page] }
14
+
15
+ describe '#caller_name' do
16
+ it 'returns the filename of the caller' do
17
+ expect(subject.caller_name).to eq('example')
18
+ end
19
+ end
20
+
21
+ describe '#caller_path' do
22
+ it 'returns the filepath of the caller' do
23
+ expect(subject.caller_path).to eq(Kernel.caller.first.match( /^(.+):\d/ )[1])
24
+ end
25
+ end
26
+
27
+ describe '#port_available?' do
28
+ context 'when a port is available' do
29
+ it 'returns true' do
30
+ expect(subject.port_available?( 7777 )).to be_truthy
31
+ end
32
+ end
33
+
34
+ context 'when a port is not available' do
35
+ it 'returns true' do
36
+ s = TCPServer.new( "127.0.0.1", 7777 )
37
+ expect(subject.port_available?( 7777 )).to be_falsey
38
+ s.close
39
+ end
40
+ end
41
+ end
42
+
43
+ describe '#random_seed' do
44
+ it 'returns a random string' do
45
+ expect(subject.random_seed).to be_kind_of String
46
+ end
47
+ end
48
+
49
+ describe '#seconds_to_hms' do
50
+ it 'converts seconds to HOURS:MINUTES:SECONDS' do
51
+ expect(subject.seconds_to_hms( 0 )).to eq('00:00:00')
52
+ expect(subject.seconds_to_hms( 1 )).to eq('00:00:01')
53
+ expect(subject.seconds_to_hms( 60 )).to eq('00:01:00')
54
+ expect(subject.seconds_to_hms( 60*60 )).to eq('01:00:00')
55
+ expect(subject.seconds_to_hms( 60*60 + 60 + 1 )).to eq('01:01:01')
56
+ end
57
+ end
58
+
59
+ describe '#hms_to_seconds' do
60
+ it 'converts seconds to HOURS:MINUTES:SECONDS' do
61
+ expect(subject.hms_to_seconds( '00:00:00' )).to eq(0)
62
+ expect(subject.hms_to_seconds( '00:00:01' )).to eq(1)
63
+ expect(subject.hms_to_seconds( '00:01:00' )).to eq(60)
64
+ expect(subject.hms_to_seconds( '01:00:00' )).to eq(60*60)
65
+ expect(subject.hms_to_seconds( '01:01:01')).to eq(60 * 60 + 60 + 1)
66
+ end
67
+ end
68
+
69
+ describe '#exception_jail' do
70
+ context 'when no error occurs' do
71
+ it 'returns the return value of the block' do
72
+ expect(subject.exception_jail { :stuff }).to eq(:stuff)
73
+ end
74
+ end
75
+
76
+ context "when a #{RuntimeError} occurs" do
77
+ context 'and raise_exception is' do
78
+ context 'default' do
79
+ it 're-raises the exception' do
80
+ expect do
81
+ subject.exception_jail { raise }
82
+ end.to raise_error RuntimeError
83
+ end
84
+ end
85
+
86
+ context 'true' do
87
+ it 're-raises the exception' do
88
+ expect do
89
+ subject.exception_jail( true ) { raise }
90
+ end.to raise_error RuntimeError
91
+ end
92
+ end
93
+
94
+ context 'false' do
95
+ it 'returns nil' do
96
+ expect(subject.exception_jail( false ) { raise }).to be_nil
97
+ end
98
+ end
99
+ end
100
+ end
101
+
102
+ context "when an #{Exception} occurs" do
103
+ context 'and raise_exception is' do
104
+ context 'default' do
105
+ it 'does not rescue it' do
106
+ expect do
107
+ subject.exception_jail { raise Exception }
108
+ end.to raise_error Exception
109
+ end
110
+ end
111
+
112
+ context 'true' do
113
+ it 'does not rescue it' do
114
+ expect do
115
+ subject.exception_jail( true ) { raise Exception }
116
+ end.to raise_error Exception
117
+ end
118
+ end
119
+
120
+ context 'false' do
121
+ it 'does not rescue it' do
122
+ expect do
123
+ subject.exception_jail( false ) { raise Exception }
124
+ end.to raise_error Exception
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
130
+
131
+ end
@@ -0,0 +1,46 @@
1
+ require 'rack/test'
2
+ # require 'simplecov'
3
+ require 'faker'
4
+
5
+ require 'typhoeus'
6
+ require_relative '../lib/cuboid'
7
+ require_relative '../lib/cuboid/processes'
8
+ require_relative '../lib/cuboid/processes/helpers'
9
+
10
+ require_relative 'support/helpers/paths'
11
+ require_relative 'support/helpers/requires'
12
+
13
+ Dir.glob( "#{support_path}/{lib,helpers,shared,factories}/**/*.rb" ).each { |f| require f }
14
+
15
+ # Uncomment to show output from spawned processes.
16
+ Cuboid::Processes::Manager.preserve_output
17
+
18
+ RSpec::Core::MemoizedHelpers.module_eval do
19
+ alias to should
20
+ alias to_not should_not
21
+ end
22
+
23
+ RSpec.configure do |config|
24
+ config.example_status_persistence_file_path = '.rspec_status'
25
+ config.run_all_when_everything_filtered = true
26
+ config.color = true
27
+ config.add_formatter :documentation
28
+ config.alias_example_to :expect_it
29
+ config.filter_run_when_matching focus: true
30
+
31
+ config.mock_with :rspec do |mocks|
32
+ mocks.yield_receiver_to_any_instance_implementation_blocks = true
33
+ end
34
+
35
+ config.before( :each ) do
36
+ reset_all
37
+ end
38
+
39
+ config.after( :each ) do
40
+ cleanup_instances
41
+ processes_killall
42
+ end
43
+ config.after( :all ) do
44
+ killall
45
+ end
46
+ end
File without changes
@@ -0,0 +1,18 @@
1
+ Factory.define :report_data do
2
+
3
+ {
4
+ application: MockApp,
5
+ seed: Cuboid::Utilities.random_seed,
6
+ options: Cuboid::Options.to_hash,
7
+ start_datetime: Time.now - 10_000,
8
+ finish_datetime: Time.now
9
+ }
10
+ end
11
+
12
+ Factory.define :report do
13
+ Cuboid::Report.new Factory[:report_data]
14
+ end
15
+
16
+ Factory.define :report_empty do
17
+ Cuboid::Report.new
18
+ end
File without changes
@@ -0,0 +1,50 @@
1
+ require Options.paths.lib + 'ui/output'
2
+ require Options.paths.lib + 'rpc/server/dispatcher'
3
+ require Options.paths.lib + 'processes/manager'
4
+
5
+ class Node < Cuboid::RPC::Server::Dispatcher::Node
6
+
7
+ def initialize
8
+ @options = Options.instance
9
+
10
+ methods.each do |m|
11
+ next if method( m ).owner != Cuboid::RPC::Server::Dispatcher::Node
12
+ self.class.send :private, m
13
+ self.class.send :public, m
14
+ end
15
+
16
+ @server = Cuboid::RPC::Server::Base.new
17
+ @server.add_async_check do |method|
18
+ # methods that expect a block are async
19
+ method.parameters.flatten.include?( :block )
20
+ end
21
+ @server.add_handler( 'node', self )
22
+
23
+ super @options, @server
24
+
25
+ @server.start
26
+ end
27
+
28
+ def url
29
+ @server.url
30
+ end
31
+
32
+ def shutdown
33
+ Arachni::Reactor.global.delay 1 do
34
+ Process.kill( 'KILL', Process.pid )
35
+ end
36
+ end
37
+
38
+ def connect_to_peer( url )
39
+ self.class.connect_to_peer( url )
40
+ end
41
+
42
+ def self.connect_to_peer( url )
43
+ c = Cuboid::RPC::Client::Base.new( url )
44
+ Arachni::RPC::Proxy.new( c, 'node' )
45
+ end
46
+ end
47
+
48
+ Arachni::Reactor.global.run do
49
+ Node.new
50
+ end
@@ -0,0 +1,61 @@
1
+ require_relative 'mock_app/test_service'
2
+
3
+ class MockApp < Cuboid::Application
4
+
5
+ # This app is going to be using a max of 2 threads.
6
+ provision_cores 2
7
+ # This app is going to be using a max of 200MB of RAM.
8
+ provision_memory 200 * 1024 * 1024
9
+ # This app is going to be using a max of 2GB of disk space.
10
+ provision_disk 2 * 1024 * 1024 * 1024
11
+
12
+ validate_options_with :do_validate_options
13
+
14
+ # Register event handlers.
15
+ handler_for :pause, :do_pause
16
+ handler_for :resume, :do_resume
17
+ handler_for :suspend, :do_suspend
18
+ handler_for :restore, :do_restore
19
+ handler_for :abort, :do_abort
20
+
21
+ # RPC, report and snapshot file.
22
+ serialize_with Marshal
23
+
24
+ dispatcher_service_for :test_service, TestService
25
+
26
+ # Execution entry point.
27
+ def run
28
+ ap __method__
29
+ report 'My results.'
30
+
31
+ sleep 5
32
+ end
33
+
34
+ def do_validate_options( options )
35
+ return true if !options.is_a?( Hash )
36
+ !options.include?( 'invalid' )
37
+ end
38
+
39
+ def do_pause
40
+ ap __method__
41
+ end
42
+
43
+ def do_resume
44
+ ap __method__
45
+ end
46
+
47
+ def do_suspend
48
+ # Write pending state and data to Cuboid::Data::Application.
49
+ ap __method__
50
+ end
51
+
52
+ def do_restore
53
+ # Restore special state and data from Cuboid::Data::Application.
54
+ ap __method__
55
+ end
56
+
57
+ def do_abort
58
+ ap __method__
59
+ end
60
+
61
+ end
@@ -0,0 +1,64 @@
1
+ require 'cuboid/rpc/server/dispatcher'
2
+
3
+ class TestService < Cuboid::RPC::Server::Dispatcher::Service
4
+
5
+ private :instances
6
+ public :instances
7
+
8
+ def test_dispatcher
9
+ dispatcher.class == Cuboid::RPC::Server::Dispatcher
10
+ end
11
+
12
+ def test_opts
13
+ dispatcher.instance_eval{ @options } == options
14
+ end
15
+
16
+ def test_node
17
+ node.class == Cuboid::RPC::Server::Dispatcher::Node
18
+ end
19
+
20
+ def test_map_instances( &block )
21
+ each = proc do |instance, iterator|
22
+ iterator.return [instance.url, instance.token]
23
+ end
24
+ after = proc { |i| block.call Hash[i] }
25
+
26
+ map_instances( each, after )
27
+ end
28
+
29
+ def test_each_instance
30
+ i = 0
31
+ each_instance do |instance, iterator|
32
+ i += 1
33
+ instance.options.set( authorized_by: "test_#{i}@test.com") { |p| iterator.next }
34
+ end
35
+ true
36
+ end
37
+
38
+ def test_iterator_for
39
+ iterator_for( instances ).class == Arachni::Reactor::Iterator
40
+ end
41
+
42
+ def test_connect_to_dispatcher( url, &block )
43
+ connect_to_dispatcher( url ).alive? { |b| block.call b }
44
+ end
45
+
46
+ def test_connect_to_instance( *args, &block )
47
+ connect_to_instance( *args ).busy?{ |b| block.call !!b }
48
+ end
49
+
50
+ def test_defer( *args, &block )
51
+ defer do
52
+ block.call args
53
+ end
54
+ end
55
+
56
+ def test_run_asap( *args, &block )
57
+ run_asap { block.call args }
58
+ end
59
+
60
+ def echo( *args )
61
+ args
62
+ end
63
+
64
+ end