nucleus 0.1.0
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 +7 -0
- data/.gitattributes +1 -0
- data/.gitignore +19 -0
- data/.rspec +3 -0
- data/.rubocop.yml +44 -0
- data/.travis.yml +21 -0
- data/CHANGELOG.md +19 -0
- data/CONTRIBUTING.md +13 -0
- data/Gemfile +16 -0
- data/Guardfile +22 -0
- data/LICENSE +21 -0
- data/README.md +675 -0
- data/Rakefile +137 -0
- data/bin/nucleus +91 -0
- data/bin/nucleus.bat +1 -0
- data/config.ru +18 -0
- data/config/adapters/cloud_control.yml +32 -0
- data/config/adapters/cloud_foundry_v2.yml +61 -0
- data/config/adapters/heroku.yml +13 -0
- data/config/adapters/openshift_v2.yml +20 -0
- data/config/nucleus_config.rb +47 -0
- data/lib/nucleus.rb +13 -0
- data/lib/nucleus/adapter_resolver.rb +115 -0
- data/lib/nucleus/adapters/base_adapter.rb +109 -0
- data/lib/nucleus/adapters/buildpack_translator.rb +79 -0
- data/lib/nucleus/adapters/v1/cloud_control/application.rb +108 -0
- data/lib/nucleus/adapters/v1/cloud_control/authentication.rb +27 -0
- data/lib/nucleus/adapters/v1/cloud_control/buildpacks.rb +23 -0
- data/lib/nucleus/adapters/v1/cloud_control/cloud_control.rb +153 -0
- data/lib/nucleus/adapters/v1/cloud_control/data.rb +76 -0
- data/lib/nucleus/adapters/v1/cloud_control/domains.rb +68 -0
- data/lib/nucleus/adapters/v1/cloud_control/lifecycle.rb +27 -0
- data/lib/nucleus/adapters/v1/cloud_control/log_poller.rb +71 -0
- data/lib/nucleus/adapters/v1/cloud_control/logs.rb +103 -0
- data/lib/nucleus/adapters/v1/cloud_control/regions.rb +32 -0
- data/lib/nucleus/adapters/v1/cloud_control/scaling.rb +17 -0
- data/lib/nucleus/adapters/v1/cloud_control/semantic_errors.rb +31 -0
- data/lib/nucleus/adapters/v1/cloud_control/services.rb +162 -0
- data/lib/nucleus/adapters/v1/cloud_control/token.rb +17 -0
- data/lib/nucleus/adapters/v1/cloud_control/vars.rb +88 -0
- data/lib/nucleus/adapters/v1/cloud_foundry_v2/app_states.rb +28 -0
- data/lib/nucleus/adapters/v1/cloud_foundry_v2/application.rb +111 -0
- data/lib/nucleus/adapters/v1/cloud_foundry_v2/authentication.rb +17 -0
- data/lib/nucleus/adapters/v1/cloud_foundry_v2/buildpacks.rb +23 -0
- data/lib/nucleus/adapters/v1/cloud_foundry_v2/cloud_foundry_v2.rb +141 -0
- data/lib/nucleus/adapters/v1/cloud_foundry_v2/data.rb +97 -0
- data/lib/nucleus/adapters/v1/cloud_foundry_v2/domains.rb +149 -0
- data/lib/nucleus/adapters/v1/cloud_foundry_v2/lifecycle.rb +41 -0
- data/lib/nucleus/adapters/v1/cloud_foundry_v2/logs.rb +303 -0
- data/lib/nucleus/adapters/v1/cloud_foundry_v2/regions.rb +33 -0
- data/lib/nucleus/adapters/v1/cloud_foundry_v2/scaling.rb +15 -0
- data/lib/nucleus/adapters/v1/cloud_foundry_v2/semantic_errors.rb +27 -0
- data/lib/nucleus/adapters/v1/cloud_foundry_v2/services.rb +286 -0
- data/lib/nucleus/adapters/v1/cloud_foundry_v2/vars.rb +80 -0
- data/lib/nucleus/adapters/v1/heroku/app_states.rb +57 -0
- data/lib/nucleus/adapters/v1/heroku/application.rb +93 -0
- data/lib/nucleus/adapters/v1/heroku/authentication.rb +27 -0
- data/lib/nucleus/adapters/v1/heroku/buildpacks.rb +27 -0
- data/lib/nucleus/adapters/v1/heroku/data.rb +78 -0
- data/lib/nucleus/adapters/v1/heroku/domains.rb +43 -0
- data/lib/nucleus/adapters/v1/heroku/heroku.rb +146 -0
- data/lib/nucleus/adapters/v1/heroku/lifecycle.rb +51 -0
- data/lib/nucleus/adapters/v1/heroku/logs.rb +108 -0
- data/lib/nucleus/adapters/v1/heroku/regions.rb +42 -0
- data/lib/nucleus/adapters/v1/heroku/scaling.rb +28 -0
- data/lib/nucleus/adapters/v1/heroku/semantic_errors.rb +23 -0
- data/lib/nucleus/adapters/v1/heroku/services.rb +168 -0
- data/lib/nucleus/adapters/v1/heroku/vars.rb +65 -0
- data/lib/nucleus/adapters/v1/openshift_v2/app_states.rb +68 -0
- data/lib/nucleus/adapters/v1/openshift_v2/application.rb +108 -0
- data/lib/nucleus/adapters/v1/openshift_v2/authentication.rb +21 -0
- data/lib/nucleus/adapters/v1/openshift_v2/data.rb +96 -0
- data/lib/nucleus/adapters/v1/openshift_v2/domains.rb +37 -0
- data/lib/nucleus/adapters/v1/openshift_v2/lifecycle.rb +60 -0
- data/lib/nucleus/adapters/v1/openshift_v2/logs.rb +106 -0
- data/lib/nucleus/adapters/v1/openshift_v2/openshift_v2.rb +125 -0
- data/lib/nucleus/adapters/v1/openshift_v2/regions.rb +58 -0
- data/lib/nucleus/adapters/v1/openshift_v2/scaling.rb +39 -0
- data/lib/nucleus/adapters/v1/openshift_v2/semantic_errors.rb +40 -0
- data/lib/nucleus/adapters/v1/openshift_v2/services.rb +173 -0
- data/lib/nucleus/adapters/v1/openshift_v2/vars.rb +49 -0
- data/lib/nucleus/adapters/v1/stub_adapter.rb +464 -0
- data/lib/nucleus/core/adapter_authentication_inductor.rb +62 -0
- data/lib/nucleus/core/adapter_extensions/auth/auth_client.rb +44 -0
- data/lib/nucleus/core/adapter_extensions/auth/authentication_retry_wrapper.rb +79 -0
- data/lib/nucleus/core/adapter_extensions/auth/expiring_token_auth_client.rb +53 -0
- data/lib/nucleus/core/adapter_extensions/auth/http_basic_auth_client.rb +37 -0
- data/lib/nucleus/core/adapter_extensions/auth/o_auth2_auth_client.rb +95 -0
- data/lib/nucleus/core/adapter_extensions/auth/token_auth_client.rb +36 -0
- data/lib/nucleus/core/adapter_extensions/http_client.rb +177 -0
- data/lib/nucleus/core/adapter_extensions/http_tail_client.rb +26 -0
- data/lib/nucleus/core/adapter_extensions/tail_stopper.rb +25 -0
- data/lib/nucleus/core/common/errors/ambiguous_adapter_error.rb +7 -0
- data/lib/nucleus/core/common/errors/file_existence_error.rb +7 -0
- data/lib/nucleus/core/common/errors/startup_error.rb +12 -0
- data/lib/nucleus/core/common/exit_codes.rb +25 -0
- data/lib/nucleus/core/common/files/application_repo_sanitizer.rb +52 -0
- data/lib/nucleus/core/common/files/archive_extractor.rb +112 -0
- data/lib/nucleus/core/common/files/archiver.rb +91 -0
- data/lib/nucleus/core/common/link_generator.rb +46 -0
- data/lib/nucleus/core/common/logging/logging.rb +52 -0
- data/lib/nucleus/core/common/logging/multi_logger.rb +59 -0
- data/lib/nucleus/core/common/logging/request_log_formatter.rb +48 -0
- data/lib/nucleus/core/common/ssh_handler.rb +108 -0
- data/lib/nucleus/core/common/stream_callback.rb +27 -0
- data/lib/nucleus/core/common/thread_config_accessor.rb +85 -0
- data/lib/nucleus/core/common/url_converter.rb +28 -0
- data/lib/nucleus/core/enums/application_states.rb +26 -0
- data/lib/nucleus/core/enums/logfile_types.rb +28 -0
- data/lib/nucleus/core/error_messages.rb +127 -0
- data/lib/nucleus/core/errors/adapter_error.rb +13 -0
- data/lib/nucleus/core/errors/adapter_missing_implementation_error.rb +12 -0
- data/lib/nucleus/core/errors/adapter_request_error.rb +10 -0
- data/lib/nucleus/core/errors/adapter_resource_not_found_error.rb +10 -0
- data/lib/nucleus/core/errors/endpoint_authentication_error.rb +10 -0
- data/lib/nucleus/core/errors/platform_specific_semantic_error.rb +12 -0
- data/lib/nucleus/core/errors/platform_timeout_error.rb +10 -0
- data/lib/nucleus/core/errors/platform_unavailable_error.rb +10 -0
- data/lib/nucleus/core/errors/semantic_adapter_request_error.rb +19 -0
- data/lib/nucleus/core/errors/unknown_adapter_call_error.rb +10 -0
- data/lib/nucleus/core/file_handling/archive_converter.rb +29 -0
- data/lib/nucleus/core/file_handling/file_manager.rb +64 -0
- data/lib/nucleus/core/file_handling/git_deployer.rb +133 -0
- data/lib/nucleus/core/file_handling/git_repo_analyzer.rb +23 -0
- data/lib/nucleus/core/import/adapter_configuration.rb +53 -0
- data/lib/nucleus/core/import/vendor_parser.rb +28 -0
- data/lib/nucleus/core/import/version_detector.rb +18 -0
- data/lib/nucleus/core/models/abstract_model.rb +29 -0
- data/lib/nucleus/core/models/endpoint.rb +30 -0
- data/lib/nucleus/core/models/provider.rb +26 -0
- data/lib/nucleus/core/models/vendor.rb +22 -0
- data/lib/nucleus/ext/kernel.rb +5 -0
- data/lib/nucleus/ext/regexp.rb +49 -0
- data/lib/nucleus/os.rb +15 -0
- data/lib/nucleus/root_dir.rb +13 -0
- data/lib/nucleus/scripts/finalize.rb +8 -0
- data/lib/nucleus/scripts/initialize.rb +9 -0
- data/lib/nucleus/scripts/initialize_config_defaults.rb +26 -0
- data/lib/nucleus/scripts/load.rb +17 -0
- data/lib/nucleus/scripts/load_dependencies.rb +43 -0
- data/lib/nucleus/scripts/setup_config.rb +28 -0
- data/lib/nucleus/scripts/shutdown.rb +11 -0
- data/lib/nucleus/version.rb +3 -0
- data/nucleus.gemspec +88 -0
- data/public/robots.txt +2 -0
- data/public/swagger-ui/css/reset.css +125 -0
- data/public/swagger-ui/css/screen.css +1224 -0
- data/public/swagger-ui/images/apple-touch-icon-114x114.png +0 -0
- data/public/swagger-ui/images/apple-touch-icon-120x120.png +0 -0
- data/public/swagger-ui/images/apple-touch-icon-144x144.png +0 -0
- data/public/swagger-ui/images/apple-touch-icon-152x152.png +0 -0
- data/public/swagger-ui/images/apple-touch-icon-57x57.png +0 -0
- data/public/swagger-ui/images/apple-touch-icon-60x60.png +0 -0
- data/public/swagger-ui/images/apple-touch-icon-72x72.png +0 -0
- data/public/swagger-ui/images/apple-touch-icon-76x76.png +0 -0
- data/public/swagger-ui/images/explorer_icons.png +0 -0
- data/public/swagger-ui/images/favicon-128.png +0 -0
- data/public/swagger-ui/images/favicon-16x16.png +0 -0
- data/public/swagger-ui/images/favicon-196x196.png +0 -0
- data/public/swagger-ui/images/favicon-32x32.png +0 -0
- data/public/swagger-ui/images/favicon-96x96.png +0 -0
- data/public/swagger-ui/images/favicon.ico +0 -0
- data/public/swagger-ui/images/logo_small.png +0 -0
- data/public/swagger-ui/images/mstile-144x144.png +0 -0
- data/public/swagger-ui/images/mstile-150x150.png +0 -0
- data/public/swagger-ui/images/mstile-310x150.png +0 -0
- data/public/swagger-ui/images/mstile-310x310.png +0 -0
- data/public/swagger-ui/images/mstile-70x70.png +0 -0
- data/public/swagger-ui/images/pet_store_api.png +0 -0
- data/public/swagger-ui/images/throbber.gif +0 -0
- data/public/swagger-ui/images/wordnik_api.png +0 -0
- data/public/swagger-ui/index.html +107 -0
- data/public/swagger-ui/lib/backbone-min.js +38 -0
- data/public/swagger-ui/lib/handlebars-1.0.0.js +2278 -0
- data/public/swagger-ui/lib/highlight.7.3.pack.js +1 -0
- data/public/swagger-ui/lib/jquery-1.8.0.min.js +2 -0
- data/public/swagger-ui/lib/jquery.ba-bbq.min.js +18 -0
- data/public/swagger-ui/lib/jquery.slideto.min.js +1 -0
- data/public/swagger-ui/lib/jquery.wiggle.min.js +8 -0
- data/public/swagger-ui/lib/shred.bundle.js +2765 -0
- data/public/swagger-ui/lib/shred/content.js +193 -0
- data/public/swagger-ui/lib/swagger-oauth.js +211 -0
- data/public/swagger-ui/lib/swagger.js +1653 -0
- data/public/swagger-ui/lib/underscore-min.js +32 -0
- data/public/swagger-ui/o2c.html +15 -0
- data/public/swagger-ui/redirect.html +14 -0
- data/public/swagger-ui/swagger-ui.js +2324 -0
- data/public/swagger-ui/swagger-ui.min.js +1 -0
- data/schemas/api.adapter.schema.yml +31 -0
- data/schemas/api.requirements.schema.yml +17 -0
- data/spec/factories/models.rb +61 -0
- data/spec/integration/api/auth_spec.rb +58 -0
- data/spec/integration/api/endpoints_spec.rb +167 -0
- data/spec/integration/api/errors_spec.rb +47 -0
- data/spec/integration/api/providers_spec.rb +157 -0
- data/spec/integration/api/swagger_schema_spec.rb +64 -0
- data/spec/integration/api/vendors_spec.rb +45 -0
- data/spec/integration/integration_spec_helper.rb +27 -0
- data/spec/integration/test_data_generator.rb +55 -0
- data/spec/nucleus_git_key.pem +51 -0
- data/spec/spec_helper.rb +98 -0
- data/spec/support/shared_example_request_types.rb +99 -0
- data/spec/test_suites.rake +31 -0
- data/spec/unit/adapters/archive_converter_spec.rb +25 -0
- data/spec/unit/adapters/file_manager_spec.rb +93 -0
- data/spec/unit/adapters/git_deployer_spec.rb +262 -0
- data/spec/unit/adapters/v1/stub_spec.rb +14 -0
- data/spec/unit/common/helpers/auth_helper_spec.rb +73 -0
- data/spec/unit/common/oauth2_auth_client_spec.rb +108 -0
- data/spec/unit/common/regexp_spec.rb +33 -0
- data/spec/unit/common/request_log_formatter_spec.rb +108 -0
- data/spec/unit/common/thread_config_accessor_spec.rb +97 -0
- data/spec/unit/models/endpoint_spec.rb +83 -0
- data/spec/unit/models/provider_spec.rb +102 -0
- data/spec/unit/models/vendor_spec.rb +100 -0
- data/spec/unit/schemas/adapter_schema_spec.rb +16 -0
- data/spec/unit/schemas/adapter_validation_spec.rb +56 -0
- data/spec/unit/schemas/requirements_schema_spec.rb +16 -0
- data/spec/unit/unit_spec_helper.rb +11 -0
- data/tasks/compatibility.rake +113 -0
- data/tasks/evaluation.rake +162 -0
- data/wiki/adapter_tests.md +99 -0
- data/wiki/implement_new_adapter.md +155 -0
- metadata +836 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
require 'spec/unit/unit_spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Nucleus::Adapters::OAuth2AuthClient do
|
|
4
|
+
describe 'initialization' do
|
|
5
|
+
it 'applies all values correctly' do
|
|
6
|
+
url = 'theurl'
|
|
7
|
+
check_certs = false
|
|
8
|
+
client = Nucleus::Adapters::OAuth2AuthClient.new url, check_certs
|
|
9
|
+
expect(client.instance_variable_get :@auth_url).to be url
|
|
10
|
+
expect(client.verify_ssl).to be check_certs
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
describe 'functionality:' do
|
|
15
|
+
subject(:client) { Nucleus::Adapters::OAuth2AuthClient.new 'http://localhost', true }
|
|
16
|
+
let!(:invalid_username) { 'invalid_username' }
|
|
17
|
+
let!(:invalid_password) { 'invalid_password' }
|
|
18
|
+
let!(:valid_username) { 'valid_username' }
|
|
19
|
+
let!(:valid_password) { 'valid_password' }
|
|
20
|
+
let!(:valid_refresh_token) { 'valid_refresh_token' }
|
|
21
|
+
let!(:invalid_refresh_token) { 'invalid_refresh_token' }
|
|
22
|
+
|
|
23
|
+
before do
|
|
24
|
+
Excon.stub({ query: { grant_type: 'password', username: valid_username, password: valid_password } },
|
|
25
|
+
body: { access_token: 'access_token', refresh_token: valid_refresh_token,
|
|
26
|
+
expires_in: 3600, token_type: 'bearer' }.to_json, status: 200)
|
|
27
|
+
Excon.stub({ query: { grant_type: 'password', username: invalid_username, password: invalid_password } },
|
|
28
|
+
body: { error: 'code', error_description: 'description' }.to_json, status: 401)
|
|
29
|
+
Excon.stub({ query: { grant_type: 'refresh_token', refresh_token: valid_refresh_token } },
|
|
30
|
+
body: { access_token: 'refreshed_access_token', expires_in: 3600,
|
|
31
|
+
token_type: 'bearer' }.to_json, status: 200)
|
|
32
|
+
Excon.stub({ query: { grant_type: 'refresh_token', refresh_token: invalid_refresh_token } },
|
|
33
|
+
body: { error: 'code', error_description: 'description' }.to_json, status: 401)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
context 'when not authenticated' do
|
|
37
|
+
describe '#authenticate' do
|
|
38
|
+
context 'with invalid credentials' do
|
|
39
|
+
it 'raises an error when authentication failed' do
|
|
40
|
+
expect { client.authenticate(invalid_username, invalid_password) }.to raise_error(
|
|
41
|
+
Nucleus::Errors::EndpointAuthenticationError)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
context 'with valid credentials' do
|
|
46
|
+
it 'returns the self instance' do
|
|
47
|
+
expect(client.authenticate(valid_username, valid_password))
|
|
48
|
+
.to be_a Nucleus::Adapters::OAuth2AuthClient
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
describe '#refresh' do
|
|
53
|
+
it 'can not be invoked' do
|
|
54
|
+
expect { client.refresh }.to raise_error(Nucleus::Errors::EndpointAuthenticationError)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
describe '#auth_header' do
|
|
58
|
+
it 'can not be invoked' do
|
|
59
|
+
expect { client.auth_header }.to raise_error(Nucleus::Errors::EndpointAuthenticationError)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
context 'when authenticated' do
|
|
65
|
+
before { client.authenticate(valid_username, valid_password) }
|
|
66
|
+
describe '#authenticate' do
|
|
67
|
+
context 'with invalid credentials' do
|
|
68
|
+
before { Excon.stub({}, body: {}, status: 400) }
|
|
69
|
+
it 'returns instance without making new auth request' do
|
|
70
|
+
expect(client.authenticate(valid_username, valid_password)).to be_a Nucleus::Adapters::OAuth2AuthClient
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
context 'with valid credentials' do
|
|
74
|
+
it 'returns instance without making new auth request' do
|
|
75
|
+
expect(client.authenticate(valid_username, valid_password)).to be_a Nucleus::Adapters::OAuth2AuthClient
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
describe '#auth_header' do
|
|
80
|
+
context 'when not expired' do
|
|
81
|
+
it 'returns an authorization header' do
|
|
82
|
+
expect(client.auth_header).to have_key('Authorization')
|
|
83
|
+
expect(client.auth_header['Authorization']).to eq 'bearer access_token'
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
context 'when expired' do
|
|
87
|
+
before do
|
|
88
|
+
client.instance_variable_set :@expiration, (Time.now - 120)
|
|
89
|
+
end
|
|
90
|
+
it 'returns an updated authorization header' do
|
|
91
|
+
expect(client.auth_header).to have_key('Authorization')
|
|
92
|
+
expect(client.auth_header['Authorization']).to eq 'bearer refreshed_access_token'
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
describe '#refresh' do
|
|
97
|
+
before { client.refresh }
|
|
98
|
+
it 'returns the self instance' do
|
|
99
|
+
expect(client.refresh).to be_a Nucleus::Adapters::OAuth2AuthClient
|
|
100
|
+
end
|
|
101
|
+
it 'makes an updated authorization header available' do
|
|
102
|
+
expect(client.auth_header).to have_key('Authorization')
|
|
103
|
+
expect(client.auth_header['Authorization']).to eq 'bearer refreshed_access_token'
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require 'spec/unit/unit_spec_helper'
|
|
3
|
+
require 'nucleus/ext/regexp'
|
|
4
|
+
|
|
5
|
+
describe 'Regexp::PERFECT_URL_PATTERN' do
|
|
6
|
+
%w(
|
|
7
|
+
http://✪df.ws/123 http://userid:password@example.com:8080 http://userid:password@example.com:8080/
|
|
8
|
+
http://userid@example.com http://userid@example.com/ http://userid@example.com:8080 http://userid@example.com:8080/
|
|
9
|
+
http://userid:password@example.com http://userid:password@example.com/ http://142.42.1.1/ http://142.42.1.1:8080/
|
|
10
|
+
http://➡.ws/䨹 http://⌘.ws http://⌘.ws/ http://foo.com/blah_(wikipedia)#cite-1
|
|
11
|
+
http://foo.com/blah_(wikipedia)_blah#cite-1 http://foo.com/unicode_(✪)_in_parens
|
|
12
|
+
http://foo.com/(something)?after=parens http://☺.damowmow.com/ http://code.google.com/events/#&product=browser
|
|
13
|
+
http://j.mp ftp://foo.bar/baz http://foo.bar/?q=Test%20URL-encoded%20stuff http://مثال.إختبار
|
|
14
|
+
http://例子.测试).each do |valid_url|
|
|
15
|
+
it "matches #{valid_url}" do
|
|
16
|
+
expect(Regexp::PERFECT_URL_PATTERN =~ valid_url).to eq 0
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
[
|
|
21
|
+
'http://', 'http://.', 'http://..', 'http://../', 'http://?', 'http://??', 'http://??/', 'http://#', 'http://##',
|
|
22
|
+
'http://##/', 'http://foo.bar?q=Spaces should be encoded', '//', '//a', '///a', '///', 'http:///a', 'foo.com',
|
|
23
|
+
'rdar://1234', 'h://test', 'http:// shouldfail.com', ':// should fail', 'http://foo.bar/foo(bar)baz quux',
|
|
24
|
+
'ftps://foo.bar/', 'http://-error-.invalid/', 'http://a.b--c.de/', 'http://-a.b.co', 'http://a.b-.co',
|
|
25
|
+
'http://0.0.0.0', 'http://10.1.1.0', 'http://10.1.1.255', 'http://224.1.1.1', 'http://1.1.1.1.1',
|
|
26
|
+
'http://123.123.123', 'http://3628126748', 'http://.www.foo.bar/', 'http://www.foo.bar./', 'http://.www.foo.bar./',
|
|
27
|
+
'http://10.1.1.1', 'http://10.1.1.254'
|
|
28
|
+
].each do |invalid_url|
|
|
29
|
+
it "does not match #{invalid_url}" do
|
|
30
|
+
expect(Regexp::PERFECT_URL_PATTERN =~ invalid_url).to be_nil
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
describe Nucleus::Logging::Formatter do
|
|
2
|
+
subject { Nucleus::Logging::Formatter.new }
|
|
3
|
+
let(:request_id) { SecureRandom.uuid }
|
|
4
|
+
let(:severity) { Logger::Severity::WARN.to_s }
|
|
5
|
+
let(:time) { Time.now }
|
|
6
|
+
let(:prog) { 'progname' }
|
|
7
|
+
let(:msg) { 'This output shall be included in the log' }
|
|
8
|
+
|
|
9
|
+
# make sure nucleus_request_id is always reset
|
|
10
|
+
before(:each) { Thread.current[:nucleus_request_id] = nil }
|
|
11
|
+
|
|
12
|
+
context 'with nucleus_request_id assigned to the current thread' do
|
|
13
|
+
before do
|
|
14
|
+
Thread.current[:nucleus_request_id] = request_id
|
|
15
|
+
@response = subject.call(severity, time, prog, msg)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it 'does include the request_id' do
|
|
19
|
+
expect(@response).to include(request_id)
|
|
20
|
+
end
|
|
21
|
+
it 'includes the program name' do
|
|
22
|
+
expect(@response).to include(prog)
|
|
23
|
+
end
|
|
24
|
+
it 'includes the actual log message' do
|
|
25
|
+
expect(@response).to include(msg)
|
|
26
|
+
end
|
|
27
|
+
it 'ends with a newline' do
|
|
28
|
+
expect(@response).to end_with("\n")
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
context 'nucleus_request_id unassigned' do
|
|
33
|
+
let(:dateformat) { '%Y-%m-%d' }
|
|
34
|
+
before do
|
|
35
|
+
subject.datetime_format = dateformat
|
|
36
|
+
@response = subject.call(severity, time, prog, msg)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it 'does not include the request_id' do
|
|
40
|
+
expect(@response).to_not include(request_id)
|
|
41
|
+
end
|
|
42
|
+
it 'includes the program name' do
|
|
43
|
+
expect(@response).to include(prog)
|
|
44
|
+
end
|
|
45
|
+
it 'includes the actual log message' do
|
|
46
|
+
expect(@response).to include(msg)
|
|
47
|
+
end
|
|
48
|
+
it 'ends with a newline' do
|
|
49
|
+
expect(@response).to end_with("\n")
|
|
50
|
+
end
|
|
51
|
+
it 'does included the time formatted according to the specified format' do
|
|
52
|
+
expect(@response).to include(time.strftime(dateformat))
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
context 'nucleus_request_id unassigned' do
|
|
57
|
+
before { @response = subject.call(severity, time, prog, msg) }
|
|
58
|
+
|
|
59
|
+
it 'does not include the request_id' do
|
|
60
|
+
expect(@response).to_not include(request_id)
|
|
61
|
+
end
|
|
62
|
+
it 'includes the program name' do
|
|
63
|
+
expect(@response).to include(prog)
|
|
64
|
+
end
|
|
65
|
+
it 'includes the actual log message' do
|
|
66
|
+
expect(@response).to include(msg)
|
|
67
|
+
end
|
|
68
|
+
it 'ends with a newline' do
|
|
69
|
+
expect(@response).to end_with("\n")
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
context 'with an exception as error message' do
|
|
74
|
+
let(:error) { StandardError.new(msg) }
|
|
75
|
+
before { @response = subject.call(severity, time, prog, error) }
|
|
76
|
+
|
|
77
|
+
it 'does not include the request_id' do
|
|
78
|
+
expect(@response).to_not include(request_id)
|
|
79
|
+
end
|
|
80
|
+
it 'includes the program name' do
|
|
81
|
+
expect(@response).to include(prog)
|
|
82
|
+
end
|
|
83
|
+
it 'includes the actual log message' do
|
|
84
|
+
expect(@response).to include(msg)
|
|
85
|
+
end
|
|
86
|
+
it 'ends with a newline' do
|
|
87
|
+
expect(@response).to end_with("\n")
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
context 'with an object as error message' do
|
|
92
|
+
let(:object) { { hashkey: 'hashvalue' } }
|
|
93
|
+
before { @response = subject.call(severity, time, prog, object) }
|
|
94
|
+
|
|
95
|
+
it 'does not include the request_id' do
|
|
96
|
+
expect(@response).to_not include(request_id)
|
|
97
|
+
end
|
|
98
|
+
it 'includes the program name' do
|
|
99
|
+
expect(@response).to include(prog)
|
|
100
|
+
end
|
|
101
|
+
it 'includes the actual log message' do
|
|
102
|
+
expect(@response).to include(object.inspect)
|
|
103
|
+
end
|
|
104
|
+
it 'ends with a newline' do
|
|
105
|
+
expect(@response).to end_with("\n")
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
require 'spec/unit/unit_spec_helper'
|
|
2
|
+
require 'nucleus/core/common/thread_config_accessor'
|
|
3
|
+
|
|
4
|
+
class ThreadedConfig
|
|
5
|
+
thread_config_accessor :setting_a, default: 5
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
class ThreadedConfigParentA
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
class ThreadedConfigParentB
|
|
12
|
+
thread_config_accessor :setting_a, default: 13
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
class ThreadedConfigChildA < ThreadedConfigParentA
|
|
16
|
+
thread_config_accessor :setting_a, default: 11
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
class ThreadedConfigChildB < ThreadedConfigParentB
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
class ThreadedConfigReadOnly
|
|
23
|
+
thread_config_accessor_readonly :setting_a, default: 7
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
describe 'ThreadConfigAccessor' do
|
|
27
|
+
describe 'config values accessibility' do
|
|
28
|
+
it 'for config defined in base class shall be available to inheriting classes' do
|
|
29
|
+
child = ThreadedConfigChildB.new
|
|
30
|
+
expect(child.setting_a).to eql 13
|
|
31
|
+
child.setting_a = 17
|
|
32
|
+
expect(child.setting_a).to eql 17
|
|
33
|
+
expect(child.setting_a).to eql ThreadedConfigParentB.setting_a
|
|
34
|
+
ThreadedConfigParentB.setting_a = 19
|
|
35
|
+
expect(child.setting_a).to eql ThreadedConfigParentB.setting_a
|
|
36
|
+
expect(child.setting_a).to eql 19
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it 'for config defined in inheriting class shall not be available to parent classes' do
|
|
40
|
+
child = ThreadedConfigChildA.new
|
|
41
|
+
expect(child.setting_a).to eql 11
|
|
42
|
+
expect { ThreadedConfigParentA.setting_a }.to raise_error(NoMethodError)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
describe 'using #thread_config_accessor' do
|
|
47
|
+
before :all do
|
|
48
|
+
# create instance
|
|
49
|
+
@config = ThreadedConfig.new
|
|
50
|
+
# assign value to the class
|
|
51
|
+
ThreadedConfig.setting_a = 1
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it 'should have the same value on the class and instance' do
|
|
55
|
+
expect(@config.setting_a).to eql 1
|
|
56
|
+
expect(@config.setting_a).to eql ThreadedConfig.setting_a
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it 'should have the different values in a new thread' do
|
|
60
|
+
Thread.new do
|
|
61
|
+
@config.setting_a = 2
|
|
62
|
+
expect(@config.setting_a).to eql 2
|
|
63
|
+
expect(@config.setting_a).to eql ThreadedConfig.setting_a
|
|
64
|
+
end.join
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it 'should have the default values in a new thread' do
|
|
68
|
+
Thread.new do
|
|
69
|
+
expect(@config.setting_a).to eql 5
|
|
70
|
+
expect(@config.setting_a).to eql ThreadedConfig.setting_a
|
|
71
|
+
end.join
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
describe 'using #thread_config_accessor_readonly' do
|
|
76
|
+
before :all do
|
|
77
|
+
# create instance
|
|
78
|
+
@config = ThreadedConfigReadOnly.new
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
it 'should have the same value on the class and instance' do
|
|
82
|
+
expect(@config.setting_a).to eql 7
|
|
83
|
+
expect(@config.setting_a).to eql ThreadedConfigReadOnly.setting_a
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it 'should keep the same default values in a new thread' do
|
|
87
|
+
Thread.new do
|
|
88
|
+
expect(@config.setting_a).to eql 7
|
|
89
|
+
expect(@config.setting_a).to eql ThreadedConfigReadOnly.setting_a
|
|
90
|
+
end.join
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it 'should not allow to change the default values' do
|
|
94
|
+
Thread.new { expect { @config.setting_a = 10 }.to raise_error(NoMethodError) }.join
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
require 'spec/unit/unit_spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Nucleus::Endpoint do
|
|
4
|
+
let(:id) { 'a123av6172812' }
|
|
5
|
+
let(:name) { 'fake endpoint name' }
|
|
6
|
+
let(:created_at) { Time.now }
|
|
7
|
+
let(:updated_at) { Time.now.to_s }
|
|
8
|
+
let(:url) { 'api.example.org' }
|
|
9
|
+
let(:app_domain) { 'apps.example.org' }
|
|
10
|
+
let(:trust) { true }
|
|
11
|
+
|
|
12
|
+
describe 'can be initialized with' do
|
|
13
|
+
context 'an empty hash and' do
|
|
14
|
+
before do
|
|
15
|
+
@endpoint = Nucleus::Endpoint.new({})
|
|
16
|
+
end
|
|
17
|
+
it 'fields are empty' do
|
|
18
|
+
expect(@endpoint.id).to be_nil
|
|
19
|
+
expect(@endpoint.name).to be_nil
|
|
20
|
+
expect(@endpoint.created_at).to be_nil
|
|
21
|
+
expect(@endpoint.updated_at).to be_nil
|
|
22
|
+
expect(@endpoint.url).to be_nil
|
|
23
|
+
expect(@endpoint.app_domain).to be_nil
|
|
24
|
+
end
|
|
25
|
+
it 'trust is set to false by default' do
|
|
26
|
+
expect(@endpoint.trust).to eql(false)
|
|
27
|
+
end
|
|
28
|
+
it 'to_s does not crash' do
|
|
29
|
+
expect { @endpoint.to_s }.to_not raise_error
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
context 'nil and' do
|
|
34
|
+
before do
|
|
35
|
+
@endpoint = Nucleus::Endpoint.new
|
|
36
|
+
end
|
|
37
|
+
it 'fields are empty' do
|
|
38
|
+
expect(@endpoint.id).to be_nil
|
|
39
|
+
expect(@endpoint.name).to be_nil
|
|
40
|
+
expect(@endpoint.created_at).to be_nil
|
|
41
|
+
expect(@endpoint.updated_at).to be_nil
|
|
42
|
+
expect(@endpoint.url).to be_nil
|
|
43
|
+
expect(@endpoint.app_domain).to be_nil
|
|
44
|
+
end
|
|
45
|
+
it 'trust is set to false by default' do
|
|
46
|
+
expect(@endpoint.trust).to eql(false)
|
|
47
|
+
end
|
|
48
|
+
it 'to_s does not crash' do
|
|
49
|
+
expect { @endpoint.to_s }.to_not raise_error
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
context 'hash properties' do
|
|
54
|
+
before do
|
|
55
|
+
@endpoint = Nucleus::Endpoint.new('id' => id, 'name' => name, 'created_at' => created_at,
|
|
56
|
+
'updated_at' => updated_at, 'trust' => trust, 'app_domain' => app_domain,
|
|
57
|
+
'url' => url)
|
|
58
|
+
end
|
|
59
|
+
it 'fields are not nil' do
|
|
60
|
+
expect(@endpoint.id).to_not be_nil
|
|
61
|
+
expect(@endpoint.name).to_not be_nil
|
|
62
|
+
expect(@endpoint.url).to_not be_nil
|
|
63
|
+
expect(@endpoint.app_domain).to_not be_nil
|
|
64
|
+
expect(@endpoint.trust).to_not be_nil
|
|
65
|
+
end
|
|
66
|
+
it 'dates and parent provider wont be applied' do
|
|
67
|
+
expect(@endpoint.created_at).to be_nil
|
|
68
|
+
expect(@endpoint.updated_at).to be_nil
|
|
69
|
+
expect(@endpoint.provider).to be_nil
|
|
70
|
+
end
|
|
71
|
+
it 'fields have the valid values assigned' do
|
|
72
|
+
expect(@endpoint.id).to eql(id)
|
|
73
|
+
expect(@endpoint.name).to eql(name)
|
|
74
|
+
expect(@endpoint.url).to eql(url)
|
|
75
|
+
expect(@endpoint.app_domain).to eql(app_domain)
|
|
76
|
+
expect(@endpoint.trust).to eql(trust)
|
|
77
|
+
end
|
|
78
|
+
it 'to_s does not crash' do
|
|
79
|
+
expect { @endpoint.to_s }.to_not raise_error
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
require 'spec/unit/unit_spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Nucleus::Provider do
|
|
4
|
+
let(:id) { '67890' }
|
|
5
|
+
let(:name) { 'fake provider name' }
|
|
6
|
+
let(:created_at) { Time.now }
|
|
7
|
+
let(:updated_at) { Time.now.to_s }
|
|
8
|
+
|
|
9
|
+
describe 'can be initialized with' do
|
|
10
|
+
context 'an empty hash and' do
|
|
11
|
+
before do
|
|
12
|
+
@provider = Nucleus::Provider.new({})
|
|
13
|
+
end
|
|
14
|
+
it 'endpoints are empty' do
|
|
15
|
+
expect(@provider.endpoints).to eql([])
|
|
16
|
+
end
|
|
17
|
+
it 'fields are empty' do
|
|
18
|
+
expect(@provider.id).to be_nil
|
|
19
|
+
expect(@provider.name).to be_nil
|
|
20
|
+
expect(@provider.created_at).to be_nil
|
|
21
|
+
expect(@provider.updated_at).to be_nil
|
|
22
|
+
end
|
|
23
|
+
it 'to_s does not crash' do
|
|
24
|
+
expect { @provider.to_s }.to_not raise_error
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
context 'nil and' do
|
|
29
|
+
before do
|
|
30
|
+
@provider = Nucleus::Provider.new
|
|
31
|
+
end
|
|
32
|
+
it 'providers are empty' do
|
|
33
|
+
expect(@provider.endpoints).to eql([])
|
|
34
|
+
end
|
|
35
|
+
it 'fields are empty' do
|
|
36
|
+
expect(@provider.id).to be_nil
|
|
37
|
+
expect(@provider.name).to be_nil
|
|
38
|
+
expect(@provider.created_at).to be_nil
|
|
39
|
+
expect(@provider.updated_at).to be_nil
|
|
40
|
+
end
|
|
41
|
+
it 'to_s does not crash' do
|
|
42
|
+
expect { @provider.to_s }.to_not raise_error
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
context 'hash properties and endpoint double' do
|
|
47
|
+
before do
|
|
48
|
+
endpoint = instance_double('Nucleus::Endpoint', name: 'endpoint name')
|
|
49
|
+
allow(endpoint).to receive(:is_a?).with(Nucleus::Endpoint).and_return(true)
|
|
50
|
+
@provider = Nucleus::Provider.new('endpoints' => [endpoint], 'id' => id, 'name' => name,
|
|
51
|
+
'created_at' => created_at, 'updated_at' => updated_at)
|
|
52
|
+
end
|
|
53
|
+
it 'has one endpoint' do
|
|
54
|
+
expect(@provider.endpoints).to_not eql([])
|
|
55
|
+
expect(@provider.endpoints.length).to eql(1)
|
|
56
|
+
end
|
|
57
|
+
it 'fields are not nil' do
|
|
58
|
+
expect(@provider.id).to_not be_nil
|
|
59
|
+
expect(@provider.name).to_not be_nil
|
|
60
|
+
end
|
|
61
|
+
it 'dates and parent vendor wont be applied' do
|
|
62
|
+
expect(@provider.created_at).to be_nil
|
|
63
|
+
expect(@provider.updated_at).to be_nil
|
|
64
|
+
expect(@provider.vendor).to be_nil
|
|
65
|
+
end
|
|
66
|
+
it 'fields have the valid values assigned' do
|
|
67
|
+
expect(@provider.id).to eql(id)
|
|
68
|
+
expect(@provider.name).to eql(name)
|
|
69
|
+
end
|
|
70
|
+
it 'to_s does not crash' do
|
|
71
|
+
expect { @provider.to_s }.to_not raise_error
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
context 'hash properties and endpoint hash' do
|
|
76
|
+
before do
|
|
77
|
+
@provider = Nucleus::Provider.new('endpoints' => [{ 'name' => 'endpoint name' }], 'id' => id, 'name' => name,
|
|
78
|
+
'created_at' => created_at, 'updated_at' => updated_at)
|
|
79
|
+
end
|
|
80
|
+
it 'has one endpoint' do
|
|
81
|
+
expect(@provider.endpoints).to_not eql([])
|
|
82
|
+
expect(@provider.endpoints.length).to eql(1)
|
|
83
|
+
end
|
|
84
|
+
it 'fields are not nil' do
|
|
85
|
+
expect(@provider.id).to_not be_nil
|
|
86
|
+
expect(@provider.name).to_not be_nil
|
|
87
|
+
end
|
|
88
|
+
it 'dates and parent vendor wont be applied' do
|
|
89
|
+
expect(@provider.created_at).to be_nil
|
|
90
|
+
expect(@provider.updated_at).to be_nil
|
|
91
|
+
expect(@provider.vendor).to be_nil
|
|
92
|
+
end
|
|
93
|
+
it 'fields have the valid values assigned' do
|
|
94
|
+
expect(@provider.id).to eql(id)
|
|
95
|
+
expect(@provider.name).to eql(name)
|
|
96
|
+
end
|
|
97
|
+
it 'to_s does not crash' do
|
|
98
|
+
expect { @provider.to_s }.to_not raise_error
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|