diff options
| -rw-r--r-- | Library/Homebrew/test/migrator_spec.rb | 264 | ||||
| -rw-r--r-- | Library/Homebrew/test/migrator_test.rb | 251 | 
2 files changed, 264 insertions, 251 deletions
| diff --git a/Library/Homebrew/test/migrator_spec.rb b/Library/Homebrew/test/migrator_spec.rb new file mode 100644 index 000000000..90ee9d8ff --- /dev/null +++ b/Library/Homebrew/test/migrator_spec.rb @@ -0,0 +1,264 @@ +require "migrator" +require "test/support/fixtures/testball" +require "tab" +require "keg" + +describe Migrator do +  subject { described_class.new(new_formula) } + +  let(:new_formula) { Testball.new("newname") } +  let(:old_formula) { Testball.new("oldname") } + +  let(:new_keg_record) { HOMEBREW_CELLAR/"newname/0.1" } +  let(:old_keg_record) { HOMEBREW_CELLAR/"oldname/0.1" } + +  let(:old_tab) { Tab.empty } + +  let(:keg) { Keg.new(old_keg_record) } +  let(:old_pin) { HOMEBREW_PINNED_KEGS/"oldname" } + +  before(:each) do |example| +    allow(new_formula).to receive(:oldname).and_return("oldname") + +    # do not create directories for error tests +    next if example.metadata[:description].start_with?("raises an error") + +    (old_keg_record/"bin").mkpath + +    %w[inside bindir].each do |file| +      FileUtils.touch old_keg_record/"bin/#{file}" +    end + +    old_tab.tabfile = HOMEBREW_CELLAR/"oldname/0.1/INSTALL_RECEIPT.json" +    old_tab.source["path"] = "/oldname" +    old_tab.write + +    keg.link +    keg.optlink + +    old_pin.make_relative_symlink old_keg_record + +    subject # needs to be evaluated eagerly + +    (HOMEBREW_PREFIX/"bin").mkpath +  end + +  after(:each) do +    if !old_keg_record.parent.symlink? && old_keg_record.directory? +      keg.unlink +    end + +    if new_keg_record.directory? +      new_keg = Keg.new(new_keg_record) +      new_keg.unlink +    end +  end + +  describe "::new" do +    it "raises an error if there is no old name" do +      expect { +        described_class.new(old_formula) +      }.to raise_error(Migrator::MigratorNoOldnameError) +    end + +    it "raises an error if there is no old path" do +      expect { +        described_class.new(new_formula) +      }.to raise_error(Migrator::MigratorNoOldpathError) +    end + +    it "raises an error if the Taps differ" do +      keg = HOMEBREW_CELLAR/"oldname/0.1" +      keg.mkpath +      tab = Tab.empty +      tab.tabfile = HOMEBREW_CELLAR/"oldname/0.1/INSTALL_RECEIPT.json" +      tab.source["tap"] = "homebrew/core" +      tab.write + +      expect { +        described_class.new(new_formula) +      }.to raise_error(Migrator::MigratorDifferentTapsError) +    end +  end + +  specify "#move_to_new_directory" do +    keg.unlink +    shutup do +      subject.move_to_new_directory +    end + +    expect(new_keg_record).to be_a_directory +    expect(new_keg_record/"bin").to be_a_directory +    expect(new_keg_record/"bin/inside").to be_a_file +    expect(new_keg_record/"bin/bindir").to be_a_file +    expect(old_keg_record).not_to be_a_directory +  end + +  specify "#backup_oldname_cellar" do +    old_keg_record.parent.rmtree +    (new_keg_record/"bin").mkpath + +    subject.backup_oldname_cellar + +    expect(old_keg_record/"bin").to be_a_directory +    expect(old_keg_record/"bin").to be_a_directory +  end + +  specify "#repin" do +    (new_keg_record/"bin").mkpath +    expected_relative = new_keg_record.relative_path_from HOMEBREW_PINNED_KEGS + +    subject.repin + +    expect(subject.new_pin_record).to be_a_symlink +    expect(subject.new_pin_record.readlink).to eq(expected_relative) +    expect(subject.old_pin_record).not_to exist +  end + +  specify "#unlink_oldname" do +    expect(HOMEBREW_LINKED_KEGS.children.count).to eq(1) +    expect((HOMEBREW_PREFIX/"opt").children.count).to eq(1) + +    shutup do +      subject.unlink_oldname +    end + +    expect(HOMEBREW_LINKED_KEGS).not_to exist +    expect(HOMEBREW_LIBRARY/"bin").not_to exist +  end + +  specify "#link_newname" do +    keg.unlink +    keg.uninstall + +    (new_keg_record/"bin").mkpath +    %w[inside bindir].each do |file| +      FileUtils.touch new_keg_record/"bin"/file +    end + +    shutup do +      subject.link_newname +    end + +    expect(HOMEBREW_LINKED_KEGS.children.count).to eq(1) +    expect((HOMEBREW_PREFIX/"opt").children.count).to eq(1) +  end + +  specify "#link_oldname_opt" do +    new_keg_record.mkpath +    subject.link_oldname_opt +    expect((HOMEBREW_PREFIX/"opt/oldname").realpath).to eq(new_keg_record.realpath) +  end + +  specify "#link_oldname_cellar" do +    (new_keg_record/"bin").mkpath +    keg.unlink +    keg.uninstall +    subject.link_oldname_cellar +    expect((HOMEBREW_CELLAR/"oldname").realpath).to eq(new_keg_record.parent.realpath) +  end + +  specify "#update_tabs" do +    (new_keg_record/"bin").mkpath +    tab = Tab.empty +    tab.tabfile = HOMEBREW_CELLAR/"newname/0.1/INSTALL_RECEIPT.json" +    tab.source["path"] = "/path/that/must/be/changed/by/update_tabs" +    tab.write +    subject.update_tabs +    expect(Tab.for_keg(new_keg_record).source["path"]).to eq(new_formula.path.to_s) +  end + +  specify "#migrate" do +    tab = Tab.empty +    tab.tabfile = HOMEBREW_CELLAR/"oldname/0.1/INSTALL_RECEIPT.json" +    tab.source["path"] = old_formula.path.to_s +    tab.write + +    shutup do +      subject.migrate +    end + +    expect(new_keg_record).to exist +    expect(old_keg_record.parent).to be_a_symlink +    expect(HOMEBREW_LINKED_KEGS/"oldname").not_to exist +    expect((HOMEBREW_LINKED_KEGS/"newname").realpath).to eq(new_keg_record.realpath) +    expect(old_keg_record.realpath).to eq(new_keg_record.realpath) +    expect((HOMEBREW_PREFIX/"opt/oldname").realpath).to eq(new_keg_record.realpath) +    expect((HOMEBREW_CELLAR/"oldname").realpath).to eq(new_keg_record.parent.realpath) +    expect((HOMEBREW_PINNED_KEGS/"newname").realpath).to eq(new_keg_record.realpath) +    expect(Tab.for_keg(new_keg_record).source["path"]).to eq(new_formula.path.to_s) +  end + +  specify "#unlinik_oldname_opt" do +    new_keg_record.mkpath +    old_opt_record = HOMEBREW_PREFIX/"opt/oldname" +    old_opt_record.unlink if old_opt_record.symlink? +    old_opt_record.make_relative_symlink(new_keg_record) +    subject.unlink_oldname_opt +    expect(old_opt_record).not_to be_a_symlink +  end + +  specify "#unlink_oldname_cellar" do +    new_keg_record.mkpath +    keg.unlink +    keg.uninstall +    old_keg_record.parent.make_relative_symlink(new_keg_record.parent) +    subject.unlink_oldname_cellar +    expect(old_keg_record.parent).not_to be_a_symlink +  end + +  specify "#backup_oldname_cellar" do +    (new_keg_record/"bin").mkpath +    keg.unlink +    keg.uninstall +    subject.backup_oldname_cellar +    expect(old_keg_record.subdirs).not_to be_empty +  end + +  specify "#backup_old_tabs" do +    tab = Tab.empty +    tab.tabfile = HOMEBREW_CELLAR/"oldname/0.1/INSTALL_RECEIPT.json" +    tab.source["path"] = "/should/be/the/same" +    tab.write +    migrator = Migrator.new(new_formula) +    tab.tabfile.delete +    migrator.backup_old_tabs +    expect(Tab.for_keg(old_keg_record).source["path"]).to eq("/should/be/the/same") +  end + +  describe "#backup_oldname" do +    after(:each) do +      expect(old_keg_record.parent).to be_a_directory +      expect(old_keg_record.parent.subdirs).not_to be_empty +      expect(HOMEBREW_LINKED_KEGS/"oldname").to exist +      expect(HOMEBREW_PREFIX/"opt/oldname").to exist +      expect(HOMEBREW_PINNED_KEGS/"oldname").to be_a_symlink +      expect(keg).to be_linked +    end + +    context "when cellar exists" do +      it "backs up the old name" do +        subject.backup_oldname +      end +    end + +    context "when cellar is removed" do +      it "backs up the old name" do +        (new_keg_record/"bin").mkpath +        keg.unlink +        keg.uninstall +        subject.backup_oldname +      end +    end + +    context "when cellar is linked" do +      it "backs up the old name" do +        (new_keg_record/"bin").mkpath +        keg.unlink +        keg.uninstall +        old_keg_record.parent.make_relative_symlink(new_keg_record.parent) +        subject.backup_oldname +      end +    end +  end +end diff --git a/Library/Homebrew/test/migrator_test.rb b/Library/Homebrew/test/migrator_test.rb deleted file mode 100644 index 012ea12bb..000000000 --- a/Library/Homebrew/test/migrator_test.rb +++ /dev/null @@ -1,251 +0,0 @@ -require "testing_env" -require "migrator" -require "test/support/fixtures/testball" -require "tab" -require "keg" - -class Formula -  attr_writer :oldname -end - -class MigratorErrorsTests < Homebrew::TestCase -  def setup -    super -    @new_f = Testball.new("newname") -    @new_f.oldname = "oldname" -    @old_f = Testball.new("oldname") -  end - -  def test_no_oldname -    assert_raises(Migrator::MigratorNoOldnameError) { Migrator.new(@old_f) } -  end - -  def test_no_oldpath -    assert_raises(Migrator::MigratorNoOldpathError) { Migrator.new(@new_f) } -  end - -  def test_different_taps -    keg = HOMEBREW_CELLAR/"oldname/0.1" -    keg.mkpath -    tab = Tab.empty -    tab.tabfile = HOMEBREW_CELLAR/"oldname/0.1/INSTALL_RECEIPT.json" -    tab.source["tap"] = "homebrew/core" -    tab.write -    assert_raises(Migrator::MigratorDifferentTapsError) { Migrator.new(@new_f) } -  end -end - -class MigratorTests < Homebrew::TestCase -  include FileUtils - -  def setup -    super - -    @new_f = Testball.new("newname") -    @new_f.oldname = "oldname" - -    @old_f = Testball.new("oldname") - -    @old_keg_record = HOMEBREW_CELLAR/"oldname/0.1" -    @old_keg_record.join("bin").mkpath -    @new_keg_record = HOMEBREW_CELLAR/"newname/0.1" - -    %w[inside bindir].each { |file| touch @old_keg_record.join("bin", file) } - -    @old_tab = Tab.empty -    @old_tab.tabfile = HOMEBREW_CELLAR/"oldname/0.1/INSTALL_RECEIPT.json" -    @old_tab.source["path"] = "/oldname" -    @old_tab.write - -    @keg = Keg.new(@old_keg_record) -    @keg.link -    @keg.optlink - -    @old_pin = HOMEBREW_PINNED_KEGS/"oldname" -    @old_pin.make_relative_symlink @old_keg_record - -    @migrator = Migrator.new(@new_f) - -    mkpath HOMEBREW_PREFIX/"bin" -  end - -  def teardown -    if !@old_keg_record.parent.symlink? && @old_keg_record.directory? -      @keg.unlink -    end - -    if @new_keg_record.directory? -      new_keg = Keg.new(@new_keg_record) -      new_keg.unlink -    end - -    super -  end - -  def test_move_cellar -    @keg.unlink -    shutup { @migrator.move_to_new_directory } -    assert_predicate @new_keg_record, :directory? -    assert_predicate @new_keg_record/"bin", :directory? -    assert_predicate @new_keg_record/"bin/inside", :file? -    assert_predicate @new_keg_record/"bin/bindir", :file? -    refute_predicate @old_keg_record, :directory? -  end - -  def test_backup_cellar -    @old_keg_record.parent.rmtree -    @new_keg_record.join("bin").mkpath - -    @migrator.backup_oldname_cellar - -    assert_predicate @old_keg_record, :directory? -    assert_predicate @old_keg_record/"bin", :directory? -  end - -  def test_repin -    @new_keg_record.join("bin").mkpath -    expected_relative = @new_keg_record.relative_path_from HOMEBREW_PINNED_KEGS - -    @migrator.repin - -    assert_predicate @migrator.new_pin_record, :symlink? -    assert_equal expected_relative, @migrator.new_pin_record.readlink -    refute_predicate @migrator.old_pin_record, :exist? -  end - -  def test_unlink_oldname -    assert_equal 1, HOMEBREW_LINKED_KEGS.children.size -    assert_equal 1, (HOMEBREW_PREFIX/"opt").children.size - -    shutup { @migrator.unlink_oldname } - -    refute_predicate HOMEBREW_LINKED_KEGS, :exist? -    refute_predicate HOMEBREW_LIBRARY/"bin", :exist? -  end - -  def test_link_newname -    @keg.unlink -    @keg.uninstall -    @new_keg_record.join("bin").mkpath -    %w[inside bindir].each { |file| touch @new_keg_record.join("bin", file) } - -    shutup { @migrator.link_newname } - -    assert_equal 1, HOMEBREW_LINKED_KEGS.children.size -    assert_equal 1, (HOMEBREW_PREFIX/"opt").children.size -  end - -  def test_link_oldname_opt -    @new_keg_record.mkpath -    @migrator.link_oldname_opt -    assert_equal @new_keg_record.realpath, (HOMEBREW_PREFIX/"opt/oldname").realpath -  end - -  def test_link_oldname_cellar -    @new_keg_record.join("bin").mkpath -    @keg.unlink -    @keg.uninstall -    @migrator.link_oldname_cellar -    assert_equal @new_keg_record.parent.realpath, (HOMEBREW_CELLAR/"oldname").realpath -  end - -  def test_update_tabs -    @new_keg_record.join("bin").mkpath -    tab = Tab.empty -    tab.tabfile = HOMEBREW_CELLAR/"newname/0.1/INSTALL_RECEIPT.json" -    tab.source["path"] = "/path/that/must/be/changed/by/update_tabs" -    tab.write -    @migrator.update_tabs -    assert_equal @new_f.path.to_s, Tab.for_keg(@new_keg_record).source["path"] -  end - -  def test_migrate -    tab = Tab.empty -    tab.tabfile = HOMEBREW_CELLAR/"oldname/0.1/INSTALL_RECEIPT.json" -    tab.source["path"] = @old_f.path.to_s -    tab.write - -    shutup { @migrator.migrate } - -    assert_predicate @new_keg_record, :exist? -    assert_predicate @old_keg_record.parent, :symlink? -    refute_predicate HOMEBREW_LINKED_KEGS/"oldname", :exist? -    assert_equal @new_keg_record.realpath, (HOMEBREW_LINKED_KEGS/"newname").realpath -    assert_equal @new_keg_record.realpath, @old_keg_record.realpath -    assert_equal @new_keg_record.realpath, (HOMEBREW_PREFIX/"opt/oldname").realpath -    assert_equal @new_keg_record.parent.realpath, (HOMEBREW_CELLAR/"oldname").realpath -    assert_equal @new_keg_record.realpath, (HOMEBREW_PINNED_KEGS/"newname").realpath -    assert_equal @new_f.path.to_s, Tab.for_keg(@new_keg_record).source["path"] -  end - -  def test_unlinik_oldname_opt -    @new_keg_record.mkpath -    old_opt_record = HOMEBREW_PREFIX/"opt/oldname" -    old_opt_record.unlink if old_opt_record.symlink? -    old_opt_record.make_relative_symlink(@new_keg_record) -    @migrator.unlink_oldname_opt -    refute_predicate old_opt_record, :symlink? -  end - -  def test_unlink_oldname_cellar -    @new_keg_record.mkpath -    @keg.unlink -    @keg.uninstall -    @old_keg_record.parent.make_relative_symlink(@new_keg_record.parent) -    @migrator.unlink_oldname_cellar -    refute_predicate @old_keg_record.parent, :symlink? -  end - -  def test_backup_oldname_cellar -    @new_keg_record.join("bin").mkpath -    @keg.unlink -    @keg.uninstall -    @migrator.backup_oldname_cellar -    refute_predicate @old_keg_record.subdirs, :empty? -  end - -  def test_backup_old_tabs -    tab = Tab.empty -    tab.tabfile = HOMEBREW_CELLAR/"oldname/0.1/INSTALL_RECEIPT.json" -    tab.source["path"] = "/should/be/the/same" -    tab.write -    migrator = Migrator.new(@new_f) -    tab.tabfile.delete -    migrator.backup_old_tabs -    assert_equal "/should/be/the/same", Tab.for_keg(@old_keg_record).source["path"] -  end - -  # Backup tests are divided into three groups: when oldname Cellar is deleted -  # and when it still exists and when it's a symlink - -  def check_after_backup -    assert_predicate @old_keg_record.parent, :directory? -    refute_predicate @old_keg_record.parent.subdirs, :empty? -    assert_predicate HOMEBREW_LINKED_KEGS/"oldname", :exist? -    assert_predicate HOMEBREW_PREFIX/"opt/oldname", :exist? -    assert_predicate HOMEBREW_PINNED_KEGS/"oldname", :symlink? -    assert_predicate @keg, :linked? -  end - -  def test_backup_cellar_exist -    @migrator.backup_oldname -    check_after_backup -  end - -  def test_backup_cellar_removed -    @new_keg_record.join("bin").mkpath -    @keg.unlink -    @keg.uninstall -    @migrator.backup_oldname -    check_after_backup -  end - -  def test_backup_cellar_linked -    @new_keg_record.join("bin").mkpath -    @keg.unlink -    @keg.uninstall -    @old_keg_record.parent.make_relative_symlink(@new_keg_record.parent) -    @migrator.backup_oldname -    check_after_backup -  end -end | 
