| 
									
										
										
										
											2020-10-10 14:16:11 +02:00
										 |  |  | # typed: false | 
					
						
							| 
									
										
										
										
											2020-07-25 01:25:08 +05:30
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | require "extend/pathname" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-08 06:41:51 +05:30
										 |  |  | describe Pathname do | 
					
						
							| 
									
										
										
										
											2020-07-25 01:25:08 +05:30
										 |  |  |   let(:elf_dir) { described_class.new "#{TEST_FIXTURE_DIR}/elf" } | 
					
						
							| 
									
										
										
										
											2020-08-28 18:37:54 +05:30
										 |  |  |   let(:sho) { elf_dir/"libforty.so.0" } | 
					
						
							|  |  |  |   let(:sho_without_runpath_rpath) { elf_dir/"libhello.so.0" } | 
					
						
							|  |  |  |   let(:exec) { elf_dir/"hello_with_rpath" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def patch_elfs | 
					
						
							|  |  |  |     mktmpdir do |tmp_dir| | 
					
						
							| 
									
										
										
										
											2020-09-02 18:55:09 +05:30
										 |  |  |       %w[c.elf].each do |elf| | 
					
						
							| 
									
										
										
										
											2020-08-28 18:37:54 +05:30
										 |  |  |         FileUtils.cp(elf_dir/elf, tmp_dir/elf) | 
					
						
							|  |  |  |         yield tmp_dir/elf | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2020-07-25 01:25:08 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  |   describe "#interpreter" do | 
					
						
							|  |  |  |     it "returns interpreter" do | 
					
						
							|  |  |  |       expect(exec.interpreter).to eq "/lib64/ld-linux-x86-64.so.2" | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2020-08-28 18:37:54 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  |     it "returns nil when absent" do | 
					
						
							|  |  |  |       expect(sho.interpreter).to be_nil | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2020-07-25 01:25:08 +05:30
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe "#rpath" do | 
					
						
							| 
									
										
										
										
											2020-08-28 18:37:54 +05:30
										 |  |  |     it "prefers runpath over rpath when both are present" do | 
					
						
							|  |  |  |       expect(sho.rpath).to eq "runpath" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "returns runpath or rpath" do | 
					
						
							|  |  |  |       expect(exec.rpath).to eq "@@HOMEBREW_PREFIX@@/lib" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-25 01:25:08 +05:30
										 |  |  |     it "returns nil when absent" do | 
					
						
							| 
									
										
										
										
											2020-08-28 18:37:54 +05:30
										 |  |  |       expect(sho_without_runpath_rpath.rpath).to be_nil | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe "#patch!" do | 
					
						
							|  |  |  |     # testing only patchelf.rb as HOMEBREW_PREFIX is different for tests, | 
					
						
							|  |  |  |     # and DevelopmentTools.locate fails to locate patchelf | 
					
						
							|  |  |  |     HOMEBREW_PATCHELF_RB_WRITE = true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     let(:placeholder_prefix) { "@@HOMEBREW_PREFIX@@" } | 
					
						
							|  |  |  |     let(:short_prefix) { "/home/dwarf" } | 
					
						
							|  |  |  |     let(:standard_prefix) { "/home/linuxbrew/.linuxbrew" } | 
					
						
							|  |  |  |     let(:long_prefix) { "/home/organized/very organized/litter/more organized than/your words can describe" } | 
					
						
							|  |  |  |     let(:prefixes) { [short_prefix, standard_prefix, long_prefix] } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # file is copied as modified_elf to avoid caching issues | 
					
						
							|  |  |  |     it "only interpreter" do | 
					
						
							|  |  |  |       prefixes.each do |new_prefix| | 
					
						
							|  |  |  |         patch_elfs do |elf| | 
					
						
							|  |  |  |           interpreter = elf.interpreter.gsub(placeholder_prefix, new_prefix) | 
					
						
							|  |  |  |           elf.patch!(interpreter: interpreter) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           modified_elf = elf.dirname/"mod.#{elf.basename}" | 
					
						
							|  |  |  |           FileUtils.cp(elf, modified_elf) | 
					
						
							|  |  |  |           expect(modified_elf.interpreter).to eq interpreter | 
					
						
							|  |  |  |           expect(modified_elf.rpath).to eq "@@HOMEBREW_PREFIX@@/lib" | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "only rpath" do | 
					
						
							|  |  |  |       prefixes.each do |new_prefix| | 
					
						
							|  |  |  |         patch_elfs do |elf| | 
					
						
							|  |  |  |           rpath = elf.rpath.gsub(placeholder_prefix, new_prefix) | 
					
						
							|  |  |  |           elf.patch!(rpath: rpath) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           modified_elf = elf.dirname/"mod.#{elf.basename}" | 
					
						
							|  |  |  |           FileUtils.cp(elf, modified_elf) | 
					
						
							|  |  |  |           expect(modified_elf.interpreter).to eq "@@HOMEBREW_PREFIX@@/lib/ld.so" | 
					
						
							|  |  |  |           expect(modified_elf.rpath).to eq rpath | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "both" do | 
					
						
							|  |  |  |       prefixes.each do |new_prefix| | 
					
						
							|  |  |  |         patch_elfs do |elf| | 
					
						
							|  |  |  |           interpreter = elf.interpreter.gsub(placeholder_prefix, new_prefix) | 
					
						
							|  |  |  |           rpath = elf.rpath.gsub(placeholder_prefix, new_prefix) | 
					
						
							|  |  |  |           elf.patch!(interpreter: interpreter, rpath: rpath) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           modified_elf = elf.dirname/"mod.#{elf.basename}" | 
					
						
							|  |  |  |           FileUtils.cp(elf, modified_elf) | 
					
						
							|  |  |  |           expect(modified_elf.interpreter).to eq interpreter | 
					
						
							|  |  |  |           expect(modified_elf.rpath).to eq rpath | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2020-07-25 01:25:08 +05:30
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |