| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  | require "testing_env" | 
					
						
							|  |  |  | require "keg" | 
					
						
							|  |  |  | require "stringio" | 
					
						
							| 
									
										
										
										
											2012-10-20 20:54:11 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-17 16:16:31 +00:00
										 |  |  | class LinkTestCase < Homebrew::TestCase | 
					
						
							| 
									
										
										
										
											2013-05-14 16:27:59 -05:00
										 |  |  |   include FileUtils | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 13:27:33 +01:00
										 |  |  |   def setup_test_keg(name, version) | 
					
						
							|  |  |  |     path = HOMEBREW_CELLAR.join(name, version) | 
					
						
							|  |  |  |     path.join("bin").mkpath | 
					
						
							| 
									
										
										
										
											2013-08-09 11:29:18 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     %w[hiworld helloworld goodbye_cruel_world].each do |file| | 
					
						
							| 
									
										
										
										
											2016-09-22 13:27:33 +01:00
										 |  |  |       touch path.join("bin", file) | 
					
						
							| 
									
										
										
										
											2012-10-20 20:54:11 -05:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2013-08-09 11:29:18 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 13:27:33 +01:00
										 |  |  |     keg = Keg.new(path) | 
					
						
							|  |  |  |     @kegs ||= [] | 
					
						
							|  |  |  |     @kegs << keg | 
					
						
							|  |  |  |     keg | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def setup | 
					
						
							|  |  |  |     @keg = setup_test_keg("foo", "1.0") | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2016-09-22 13:27:33 +01:00
										 |  |  |     @kegs.each do |keg| | 
					
						
							|  |  |  |       keg.unlink | 
					
						
							|  |  |  |       keg.uninstall | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2014-06-23 22:00:33 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     $stdout = @old_stdout | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     rmtree HOMEBREW_PREFIX/"bin" | 
					
						
							|  |  |  |     rmtree HOMEBREW_PREFIX/"lib" | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2016-11-17 16:16:31 +00:00
										 |  |  | end | 
					
						
							| 
									
										
										
										
											2014-06-23 22:00:33 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-17 16:16:31 +00:00
										 |  |  | class LinkTests < LinkTestCase | 
					
						
							| 
									
										
										
										
											2016-12-27 17:26:21 +00:00
										 |  |  |   def test_all | 
					
						
							|  |  |  |     Formula.clear_racks_cache | 
					
						
							|  |  |  |     assert_equal [@keg], Keg.all | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-09 21:09:02 +08:00
										 |  |  |   def test_empty_installation | 
					
						
							|  |  |  |     %w[.DS_Store INSTALL_RECEIPT.json LICENSE.txt].each do |file| | 
					
						
							|  |  |  |       touch @keg/file | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     assert_predicate @keg, :exist? | 
					
						
							|  |  |  |     assert_predicate @keg, :directory? | 
					
						
							|  |  |  |     refute_predicate @keg, :empty_installation? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     (@keg/"bin").rmtree | 
					
						
							|  |  |  |     assert_predicate @keg, :empty_installation? | 
					
						
							|  |  |  |   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? | 
					
						
							| 
									
										
										
										
											2016-05-15 13:07:58 +02:00
										 |  |  |     assert_equal 3, @keg.unlink | 
					
						
							| 
									
										
										
										
											2014-07-03 23:27:54 -05:00
										 |  |  |     refute_predicate @dst, :symlink? | 
					
						
							| 
									
										
										
										
											2012-10-20 20:54:11 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-16 18:06:42 +03:00
										 |  |  |   def test_oldname_opt_record | 
					
						
							|  |  |  |     assert_nil @keg.oldname_opt_record | 
					
						
							|  |  |  |     oldname_opt_record = HOMEBREW_PREFIX/"opt/oldfoo" | 
					
						
							|  |  |  |     oldname_opt_record.make_relative_symlink(HOMEBREW_CELLAR/"foo/1.0") | 
					
						
							|  |  |  |     assert_equal oldname_opt_record, @keg.oldname_opt_record | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def test_optlink_relink | 
					
						
							|  |  |  |     oldname_opt_record = HOMEBREW_PREFIX/"opt/oldfoo" | 
					
						
							|  |  |  |     oldname_opt_record.make_relative_symlink(HOMEBREW_CELLAR/"foo/1.0") | 
					
						
							|  |  |  |     keg_record = HOMEBREW_CELLAR.join("foo", "2.0") | 
					
						
							|  |  |  |     keg_record.join("bin").mkpath | 
					
						
							|  |  |  |     keg = Keg.new(keg_record) | 
					
						
							|  |  |  |     keg.optlink | 
					
						
							|  |  |  |     assert_equal keg_record, oldname_opt_record.resolved_path | 
					
						
							|  |  |  |     keg.uninstall | 
					
						
							|  |  |  |     refute_predicate oldname_opt_record, :symlink? | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def test_remove_oldname_opt_record | 
					
						
							|  |  |  |     oldname_opt_record = HOMEBREW_PREFIX/"opt/oldfoo" | 
					
						
							|  |  |  |     oldname_opt_record.make_relative_symlink(HOMEBREW_CELLAR/"foo/2.0") | 
					
						
							|  |  |  |     @keg.remove_oldname_opt_record | 
					
						
							|  |  |  |     assert_predicate oldname_opt_record, :symlink? | 
					
						
							|  |  |  |     oldname_opt_record.unlink | 
					
						
							|  |  |  |     oldname_opt_record.make_relative_symlink(HOMEBREW_CELLAR/"foo/1.0") | 
					
						
							|  |  |  |     @keg.remove_oldname_opt_record | 
					
						
							|  |  |  |     refute_predicate oldname_opt_record, :symlink? | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-20 20:54:11 -05:00
										 |  |  |   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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01: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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-05 22:04:59 -07: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 | 
					
						
							| 
									
										
										
										
											2016-05-15 13:07:58 +02:00
										 |  |  |     assert_equal 2, @keg.unlink | 
					
						
							| 
									
										
										
										
											2014-07-03 23:27:54 -05:00
										 |  |  |   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 | 
					
						
							| 
									
										
										
										
											2016-09-22 13:27:33 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-17 16:16:31 +00:00
										 |  |  | class InstalledDependantsTests < LinkTestCase | 
					
						
							| 
									
										
										
										
											2016-09-22 13:27:33 +01:00
										 |  |  |   def stub_formula_name(name) | 
					
						
							| 
									
										
										
										
											2016-11-13 23:17:40 +00:00
										 |  |  |     f = formula(name) { url "foo-1.0" } | 
					
						
							|  |  |  |     stub_formula_loader f | 
					
						
							|  |  |  |     stub_formula_loader f, "homebrew/core/#{f}" | 
					
						
							|  |  |  |     f | 
					
						
							| 
									
										
										
										
											2016-09-22 13:27:33 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def setup_test_keg(name, version) | 
					
						
							| 
									
										
										
										
											2016-11-13 23:17:40 +00:00
										 |  |  |     f = stub_formula_name(name) | 
					
						
							| 
									
										
										
										
											2016-09-22 13:27:33 +01:00
										 |  |  |     keg = super | 
					
						
							| 
									
										
										
										
											2016-11-13 23:17:40 +00:00
										 |  |  |     Tab.create(f, DevelopmentTools.default_compiler, :libcxx).write | 
					
						
							| 
									
										
										
										
											2016-09-22 13:27:33 +01:00
										 |  |  |     keg | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def setup | 
					
						
							|  |  |  |     super | 
					
						
							| 
									
										
										
										
											2016-09-27 21:56:56 +01:00
										 |  |  |     @dependent = setup_test_keg("bar", "1.0") | 
					
						
							| 
									
										
										
										
											2016-11-17 16:18:50 +00:00
										 |  |  |     @keg.link | 
					
						
							| 
									
										
										
										
											2016-09-22 13:27:33 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-25 23:53:59 +01:00
										 |  |  |   def alter_tab(keg = @dependent) | 
					
						
							|  |  |  |     tab = Tab.for_keg(keg) | 
					
						
							|  |  |  |     yield tab | 
					
						
							| 
									
										
										
										
											2016-09-22 13:27:33 +01:00
										 |  |  |     tab.write | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-30 18:19:26 +00:00
										 |  |  |   # 1.1.6 is the earliest version of Homebrew that generates correct runtime | 
					
						
							|  |  |  |   # dependency lists in tabs. | 
					
						
							| 
									
										
										
										
											2016-12-30 16:16:53 +00:00
										 |  |  |   def dependencies(deps, homebrew_version: "1.1.6") | 
					
						
							| 
									
										
										
										
											2016-10-25 23:53:59 +01:00
										 |  |  |     alter_tab do |tab| | 
					
						
							| 
									
										
										
										
											2016-12-30 16:16:53 +00:00
										 |  |  |       tab.homebrew_version = homebrew_version | 
					
						
							| 
									
										
										
										
											2016-10-25 23:53:59 +01:00
										 |  |  |       tab.tabfile = @dependent.join("INSTALL_RECEIPT.json") | 
					
						
							|  |  |  |       tab.runtime_dependencies = deps | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-30 16:16:53 +00:00
										 |  |  |   def unreliable_dependencies(deps) | 
					
						
							| 
									
										
										
										
											2016-12-30 18:19:26 +00:00
										 |  |  |     # 1.1.5 is (hopefully!) the last version of Homebrew that generates | 
					
						
							|  |  |  |     # incorrect runtime dependency lists in tabs. | 
					
						
							| 
									
										
										
										
											2016-12-30 16:16:53 +00:00
										 |  |  |     dependencies(deps, homebrew_version: "1.1.5") | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-13 23:17:40 +00:00
										 |  |  |   # Test with a keg whose formula isn't known. | 
					
						
							|  |  |  |   # This can happen if e.g. a formula is installed | 
					
						
							|  |  |  |   # from a file path or URL. | 
					
						
							|  |  |  |   def test_unknown_formula | 
					
						
							|  |  |  |     Formulary.unstub(:loader_for) | 
					
						
							| 
									
										
										
										
											2016-12-27 22:58:44 +00:00
										 |  |  |     alter_tab(@keg) do |t| | 
					
						
							|  |  |  |       t.source["tap"] = "some/tap" | 
					
						
							|  |  |  |       t.source["path"] = nil | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-12-31 13:14:27 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-27 22:58:44 +00:00
										 |  |  |     dependencies [{ "full_name" => "some/tap/foo", "version" => "1.0" }] | 
					
						
							| 
									
										
										
										
											2016-12-27 17:26:21 +00:00
										 |  |  |     assert_equal [@dependent], @keg.installed_dependents | 
					
						
							|  |  |  |     assert_equal [[@keg], ["bar 1.0"]], Keg.find_some_installed_dependents([@keg]) | 
					
						
							| 
									
										
										
										
											2016-12-31 15:29:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     dependencies nil | 
					
						
							|  |  |  |     # It doesn't make sense for a keg with no formula to have any dependents, | 
					
						
							|  |  |  |     # so that can't really be tested. | 
					
						
							|  |  |  |     assert_nil Keg.find_some_installed_dependents([@keg]) | 
					
						
							| 
									
										
										
										
											2016-11-13 23:17:40 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 13:03:08 +00:00
										 |  |  |   def test_a_dependency_with_no_tap_in_tab | 
					
						
							|  |  |  |     @tap_dep = setup_test_keg("baz", "1.0") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     alter_tab(@keg) { |t| t.source["tap"] = nil } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     dependencies nil | 
					
						
							|  |  |  |     Formula["bar"].class.depends_on "foo" | 
					
						
							|  |  |  |     Formula["bar"].class.depends_on "baz" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     result = Keg.find_some_installed_dependents([@keg, @tap_dep]) | 
					
						
							| 
									
										
										
										
											2016-12-31 13:14:27 +00:00
										 |  |  |     assert_equal [[@keg, @tap_dep], ["bar"]], result | 
					
						
							| 
									
										
										
										
											2016-12-31 13:03:08 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-25 23:53:59 +01:00
										 |  |  |   def test_no_dependencies_anywhere | 
					
						
							|  |  |  |     dependencies nil | 
					
						
							|  |  |  |     assert_empty @keg.installed_dependents | 
					
						
							|  |  |  |     assert_nil Keg.find_some_installed_dependents([@keg]) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def test_missing_formula_dependency | 
					
						
							|  |  |  |     dependencies nil | 
					
						
							|  |  |  |     Formula["bar"].class.depends_on "foo" | 
					
						
							|  |  |  |     assert_empty @keg.installed_dependents | 
					
						
							|  |  |  |     assert_equal [[@keg], ["bar"]], Keg.find_some_installed_dependents([@keg]) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-30 17:41:57 +00:00
										 |  |  |   def test_uninstalling_dependent_and_dependency | 
					
						
							|  |  |  |     dependencies nil | 
					
						
							|  |  |  |     Formula["bar"].class.depends_on "foo" | 
					
						
							|  |  |  |     assert_empty @keg.installed_dependents | 
					
						
							|  |  |  |     assert_nil Keg.find_some_installed_dependents([@keg, @dependent]) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 13:14:27 +00:00
										 |  |  |   def test_renamed_dependency | 
					
						
							|  |  |  |     dependencies nil | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     stub_formula_loader Formula["foo"], "homebrew/core/foo-old" | 
					
						
							|  |  |  |     renamed_path = HOMEBREW_CELLAR/"foo-old" | 
					
						
							|  |  |  |     (HOMEBREW_CELLAR/"foo").rename(renamed_path) | 
					
						
							|  |  |  |     renamed_keg = Keg.new(renamed_path.join("1.0")) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Formula["bar"].class.depends_on "foo" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     result = Keg.find_some_installed_dependents([renamed_keg]) | 
					
						
							|  |  |  |     assert_equal [[renamed_keg], ["bar"]], result | 
					
						
							|  |  |  |   ensure | 
					
						
							|  |  |  |     # Move it back to where it was so it'll be cleaned up. | 
					
						
							|  |  |  |     (HOMEBREW_CELLAR/"foo-old").rename(HOMEBREW_CELLAR/"foo") | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-25 23:53:59 +01:00
										 |  |  |   def test_empty_dependencies_in_tab | 
					
						
							| 
									
										
										
										
											2016-09-22 13:27:33 +01:00
										 |  |  |     dependencies [] | 
					
						
							| 
									
										
										
										
											2016-09-27 21:56:56 +01:00
										 |  |  |     assert_empty @keg.installed_dependents | 
					
						
							| 
									
										
										
										
											2016-10-25 23:53:59 +01:00
										 |  |  |     assert_nil Keg.find_some_installed_dependents([@keg]) | 
					
						
							| 
									
										
										
										
											2016-09-22 13:27:33 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-25 23:53:59 +01:00
										 |  |  |   def test_same_name_different_version_in_tab | 
					
						
							| 
									
										
										
										
											2016-09-22 13:27:33 +01:00
										 |  |  |     dependencies [{ "full_name" => "foo", "version" => "1.1" }] | 
					
						
							| 
									
										
										
										
											2016-11-17 16:18:50 +00:00
										 |  |  |     assert_equal [@dependent], @keg.installed_dependents | 
					
						
							|  |  |  |     assert_equal [[@keg], ["bar 1.0"]], Keg.find_some_installed_dependents([@keg]) | 
					
						
							| 
									
										
										
										
											2016-09-22 13:27:33 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-25 23:53:59 +01:00
										 |  |  |   def test_different_name_same_version_in_tab | 
					
						
							| 
									
										
										
										
											2016-09-22 13:27:33 +01:00
										 |  |  |     stub_formula_name("baz") | 
					
						
							|  |  |  |     dependencies [{ "full_name" => "baz", "version" => @keg.version.to_s }] | 
					
						
							| 
									
										
										
										
											2016-09-27 21:56:56 +01:00
										 |  |  |     assert_empty @keg.installed_dependents | 
					
						
							| 
									
										
										
										
											2016-10-25 23:53:59 +01:00
										 |  |  |     assert_nil Keg.find_some_installed_dependents([@keg]) | 
					
						
							| 
									
										
										
										
											2016-09-22 13:27:33 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-25 23:53:59 +01:00
										 |  |  |   def test_same_name_and_version_in_tab | 
					
						
							| 
									
										
										
										
											2016-09-22 13:27:33 +01:00
										 |  |  |     dependencies [{ "full_name" => "foo", "version" => "1.0" }] | 
					
						
							| 
									
										
										
										
											2016-09-27 21:56:56 +01:00
										 |  |  |     assert_equal [@dependent], @keg.installed_dependents | 
					
						
							| 
									
										
										
										
											2016-10-25 23:53:59 +01:00
										 |  |  |     assert_equal [[@keg], ["bar 1.0"]], Keg.find_some_installed_dependents([@keg]) | 
					
						
							| 
									
										
										
										
											2016-09-22 13:27:33 +01:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2016-12-30 16:16:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   def test_fallback_for_old_versions | 
					
						
							|  |  |  |     unreliable_dependencies [{ "full_name" => "baz", "version" => "1.0" }] | 
					
						
							|  |  |  |     Formula["bar"].class.depends_on "foo" | 
					
						
							|  |  |  |     assert_empty @keg.installed_dependents | 
					
						
							|  |  |  |     assert_equal [[@keg], ["bar"]], Keg.find_some_installed_dependents([@keg]) | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2016-11-17 16:18:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   def test_unlinked | 
					
						
							|  |  |  |     @keg.unlink | 
					
						
							|  |  |  |     dependencies [{ "full_name" => "foo", "version" => "1.0" }] | 
					
						
							|  |  |  |     assert_empty @keg.installed_dependents | 
					
						
							|  |  |  |     assert_nil Keg.find_some_installed_dependents([@keg]) | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2016-11-17 17:18:48 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   def test_keg_only | 
					
						
							|  |  |  |     @keg.unlink | 
					
						
							|  |  |  |     Formula["foo"].class.keg_only "a good reason" | 
					
						
							|  |  |  |     dependencies [{ "full_name" => "foo", "version" => "1.1" }] # different version | 
					
						
							|  |  |  |     assert_equal [@dependent], @keg.installed_dependents | 
					
						
							|  |  |  |     assert_equal [[@keg], ["bar 1.0"]], Keg.find_some_installed_dependents([@keg]) | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2016-09-22 13:27:33 +01:00
										 |  |  | end |