| 
									
										
										
										
											2012-10-20 20:54:11 -05:00
										 |  |  | require 'testing_env' | 
					
						
							|  |  |  | require 'keg' | 
					
						
							|  |  |  | require 'stringio' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-18 20:32:51 -05:00
										 |  |  | class LinkTests < Homebrew::TestCase | 
					
						
							| 
									
										
										
										
											2013-05-14 16:27:59 -05:00
										 |  |  |   include FileUtils | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-20 20:54:11 -05:00
										 |  |  |   def setup | 
					
						
							| 
									
										
										
										
											2014-07-03 23:27:53 -05:00
										 |  |  |     keg = HOMEBREW_CELLAR.join("foo", "1.0") | 
					
						
							|  |  |  |     keg.join("bin").mkpath | 
					
						
							| 
									
										
										
										
											2013-08-09 11:29:18 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     %w{hiworld helloworld goodbye_cruel_world}.each do |file| | 
					
						
							| 
									
										
										
										
											2014-07-03 23:27:53 -05:00
										 |  |  |       touch keg.join("bin", file) | 
					
						
							| 
									
										
										
										
											2012-10-20 20:54:11 -05:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2013-08-09 11:29:18 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-03 23:27:53 -05:00
										 |  |  |     @keg = Keg.new(keg) | 
					
						
							| 
									
										
										
										
											2014-07-03 23:27:54 -05:00
										 |  |  |     @dst = HOMEBREW_PREFIX.join("bin", "helloworld") | 
					
						
							| 
									
										
										
										
											2014-07-03 23:27:54 -05:00
										 |  |  |     @nonexistent = Pathname.new("/some/nonexistent/path") | 
					
						
							| 
									
										
										
										
											2012-10-20 20:54:11 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-14 16:27:59 -05:00
										 |  |  |     @mode = OpenStruct.new | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-20 20:54:11 -05:00
										 |  |  |     @old_stdout = $stdout | 
					
						
							|  |  |  |     $stdout = StringIO.new | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-14 16:27:59 -05:00
										 |  |  |     mkpath HOMEBREW_PREFIX/"bin" | 
					
						
							| 
									
										
										
										
											2013-08-09 11:29:18 -05:00
										 |  |  |     mkpath HOMEBREW_PREFIX/"lib" | 
					
						
							| 
									
										
										
										
											2012-10-20 20:54:11 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-23 22:00:33 -05:00
										 |  |  |   def teardown | 
					
						
							|  |  |  |     @keg.unlink | 
					
						
							|  |  |  |     @keg.uninstall | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $stdout = @old_stdout | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     rmtree HOMEBREW_PREFIX/"bin" | 
					
						
							|  |  |  |     rmtree HOMEBREW_PREFIX/"lib" | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-20 20:54:11 -05:00
										 |  |  |   def test_linking_keg | 
					
						
							| 
									
										
										
										
											2012-10-23 17:09:57 -05:00
										 |  |  |     assert_equal 3, @keg.link | 
					
						
							| 
									
										
										
										
											2014-06-11 12:21:03 -05:00
										 |  |  |     (HOMEBREW_PREFIX/"bin").children.each { |c| assert_predicate c.readlink, :relative? } | 
					
						
							| 
									
										
										
										
											2012-10-20 20:54:11 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def test_unlinking_keg | 
					
						
							|  |  |  |     @keg.link | 
					
						
							| 
									
										
										
										
											2014-07-03 23:27:54 -05:00
										 |  |  |     assert_predicate @dst, :symlink? | 
					
						
							| 
									
										
										
										
											2013-08-09 11:29:19 -05:00
										 |  |  |     assert_equal 4, @keg.unlink | 
					
						
							| 
									
										
										
										
											2014-07-03 23:27:54 -05:00
										 |  |  |     refute_predicate @dst, :symlink? | 
					
						
							| 
									
										
										
										
											2012-10-20 20:54:11 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def test_link_dry_run | 
					
						
							| 
									
										
										
										
											2013-05-14 16:27:59 -05:00
										 |  |  |     @mode.dry_run = true | 
					
						
							| 
									
										
										
										
											2012-10-20 20:54:11 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-14 16:27:59 -05:00
										 |  |  |     assert_equal 0, @keg.link(@mode) | 
					
						
							| 
									
										
										
										
											2014-06-11 12:21:03 -05:00
										 |  |  |     refute_predicate @keg, :linked? | 
					
						
							| 
									
										
										
										
											2012-10-20 20:54:11 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-23 17:09:57 -05:00
										 |  |  |     ['hiworld', 'helloworld', 'goodbye_cruel_world'].each do |file| | 
					
						
							| 
									
										
										
										
											2013-08-09 11:29:18 -05:00
										 |  |  |       assert_match "#{HOMEBREW_PREFIX}/bin/#{file}", $stdout.string | 
					
						
							| 
									
										
										
										
											2012-10-23 17:09:57 -05:00
										 |  |  |     end | 
					
						
							|  |  |  |     assert_equal 3, $stdout.string.lines.count | 
					
						
							| 
									
										
										
										
											2012-10-20 20:54:11 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def test_linking_fails_when_already_linked | 
					
						
							|  |  |  |     @keg.link | 
					
						
							| 
									
										
										
										
											2014-07-03 23:27:53 -05:00
										 |  |  |     assert_raises(Keg::AlreadyLinkedError) { @keg.link } | 
					
						
							| 
									
										
										
										
											2012-10-20 20:54:11 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def test_linking_fails_when_files_exist | 
					
						
							| 
									
										
										
										
											2014-07-03 23:27:54 -05:00
										 |  |  |     touch @dst | 
					
						
							| 
									
										
										
										
											2014-07-03 23:27:53 -05:00
										 |  |  |     assert_raises(Keg::ConflictError) { @keg.link } | 
					
						
							| 
									
										
										
										
											2012-10-20 20:54:11 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-27 09:35:10 -05:00
										 |  |  |   def test_link_ignores_broken_symlinks_at_target | 
					
						
							| 
									
										
										
										
											2014-07-03 23:27:54 -05:00
										 |  |  |     src = @keg.join("bin", "helloworld") | 
					
						
							| 
									
										
										
										
											2014-07-03 23:27:54 -05:00
										 |  |  |     @dst.make_symlink(@nonexistent) | 
					
						
							| 
									
										
										
										
											2014-07-03 23:27:53 -05:00
										 |  |  |     @keg.link | 
					
						
							| 
									
										
										
										
											2014-07-03 23:27:54 -05:00
										 |  |  |     assert_equal src.relative_path_from(@dst.dirname), @dst.readlink | 
					
						
							| 
									
										
										
										
											2014-03-27 09:35:10 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-20 20:54:11 -05:00
										 |  |  |   def test_link_overwrite | 
					
						
							| 
									
										
										
										
											2014-07-03 23:27:54 -05:00
										 |  |  |     touch @dst | 
					
						
							| 
									
										
										
										
											2013-05-14 16:27:59 -05:00
										 |  |  |     @mode.overwrite = true | 
					
						
							|  |  |  |     assert_equal 3, @keg.link(@mode) | 
					
						
							| 
									
										
										
										
											2014-07-01 09:01:06 -05:00
										 |  |  |     assert_predicate @keg, :linked? | 
					
						
							| 
									
										
										
										
											2012-10-20 20:54:11 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-27 15:21:17 -07:00
										 |  |  |   def test_link_overwrite_broken_symlinks | 
					
						
							| 
									
										
										
										
											2014-07-03 23:27:54 -05:00
										 |  |  |     @dst.make_symlink "nowhere" | 
					
						
							| 
									
										
										
										
											2013-05-14 16:27:59 -05:00
										 |  |  |     @mode.overwrite = true | 
					
						
							|  |  |  |     assert_equal 3, @keg.link(@mode) | 
					
						
							| 
									
										
										
										
											2014-07-01 09:01:06 -05:00
										 |  |  |     assert_predicate @keg, :linked? | 
					
						
							| 
									
										
										
										
											2013-04-27 15:21:17 -07:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-20 20:54:11 -05:00
										 |  |  |   def test_link_overwrite_dryrun | 
					
						
							| 
									
										
										
										
											2014-07-03 23:27:54 -05:00
										 |  |  |     touch @dst | 
					
						
							| 
									
										
										
										
											2013-05-14 16:27:59 -05:00
										 |  |  |     @mode.overwrite = true | 
					
						
							|  |  |  |     @mode.dry_run = true | 
					
						
							| 
									
										
										
										
											2012-10-20 20:54:11 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-14 16:27:59 -05:00
										 |  |  |     assert_equal 0, @keg.link(@mode) | 
					
						
							| 
									
										
										
										
											2014-06-11 12:21:03 -05:00
										 |  |  |     refute_predicate @keg, :linked? | 
					
						
							| 
									
										
										
										
											2012-10-20 20:54:11 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-03 23:27:54 -05:00
										 |  |  |     assert_equal "#{@dst}\n", $stdout.string | 
					
						
							| 
									
										
										
										
											2012-10-20 20:54:11 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-09 11:29:19 -05:00
										 |  |  |   def test_unlink_prunes_empty_toplevel_directories | 
					
						
							| 
									
										
										
										
											2013-08-09 11:29:18 -05:00
										 |  |  |     mkpath HOMEBREW_PREFIX/"lib/foo/bar" | 
					
						
							|  |  |  |     mkpath @keg/"lib/foo/bar" | 
					
						
							|  |  |  |     touch @keg/"lib/foo/bar/file1" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @keg.unlink | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-11 12:21:03 -05:00
										 |  |  |     refute_predicate HOMEBREW_PREFIX/"lib/foo", :directory? | 
					
						
							| 
									
										
										
										
											2013-08-09 11:29:18 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-09 11:29:19 -05:00
										 |  |  |   def test_unlink_ignores_DS_Store_when_pruning_empty_dirs | 
					
						
							| 
									
										
										
										
											2013-08-09 11:29:18 -05:00
										 |  |  |     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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-11 12:21:03 -05:00
										 |  |  |     refute_predicate HOMEBREW_PREFIX/"lib/foo", :directory? | 
					
						
							|  |  |  |     refute_predicate HOMEBREW_PREFIX/"lib/foo/.DS_Store", :exist? | 
					
						
							| 
									
										
										
										
											2013-08-09 11:29:18 -05:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2014-06-30 21:47:50 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-01 09:01:06 -05:00
										 |  |  |   def test_linking_creates_opt_link | 
					
						
							|  |  |  |     refute_predicate @keg, :optlinked? | 
					
						
							|  |  |  |     @keg.link | 
					
						
							|  |  |  |     assert_predicate @keg, :optlinked? | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def test_unlinking_does_not_remove_opt_link | 
					
						
							|  |  |  |     @keg.link | 
					
						
							|  |  |  |     @keg.unlink | 
					
						
							|  |  |  |     assert_predicate @keg, :optlinked? | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-30 21:47:50 -05:00
										 |  |  |   def test_existing_opt_link | 
					
						
							|  |  |  |     @keg.opt_record.make_relative_symlink Pathname.new(@keg) | 
					
						
							|  |  |  |     @keg.optlink | 
					
						
							| 
									
										
										
										
											2014-07-01 09:01:06 -05:00
										 |  |  |     assert_predicate @keg, :optlinked? | 
					
						
							| 
									
										
										
										
											2014-06-30 21:47:50 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def test_existing_opt_link_directory | 
					
						
							|  |  |  |     @keg.opt_record.mkpath | 
					
						
							|  |  |  |     @keg.optlink | 
					
						
							| 
									
										
										
										
											2014-07-01 09:01:06 -05:00
										 |  |  |     assert_predicate @keg, :optlinked? | 
					
						
							| 
									
										
										
										
											2014-06-30 21:47:50 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def test_existing_opt_link_file | 
					
						
							|  |  |  |     @keg.opt_record.parent.mkpath | 
					
						
							|  |  |  |     @keg.opt_record.write("foo") | 
					
						
							|  |  |  |     @keg.optlink | 
					
						
							| 
									
										
										
										
											2014-07-01 09:01:06 -05:00
										 |  |  |     assert_predicate @keg, :optlinked? | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def test_linked_keg | 
					
						
							|  |  |  |     refute_predicate @keg, :linked? | 
					
						
							|  |  |  |     @keg.link | 
					
						
							|  |  |  |     assert_predicate @keg, :linked? | 
					
						
							|  |  |  |     @keg.unlink | 
					
						
							|  |  |  |     refute_predicate @keg, :linked? | 
					
						
							| 
									
										
										
										
											2014-06-30 21:47:50 -05:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2014-07-03 23:27:54 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |   def test_unlink_preserves_broken_symlink_pointing_outside_the_keg | 
					
						
							|  |  |  |     @keg.link | 
					
						
							|  |  |  |     @dst.delete | 
					
						
							|  |  |  |     @dst.make_symlink(@nonexistent) | 
					
						
							|  |  |  |     @keg.unlink | 
					
						
							|  |  |  |     assert_predicate @dst, :symlink? | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def test_unlink_preserves_broken_symlink_pointing_into_the_keg | 
					
						
							|  |  |  |     @keg.link | 
					
						
							|  |  |  |     @dst.resolved_path.delete | 
					
						
							|  |  |  |     @keg.unlink | 
					
						
							|  |  |  |     assert_predicate @dst, :symlink? | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def test_unlink_preserves_symlink_pointing_outside_of_keg | 
					
						
							|  |  |  |     @keg.link | 
					
						
							|  |  |  |     @dst.delete | 
					
						
							|  |  |  |     @dst.make_symlink(Pathname.new("/bin/sh")) | 
					
						
							|  |  |  |     @keg.unlink | 
					
						
							|  |  |  |     assert_predicate @dst, :symlink? | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def test_unlink_preserves_real_file | 
					
						
							|  |  |  |     @keg.link | 
					
						
							|  |  |  |     @dst.delete | 
					
						
							|  |  |  |     touch @dst | 
					
						
							|  |  |  |     @keg.unlink | 
					
						
							|  |  |  |     assert_predicate @dst, :file? | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def test_unlink_ignores_nonexistent_file | 
					
						
							|  |  |  |     @keg.link | 
					
						
							|  |  |  |     @dst.delete | 
					
						
							|  |  |  |     assert_equal 3, @keg.unlink | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2014-07-12 19:56:58 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |   def test_pkgconfig_is_mkpathed | 
					
						
							|  |  |  |     link = HOMEBREW_PREFIX.join("lib", "pkgconfig") | 
					
						
							|  |  |  |     @keg.join("lib", "pkgconfig").mkpath | 
					
						
							|  |  |  |     @keg.link | 
					
						
							|  |  |  |     assert_predicate link.lstat, :directory? | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-23 16:38:13 +00:00
										 |  |  |   def test_cmake_is_mkpathed | 
					
						
							|  |  |  |     link = HOMEBREW_PREFIX.join("lib", "cmake") | 
					
						
							|  |  |  |     @keg.join("lib", "cmake").mkpath | 
					
						
							|  |  |  |     @keg.link | 
					
						
							|  |  |  |     assert_predicate link.lstat, :directory? | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-12 19:56:58 -05:00
										 |  |  |   def test_symlinks_are_linked_directly | 
					
						
							|  |  |  |     link = HOMEBREW_PREFIX.join("lib", "pkgconfig") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @keg.join("lib", "example").mkpath | 
					
						
							|  |  |  |     @keg.join("lib", "pkgconfig").make_symlink "example" | 
					
						
							|  |  |  |     @keg.link | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert_predicate link.resolved_path, :symlink? | 
					
						
							|  |  |  |     assert_predicate link.lstat, :symlink? | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2014-07-12 19:56:58 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |   def test_links_to_symlinks_are_not_removed | 
					
						
							|  |  |  |     a = HOMEBREW_CELLAR.join("a", "1.0") | 
					
						
							|  |  |  |     b = HOMEBREW_CELLAR.join("b", "1.0") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     a.join("lib", "example").mkpath | 
					
						
							|  |  |  |     a.join("lib", "example2").make_symlink "example" | 
					
						
							|  |  |  |     b.join("lib", "example2").mkpath | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-20 17:07:53 -05:00
										 |  |  |     a = Keg.new(a) | 
					
						
							|  |  |  |     b = Keg.new(b) | 
					
						
							|  |  |  |     a.link | 
					
						
							| 
									
										
										
										
											2014-07-12 19:56:58 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     lib = HOMEBREW_PREFIX.join("lib") | 
					
						
							|  |  |  |     assert_equal 2, lib.children.length | 
					
						
							| 
									
										
										
										
											2014-10-20 17:07:53 -05:00
										 |  |  |     assert_raises(Keg::ConflictError) { b.link } | 
					
						
							| 
									
										
										
										
											2014-07-12 19:56:58 -05:00
										 |  |  |     assert_equal 2, lib.children.length | 
					
						
							| 
									
										
										
										
											2014-10-20 17:07:53 -05:00
										 |  |  |   ensure | 
					
						
							|  |  |  |     a.unlink | 
					
						
							|  |  |  |     a.uninstall | 
					
						
							|  |  |  |     b.uninstall | 
					
						
							| 
									
										
										
										
											2014-07-12 19:56:58 -05:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2014-10-20 17:07:54 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |   def test_removes_broken_symlinks_that_conflict_with_directories | 
					
						
							|  |  |  |     a = HOMEBREW_CELLAR.join("a", "1.0") | 
					
						
							|  |  |  |     a.join("lib", "foo").mkpath | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     keg = Keg.new(a) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     link = HOMEBREW_PREFIX.join("lib", "foo") | 
					
						
							|  |  |  |     link.parent.mkpath | 
					
						
							|  |  |  |     link.make_symlink(@nonexistent) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     keg.link | 
					
						
							|  |  |  |   ensure | 
					
						
							|  |  |  |     keg.unlink | 
					
						
							|  |  |  |     keg.uninstall | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2012-10-20 20:54:11 -05:00
										 |  |  | end |