diff options
author | drbrain <drbrain@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-11-10 07:48:56 +0000 |
---|---|---|
committer | drbrain <drbrain@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-11-10 07:48:56 +0000 |
commit | fbf59bdbea63efd34ccc144e648467d2f52e7345 (patch) | |
tree | 244f0e7ae112cc7dd135e5d1ac24e6c70ba71b4a /test/rubygems/test_gem_source_info_cache.rb | |
parent | 7a4aad75356496559460041a6c063bdb736c7236 (diff) |
Import RubyGems trunk revision 1493.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13862 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test/rubygems/test_gem_source_info_cache.rb')
-rw-r--r-- | test/rubygems/test_gem_source_info_cache.rb | 299 |
1 files changed, 299 insertions, 0 deletions
diff --git a/test/rubygems/test_gem_source_info_cache.rb b/test/rubygems/test_gem_source_info_cache.rb new file mode 100644 index 0000000000..570b643bc5 --- /dev/null +++ b/test/rubygems/test_gem_source_info_cache.rb @@ -0,0 +1,299 @@ +#!/usr/bin/env ruby +#-- +# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others. +# All rights reserved. +# See LICENSE.txt for permissions. +#++ + +require 'test/unit' +require File.join(File.expand_path(File.dirname(__FILE__)), 'gemutilities') +require 'rubygems/source_info_cache' + +class Gem::SourceIndex + public :gems +end + +class TestGemSourceInfoCache < RubyGemTestCase + + def setup + @original_sources = Gem.sources + + super + + util_setup_fake_fetcher + + @sic = Gem::SourceInfoCache.new + @sic.instance_variable_set :@fetcher, @fetcher + + prep_cache_files @sic + end + + def teardown + super + Gem.sources.replace @original_sources + end + + def test_self_cache_refreshes + Gem.configuration.update_sources = true #true by default + source_index = Gem::SourceIndex.new 'key' => 'sys' + @fetcher.data["#{@gem_repo}/Marshal.#{@marshal_version}"] = source_index.dump + + Gem.sources.replace %W[#{@gem_repo}] + + use_ui @ui do + assert_not_nil Gem::SourceInfoCache.cache + assert_kind_of Gem::SourceInfoCache, Gem::SourceInfoCache.cache + assert_equal Gem::SourceInfoCache.cache.object_id, + Gem::SourceInfoCache.cache.object_id + assert_match %r|Bulk updating|, @ui.output + end + end + + def test_self_cache_skips_refresh_based_on_configuration + Gem.configuration.update_sources = false + source_index = Gem::SourceIndex.new 'key' => 'sys' + @fetcher.data["#{@gem_repo}/Marshal.#{@marshal_version}"] = source_index.dump + + Gem.sources.replace %w[#{@gem_repo}] + + use_ui @ui do + assert_not_nil Gem::SourceInfoCache.cache + assert_kind_of Gem::SourceInfoCache, Gem::SourceInfoCache.cache + assert_equal Gem::SourceInfoCache.cache.object_id, + Gem::SourceInfoCache.cache.object_id + assert_no_match %r|Bulk updating|, @ui.output + end + end + + def test_self_cache_data + source_index = Gem::SourceIndex.new 'key' => 'sys' + @fetcher.data["#{@gem_repo}/Marshal.#{@marshal_version}"] = source_index.dump + + Gem::SourceInfoCache.instance_variable_set :@cache, nil + sice = Gem::SourceInfoCacheEntry.new source_index, 0 + + use_ui @ui do + assert_equal source_index.gems, + Gem::SourceInfoCache.cache_data[@gem_repo].source_index.gems + end + end + + def test_cache_data + assert_equal [['key','sys']], @sic.cache_data.to_a.sort + end + + def test_cache_data_dirty + def @sic.dirty() @dirty; end + assert_equal false, @sic.dirty, 'clean on init' + @sic.cache_data + assert_equal false, @sic.dirty, 'clean on fetch' + @sic.update + @sic.cache_data + assert_equal true, @sic.dirty, 'still dirty' + end + + def test_cache_data_irreparable + @fetcher.data["#{@gem_repo}/Marshal.#{@marshal_version}"] = @source_index.dump + + data = { @gem_repo => { 'totally' => 'borked' } } + + [@sic.system_cache_file, @sic.user_cache_file].each do |fn| + FileUtils.mkdir_p File.dirname(fn) + open(fn, "wb") { |f| f.write Marshal.dump(data) } + end + + @sic.instance_eval { @cache_data = nil } + + fetched = use_ui @ui do @sic.cache_data end + + fetched_si = fetched["#{@gem_repo}"].source_index + + assert_equal @source_index.index_signature, fetched_si.index_signature + end + + def test_cache_data_none_readable + FileUtils.chmod 0222, @sic.system_cache_file + FileUtils.chmod 0222, @sic.user_cache_file + return if (File.stat(@sic.system_cache_file).mode & 0222) != 0222 + return if (File.stat(@sic.user_cache_file).mode & 0222) != 0222 + # HACK for systems that don't support chmod + assert_equal({}, @sic.cache_data) + end + + def test_cache_data_none_writable + FileUtils.chmod 0444, @sic.system_cache_file + FileUtils.chmod 0444, @sic.user_cache_file + e = assert_raise RuntimeError do + @sic.cache_data + end + assert_equal 'unable to locate a writable cache file', e.message + end + + def test_cache_data_repair + data = { + @gem_repo => { + 'cache' => Gem::SourceIndex.new, + 'size' => 0, + } + } + [@sic.system_cache_file, @sic.user_cache_file].each do |fn| + FileUtils.mkdir_p File.dirname(fn) + open(fn, "wb") { |f| f.write Marshal.dump(data) } + end + + @sic.instance_eval { @cache_data = nil } + + expected = { + @gem_repo => + Gem::SourceInfoCacheEntry.new(Gem::SourceIndex.new, 0) + } + assert_equal expected, @sic.cache_data + end + + def test_cache_data_user_fallback + FileUtils.chmod 0444, @sic.system_cache_file + assert_equal [['key','usr']], @sic.cache_data.to_a.sort + end + + def test_cache_file + assert_equal @gemcache, @sic.cache_file + end + + def test_cache_file_user_fallback + FileUtils.chmod 0444, @sic.system_cache_file + assert_equal @usrcache, @sic.cache_file + end + + def test_cache_file_none_writable + FileUtils.chmod 0444, @sic.system_cache_file + FileUtils.chmod 0444, @sic.user_cache_file + e = assert_raise RuntimeError do + @sic.cache_file + end + assert_equal 'unable to locate a writable cache file', e.message + end + + def test_flush + @sic.cache_data['key'] = 'new' + @sic.update + @sic.flush + + assert_equal [['key','new']], read_cache(@sic.system_cache_file).to_a.sort + end + + def test_read_system_cache + assert_equal [['key','sys']], @sic.cache_data.to_a.sort + end + + def test_read_user_cache + FileUtils.chmod 0444, @sic.system_cache_file + + assert_equal [['key','usr']], @sic.cache_data.to_a.sort + end + + def test_search + si = Gem::SourceIndex.new @gem1.full_name => @gem1 + cache_data = { + @gem_repo => Gem::SourceInfoCacheEntry.new(si, nil) + } + @sic.instance_variable_set :@cache_data, cache_data + + assert_equal [@gem1], @sic.search(//) + end + + def test_search_dependency + si = Gem::SourceIndex.new @gem1.full_name => @gem1 + cache_data = { + @gem_repo => Gem::SourceInfoCacheEntry.new(si, nil) + } + @sic.instance_variable_set :@cache_data, cache_data + + dep = Gem::Dependency.new @gem1.name, @gem1.version + + assert_equal [@gem1], @sic.search(dep) + end + + def test_search_no_matches + si = Gem::SourceIndex.new @gem1.full_name => @gem1 + cache_data = { + @gem_repo => Gem::SourceInfoCacheEntry.new(si, nil) + } + @sic.instance_variable_set :@cache_data, cache_data + + assert_equal [], @sic.search(/nonexistent/) + end + + def test_search_no_matches_in_source + si = Gem::SourceIndex.new @gem1.full_name => @gem1 + cache_data = { + @gem_repo => Gem::SourceInfoCacheEntry.new(si, nil) + } + @sic.instance_variable_set :@cache_data, cache_data + Gem.sources.replace %w[more-gems.example.com] + + assert_equal [], @sic.search(/nonexistent/) + end + + def test_search_with_source + si = Gem::SourceIndex.new @gem1.full_name => @gem1 + cache_data = { + @gem_repo => Gem::SourceInfoCacheEntry.new(si, nil) + } + @sic.instance_variable_set :@cache_data, cache_data + + assert_equal [[@gem1, @gem_repo]], + @sic.search_with_source(//) + end + + def test_system_cache_file + assert_equal File.join(Gem.dir, "source_cache"), @sic.system_cache_file + end + + def test_user_cache_file + assert_equal @usrcache, @sic.user_cache_file + end + + def test_write_cache + @sic.cache_data['key'] = 'new' + @sic.write_cache + + assert_equal [['key', 'new']], + read_cache(@sic.system_cache_file).to_a.sort + assert_equal [['key', 'usr']], + read_cache(@sic.user_cache_file).to_a.sort + end + + def test_write_cache_user + FileUtils.chmod 0444, @sic.system_cache_file + @sic.set_cache_data({'key' => 'new'}) + @sic.update + @sic.write_cache + + assert_equal [['key', 'sys']], read_cache(@sic.system_cache_file).to_a.sort + assert_equal [['key', 'new']], read_cache(@sic.user_cache_file).to_a.sort + end + + def test_write_cache_user_from_scratch + FileUtils.rm_rf @sic.user_cache_file + FileUtils.chmod 0444, @sic.system_cache_file + @sic.set_cache_data({'key' => 'new'}) + @sic.update + @sic.write_cache + + assert_equal [['key', 'sys']], read_cache(@sic.system_cache_file).to_a.sort + assert_equal [['key', 'new']], read_cache(@sic.user_cache_file).to_a.sort + end + + def test_write_cache_user_no_directory + FileUtils.rm_rf File.dirname(@sic.user_cache_file) + FileUtils.chmod 0444, @sic.system_cache_file + @sic.set_cache_data({'key' => 'new'}) + @sic.update + @sic.write_cache + + assert_equal [['key','sys']], read_cache(@sic.system_cache_file).to_a.sort + assert_equal [['key','new']], read_cache(@sic.user_cache_file).to_a.sort + end + +end + |