buildpack-support 1.0.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.
Files changed (122) hide show
  1. data/LICENSE +202 -0
  2. data/NOTICE +2 -0
  3. data/docs/cache.md +77 -0
  4. data/docs/component.md +1 -0
  5. data/docs/configuration.md +27 -0
  6. data/docs/logging.md +54 -0
  7. data/docs/other.md +1 -0
  8. data/docs/rake.md +1 -0
  9. data/docs/repository.md +116 -0
  10. data/docs/test.md +1 -0
  11. data/lib/buildpack_support.rb +18 -0
  12. data/lib/buildpack_support/base_buildpack.rb +166 -0
  13. data/lib/buildpack_support/buildpack_version.rb +124 -0
  14. data/lib/buildpack_support/cache.rb +24 -0
  15. data/lib/buildpack_support/cache/application_cache.rb +41 -0
  16. data/lib/buildpack_support/cache/cached_file.rb +103 -0
  17. data/lib/buildpack_support/cache/download_cache.rb +280 -0
  18. data/lib/buildpack_support/cache/inferred_network_failure.rb +26 -0
  19. data/lib/buildpack_support/cache/internet_availability.rb +64 -0
  20. data/lib/buildpack_support/component.rb +24 -0
  21. data/lib/buildpack_support/component/application.rb +76 -0
  22. data/lib/buildpack_support/component/base_component.rb +78 -0
  23. data/lib/buildpack_support/component/base_droplet.rb +96 -0
  24. data/lib/buildpack_support/component/downloads.rb +88 -0
  25. data/lib/buildpack_support/component/services.rb +84 -0
  26. data/lib/buildpack_support/component/versioned_dependency_component.rb +71 -0
  27. data/lib/buildpack_support/component/versioned_downloads.rb +57 -0
  28. data/lib/buildpack_support/component/with_timing.rb +40 -0
  29. data/lib/buildpack_support/configuration_utils.rb +58 -0
  30. data/lib/buildpack_support/constantize.rb +46 -0
  31. data/lib/buildpack_support/dash_case.rb +29 -0
  32. data/lib/buildpack_support/directory_finder.rb +45 -0
  33. data/lib/buildpack_support/filtering_pathname.rb +227 -0
  34. data/lib/buildpack_support/format_duration.rb +57 -0
  35. data/lib/buildpack_support/logging.rb +22 -0
  36. data/lib/buildpack_support/logging/delegating_logger.rb +48 -0
  37. data/lib/buildpack_support/logging/logger_factory.rb +148 -0
  38. data/lib/buildpack_support/qualify_path.rb +36 -0
  39. data/lib/buildpack_support/rake.rb +22 -0
  40. data/lib/buildpack_support/rake/buildpack_stage_task.rb +86 -0
  41. data/lib/buildpack_support/rake/cached_artifact_finder.rb +99 -0
  42. data/lib/buildpack_support/rake/check_api_doc_task.rb +70 -0
  43. data/lib/buildpack_support/rake/dependency_cache_task.rb +87 -0
  44. data/lib/buildpack_support/rake/disable_remote_downloads_task.rb +80 -0
  45. data/lib/buildpack_support/rake/package_task.rb +133 -0
  46. data/lib/buildpack_support/rake/package_zip_task.rb +80 -0
  47. data/lib/buildpack_support/rake/repository_configuration_finder.rb +66 -0
  48. data/lib/buildpack_support/rake/write_version_file_task.rb +82 -0
  49. data/lib/buildpack_support/repository.rb +24 -0
  50. data/lib/buildpack_support/repository/configured_item.rb +81 -0
  51. data/lib/buildpack_support/repository/repository_index.rb +98 -0
  52. data/lib/buildpack_support/repository/wildcard_version_resolver.rb +75 -0
  53. data/lib/buildpack_support/shell.rb +41 -0
  54. data/lib/buildpack_support/snake_case.rb +30 -0
  55. data/lib/buildpack_support/space_case.rb +29 -0
  56. data/lib/buildpack_support/test/application_helper.rb +41 -0
  57. data/lib/buildpack_support/test/base_component_helper.rb +59 -0
  58. data/lib/buildpack_support/test/base_droplet_helper.rb +36 -0
  59. data/lib/buildpack_support/test/console_helper.rb +57 -0
  60. data/lib/buildpack_support/test/environment_helper.rb +32 -0
  61. data/lib/buildpack_support/test/internet_availability_helper.rb +29 -0
  62. data/lib/buildpack_support/test/logging_helper.rb +50 -0
  63. data/lib/buildpack_support/test/scratch_helper.rb +32 -0
  64. data/lib/buildpack_support/test/versioned_dependency_component_helper.rb +32 -0
  65. data/lib/buildpack_support/test/with_load_path_helper.rb +27 -0
  66. data/lib/buildpack_support/to_b.rb +38 -0
  67. data/lib/buildpack_support/tokenized_version.rb +157 -0
  68. data/lib/buildpack_support/version.rb +23 -0
  69. data/spec/buildpack_support/base_buildpack_spec.rb +112 -0
  70. data/spec/buildpack_support/buildpack_version_spec.rb +122 -0
  71. data/spec/buildpack_support/cache/application_cache_spec.rb +56 -0
  72. data/spec/buildpack_support/cache/cached_file_spec.rb +94 -0
  73. data/spec/buildpack_support/cache/download_cache_spec.rb +293 -0
  74. data/spec/buildpack_support/cache/internet_availability_spec.rb +57 -0
  75. data/spec/buildpack_support/cache/yield_file_with_content.rb +30 -0
  76. data/spec/buildpack_support/component/application_spec.rb +81 -0
  77. data/spec/buildpack_support/component/base_component_spec.rb +81 -0
  78. data/spec/buildpack_support/component/base_droplet_spec.rb +72 -0
  79. data/spec/buildpack_support/component/downloads_spec.rb +63 -0
  80. data/spec/buildpack_support/component/services_spec.rb +80 -0
  81. data/spec/buildpack_support/component/versioned_dependency_component_spec.rb +58 -0
  82. data/spec/buildpack_support/component/versioned_downloads_spec.rb +58 -0
  83. data/spec/buildpack_support/component/with_timing_spec.rb +30 -0
  84. data/spec/buildpack_support/configuration_utils_spec.rb +39 -0
  85. data/spec/buildpack_support/constantize_spec.rb +34 -0
  86. data/spec/buildpack_support/dash_case_spec.rb +41 -0
  87. data/spec/buildpack_support/directory_finder_spec.rb +41 -0
  88. data/spec/buildpack_support/filtering_pathname_spec.rb +443 -0
  89. data/spec/buildpack_support/format_duration_spec.rb +60 -0
  90. data/spec/buildpack_support/logging/delegating_logger_spec.rb +62 -0
  91. data/spec/buildpack_support/logging/logger_factory_spec.rb +262 -0
  92. data/spec/buildpack_support/qualify_path_spec.rb +42 -0
  93. data/spec/buildpack_support/rake/buildpack_stage_task_spec.rb +88 -0
  94. data/spec/buildpack_support/rake/cached_artifact_finder_spec.rb +73 -0
  95. data/spec/buildpack_support/rake/check_api_doc_task_spec.rb +69 -0
  96. data/spec/buildpack_support/rake/dependency_cache_task_spec.rb +133 -0
  97. data/spec/buildpack_support/rake/disable_remote_downloads_task_spec.rb +91 -0
  98. data/spec/buildpack_support/rake/package_task_spec.rb +335 -0
  99. data/spec/buildpack_support/rake/package_zip_task_spec.rb +91 -0
  100. data/spec/buildpack_support/rake/repository_configuration_finder_spec.rb +61 -0
  101. data/spec/buildpack_support/rake/write_version_file_task_spec.rb +96 -0
  102. data/spec/buildpack_support/repository/configured_item_spec.rb +78 -0
  103. data/spec/buildpack_support/repository/repository_index_spec.rb +118 -0
  104. data/spec/buildpack_support/repository/wildcard_version_resolver_spec.rb +73 -0
  105. data/spec/buildpack_support/shell_spec.rb +32 -0
  106. data/spec/buildpack_support/snake_case_spec.rb +45 -0
  107. data/spec/buildpack_support/space_case_spec.rb +41 -0
  108. data/spec/buildpack_support/to_b_spec.rb +41 -0
  109. data/spec/buildpack_support/tokenized_version_spec.rb +132 -0
  110. data/spec/fixtures/application/test-file +0 -0
  111. data/spec/fixtures/config/found-config.yml +2 -0
  112. data/spec/fixtures/droplet-resources/droplet-resource +0 -0
  113. data/spec/fixtures/stub-download-with-top-level.zip +0 -0
  114. data/spec/fixtures/stub-download.tar.gz +0 -0
  115. data/spec/fixtures/stub-download.zip +0 -0
  116. data/spec/fixtures/test-cache.yml +18 -0
  117. data/spec/fixtures/test-index.yml +2 -0
  118. data/spec/fixtures/test_component.rb +0 -0
  119. data/spec/fixtures/zip-contents/test-directory/test-deep-file +0 -0
  120. data/spec/fixtures/zip-contents/test-file +0 -0
  121. data/spec/spec_helper.rb +30 -0
  122. metadata +416 -0
@@ -0,0 +1,56 @@
1
+ # Encoding: utf-8
2
+ # Copyright 2013-2014 the original author or authors.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ require 'spec_helper'
17
+ require 'buildpack_support/cache/application_cache'
18
+ require 'buildpack_support/test/internet_availability_helper'
19
+ require 'buildpack_support/test/logging_helper'
20
+ require 'buildpack_support/test/scratch_helper'
21
+
22
+ describe BuildpackSupport::Cache::ApplicationCache do
23
+ include_context 'internet_availability_helper'
24
+ include_context 'logging_helper'
25
+ include_context 'scratch_helper'
26
+
27
+ previous_arg_value = ARGV[1]
28
+
29
+ before do
30
+ ARGV[1] = nil
31
+
32
+ stub_request(:get, 'http://foo-uri/').with(headers: { 'Accept' => '*/*', 'User-Agent' => 'Ruby' })
33
+ .to_return(status: 200, body: 'foo-cached', headers: { Etag: 'foo-etag', 'Last-Modified' => 'foo-last-modified' })
34
+
35
+ stub_request(:head, 'http://foo-uri/')
36
+ .with(headers: { 'Accept' => '*/*', 'If-Modified-Since' => 'foo-last-modified', 'If-None-Match' => 'foo-etag', 'User-Agent' => 'Ruby' })
37
+ .to_return(status: 304, body: '', headers: {})
38
+ end
39
+
40
+ after do
41
+ ARGV[1] = previous_arg_value
42
+ end
43
+
44
+ it 'should raise an error if ARGV[1] is not defined' do
45
+ expect { described_class.new }.to raise_error
46
+ end
47
+
48
+ it 'should use ARGV[1] directory' do
49
+ ARGV[1] = scratch_dir
50
+
51
+ described_class.new.get('http://foo-uri/') {}
52
+
53
+ expect(Pathname.glob(scratch_dir + '*.cached').size).to eq(1)
54
+ end
55
+
56
+ end
@@ -0,0 +1,94 @@
1
+ # Encoding: utf-8
2
+ # Copyright 2013-2014 the original author or authors.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ require 'spec_helper'
17
+ require 'buildpack_support/cache/cached_file'
18
+ require 'buildpack_support/cache/yield_file_with_content'
19
+ require 'buildpack_support/test/scratch_helper'
20
+ require 'fileutils'
21
+
22
+ describe BuildpackSupport::Cache::CachedFile do
23
+ include_context 'scratch_helper'
24
+
25
+ let(:file_cache) { described_class.new(scratch_dir, 'http://foo-uri/') }
26
+
27
+ it 'should not create any files on initialization' do
28
+ %w(cached etag last_modified).each { |extension| expect(cache_file(extension)).not_to exist }
29
+ end
30
+
31
+ it 'should not detect cached file' do
32
+ expect(file_cache.cached?).not_to be
33
+ end
34
+
35
+ it 'should not detect etag file' do
36
+ expect(file_cache.etag?).not_to be
37
+ end
38
+
39
+ it 'should not detect last_modified file' do
40
+ expect(file_cache.last_modified?).not_to be
41
+ end
42
+
43
+ context do
44
+
45
+ before do
46
+ touch('cached', 'foo-cached')
47
+ touch('etag', 'foo-etag')
48
+ touch('last_modified', 'foo-last-modified')
49
+ end
50
+
51
+ it 'should call the block with the content of the cache file' do
52
+ expect { |b| file_cache.cached(File::RDONLY, 'test-arg', &b) }.to yield_file_with_content(/foo-cached/)
53
+ end
54
+
55
+ it 'should detect cached file' do
56
+ expect(file_cache.cached?).to be
57
+ end
58
+
59
+ it 'should destroy all files' do
60
+ file_cache.destroy
61
+
62
+ %w(cached etag last_modified).each { |extension| expect(cache_file(extension)).not_to exist }
63
+ end
64
+
65
+ it 'should call the block with the content of the etag file' do
66
+ expect { |b| file_cache.etag(File::RDONLY, 'test-arg', &b) }.to yield_file_with_content(/foo-etag/)
67
+ end
68
+
69
+ it 'should detect etag file' do
70
+ expect(file_cache.etag?).to be
71
+ end
72
+
73
+ it 'should call the block with the content of the last_modified file' do
74
+ expect { |b| file_cache.last_modified(File::RDONLY, 'test-arg', &b) }.to yield_file_with_content(/foo-last-modified/)
75
+ end
76
+
77
+ it 'should detect last_modified file' do
78
+ expect(file_cache.last_modified?).to be
79
+ end
80
+ end
81
+
82
+ def cache_file(extension)
83
+ scratch_dir + "http:%2F%2Ffoo-uri%2F.#{extension}"
84
+ end
85
+
86
+ def touch(extension, content = '')
87
+ file = cache_file extension
88
+ FileUtils.mkdir_p file.dirname
89
+ file.open('w') { |f| f.write content }
90
+
91
+ file
92
+ end
93
+
94
+ end
@@ -0,0 +1,293 @@
1
+ # Encoding: utf-8
2
+ # Copyright 2013-2014 the original author or authors.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ require 'spec_helper'
17
+ require 'buildpack_support/cache/download_cache'
18
+ require 'buildpack_support/test/environment_helper'
19
+ require 'buildpack_support/test/internet_availability_helper'
20
+ require 'buildpack_support/test/logging_helper'
21
+ require 'buildpack_support/test/scratch_helper'
22
+ require 'fileutils'
23
+ require 'net/http'
24
+
25
+ describe BuildpackSupport::Cache::DownloadCache do
26
+ include_context 'environment_helper'
27
+ include_context 'internet_availability_helper'
28
+ include_context 'logging_helper'
29
+ include_context 'scratch_helper'
30
+
31
+ let(:mutable_cache_root) { scratch_dir + 'mutable' }
32
+
33
+ let(:immutable_cache_root) { scratch_dir + 'immutable' }
34
+
35
+ let(:uri) { 'http://foo-uri/' }
36
+
37
+ let(:uri_credentials) { 'http://test-username:test-password@foo-uri/' }
38
+
39
+ let(:uri_secure) { 'https://foo-uri/' }
40
+
41
+ let(:download_cache) { described_class.new(mutable_cache_root, immutable_cache_root) }
42
+
43
+ it 'should raise error if file cannot be found',
44
+ :disable_internet do
45
+
46
+ expect { download_cache.get uri }.to raise_error('Unable to find cached file for http://foo-uri/')
47
+ end
48
+
49
+ it 'should return file from immutable cache if internet is disabled',
50
+ :disable_internet do
51
+
52
+ touch immutable_cache_root, 'cached', 'foo-cached'
53
+
54
+ expect { |b| download_cache.get uri, &b }.to yield_file_with_content(/foo-cached/)
55
+ end
56
+
57
+ it 'should return file from mutable cache if internet is disabled',
58
+ :disable_internet do
59
+
60
+ touch mutable_cache_root, 'cached', 'foo-cached'
61
+
62
+ expect { |b| download_cache.get uri, &b }.to yield_file_with_content(/foo-cached/)
63
+ end
64
+
65
+ it 'should download if cached file does not exist' do
66
+ stub_request(:get, uri)
67
+ .to_return(status: 200, body: 'foo-cached', headers: { Etag: 'foo-etag', 'Last-Modified' => 'foo-last-modified' })
68
+
69
+ allow(Net::HTTP).to receive(:Proxy).and_call_original
70
+ expect(Net::HTTP).not_to receive(:Proxy).with('proxy', 9000, nil, nil)
71
+
72
+ expect { |b| download_cache.get uri, &b }.to yield_file_with_content(/foo-cached/)
73
+ expect_complete_cache mutable_cache_root
74
+ end
75
+
76
+ it 'should download with credentials if cached file does not exist' do
77
+ stub_request(:get, uri_credentials)
78
+ .to_return(status: 200, body: 'foo-cached', headers: { Etag: 'foo-etag', 'Last-Modified' => 'foo-last-modified' })
79
+
80
+ allow(Net::HTTP).to receive(:Proxy).and_call_original
81
+ expect(Net::HTTP).not_to receive(:Proxy).with('proxy', 9000, nil, nil)
82
+
83
+ expect { |b| download_cache.get uri_credentials, &b }.to yield_file_with_content(/foo-cached/)
84
+ expect_complete_credential_cache mutable_cache_root
85
+ end
86
+
87
+ it 'should follow redirects' do
88
+ stub_request(:get, uri)
89
+ .to_return(status: 301, headers: { Location: uri_secure })
90
+ stub_request(:get, uri_secure)
91
+ .to_return(status: 200, body: 'foo-cached', headers: { Etag: 'foo-etag', 'Last-Modified' => 'foo-last-modified' })
92
+
93
+ expect { |b| download_cache.get uri, &b }.to yield_file_with_content(/foo-cached/)
94
+ expect_complete_cache mutable_cache_root
95
+ end
96
+
97
+ it 'should retry failed downloads' do
98
+ stub_request(:get, uri)
99
+ .to_raise(SocketError)
100
+ .to_return(status: 200, body: 'foo-cached', headers: { Etag: 'foo-etag', 'Last-Modified' => 'foo-last-modified' })
101
+
102
+ expect { |b| download_cache.get uri, &b }.to yield_file_with_content(/foo-cached/)
103
+ expect_complete_cache mutable_cache_root
104
+ end
105
+
106
+ it 'should return cached data if unknown error occurs' do
107
+ stub_request(:get, uri)
108
+ .to_raise('DNS Error')
109
+
110
+ touch immutable_cache_root, 'cached', 'foo-cached'
111
+
112
+ expect { |b| download_cache.get uri, &b }.to yield_file_with_content(/foo-cached/)
113
+ end
114
+
115
+ it 'should return cached data if retry limit is reached' do
116
+ stub_request(:get, uri)
117
+ .to_return(status: 500)
118
+
119
+ touch immutable_cache_root, 'cached', 'foo-cached'
120
+
121
+ expect { |b| download_cache.get uri, &b }.to yield_file_with_content(/foo-cached/)
122
+ end
123
+
124
+ it 'should not overwrite existing information if 304 is received' do
125
+ stub_request(:get, uri)
126
+ .with(headers: { 'If-None-Match' => 'foo-etag', 'If-Modified-Since' => 'foo-last-modified' })
127
+ .to_return(status: 304, body: '', headers: {})
128
+
129
+ touch mutable_cache_root, 'cached', 'foo-cached'
130
+ touch mutable_cache_root, 'etag', 'foo-etag'
131
+ touch mutable_cache_root, 'last_modified', 'foo-last-modified'
132
+
133
+ expect { |b| download_cache.get uri, &b }.to yield_file_with_content(/foo-cached/)
134
+ expect_complete_cache mutable_cache_root
135
+ end
136
+
137
+ it 'should overwrite existing information if 304 is not received' do
138
+ stub_request(:get, uri)
139
+ .with(headers: { 'If-None-Match' => 'old-foo-etag', 'If-Modified-Since' => 'old-foo-last-modified' })
140
+ .to_return(status: 200, body: 'foo-cached', headers: { Etag: 'foo-etag', 'Last-Modified' => 'foo-last-modified' })
141
+
142
+ touch mutable_cache_root, 'cached', 'old-foo-cached'
143
+ touch mutable_cache_root, 'etag', 'old-foo-etag'
144
+ touch mutable_cache_root, 'last_modified', 'old-foo-last-modified'
145
+
146
+ expect { |b| download_cache.get uri, &b }.to yield_with_args(be_a(File), true)
147
+
148
+ touch mutable_cache_root, 'cached', 'old-foo-cached'
149
+ touch mutable_cache_root, 'etag', 'old-foo-etag'
150
+ touch mutable_cache_root, 'last_modified', 'old-foo-last-modified'
151
+
152
+ expect { |b| download_cache.get uri, &b }.to yield_file_with_content(/foo-cached/)
153
+
154
+ expect_complete_cache mutable_cache_root
155
+ end
156
+
157
+ it 'should discard content with incorrect size' do
158
+ stub_request(:get, uri)
159
+ .to_return(status: 200, body: 'foo-cac', headers: { Etag: 'foo-etag',
160
+ 'Last-Modified' => 'foo-last-modified',
161
+ 'Content-Length' => 10 })
162
+
163
+ touch immutable_cache_root, 'cached', 'old-foo-cached'
164
+
165
+ expect { |b| download_cache.get uri, &b }.to yield_file_with_content(/foo-cached/)
166
+ end
167
+
168
+ context do
169
+
170
+ let(:environment) { { 'http_proxy' => 'http://proxy:9000' } }
171
+
172
+ it 'should use http_proxy if specified' do
173
+ stub_request(:get, uri)
174
+ .to_return(status: 200, body: 'foo-cached', headers: { Etag: 'foo-etag', 'Last-Modified' => 'foo-last-modified' })
175
+
176
+ allow(Net::HTTP).to receive(:Proxy).and_call_original
177
+ expect(Net::HTTP).to receive(:Proxy).with('proxy', 9000, nil, nil).and_call_original
178
+
179
+ download_cache.get(uri) {}
180
+ end
181
+
182
+ end
183
+
184
+ context do
185
+
186
+ let(:environment) { { 'HTTP_PROXY' => 'http://proxy:9000' } }
187
+
188
+ it 'should use HTTP_PROXY if specified' do
189
+ stub_request(:get, uri)
190
+ .to_return(status: 200, body: 'foo-cached', headers: { Etag: 'foo-etag', 'Last-Modified' => 'foo-last-modified' })
191
+
192
+ allow(Net::HTTP).to receive(:Proxy).and_call_original
193
+ expect(Net::HTTP).to receive(:Proxy).with('proxy', 9000, nil, nil).and_call_original
194
+
195
+ download_cache.get(uri) {}
196
+ end
197
+
198
+ end
199
+
200
+ context do
201
+
202
+ let(:environment) { { 'https_proxy' => 'http://proxy:9000' } }
203
+
204
+ it 'should use https_proxy if specified and URL is secure' do
205
+ stub_request(:get, uri_secure)
206
+ .to_return(status: 200, body: 'foo-cached', headers: { Etag: 'foo-etag', 'Last-Modified' => 'foo-last-modified' })
207
+
208
+ allow(Net::HTTP).to receive(:Proxy).and_call_original
209
+ expect(Net::HTTP).to receive(:Proxy).with('proxy', 9000, nil, nil).and_call_original
210
+
211
+ download_cache.get(uri_secure) {}
212
+ end
213
+
214
+ end
215
+
216
+ context do
217
+
218
+ let(:environment) { { 'HTTPS_PROXY' => 'http://proxy:9000' } }
219
+
220
+ it 'should use HTTPS_PROXY if specified and URL is secure' do
221
+ stub_request(:get, uri_secure)
222
+ .to_return(status: 200, body: 'foo-cached', headers: { Etag: 'foo-etag', 'Last-Modified' => 'foo-last-modified' })
223
+
224
+ allow(Net::HTTP).to receive(:Proxy).and_call_original
225
+ expect(Net::HTTP).to receive(:Proxy).with('proxy', 9000, nil, nil).and_call_original
226
+
227
+ download_cache.get(uri_secure) {}
228
+ end
229
+
230
+ end
231
+
232
+ it 'should delete the cached file if it exists' do
233
+ expect_file_deleted 'cached'
234
+ end
235
+
236
+ it 'should delete the etag file if it exists' do
237
+ expect_file_deleted 'etag'
238
+ end
239
+
240
+ it 'should delete the last_modified file if it exists' do
241
+ expect_file_deleted 'last_modified'
242
+ end
243
+
244
+ def cache_file(root, extension)
245
+ root + "http:%2F%2Ffoo-uri%2F.#{extension}"
246
+ end
247
+
248
+ def credential_cache_file(root, extension)
249
+ root + "http:%2F%2Ftest-username:test-password@foo-uri%2F.#{extension}"
250
+ end
251
+
252
+ def expect_complete_cache(root)
253
+ expect_file_content root, 'cached', 'foo-cached'
254
+ expect_file_content root, 'etag', 'foo-etag'
255
+ expect_file_content root, 'last_modified', 'foo-last-modified'
256
+ end
257
+
258
+ def expect_complete_credential_cache(root)
259
+ expect_credential_file_content root, 'cached', 'foo-cached'
260
+ expect_credential_file_content root, 'etag', 'foo-etag'
261
+ expect_credential_file_content root, 'last_modified', 'foo-last-modified'
262
+ end
263
+
264
+ def expect_credential_file_content(root, extension, content = '')
265
+ file = credential_cache_file root, extension
266
+ expect(file).to exist
267
+ expect(file.read).to eq(content)
268
+ end
269
+
270
+ def expect_file_content(root, extension, content = '')
271
+ file = cache_file root, extension
272
+ expect(file).to exist
273
+ expect(file.read).to eq(content)
274
+ end
275
+
276
+ def expect_file_deleted(extension)
277
+ file = touch mutable_cache_root, extension
278
+ expect(file).to exist
279
+
280
+ download_cache.evict('http://foo-uri/')
281
+
282
+ expect(file).not_to exist
283
+ end
284
+
285
+ def touch(root, extension, content = '')
286
+ file = cache_file root, extension
287
+ FileUtils.mkdir_p file.dirname
288
+ file.open('w') { |f| f.write content }
289
+
290
+ file
291
+ end
292
+
293
+ end
@@ -0,0 +1,57 @@
1
+ # Encoding: utf-8
2
+ # Copyright 2013-2014 the original author or authors.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ require 'spec_helper'
17
+ require 'buildpack_support/cache/internet_availability'
18
+ require 'buildpack_support/configuration_utils'
19
+ require 'buildpack_support/test/internet_availability_helper'
20
+ require 'buildpack_support/test/logging_helper'
21
+
22
+ describe BuildpackSupport::Cache::InternetAvailability do
23
+ include_context 'internet_availability_helper'
24
+ include_context 'logging_helper'
25
+
26
+ it 'should use internet by default' do
27
+ expect(described_class.instance.available?).to be
28
+ end
29
+
30
+ context do
31
+
32
+ before do
33
+ allow_any_instance_of(BuildpackSupport::ConfigurationUtils).to receive(:load).with('cache')
34
+ .and_return('remote_downloads' => 'disabled')
35
+ described_class.instance.send :initialize
36
+ end
37
+
38
+ it 'should not use internet if remote downloads are disabled' do
39
+ expect(described_class.instance.available?).not_to be
40
+ end
41
+ end
42
+
43
+ it 'should record availability' do
44
+ described_class.instance.available false
45
+
46
+ expect(described_class.instance.available?).not_to be
47
+ expect(log_contents).not_to match(/Internet availability set to false/)
48
+ end
49
+
50
+ it 'should record availability with message' do
51
+ described_class.instance.available false, 'test message'
52
+
53
+ expect(described_class.instance.available?).not_to be
54
+ expect(log_contents).to match(/Internet availability set to false: test message/)
55
+ end
56
+
57
+ end