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