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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +0 -0
- data/Gemfile +20 -5
- data/LICENSE.md +22 -0
- data/README.md +158 -19
- data/Rakefile +56 -3
- data/config/paths.yml +15 -0
- data/cuboid.gemspec +61 -23
- data/lib/cuboid.rb +96 -4
- data/lib/cuboid/application.rb +326 -0
- data/lib/cuboid/application/parts/data.rb +18 -0
- data/lib/cuboid/application/parts/report.rb +29 -0
- data/lib/cuboid/application/parts/state.rb +274 -0
- data/lib/cuboid/application/runtime.rb +25 -0
- data/lib/cuboid/banner.rb +13 -0
- data/lib/cuboid/data.rb +86 -0
- data/lib/cuboid/data/application.rb +52 -0
- data/lib/cuboid/error.rb +9 -0
- data/lib/cuboid/option_group.rb +129 -0
- data/lib/cuboid/option_groups.rb +8 -0
- data/lib/cuboid/option_groups/datastore.rb +23 -0
- data/lib/cuboid/option_groups/dispatcher.rb +38 -0
- data/lib/cuboid/option_groups/output.rb +14 -0
- data/lib/cuboid/option_groups/paths.rb +184 -0
- data/lib/cuboid/option_groups/report.rb +39 -0
- data/lib/cuboid/option_groups/rpc.rb +105 -0
- data/lib/cuboid/option_groups/scheduler.rb +27 -0
- data/lib/cuboid/option_groups/snapshot.rb +13 -0
- data/lib/cuboid/option_groups/system.rb +10 -0
- data/lib/cuboid/options.rb +254 -0
- data/lib/cuboid/processes.rb +13 -0
- data/lib/cuboid/processes/dispatchers.rb +140 -0
- data/lib/cuboid/processes/executables/base.rb +54 -0
- data/lib/cuboid/processes/executables/dispatcher.rb +5 -0
- data/lib/cuboid/processes/executables/instance.rb +12 -0
- data/lib/cuboid/processes/executables/rest_service.rb +13 -0
- data/lib/cuboid/processes/executables/scheduler.rb +5 -0
- data/lib/cuboid/processes/helpers.rb +4 -0
- data/lib/cuboid/processes/helpers/dispatchers.rb +23 -0
- data/lib/cuboid/processes/helpers/instances.rb +39 -0
- data/lib/cuboid/processes/helpers/processes.rb +23 -0
- data/lib/cuboid/processes/helpers/schedulers.rb +23 -0
- data/lib/cuboid/processes/instances.rb +203 -0
- data/lib/cuboid/processes/manager.rb +262 -0
- data/lib/cuboid/processes/schedulers.rb +128 -0
- data/lib/cuboid/report.rb +220 -0
- data/lib/cuboid/rest/server.rb +165 -0
- data/lib/cuboid/rest/server/instance_helpers.rb +99 -0
- data/lib/cuboid/rest/server/routes/dispatcher.rb +41 -0
- data/lib/cuboid/rest/server/routes/grid.rb +41 -0
- data/lib/cuboid/rest/server/routes/instances.rb +131 -0
- data/lib/cuboid/rest/server/routes/scheduler.rb +140 -0
- data/lib/cuboid/rpc/client.rb +3 -0
- data/lib/cuboid/rpc/client/base.rb +58 -0
- data/lib/cuboid/rpc/client/dispatcher.rb +58 -0
- data/lib/cuboid/rpc/client/instance.rb +100 -0
- data/lib/cuboid/rpc/client/instance/service.rb +37 -0
- data/lib/cuboid/rpc/client/scheduler.rb +46 -0
- data/lib/cuboid/rpc/serializer.rb +92 -0
- data/lib/cuboid/rpc/server/active_options.rb +38 -0
- data/lib/cuboid/rpc/server/application_wrapper.rb +138 -0
- data/lib/cuboid/rpc/server/base.rb +63 -0
- data/lib/cuboid/rpc/server/dispatcher.rb +317 -0
- data/lib/cuboid/rpc/server/dispatcher/node.rb +247 -0
- data/lib/cuboid/rpc/server/dispatcher/service.rb +145 -0
- data/lib/cuboid/rpc/server/instance.rb +338 -0
- data/lib/cuboid/rpc/server/output.rb +92 -0
- data/lib/cuboid/rpc/server/scheduler.rb +482 -0
- data/lib/cuboid/ruby.rb +4 -0
- data/lib/cuboid/ruby/array.rb +17 -0
- data/lib/cuboid/ruby/hash.rb +41 -0
- data/lib/cuboid/ruby/object.rb +32 -0
- data/lib/cuboid/snapshot.rb +186 -0
- data/lib/cuboid/state.rb +94 -0
- data/lib/cuboid/state/application.rb +309 -0
- data/lib/cuboid/state/options.rb +27 -0
- data/lib/cuboid/support.rb +11 -0
- data/lib/cuboid/support/buffer.rb +3 -0
- data/lib/cuboid/support/buffer/autoflush.rb +61 -0
- data/lib/cuboid/support/buffer/base.rb +91 -0
- data/lib/cuboid/support/cache.rb +7 -0
- data/lib/cuboid/support/cache/base.rb +226 -0
- data/lib/cuboid/support/cache/least_cost_replacement.rb +77 -0
- data/lib/cuboid/support/cache/least_recently_pushed.rb +21 -0
- data/lib/cuboid/support/cache/least_recently_used.rb +31 -0
- data/lib/cuboid/support/cache/preference.rb +31 -0
- data/lib/cuboid/support/cache/random_replacement.rb +20 -0
- data/lib/cuboid/support/crypto.rb +2 -0
- data/lib/cuboid/support/crypto/rsa_aes_cbc.rb +86 -0
- data/lib/cuboid/support/database.rb +5 -0
- data/lib/cuboid/support/database/base.rb +177 -0
- data/lib/cuboid/support/database/categorized_queue.rb +195 -0
- data/lib/cuboid/support/database/hash.rb +300 -0
- data/lib/cuboid/support/database/queue.rb +149 -0
- data/lib/cuboid/support/filter.rb +3 -0
- data/lib/cuboid/support/filter/base.rb +110 -0
- data/lib/cuboid/support/filter/set.rb +29 -0
- data/lib/cuboid/support/glob.rb +27 -0
- data/lib/cuboid/support/mixins.rb +8 -0
- data/lib/cuboid/support/mixins/observable.rb +99 -0
- data/lib/cuboid/support/mixins/parts.rb +20 -0
- data/lib/cuboid/support/mixins/profiler.rb +93 -0
- data/lib/cuboid/support/mixins/spec_instances.rb +65 -0
- data/lib/cuboid/support/mixins/terminal.rb +57 -0
- data/lib/cuboid/system.rb +119 -0
- data/lib/cuboid/system/platforms.rb +84 -0
- data/lib/cuboid/system/platforms/linux.rb +26 -0
- data/lib/cuboid/system/platforms/mixins/unix.rb +46 -0
- data/lib/cuboid/system/platforms/osx.rb +25 -0
- data/lib/cuboid/system/platforms/windows.rb +81 -0
- data/lib/cuboid/system/slots.rb +143 -0
- data/lib/cuboid/ui/output.rb +52 -0
- data/lib/cuboid/ui/output_interface.rb +43 -0
- data/lib/cuboid/ui/output_interface/abstract.rb +68 -0
- data/lib/cuboid/ui/output_interface/controls.rb +84 -0
- data/lib/cuboid/ui/output_interface/error_logging.rb +119 -0
- data/lib/cuboid/ui/output_interface/implemented.rb +58 -0
- data/lib/cuboid/ui/output_interface/personalization.rb +62 -0
- data/lib/cuboid/utilities.rb +155 -0
- data/lib/cuboid/version.rb +4 -3
- data/lib/version +1 -0
- data/logs/placeholder +0 -0
- data/spec/cuboid/application/parts/data_spec.rb +12 -0
- data/spec/cuboid/application/parts/report_spec.rb +6 -0
- data/spec/cuboid/application/parts/state_spec.rb +192 -0
- data/spec/cuboid/application/runtime_spec.rb +21 -0
- data/spec/cuboid/application_spec.rb +37 -0
- data/spec/cuboid/data/application_spec.rb +22 -0
- data/spec/cuboid/data_spec.rb +47 -0
- data/spec/cuboid/error_spec.rb +23 -0
- data/spec/cuboid/option_groups/datastore_spec.rb +54 -0
- data/spec/cuboid/option_groups/dispatcher_spec.rb +12 -0
- data/spec/cuboid/option_groups/output_spec.rb +11 -0
- data/spec/cuboid/option_groups/paths_spec.rb +184 -0
- data/spec/cuboid/option_groups/report_spec.rb +26 -0
- data/spec/cuboid/option_groups/rpc_spec.rb +53 -0
- data/spec/cuboid/option_groups/snapshot_spec.rb +26 -0
- data/spec/cuboid/option_groups/system.rb +12 -0
- data/spec/cuboid/options_spec.rb +218 -0
- data/spec/cuboid/report_spec.rb +221 -0
- data/spec/cuboid/rest/server_spec.rb +1205 -0
- data/spec/cuboid/rpc/client/base_spec.rb +151 -0
- data/spec/cuboid/rpc/client/dispatcher_spec.rb +13 -0
- data/spec/cuboid/rpc/client/instance_spec.rb +38 -0
- data/spec/cuboid/rpc/server/active_options_spec.rb +21 -0
- data/spec/cuboid/rpc/server/base_spec.rb +60 -0
- data/spec/cuboid/rpc/server/dispatcher/node_spec.rb +222 -0
- data/spec/cuboid/rpc/server/dispatcher/service_spec.rb +112 -0
- data/spec/cuboid/rpc/server/dispatcher_spec.rb +317 -0
- data/spec/cuboid/rpc/server/instance_spec.rb +307 -0
- data/spec/cuboid/rpc/server/output_spec.rb +32 -0
- data/spec/cuboid/rpc/server/scheduler_spec.rb +400 -0
- data/spec/cuboid/ruby/array_spec.rb +77 -0
- data/spec/cuboid/ruby/hash_spec.rb +63 -0
- data/spec/cuboid/ruby/object_spec.rb +22 -0
- data/spec/cuboid/snapshot_spec.rb +123 -0
- data/spec/cuboid/state/application_spec.rb +538 -0
- data/spec/cuboid/state/options_spec.rb +37 -0
- data/spec/cuboid/state_spec.rb +53 -0
- data/spec/cuboid/support/buffer/autoflush_spec.rb +78 -0
- data/spec/cuboid/support/buffer/base_spec.rb +193 -0
- data/spec/cuboid/support/cache/least_cost_replacement_spec.rb +61 -0
- data/spec/cuboid/support/cache/least_recently_pushed_spec.rb +90 -0
- data/spec/cuboid/support/cache/least_recently_used_spec.rb +80 -0
- data/spec/cuboid/support/cache/preference_spec.rb +37 -0
- data/spec/cuboid/support/cache/random_replacement_spec.rb +42 -0
- data/spec/cuboid/support/crypto/rsa_aes_cbc_spec.rb +28 -0
- data/spec/cuboid/support/database/categorized_queue_spec.rb +327 -0
- data/spec/cuboid/support/database/hash_spec.rb +204 -0
- data/spec/cuboid/support/database/scheduler_spec.rb +325 -0
- data/spec/cuboid/support/filter/set_spec.rb +19 -0
- data/spec/cuboid/support/glob_spec.rb +75 -0
- data/spec/cuboid/support/mixins/observable_spec.rb +95 -0
- data/spec/cuboid/system/platforms/linux_spec.rb +31 -0
- data/spec/cuboid/system/platforms/osx_spec.rb +32 -0
- data/spec/cuboid/system/platforms/windows_spec.rb +41 -0
- data/spec/cuboid/system/slots_spec.rb +202 -0
- data/spec/cuboid/system_spec.rb +105 -0
- data/spec/cuboid/utilities_spec.rb +131 -0
- data/spec/spec_helper.rb +46 -0
- data/spec/support/factories/placeholder +0 -0
- data/spec/support/factories/scan_report.rb +18 -0
- data/spec/support/fixtures/empty/placeholder +0 -0
- data/spec/support/fixtures/executables/node.rb +50 -0
- data/spec/support/fixtures/mock_app.rb +61 -0
- data/spec/support/fixtures/mock_app/test_service.rb +64 -0
- data/spec/support/fixtures/services/echo.rb +64 -0
- data/spec/support/helpers/framework.rb +3 -0
- data/spec/support/helpers/matchers.rb +5 -0
- data/spec/support/helpers/misc.rb +3 -0
- data/spec/support/helpers/paths.rb +15 -0
- data/spec/support/helpers/request_helpers.rb +38 -0
- data/spec/support/helpers/requires.rb +8 -0
- data/spec/support/helpers/resets.rb +52 -0
- data/spec/support/helpers/web_server.rb +15 -0
- data/spec/support/lib/factory.rb +107 -0
- data/spec/support/lib/web_server_client.rb +41 -0
- data/spec/support/lib/web_server_dispatcher.rb +25 -0
- data/spec/support/lib/web_server_manager.rb +118 -0
- data/spec/support/logs/placeholder +0 -0
- data/spec/support/pems/cacert.pem +37 -0
- data/spec/support/pems/client/cert.pem +37 -0
- data/spec/support/pems/client/foo-cert.pem +39 -0
- data/spec/support/pems/client/foo-key.pem +51 -0
- data/spec/support/pems/client/key.pem +51 -0
- data/spec/support/pems/server/cert.pem +37 -0
- data/spec/support/pems/server/key.pem +51 -0
- data/spec/support/reports/placeholder +0 -0
- data/spec/support/shared/application.rb +10 -0
- data/spec/support/shared/component.rb +31 -0
- data/spec/support/shared/component/options/base.rb +187 -0
- data/spec/support/shared/option_group.rb +98 -0
- data/spec/support/shared/support/cache.rb +419 -0
- data/spec/support/shared/support/filter.rb +143 -0
- data/spec/support/shared/system/platforms/base.rb +25 -0
- data/spec/support/shared/system/platforms/mixins/unix.rb +37 -0
- data/spec/support/snapshots/placeholder +0 -0
- metadata +566 -21
- data/.gitignore +0 -8
- data/bin/console +0 -15
- 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
|
data/spec/spec_helper.rb
ADDED
@@ -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
|