aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/test/test_keg.rb
blob: 828ad1e43cb1de51b580e36afb85bdc5ffa985a2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
require 'testing_env'
require 'keg'
require 'stringio'

class LinkTests < Test::Unit::TestCase
  include FileUtils

  def setup
    @keg = HOMEBREW_CELLAR/"foo/1.0"
    @keg.mkpath
    (@keg/"bin").mkpath

    %w{hiworld helloworld goodbye_cruel_world}.each do |file|
      touch @keg/"bin/#{file}"
    end

    @keg = Keg.new(@keg)

    @mode = OpenStruct.new

    @old_stdout = $stdout
    $stdout = StringIO.new

    mkpath HOMEBREW_PREFIX/"bin"
    mkpath HOMEBREW_PREFIX/"lib"
  end

  def test_linking_keg
    assert_equal 3, @keg.link
    (HOMEBREW_PREFIX/"bin").children.each { |c| assert c.readlink.relative? }
  end

  def test_unlinking_keg
    @keg.link
    assert_equal 4, @keg.unlink
  end

  def test_link_dry_run
    @mode.dry_run = true

    assert_equal 0, @keg.link(@mode)
    assert !@keg.linked?

    ['hiworld', 'helloworld', 'goodbye_cruel_world'].each do |file|
      assert_match "#{HOMEBREW_PREFIX}/bin/#{file}", $stdout.string
    end
    assert_equal 3, $stdout.string.lines.count
  end

  def test_linking_fails_when_already_linked
    @keg.link
    assert_raise Keg::AlreadyLinkedError do
      shutup { @keg.link }
    end
  end

  def test_linking_fails_when_files_exist
    touch HOMEBREW_PREFIX/"bin/helloworld"
    assert_raise Keg::ConflictError do
      shutup { @keg.link }
    end
  end

  def test_link_ignores_broken_symlinks_at_target
    dst = HOMEBREW_PREFIX/"bin/helloworld"
    src = @keg/"bin/helloworld"
    ln_s "/some/nonexistent/path", dst
    shutup { @keg.link }
    assert_equal src.relative_path_from(dst.dirname), dst.readlink
  end

  def test_link_overwrite
    touch HOMEBREW_PREFIX/"bin/helloworld"
    @mode.overwrite = true
    assert_equal 3, @keg.link(@mode)
  end

  def test_link_overwrite_broken_symlinks
    cd HOMEBREW_PREFIX/"bin" do
      ln_s "nowhere", "helloworld"
    end
    @mode.overwrite = true
    assert_equal 3, @keg.link(@mode)
  end

  def test_link_overwrite_dryrun
    touch HOMEBREW_PREFIX/"bin/helloworld"
    @mode.overwrite = true
    @mode.dry_run = true

    assert_equal 0, @keg.link(@mode)
    assert !@keg.linked?

    assert_equal "#{HOMEBREW_PREFIX}/bin/helloworld\n", $stdout.string
  end

  def test_unlink_prunes_empty_toplevel_directories
    mkpath HOMEBREW_PREFIX/"lib/foo/bar"
    mkpath @keg/"lib/foo/bar"
    touch @keg/"lib/foo/bar/file1"

    @keg.unlink

    assert !File.directory?(HOMEBREW_PREFIX/"lib/foo")
  end

  def test_unlink_ignores_DS_Store_when_pruning_empty_dirs
    mkpath HOMEBREW_PREFIX/"lib/foo/bar"
    touch HOMEBREW_PREFIX/"lib/foo/.DS_Store"
    mkpath @keg/"lib/foo/bar"
    touch @keg/"lib/foo/bar/file1"

    @keg.unlink

    assert !File.directory?(HOMEBREW_PREFIX/"lib/foo")
    assert !File.exist?(HOMEBREW_PREFIX/"lib/foo/.DS_Store")
  end

  def teardown
    @keg.unlink
    @keg.rmtree

    $stdout = @old_stdout

    rmtree HOMEBREW_PREFIX/"bin"
    rmtree HOMEBREW_PREFIX/"lib"
  end
end