From a7861783828182425c2dd7ec8dbc716843ff0f48 Mon Sep 17 00:00:00 2001 From: Jack Nagel Date: Fri, 25 May 2012 23:44:11 -0500 Subject: Pathname: add Mach-O module The MachO module contains methods for learning about Mach-O binaries, and can be used where one might normally shell out to file(1). Signed-off-by: Jack Nagel --- Library/Homebrew/test/mach/a.out | Bin 0 -> 25072 bytes Library/Homebrew/test/mach/fat.dylib | Bin 0 -> 16452 bytes Library/Homebrew/test/mach/i386.dylib | Bin 0 -> 4164 bytes Library/Homebrew/test/mach/x86_64.dylib | Bin 0 -> 4176 bytes Library/Homebrew/test/test_mach.rb | 140 ++++++++++++++++++++++++++++++++ 5 files changed, 140 insertions(+) create mode 100755 Library/Homebrew/test/mach/a.out create mode 100644 Library/Homebrew/test/mach/fat.dylib create mode 100644 Library/Homebrew/test/mach/i386.dylib create mode 100644 Library/Homebrew/test/mach/x86_64.dylib create mode 100644 Library/Homebrew/test/test_mach.rb (limited to 'Library/Homebrew/test') diff --git a/Library/Homebrew/test/mach/a.out b/Library/Homebrew/test/mach/a.out new file mode 100755 index 000000000..18e0e982f Binary files /dev/null and b/Library/Homebrew/test/mach/a.out differ diff --git a/Library/Homebrew/test/mach/fat.dylib b/Library/Homebrew/test/mach/fat.dylib new file mode 100644 index 000000000..6886a6a8b Binary files /dev/null and b/Library/Homebrew/test/mach/fat.dylib differ diff --git a/Library/Homebrew/test/mach/i386.dylib b/Library/Homebrew/test/mach/i386.dylib new file mode 100644 index 000000000..0304dca01 Binary files /dev/null and b/Library/Homebrew/test/mach/i386.dylib differ diff --git a/Library/Homebrew/test/mach/x86_64.dylib b/Library/Homebrew/test/mach/x86_64.dylib new file mode 100644 index 000000000..781b41cb4 Binary files /dev/null and b/Library/Homebrew/test/mach/x86_64.dylib differ diff --git a/Library/Homebrew/test/test_mach.rb b/Library/Homebrew/test/test_mach.rb new file mode 100644 index 000000000..2da4e429a --- /dev/null +++ b/Library/Homebrew/test/test_mach.rb @@ -0,0 +1,140 @@ +require 'testing_env' + +require 'extend/ARGV' # needs to be after test/unit to avoid conflict with OptionsParser +ARGV.extend(HomebrewArgvExtension) + +class MachOPathnameTests < Test::Unit::TestCase + def test_fat_dylib + pn = Pathname.new("#{TEST_FOLDER}/mach/fat.dylib") + assert pn.universal? + assert !pn.i386? + assert !pn.x86_64? + assert !pn.ppc7400? + assert !pn.ppc64? + assert pn.dylib? + assert !pn.mach_o_executable? + assert !pn.text_executable? + assert pn.arch == :universal + assert_match /Mach-O (64-bit )?dynamically linked shared library/, + `/usr/bin/file -h '#{pn}'`.chomp + end + + def test_i386_dylib + pn = Pathname.new("#{TEST_FOLDER}/mach/i386.dylib") + assert !pn.universal? + assert pn.i386? + assert !pn.x86_64? + assert !pn.ppc7400? + assert !pn.ppc64? + assert pn.dylib? + assert !pn.mach_o_executable? + assert !pn.text_executable? + assert_match /Mach-O (64-bit )?dynamically linked shared library/, + `/usr/bin/file -h '#{pn}'`.chomp + end + + def test_x86_64_dylib + pn = Pathname.new("#{TEST_FOLDER}/mach/x86_64.dylib") + assert !pn.universal? + assert !pn.i386? + assert pn.x86_64? + assert !pn.ppc7400? + assert !pn.ppc64? + assert pn.dylib? + assert !pn.mach_o_executable? + assert !pn.text_executable? + assert_match /Mach-O (64-bit )?dynamically linked shared library/, + `/usr/bin/file -h '#{pn}'`.chomp + end + + def test_mach_o_executable + pn = Pathname.new("#{TEST_FOLDER}/mach/a.out") + assert pn.universal? + assert !pn.i386? + assert !pn.x86_64? + assert !pn.ppc7400? + assert !pn.ppc64? + assert !pn.dylib? + assert pn.mach_o_executable? + assert !pn.text_executable? + assert_match /Mach-O (64-bit )?executable/, + `/usr/bin/file -h '#{pn}'`.chomp + end + + def test_non_mach_o + pn = Pathname.new("#{TEST_FOLDER}/tarballs/testball-0.1.tbz") + assert !pn.universal? + assert !pn.i386? + assert !pn.x86_64? + assert !pn.ppc7400? + assert !pn.ppc64? + assert !pn.dylib? + assert !pn.mach_o_executable? + assert !pn.text_executable? + assert pn.arch == :dunno + assert_no_match /Mach-O (64-bit )?dynamically linked shared library/, + `/usr/bin/file -h '#{pn}'`.chomp + assert_no_match /Mach-O [^ ]* ?executable/, + `/usr/bin/file -h '#{pn}'`.chomp + end +end + +class TextExecutableTests < Test::Unit::TestCase + TMPDIR = HOMEBREW_PREFIX/'tmp' + + def setup + FileUtils.mkdir_p TMPDIR + end + + def test_simple_shebang + pn = Pathname.new('foo') + pn.write '#!/bin/sh' + assert !pn.universal? + assert !pn.i386? + assert !pn.x86_64? + assert !pn.ppc7400? + assert !pn.ppc64? + assert !pn.dylib? + assert !pn.mach_o_executable? + assert pn.text_executable? + assert_equal [], pn.archs + assert pn.arch == :dunno + assert_match /text executable/, `/usr/bin/file -h '#{pn}'`.chomp + end + + def test_shebang_with_options + pn = Pathname.new('bar') + pn.write '#! /usr/bin/perl -w' + assert !pn.universal? + assert !pn.i386? + assert !pn.x86_64? + assert !pn.ppc7400? + assert !pn.ppc64? + assert !pn.dylib? + assert !pn.mach_o_executable? + assert pn.text_executable? + assert_equal [], pn.archs + assert pn.arch == :dunno + assert_match /text executable/, `/usr/bin/file -h '#{pn}'`.chomp + end + + def test_malformed_shebang + pn = Pathname.new('baz') + pn.write '#! ' + assert !pn.universal? + assert !pn.i386? + assert !pn.x86_64? + assert !pn.ppc7400? + assert !pn.ppc64? + assert !pn.dylib? + assert !pn.mach_o_executable? + assert !pn.text_executable? + assert_equal [], pn.archs + assert pn.arch == :dunno + assert_match /text executable/, `/usr/bin/file -h '#{pn}'`.chomp + end + + def teardown + TMPDIR.rmtree + end +end -- cgit v1.2.3