require 'rubygems/test_case' require 'rubygems/indexer' unless defined?(Builder::XChar) then warn "Gem::Indexer tests are being skipped. Install builder gem." if $VERBOSE end class TestGemIndexer < Gem::TestCase def setup super util_clear_gems util_make_gems @d2_0 = quick_spec 'd', '2.0' do |s| s.date = Gem::Specification::TODAY - 86400 * 3 end util_build_gem @d2_0 @d2_0_a = quick_spec 'd', '2.0.a' util_build_gem @d2_0_a @d2_0_b = quick_spec 'd', '2.0.b' util_build_gem @d2_0_b @tempdir = File.join(@tempdir, 'indexer') gems = File.join(@tempdir, 'gems') FileUtils.mkdir_p gems FileUtils.mv Dir[File.join(@gemhome, "cache", '*.gem')], gems @indexer = Gem::Indexer.new(@tempdir, :rss_title => 'ExampleForge gems', :rss_host => 'example.com', :rss_gems_host => 'gems.example.com') end def test_initialize assert_equal @tempdir, @indexer.dest_directory assert_equal File.join(Dir.tmpdir, "gem_generate_index_#{$$}"), @indexer.directory indexer = Gem::Indexer.new @tempdir assert indexer.build_legacy assert indexer.build_modern indexer = Gem::Indexer.new @tempdir, :build_legacy => false, :build_modern => true refute indexer.build_legacy assert indexer.build_modern indexer = Gem::Indexer.new @tempdir, :build_legacy => true, :build_modern => false assert indexer.build_legacy refute indexer.build_modern end def test_build_indicies @indexer.make_temp_directories use_ui @ui do @indexer.build_indicies end specs_path = File.join @indexer.directory, "specs.#{@marshal_version}" specs_dump = Gem.read_binary specs_path specs = Marshal.load specs_dump expected = [["a", Gem::Version.new("1"), "ruby"], ["a", Gem::Version.new("2"), "ruby"], ["a_evil", Gem::Version.new("9"), "ruby"], ["b", Gem::Version.new("2"), "ruby"], ["c", Gem::Version.new("1.2"), "ruby"], ["d", Gem::Version.new("2.0"), "ruby"], ["pl", Gem::Version.new("1"), "i386-linux"]] assert_equal expected, specs latest_specs_path = File.join(@indexer.directory, "latest_specs.#{@marshal_version}") latest_specs_dump = Gem.read_binary latest_specs_path latest_specs = Marshal.load latest_specs_dump expected = [["a", Gem::Version.new("2"), "ruby"], ["a_evil", Gem::Version.new("9"), "ruby"], ["b", Gem::Version.new("2"), "ruby"], ["c", Gem::Version.new("1.2"), "ruby"], ["d", Gem::Version.new("2.0"), "ruby"], ["pl", Gem::Version.new("1"), "i386-linux"]] assert_equal expected, latest_specs, 'latest_specs' end def test_generate_index use_ui @ui do @indexer.generate_index end assert_indexed @tempdir, "Marshal.#{@marshal_version}" assert_indexed @tempdir, "Marshal.#{@marshal_version}.Z" quickdir = File.join @tempdir, 'quick' marshal_quickdir = File.join quickdir, "Marshal.#{@marshal_version}" assert File.directory?(quickdir) assert File.directory?(marshal_quickdir) assert_indexed marshal_quickdir, "#{File.basename(@a1.spec_file)}.rz" assert_indexed marshal_quickdir, "#{File.basename(@a2.spec_file)}.rz" refute_indexed marshal_quickdir, File.basename(@c1_2.spec_file) assert_indexed @tempdir, "specs.#{@marshal_version}" assert_indexed @tempdir, "specs.#{@marshal_version}.gz" assert_indexed @tempdir, "latest_specs.#{@marshal_version}" assert_indexed @tempdir, "latest_specs.#{@marshal_version}.gz" expected = <<-EOF ExampleForge gems http://example.com Recently released gems from http://example.com RubyGems v#{Gem::VERSION} http://cyber.law.harvard.edu/rss/rss.html a-2 <pre>This is a test description</pre> example@example.com (A User) a-2 #{@a2.date.rfc2822} http://example.com a-3.a <pre>This is a test description</pre> example@example.com (A User) a-3.a #{@a3a.date.rfc2822} http://example.com a_evil-9 <pre>This is a test description</pre> example@example.com (A User) a_evil-9 #{@a_evil9.date.rfc2822} http://example.com b-2 <pre>This is a test description</pre> example@example.com (A User) b-2 #{@b2.date.rfc2822} http://example.com c-1.2 <pre>This is a test description</pre> example@example.com (A User) c-1.2 #{@c1_2.date.rfc2822} http://example.com d-2.0.a <pre>This is a test description</pre> example@example.com (A User) d-2.0.a #{@d2_0_a.date.rfc2822} http://example.com d-2.0.b <pre>This is a test description</pre> example@example.com (A User) d-2.0.b #{@d2_0_b.date.rfc2822} http://example.com pl-1-x86-linux <pre>This is a test description</pre> example@example.com (A User) pl-1-x86-linux #{@pl1.date.rfc2822} http://example.com a-1 <pre>This line is really, really long. So long, in fact, that it is more than eighty characters long! The purpose of this line is for testing wrapping behavior because sometimes people don't wrap their text to eighty characters. Without the wrapping, the text might not look good in the RSS feed. Also, a list: * An entry that's actually kind of sort * an entry that's really long, which will probably get wrapped funny. That's ok, somebody wasn't thinking straight when they made it more than eighty characters.</pre> example@example.com (Example), example2@example.com (Example2) a-1 #{@a1.date.rfc2822} http://a.example.com EOF gems_rss = File.read File.join(@tempdir, 'index.rss') assert_equal expected, gems_rss end def test_generate_index_legacy @indexer.build_modern = false @indexer.build_legacy = true use_ui @ui do @indexer.generate_index end assert_indexed @tempdir, "Marshal.#{@marshal_version}" assert_indexed @tempdir, "Marshal.#{@marshal_version}.Z" quickdir = File.join @tempdir, 'quick' marshal_quickdir = File.join quickdir, "Marshal.#{@marshal_version}" assert File.directory?(quickdir) assert File.directory?(marshal_quickdir) assert_indexed marshal_quickdir, "#{File.basename(@a1.spec_file)}.rz" assert_indexed marshal_quickdir, "#{File.basename(@a2.spec_file)}.rz" refute_indexed marshal_quickdir, "#{File.basename(@c1_2.spec_file)}" refute_indexed @tempdir, "specs.#{@marshal_version}" refute_indexed @tempdir, "specs.#{@marshal_version}.gz" refute_indexed @tempdir, "latest_specs.#{@marshal_version}" refute_indexed @tempdir, "latest_specs.#{@marshal_version}.gz" end def test_generate_index_legacy_back_to_back @indexer.build_modern = true @indexer.build_legacy = true use_ui @ui do @indexer.generate_index end @indexer = Gem::Indexer.new @tempdir @indexer.build_modern = false @indexer.build_legacy = true use_ui @ui do @indexer.generate_index end assert_indexed @tempdir, "Marshal.#{@marshal_version}" assert_indexed @tempdir, "Marshal.#{@marshal_version}.Z" quickdir = File.join @tempdir, 'quick' marshal_quickdir = File.join quickdir, "Marshal.#{@marshal_version}" assert File.directory?(marshal_quickdir) assert_indexed marshal_quickdir, "#{File.basename(@a1.spec_file)}.rz" assert_indexed marshal_quickdir, "#{File.basename(@a2.spec_file)}.rz" assert_indexed @tempdir, "specs.#{@marshal_version}" assert_indexed @tempdir, "specs.#{@marshal_version}.gz" assert_indexed @tempdir, "latest_specs.#{@marshal_version}" assert_indexed @tempdir, "latest_specs.#{@marshal_version}.gz" end def test_generate_index_modern @indexer.build_modern = true @indexer.build_legacy = false use_ui @ui do @indexer.generate_index end refute_indexed @tempdir, 'yaml' refute_indexed @tempdir, 'yaml.Z' refute_indexed @tempdir, "Marshal.#{@marshal_version}" refute_indexed @tempdir, "Marshal.#{@marshal_version}.Z" quickdir = File.join @tempdir, 'quick' marshal_quickdir = File.join quickdir, "Marshal.#{@marshal_version}" assert File.directory?(quickdir), 'quickdir should be directory' assert File.directory?(marshal_quickdir) refute_indexed quickdir, "index" refute_indexed quickdir, "index.rz" refute_indexed quickdir, "latest_index" refute_indexed quickdir, "latest_index.rz" refute_indexed quickdir, "#{File.basename(@a1.spec_file)}.rz" refute_indexed quickdir, "#{File.basename(@a2.spec_file)}.rz" refute_indexed quickdir, "#{File.basename(@b2.spec_file)}.rz" refute_indexed quickdir, "#{File.basename(@c1_2.spec_file)}.rz" refute_indexed quickdir, "#{@pl1.original_name}.gemspec.rz" refute_indexed quickdir, "#{File.basename(@pl1.spec_file)}.rz" assert_indexed marshal_quickdir, "#{File.basename(@a1.spec_file)}.rz" assert_indexed marshal_quickdir, "#{File.basename(@a2.spec_file)}.rz" refute_indexed quickdir, "#{File.basename(@c1_2.spec_file)}" refute_indexed marshal_quickdir, "#{File.basename(@c1_2.spec_file)}" assert_indexed @tempdir, "specs.#{@marshal_version}" assert_indexed @tempdir, "specs.#{@marshal_version}.gz" assert_indexed @tempdir, "latest_specs.#{@marshal_version}" assert_indexed @tempdir, "latest_specs.#{@marshal_version}.gz" end def test_generate_index_modern_back_to_back @indexer.build_modern = true @indexer.build_legacy = true use_ui @ui do @indexer.generate_index end @indexer = Gem::Indexer.new @tempdir @indexer.build_modern = true @indexer.build_legacy = false use_ui @ui do @indexer.generate_index end assert_indexed @tempdir, "Marshal.#{@marshal_version}" assert_indexed @tempdir, "Marshal.#{@marshal_version}.Z" quickdir = File.join @tempdir, 'quick' marshal_quickdir = File.join quickdir, "Marshal.#{@marshal_version}" assert File.directory?(quickdir) assert File.directory?(marshal_quickdir) assert_indexed marshal_quickdir, "#{File.basename(@a1.spec_file)}.rz" assert_indexed marshal_quickdir, "#{File.basename(@a2.spec_file)}.rz" assert_indexed @tempdir, "specs.#{@marshal_version}" assert_indexed @tempdir, "specs.#{@marshal_version}.gz" assert_indexed @tempdir, "latest_specs.#{@marshal_version}" assert_indexed @tempdir, "latest_specs.#{@marshal_version}.gz" end def test_generate_index_ui use_ui @ui do @indexer.generate_index end assert_match %r%^\.\.\.\.\.\.\.\.\.\.$%, @ui.output assert_match %r%^Generating Marshal quick index gemspecs for 10 gems$%, @ui.output assert_match %r%^Complete$%, @ui.output assert_match %r%^Generating specs index$%, @ui.output assert_match %r%^Generating latest specs index$%, @ui.output assert_match %r%^Generating prerelease specs index$%, @ui.output assert_match %r%^Generating Marshal master index$%, @ui.output assert_match %r%^Complete$%, @ui.output assert_match %r%^Compressing indicies$%, @ui.output assert_equal '', @ui.error end def test_generate_index_specs use_ui @ui do @indexer.generate_index end specs_path = File.join @tempdir, "specs.#{@marshal_version}" specs_dump = Gem.read_binary specs_path specs = Marshal.load specs_dump expected = [ ['a', Gem::Version.new(1), 'ruby'], ['a', Gem::Version.new(2), 'ruby'], ['a_evil', Gem::Version.new(9), 'ruby'], ['b', Gem::Version.new(2), 'ruby'], ['c', Gem::Version.new('1.2'), 'ruby'], ['d', Gem::Version.new('2.0'), 'ruby'], ['pl', Gem::Version.new(1), 'i386-linux'], ] assert_equal expected, specs assert_same specs[0].first, specs[1].first, 'identical names not identical' assert_same specs[0][1], specs[-1][1], 'identical versions not identical' assert_same specs[0].last, specs[1].last, 'identical platforms not identical' refute_same specs[1][1], specs[5][1], 'different versions not different' end def test_generate_index_latest_specs use_ui @ui do @indexer.generate_index end latest_specs_path = File.join @tempdir, "latest_specs.#{@marshal_version}" latest_specs_dump = Gem.read_binary latest_specs_path latest_specs = Marshal.load latest_specs_dump expected = [ ['a', Gem::Version.new(2), 'ruby'], ['a_evil', Gem::Version.new(9), 'ruby'], ['b', Gem::Version.new(2), 'ruby'], ['c', Gem::Version.new('1.2'), 'ruby'], ['d', Gem::Version.new('2.0'), 'ruby'], ['pl', Gem::Version.new(1), 'i386-linux'], ] assert_equal expected, latest_specs assert_same latest_specs[0][1], latest_specs[2][1], 'identical versions not identical' assert_same latest_specs[0].last, latest_specs[1].last, 'identical platforms not identical' end def test_generate_index_prerelease_specs use_ui @ui do @indexer.generate_index end prerelease_specs_path = File.join @tempdir, "prerelease_specs.#{@marshal_version}" prerelease_specs_dump = Gem.read_binary prerelease_specs_path prerelease_specs = Marshal.load prerelease_specs_dump assert_equal [['a', Gem::Version.new('3.a'), 'ruby'], ['d', Gem::Version.new('2.0.a'), 'ruby'], ['d', Gem::Version.new('2.0.b'), 'ruby']], prerelease_specs end def test_update_index use_ui @ui do @indexer.generate_index end quickdir = File.join @tempdir, 'quick' marshal_quickdir = File.join quickdir, "Marshal.#{@marshal_version}" assert File.directory?(quickdir) assert File.directory?(marshal_quickdir) @d2_1 = quick_spec 'd', '2.1' util_build_gem @d2_1 @d2_1_tuple = [@d2_1.name, @d2_1.version, @d2_1.original_platform] @d2_1_a = quick_spec 'd', '2.2.a' util_build_gem @d2_1_a @d2_1_a_tuple = [@d2_1_a.name, @d2_1_a.version, @d2_1_a.original_platform] gems = File.join @tempdir, 'gems' FileUtils.mv @d2_1.cache_file, gems FileUtils.mv @d2_1_a.cache_file, gems use_ui @ui do @indexer.update_index end assert_indexed marshal_quickdir, "#{File.basename(@d2_1.spec_file)}.rz" specs_index = Marshal.load Gem.read_binary(@indexer.dest_specs_index) assert_includes specs_index, @d2_1_tuple refute_includes specs_index, @d2_1_a_tuple latest_specs_index = Marshal.load \ Gem.read_binary(@indexer.dest_latest_specs_index) assert_includes latest_specs_index, @d2_1_tuple assert_includes latest_specs_index, [@d2_0.name, @d2_0.version, @d2_0.original_platform] refute_includes latest_specs_index, @d2_1_a_tuple pre_specs_index = Marshal.load \ Gem.read_binary(@indexer.dest_prerelease_specs_index) assert_includes pre_specs_index, @d2_1_a_tuple refute_includes pre_specs_index, @d2_1_tuple end def assert_indexed(dir, name) file = File.join dir, name assert File.exist?(file), "#{file} does not exist" end def refute_indexed(dir, name) file = File.join dir, name refute File.exist?(file), "#{file} exists" end end if defined?(Builder::XChar)