1require 'rubygems/test_case'
2require 'rubygems/config_file'
3
4class TestGemConfigFile < Gem::TestCase
5
6  def setup
7    super
8
9    @temp_conf = File.join @tempdir, '.gemrc'
10
11    @cfg_args = %W[--config-file #{@temp_conf}]
12
13    @orig_SYSTEM_WIDE_CONFIG_FILE = Gem::ConfigFile::SYSTEM_WIDE_CONFIG_FILE
14    Gem::ConfigFile.send :remove_const, :SYSTEM_WIDE_CONFIG_FILE
15    Gem::ConfigFile.send :const_set, :SYSTEM_WIDE_CONFIG_FILE,
16                         File.join(@tempdir, 'system-gemrc')
17    Gem::ConfigFile::OPERATING_SYSTEM_DEFAULTS.clear
18    Gem::ConfigFile::PLATFORM_DEFAULTS.clear
19
20    @env_gemrc = ENV['GEMRC']
21    ENV['GEMRC'] = ''
22
23    util_config_file
24  end
25
26  def teardown
27    Gem::ConfigFile::OPERATING_SYSTEM_DEFAULTS.clear
28    Gem::ConfigFile::PLATFORM_DEFAULTS.clear
29    Gem::ConfigFile.send :remove_const, :SYSTEM_WIDE_CONFIG_FILE
30    Gem::ConfigFile.send :const_set, :SYSTEM_WIDE_CONFIG_FILE,
31                         @orig_SYSTEM_WIDE_CONFIG_FILE
32
33    ENV['GEMRC'] = @env_gemrc
34
35    super
36  end
37
38  def test_initialize
39    assert_equal @temp_conf, @cfg.config_file_name
40
41    assert_equal false, @cfg.backtrace
42    assert_equal true, @cfg.update_sources
43    assert_equal Gem::ConfigFile::DEFAULT_BULK_THRESHOLD, @cfg.bulk_threshold
44    assert_equal true, @cfg.verbose
45    assert_equal [@gem_repo], Gem.sources
46
47    File.open @temp_conf, 'w' do |fp|
48      fp.puts ":backtrace: true"
49      fp.puts ":update_sources: false"
50      fp.puts ":bulk_threshold: 10"
51      fp.puts ":verbose: false"
52      fp.puts ":sources:"
53      fp.puts "  - http://more-gems.example.com"
54      fp.puts "install: --wrappers"
55      fp.puts ":gempath:"
56      fp.puts "- /usr/ruby/1.8/lib/ruby/gems/1.8"
57      fp.puts "- /var/ruby/1.8/gem_home"
58      fp.puts ":ssl_verify_mode: 0"
59      fp.puts ":ssl_ca_cert: /etc/ssl/certs"
60    end
61
62    util_config_file
63
64    assert_equal true, @cfg.backtrace
65    assert_equal 10, @cfg.bulk_threshold
66    assert_equal false, @cfg.verbose
67    assert_equal false, @cfg.update_sources
68    assert_equal %w[http://more-gems.example.com], Gem.sources
69    assert_equal '--wrappers', @cfg[:install]
70    assert_equal(['/usr/ruby/1.8/lib/ruby/gems/1.8', '/var/ruby/1.8/gem_home'],
71                 @cfg.path)
72    assert_equal 0, @cfg.ssl_verify_mode
73    assert_equal '/etc/ssl/certs', @cfg.ssl_ca_cert
74  end
75
76  def test_initialize_handle_arguments_config_file
77    util_config_file %W[--config-file #{@temp_conf}]
78
79    assert_equal @temp_conf, @cfg.config_file_name
80  end
81
82  def test_initialize_handle_arguments_config_file_with_other_params
83    util_config_file %W[--config-file #{@temp_conf} --backtrace]
84
85    assert_equal @temp_conf, @cfg.config_file_name
86  end
87
88  def test_initialize_handle_arguments_config_file_equals
89    util_config_file %W[--config-file=#{@temp_conf}]
90
91    assert_equal @temp_conf, @cfg.config_file_name
92  end
93
94  def test_initialize_operating_system_override
95    Gem::ConfigFile::OPERATING_SYSTEM_DEFAULTS[:bulk_threshold] = 1
96    Gem::ConfigFile::OPERATING_SYSTEM_DEFAULTS['install'] = '--no-env-shebang'
97
98    Gem::ConfigFile::PLATFORM_DEFAULTS[:bulk_threshold] = 2
99
100    util_config_file
101
102    assert_equal 2, @cfg.bulk_threshold
103    assert_equal '--no-env-shebang', @cfg[:install]
104  end
105
106  def test_initialize_platform_override
107    Gem::ConfigFile::PLATFORM_DEFAULTS[:bulk_threshold] = 2
108    Gem::ConfigFile::PLATFORM_DEFAULTS['install'] = '--no-env-shebang'
109
110    File.open Gem::ConfigFile::SYSTEM_WIDE_CONFIG_FILE, 'w' do |fp|
111      fp.puts ":bulk_threshold: 3"
112    end
113
114    util_config_file
115
116    assert_equal 3, @cfg.bulk_threshold
117    assert_equal '--no-env-shebang', @cfg[:install]
118  end
119
120  def test_initialize_system_wide_override
121    File.open Gem::ConfigFile::SYSTEM_WIDE_CONFIG_FILE, 'w' do |fp|
122      fp.puts ":backtrace: false"
123      fp.puts ":bulk_threshold: 2048"
124    end
125
126    File.open @temp_conf, 'w' do |fp|
127      fp.puts ":backtrace: true"
128    end
129
130    util_config_file
131
132    assert_equal 2048, @cfg.bulk_threshold
133    assert_equal true, @cfg.backtrace
134  end
135
136  def test_initialize_environment_variable_override
137    File.open Gem::ConfigFile::SYSTEM_WIDE_CONFIG_FILE, 'w' do |fp|
138      fp.puts ':backtrace: false'
139      fp.puts ':verbose: false'
140      fp.puts ':bulk_threshold: 2048'
141    end
142
143    conf1 = File.join @tempdir, 'gemrc1'
144    File.open conf1, 'w' do |fp|
145      fp.puts ':backtrace: true'
146    end
147
148    conf2 = File.join @tempdir, 'gemrc2'
149    File.open conf2, 'w' do |fp|
150      fp.puts ':verbose: true'
151    end
152
153    conf3 = File.join @tempdir, 'gemrc3'
154    File.open conf3, 'w' do |fp|
155      fp.puts ':verbose: :loud'
156    end
157
158    ENV['GEMRC'] = conf1 + ':' + conf2 + ';' + conf3
159
160    util_config_file
161
162    assert_equal true, @cfg.backtrace
163    assert_equal :loud, @cfg.verbose
164    assert_equal 2048, @cfg.bulk_threshold
165  end
166
167  def test_api_keys
168    assert_nil @cfg.instance_variable_get :@api_keys
169
170    temp_cred = File.join Gem.user_home, '.gem', 'credentials'
171    FileUtils.mkdir File.dirname(temp_cred)
172    File.open temp_cred, 'w', 0600 do |fp|
173      fp.puts ':rubygems_api_key: 701229f217cdf23b1344c7b4b54ca97'
174    end
175
176    util_config_file
177
178    assert_equal({:rubygems => '701229f217cdf23b1344c7b4b54ca97'},
179                 @cfg.api_keys)
180  end
181
182  def test_check_credentials_permissions
183    skip 'chmod not supported' if win_platform?
184
185    @cfg.rubygems_api_key = 'x'
186
187    File.chmod 0644, @cfg.credentials_path
188
189    use_ui @ui do
190      assert_raises Gem::MockGemUi::TermError do
191        @cfg.load_api_keys
192      end
193    end
194
195    assert_empty @ui.output
196
197    expected = <<-EXPECTED
198ERROR:  Your gem push credentials file located at:
199
200\t#{@cfg.credentials_path}
201
202has file permissions of 0644 but 0600 is required.
203
204You should reset your credentials at:
205
206\thttps://rubygems.org/profile/edit
207
208if you believe they were disclosed to a third party.
209    EXPECTED
210
211    assert_equal expected, @ui.error
212  end
213
214  def test_handle_arguments
215    args = %w[--backtrace --bunch --of --args here]
216
217    @cfg.handle_arguments args
218
219    assert_equal %w[--bunch --of --args here], @cfg.args
220  end
221
222  def test_handle_arguments_backtrace
223    assert_equal false, @cfg.backtrace
224
225    args = %w[--backtrace]
226
227    @cfg.handle_arguments args
228
229    assert_equal true, @cfg.backtrace
230  end
231
232  def test_handle_arguments_debug
233    old_dollar_DEBUG = $DEBUG
234    assert_equal false, $DEBUG
235
236    args = %w[--debug]
237
238    @cfg.handle_arguments args
239
240    assert_equal true, $DEBUG
241  ensure
242    $DEBUG = old_dollar_DEBUG
243  end
244
245  def test_handle_arguments_override
246    File.open @temp_conf, 'w' do |fp|
247      fp.puts ":backtrace: false"
248    end
249
250    util_config_file %W[--backtrace --config-file=#{@temp_conf}]
251
252    assert_equal true, @cfg.backtrace
253  end
254
255  def test_handle_arguments_traceback
256    assert_equal false, @cfg.backtrace
257
258    args = %w[--traceback]
259
260    @cfg.handle_arguments args
261
262    assert_equal true, @cfg.backtrace
263  end
264
265  def test_load_api_keys
266    temp_cred = File.join Gem.user_home, '.gem', 'credentials'
267    FileUtils.mkdir File.dirname(temp_cred)
268    File.open temp_cred, 'w', 0600 do |fp|
269      fp.puts ":rubygems_api_key: 701229f217cdf23b1344c7b4b54ca97"
270      fp.puts ":other: a5fdbb6ba150cbb83aad2bb2fede64c"
271    end
272
273    util_config_file
274
275    assert_equal({:rubygems => '701229f217cdf23b1344c7b4b54ca97',
276                  :other => 'a5fdbb6ba150cbb83aad2bb2fede64c'}, @cfg.api_keys)
277  end
278
279  def test_load_api_keys_bad_permission
280    skip 'chmod not supported' if win_platform?
281
282    @cfg.rubygems_api_key = 'x'
283
284    File.chmod 0644, @cfg.credentials_path
285
286    assert_raises Gem::MockGemUi::TermError do
287      @cfg.load_api_keys
288    end
289  end
290
291  def test_really_verbose
292    assert_equal false, @cfg.really_verbose
293
294    @cfg.verbose = true
295
296    assert_equal false, @cfg.really_verbose
297
298    @cfg.verbose = 1
299
300    assert_equal true, @cfg.really_verbose
301  end
302
303  def test_rubygems_api_key_equals
304    @cfg.rubygems_api_key = 'x'
305
306    assert_equal 'x', @cfg.rubygems_api_key
307
308    expected = {
309      :rubygems_api_key => 'x',
310    }
311
312    assert_equal expected, YAML.load_file(@cfg.credentials_path)
313
314    unless win_platform? then
315      stat = File.stat @cfg.credentials_path
316
317      assert_equal 0600, stat.mode & 0600
318    end
319  end
320
321  def test_rubygems_api_key_equals_bad_permission
322    skip 'chmod not supported' if win_platform?
323
324    @cfg.rubygems_api_key = 'x'
325
326    File.chmod 0644, @cfg.credentials_path
327
328    assert_raises Gem::MockGemUi::TermError do
329      @cfg.rubygems_api_key = 'y'
330    end
331
332    expected = {
333      :rubygems_api_key => 'x',
334    }
335
336    assert_equal expected, YAML.load_file(@cfg.credentials_path)
337
338    stat = File.stat @cfg.credentials_path
339
340    assert_equal 0644, stat.mode & 0644
341  end
342
343  def test_write
344    @cfg.backtrace = true
345    @cfg.update_sources = false
346    @cfg.bulk_threshold = 10
347    @cfg.verbose = false
348    Gem.sources.replace %w[http://more-gems.example.com]
349    @cfg[:install] = '--wrappers'
350
351    @cfg.write
352
353    util_config_file
354
355    # These should not be written out to the config file.
356    assert_equal false, @cfg.backtrace,     'backtrace'
357    assert_equal Gem::ConfigFile::DEFAULT_BULK_THRESHOLD, @cfg.bulk_threshold,
358                 'bulk_threshold'
359    assert_equal true, @cfg.update_sources, 'update_sources'
360    assert_equal true, @cfg.verbose,        'verbose'
361
362    assert_equal '--wrappers', @cfg[:install], 'install'
363
364    # this should be written out to the config file.
365    assert_equal %w[http://more-gems.example.com], Gem.sources
366  end
367
368  def test_write_from_hash
369    File.open @temp_conf, 'w' do |fp|
370      fp.puts ":backtrace: true"
371      fp.puts ":bulk_threshold: 10"
372      fp.puts ":update_sources: false"
373      fp.puts ":verbose: false"
374      fp.puts ":sources:"
375      fp.puts "  - http://more-gems.example.com"
376      fp.puts "install: --wrappers"
377    end
378
379    util_config_file
380
381    @cfg.backtrace = :junk
382    @cfg.update_sources = :junk
383    @cfg.bulk_threshold = 20
384    @cfg.verbose = :junk
385    Gem.sources.replace %w[http://even-more-gems.example.com]
386    @cfg[:install] = '--wrappers --no-rdoc'
387
388    @cfg.write
389
390    util_config_file
391
392    # These should not be written out to the config file
393    assert_equal true,  @cfg.backtrace,      'backtrace'
394    assert_equal 10,    @cfg.bulk_threshold, 'bulk_threshold'
395    assert_equal false, @cfg.update_sources, 'update_sources'
396    assert_equal false, @cfg.verbose,        'verbose'
397
398    assert_equal '--wrappers --no-rdoc', @cfg[:install], 'install'
399
400    assert_equal %w[http://even-more-gems.example.com], Gem.sources
401  end
402
403  def test_ignore_invalid_config_file
404    File.open @temp_conf, 'w' do |fp|
405      fp.puts "some-non-yaml-hash-string"
406    end
407
408    # Avoid writing stuff to output when running tests
409    Gem::ConfigFile.class_eval { def warn(args); end }
410
411    # This should not raise exception
412    util_config_file
413  end
414
415  def test_load_ssl_verify_mode_from_config
416    File.open @temp_conf, 'w' do |fp|
417      fp.puts ":ssl_verify_mode: 1"
418    end
419    util_config_file
420    assert_equal(1, @cfg.ssl_verify_mode)
421  end
422
423  def test_load_ssl_ca_cert_from_config
424    File.open @temp_conf, 'w' do |fp|
425      fp.puts ":ssl_ca_cert: /home/me/certs"
426    end
427    util_config_file
428    assert_equal('/home/me/certs', @cfg.ssl_ca_cert)
429  end
430
431  def util_config_file(args = @cfg_args)
432    @cfg = Gem::ConfigFile.new args
433  end
434
435  def test_disable_default_gem_server
436    File.open @temp_conf, 'w' do |fp|
437      fp.puts ":disable_default_gem_server: true"
438    end
439    util_config_file
440    assert_equal(true, @cfg.disable_default_gem_server)
441  end
442end
443
444