diff options
author | sbc@chromium.org <sbc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-04 23:07:56 +0000 |
---|---|---|
committer | sbc@chromium.org <sbc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-04 23:07:56 +0000 |
commit | 0e357c3e1cb8f788ad592ab6760900716f9b018d (patch) | |
tree | ead1e55f9b7bf5492e2a362cf8b2fef3e6be8910 /native_client_sdk/src | |
parent | 87b327a7dc81ba041d208e768373064b4c6b9957 (diff) | |
download | chromium_src-0e357c3e1cb8f788ad592ab6760900716f9b018d.zip chromium_src-0e357c3e1cb8f788ad592ab6760900716f9b018d.tar.gz chromium_src-0e357c3e1cb8f788ad592ab6760900716f9b018d.tar.bz2 |
[NaCl SDK] Add launcher script for sel_ldr.
This script simplifies the process of running .nexe files
under the sel_ldr in the SDK. It uses sensible defaults for
things like the IRT location and library paths. It can also
determine which version of the sel_ldr to run according to
that architecture of the .nexe.
Make common.mk aware of SEL_LDR=1 environment variable. In
this case SEL_LDR is defined (so code an detect it) and
'make run' will run the sel_ldr rather than chrome.
Run sel_ldr based tests as part of test_sdk. Currently
this is only simple_hello_world and nacl_io_test.
Distinguish between crashes and program exiting normally
in common.js (we can't distinguish if exitcode is -1 right
now).
Review URL: https://chromiumcodereview.appspot.com/18176014
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@210236 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'native_client_sdk/src')
17 files changed, 324 insertions, 30 deletions
diff --git a/native_client_sdk/src/build_tools/build_projects.py b/native_client_sdk/src/build_tools/build_projects.py index 3b6780b..cc96b8b 100755 --- a/native_client_sdk/src/build_tools/build_projects.py +++ b/native_client_sdk/src/build_tools/build_projects.py @@ -37,7 +37,6 @@ VALID_TOOLCHAINS = ['newlib', 'glibc', 'pnacl', 'win', 'linux', 'mac'] verbose = False - def CopyFilesFromTo(filelist, srcdir, dstdir): for filename in filelist: srcpath = os.path.join(srcdir, filename) @@ -150,9 +149,9 @@ def UpdateProjects(pepperdir, project_tree, toolchains, targets) -def BuildProjectsBranch(pepperdir, branch, deps, clean, config): +def BuildProjectsBranch(pepperdir, branch, deps, clean, config, args=None): make_dir = os.path.join(pepperdir, branch) - print "\n\nMake: " + make_dir + print "\nMake: " + make_dir if getos.GetPlatform() == 'win': # We need to modify the environment to build host on Windows. @@ -173,7 +172,7 @@ def BuildProjectsBranch(pepperdir, branch, deps, clean, config): else: jobs = str(multiprocessing.cpu_count()) - make_cmd = [make, '-j', jobs, 'TOOLCHAIN=all'] + make_cmd = [make, '-j', jobs] make_cmd.append('CONFIG='+config) if not deps: @@ -182,6 +181,11 @@ def BuildProjectsBranch(pepperdir, branch, deps, clean, config): if verbose: make_cmd.append('V=1') + if args: + make_cmd += args + else: + make_cmd.append('TOOLCHAIN=all') + buildbot_common.Run(make_cmd, cwd=make_dir, env=env) if clean: # Clean to remove temporary files but keep the built @@ -260,7 +264,10 @@ def main(args): filters['NAME'] = options.project print 'Filter by name: ' + str(options.project) - project_tree = parse_dsc.LoadProjectTree(SDK_SRC_DIR, filters=filters) + try: + project_tree = parse_dsc.LoadProjectTree(SDK_SRC_DIR, filters=filters) + except parse_dsc.ValidationError as e: + buildbot_common.ErrorExit(str(e)) parse_dsc.PrintProjectTree(project_tree) UpdateHelpers(pepperdir, clobber=options.clobber) diff --git a/native_client_sdk/src/build_tools/build_sdk.py b/native_client_sdk/src/build_tools/build_sdk.py index 0212d07..a151635 100755 --- a/native_client_sdk/src/build_tools/build_sdk.py +++ b/native_client_sdk/src/build_tools/build_sdk.py @@ -668,9 +668,10 @@ def BuildStepUpdateUserProjects(pepperdir, toolchains, def BuildStepMakeAll(pepperdir, directory, step_name, - deps=True, clean=False, config='Debug'): + deps=True, clean=False, config='Debug', args=None): buildbot_common.BuildStep(step_name) - build_projects.BuildProjectsBranch(pepperdir, directory, clean, deps, config) + build_projects.BuildProjectsBranch(pepperdir, directory, clean, + deps, config, args) def BuildStepBuildLibraries(pepperdir, directory): diff --git a/native_client_sdk/src/build_tools/parse_dsc.py b/native_client_sdk/src/build_tools/parse_dsc.py index 0626f6b8..72db7cb 100755 --- a/native_client_sdk/src/build_tools/parse_dsc.py +++ b/native_client_sdk/src/build_tools/parse_dsc.py @@ -14,6 +14,7 @@ VALID_TOOLCHAINS = ['newlib', 'glibc', 'pnacl', 'win', 'linux', 'mac'] # 'KEY' : ( <TYPE>, [Accepted Values], <Required?>) DSC_FORMAT = { 'DISABLE': (bool, [True, False], False), + 'SEL_LDR': (bool, [True, False], False), 'DISABLE_PACKAGE': (bool, [True, False], False), 'TOOLS' : (list, VALID_TOOLCHAINS, True), 'CONFIGS' : (list, ['Debug', 'Release'], False), diff --git a/native_client_sdk/src/build_tools/sdk_files.list b/native_client_sdk/src/build_tools/sdk_files.list index ffc959a..373243a 100644 --- a/native_client_sdk/src/build_tools/sdk_files.list +++ b/native_client_sdk/src/build_tools/sdk_files.list @@ -1095,5 +1095,6 @@ tools/oshelpers.py tools/oshelpers.pyc tools/quote.py tools/run.py +tools/sel_ldr.py tools/sel_ldr_x86_32${EXE_EXT} [linux,win]tools/sel_ldr_x86_64${EXE_EXT} diff --git a/native_client_sdk/src/build_tools/test_sdk.py b/native_client_sdk/src/build_tools/test_sdk.py index c2b7b7d..5baad12 100755 --- a/native_client_sdk/src/build_tools/test_sdk.py +++ b/native_client_sdk/src/build_tools/test_sdk.py @@ -3,6 +3,10 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +"""Script for a testing an existing SDK. + +This script is normally run immediately after build_sdk.py. +""" import optparse import os @@ -25,14 +29,14 @@ sys.path.append(os.path.join(SDK_SRC_DIR, 'tools')) import getos -def BuildStepBuildExamples(pepperdir): +def StepBuildExamples(pepperdir): for config in ('Debug', 'Release'): build_sdk.BuildStepMakeAll(pepperdir, 'examples', 'Build Examples (%s)' % config, deps=False, config=config) -def BuildStepCopyTests(pepperdir, toolchains, build_experimental): +def StepCopyTests(pepperdir, toolchains, build_experimental): buildbot_common.BuildStep('Copy Tests') # Update test libraries and test apps @@ -48,18 +52,55 @@ def BuildStepCopyTests(pepperdir, toolchains, build_experimental): toolchains=toolchains) -def BuildStepBuildTests(pepperdir): +def StepBuildTests(pepperdir): for config in ('Debug', 'Release'): build_sdk.BuildStepMakeAll(pepperdir, 'testlibs', - 'Build Test Libraries (%s)' % config, - config=config) + 'Build Test Libraries (%s)' % config, + config=config) build_sdk.BuildStepMakeAll(pepperdir, 'tests', - 'Build Tests (%s)' % config, - deps=False, config=config) + 'Build Tests (%s)' % config, + deps=False, config=config) + + +def RunSelLdrTests(pepperdir): + filters = { + 'SEL_LDR': True + } + + tree = parse_dsc.LoadProjectTree(SDK_SRC_DIR, filters=filters) + + def RunTest(test, toolchain, arch, config): + args = ['TOOLCHAIN=%s' % toolchain, 'NACL_ARCH=%s' % arch] + args += ['SEL_LDR=1', 'run'] + build_projects.BuildProjectsBranch(pepperdir, test, clean=False, + deps=False, config=config, + args=args) + + if getos.GetPlatform() == 'win': + # On win32 we only support running on the system + # arch + archs = (getos.GetSystemArch('win'),) + elif getos.GetPlatform() == 'mac': + # We only ship 32-bit version of sel_ldr on mac. + archs = ('x86_32',) + else: + # On linux we can run both 32 and 64-bit + archs = ('x86_64', 'x86_32') + + for root, projects in tree.iteritems(): + for project in projects: + title = 'sel_ldr tests: %s' % os.path.basename(project['NAME']) + location = os.path.join(root, project['NAME']) + buildbot_common.BuildStep(title) + for toolchain in ('newlib', 'glibc'): + for arch in archs: + for config in ('Debug', 'Release'): + RunTest(location, toolchain, arch, config) def main(args): - parser = optparse.OptionParser() + usage = '%prog [<options>] [<phase...>]' + parser = optparse.OptionParser(description=__doc__, usage=usage) parser.add_option('--experimental', help='build experimental tests', action='store_true') parser.add_option('--verbose', help='Verbose output', action='store_true') @@ -79,9 +120,30 @@ def main(args): if options.verbose: build_projects.verbose = True - BuildStepBuildExamples(pepperdir) - BuildStepCopyTests(pepperdir, toolchains, options.experimental) - BuildStepBuildTests(pepperdir) + phases = [ + ('build_examples', StepBuildExamples, pepperdir), + ('copy_tests', StepCopyTests, pepperdir, toolchains, options.experimental), + ('build_tests', StepBuildTests, pepperdir), + ('sel_ldr_tests', RunSelLdrTests, pepperdir) + ] + + if args: + phase_names = [p[0] for p in phases] + for arg in args: + if arg not in phase_names: + msg = 'Invalid argument: %s\n' % arg + msg += 'Possible arguments:\n' + for name in phase_names: + msg += ' %s\n' % name + parser.error(msg.strip()) + + for phase in phases: + phase_name = phase[0] + if args and phase_name not in args: + continue + phase_func = phase[1] + phase_args = phase[2:] + phase_func(*phase_args) return 0 diff --git a/native_client_sdk/src/examples/common.js b/native_client_sdk/src/examples/common.js index e1bc06a..51a0164 100644 --- a/native_client_sdk/src/examples/common.js +++ b/native_client_sdk/src/examples/common.js @@ -96,7 +96,11 @@ var common = (function () { * This event listener is registered in attachDefaultListeners above. */ function handleCrash(event) { - updateStatus('CRASHED') + if (common.naclModule.exitStatus == -1) { + updateStatus('CRASHED') + } else { + updateStatus('EXITED [' + common.naclModule.exitStatus + ']') + } if (typeof window.handleCrash !== 'undefined') { window.handleCrash(common.naclModule.lastError); } @@ -109,7 +113,7 @@ var common = (function () { */ function moduleDidLoad() { common.naclModule = document.getElementById('nacl_module'); - updateStatus('SUCCESS'); + updateStatus('RUNNING'); if (typeof window.moduleDidLoad !== 'undefined') { window.moduleDidLoad(); diff --git a/native_client_sdk/src/examples/getting_started/simple_hello_world/example.dsc b/native_client_sdk/src/examples/getting_started/simple_hello_world/example.dsc index de8c6a3..8a7a8de 100644 --- a/native_client_sdk/src/examples/getting_started/simple_hello_world/example.dsc +++ b/native_client_sdk/src/examples/getting_started/simple_hello_world/example.dsc @@ -1,5 +1,6 @@ { 'TOOLS': ['newlib', 'glibc', 'pnacl'], + 'SEL_LDR': True, 'TARGETS': [ { 'NAME' : 'simple_hello_world', diff --git a/native_client_sdk/src/examples/getting_started/simple_hello_world/hello_world.c b/native_client_sdk/src/examples/getting_started/simple_hello_world/hello_world.c index 30c1a95..9c98d6c 100644 --- a/native_client_sdk/src/examples/getting_started/simple_hello_world/hello_world.c +++ b/native_client_sdk/src/examples/getting_started/simple_hello_world/hello_world.c @@ -8,6 +8,10 @@ #include "ppapi_simple/ps_main.h" +#ifdef SEL_LDR +#define example_main main +#endif + int example_main(int argc, char* argv[]) { /* Use ppb_messaging to send "Hello World" to JavaScript. */ printf("Hello World STDOUT.\n"); diff --git a/native_client_sdk/src/examples/tutorial/load_progress/example.js b/native_client_sdk/src/examples/tutorial/load_progress/example.js index 8e7c00d..06e452d 100644 --- a/native_client_sdk/src/examples/tutorial/load_progress/example.js +++ b/native_client_sdk/src/examples/tutorial/load_progress/example.js @@ -64,7 +64,7 @@ function moduleLoadAbort() { // When the NaCl module has loaded indicate success. function moduleDidLoad() { common.logMessage('load\n'); - common.updateStatus('SUCCESS'); + common.updateStatus('LOADED'); } // Handler that gets called when the NaCl module loading has completed. diff --git a/native_client_sdk/src/libraries/nacl_io_test/example.dsc b/native_client_sdk/src/libraries/nacl_io_test/example.dsc index b26cd7c..934b25b 100644 --- a/native_client_sdk/src/libraries/nacl_io_test/example.dsc +++ b/native_client_sdk/src/libraries/nacl_io_test/example.dsc @@ -1,5 +1,6 @@ { 'TOOLS': ['newlib', 'glibc', 'pnacl', 'win'], + 'SEL_LDR': True, # Need to add ../../examples for common.js 'SEARCH': ['.', '../../examples'], diff --git a/native_client_sdk/src/libraries/nacl_io_test/main.cc b/native_client_sdk/src/libraries/nacl_io_test/main.cc index f9adc0d..ef7b094 100644 --- a/native_client_sdk/src/libraries/nacl_io_test/main.cc +++ b/native_client_sdk/src/libraries/nacl_io_test/main.cc @@ -2,10 +2,19 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - #include <string> #include "gtest/gtest.h" + +#if defined(SEL_LDR) + +int main(int argc, char* argv[]) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} + +#else + #include "ppapi/cpp/instance.h" #include "ppapi/cpp/var.h" #include "ppapi_simple/ps_main.h" @@ -53,3 +62,5 @@ int example_main(int argc, char* argv[]) { // Register the function to call once the Instance Object is initialized. // see: pappi_simple/ps_main.h PPAPI_SIMPLE_REGISTER_MAIN(example_main); + +#endif diff --git a/native_client_sdk/src/libraries/nacl_io_test/mount_http_test.cc b/native_client_sdk/src/libraries/nacl_io_test/mount_http_test.cc index 2c77c50..3d4facc 100644 --- a/native_client_sdk/src/libraries/nacl_io_test/mount_http_test.cc +++ b/native_client_sdk/src/libraries/nacl_io_test/mount_http_test.cc @@ -343,7 +343,7 @@ void MountHttpNodeTest::TearDown() { delete mnt_; } -TEST_F(MountHttpNodeTest, OpenAndCloseNoCache) { +TEST_F(MountHttpNodeTest, DISABLED_OpenAndCloseNoCache) { StringMap_t smap; smap["cache_content"] = "false"; SetMountArgs(StringMap_t()); @@ -387,7 +387,7 @@ TEST_F(MountHttpNodeTest, GetStat) { EXPECT_EQ(42, stat.st_size); } -TEST_F(MountHttpNodeTest, Access) { +TEST_F(MountHttpNodeTest, DISABLED_Access) { StringMap_t smap; smap["cache_content"] = "false"; SetMountArgs(StringMap_t()); @@ -397,7 +397,7 @@ TEST_F(MountHttpNodeTest, Access) { ASSERT_EQ(0, mnt_->Access(Path(path_), R_OK)); } -TEST_F(MountHttpNodeTest, AccessWrite) { +TEST_F(MountHttpNodeTest, DISABLED_AccessWrite) { StringMap_t smap; smap["cache_content"] = "false"; SetMountArgs(StringMap_t()); @@ -452,7 +452,7 @@ TEST_F(MountHttpNodeTest, ReadCached) { EXPECT_EQ(42, result_size); } -TEST_F(MountHttpNodeTest, ReadCachedNoContentLength) { +TEST_F(MountHttpNodeTest, DISABLED_ReadCachedNoContentLength) { size_t result_size = 0; int result_bytes = 0; diff --git a/native_client_sdk/src/libraries/nacl_io_test/mount_test.cc b/native_client_sdk/src/libraries/nacl_io_test/mount_test.cc index d9bb876..e04f513 100644 --- a/native_client_sdk/src/libraries/nacl_io_test/mount_test.cc +++ b/native_client_sdk/src/libraries/nacl_io_test/mount_test.cc @@ -255,7 +255,8 @@ TEST(MountTest, DevZero) { EXPECT_EQ(0, memcmp(&buffer[0], &zero_buffer[0], kBufferLength)); } -TEST(MountTest, DevUrandom) { +// Disabled due to intermittent failures on linux: http://crbug.com/257257 +TEST(MountTest, DISABLED_DevUrandom) { MountDevMock* mnt = new MountDevMock(); ScopedMountNode dev_urandom; int result_bytes = 0; diff --git a/native_client_sdk/src/test_all.py b/native_client_sdk/src/test_all.py index 4091948..2dc4d4c 100755 --- a/native_client_sdk/src/test_all.py +++ b/native_client_sdk/src/test_all.py @@ -22,6 +22,7 @@ TEST_MODULES = [ 'oshelpers_test', 'parse_dsc_test', 'sdktools_test', + 'sel_ldr_test', 'sdktools_commands_test', 'sdktools_config_test', 'update_nacl_manifest_test', diff --git a/native_client_sdk/src/tools/common.mk b/native_client_sdk/src/tools/common.mk index 2d94144..6d88a2a8 100644 --- a/native_client_sdk/src/tools/common.mk +++ b/native_client_sdk/src/tools/common.mk @@ -27,8 +27,8 @@ TOP_MAKE := $(word 1,$(MAKEFILE_LIST)) # # Figure out which OS we are running on. # -GETOS = python $(NACL_SDK_ROOT)/tools/getos.py -FIXDEPS = python $(NACL_SDK_ROOT)/tools/fix_deps.py +GETOS := python $(NACL_SDK_ROOT)/tools/getos.py +FIXDEPS := python $(NACL_SDK_ROOT)/tools/fix_deps.py OSNAME := $(shell $(GETOS)) @@ -212,7 +212,11 @@ install: OUTBASE ?= . +ifdef SEL_LDR +OUTDIR := $(OUTBASE)/$(TOOLCHAIN)/sel_ldr_$(CONFIG) +else OUTDIR := $(OUTBASE)/$(TOOLCHAIN)/$(CONFIG) +endif STAMPDIR ?= $(OUTDIR) LIBDIR ?= $(NACL_SDK_ROOT)/lib @@ -286,6 +290,10 @@ else POSIX_FLAGS ?= -g -O0 -pthread -MMD -DNACL_SDK_DEBUG endif +ifdef SEL_LDR +POSIX_FLAGS += -DSEL_LDR=1 +endif + NACL_CFLAGS ?= -Wno-long-long -Werror NACL_CXXFLAGS ?= -Wno-long-long -Werror NACL_LDFLAGS ?= -Wl,-as-needed @@ -420,6 +428,22 @@ PPAPI_DEBUG = $(abspath $(OSNAME)/Debug/$(TARGET)$(HOST_EXT));application/x-ppap PPAPI_RELEASE = $(abspath $(OSNAME)/Release/$(TARGET)$(HOST_EXT));application/x-ppapi-release +SYSARCH := $(shell $(GETOS) --nacl-arch) +SEL_LDR_PATH := python $(NACL_SDK_ROOT)/tools/sel_ldr.py + +ifdef SEL_LDR +run: all +ifndef NACL_ARCH + $(error Cannot run in sel_ldr unless \$NACL_ARCH is set) +endif + $(SEL_LDR_PATH) $(OUTDIR)/$(TARGET)_$(NACL_ARCH).nexe + +debug: all +ifndef NACL_ARCH + $(error Cannot run in sel_ldr unless \$NACL_ARCH is set) +endif + $(SEL_LDR_PATH) -d $(OUTDIR)/$(TARGET)_$(NACL_ARCH).nexe +else PAGE ?= index.html PAGE_TC_CONFIG ?= "$(PAGE)?tc=$(TOOLCHAIN)&config=$(CONFIG)" @@ -434,7 +458,6 @@ run_package: check_for_chrome all $(CHROME_PATH) --load-and-launch-app=$(CURDIR) $(CHROME_ARGS) -SYSARCH = $(shell $(GETOS) --nacl-arch) GDB_ARGS += -D $(TC_PATH)/$(OSNAME)_x86_$(TOOLCHAIN)/bin/$(SYSARCH)-nacl-gdb GDB_ARGS += -D $(abspath $(OUTDIR))/$(TARGET)_$(SYSARCH).nexe @@ -445,6 +468,7 @@ debug: check_for_chrome all $(PAGE) $(addprefix -E ,$(CHROME_ENV)) -- $(CHROME_PATH) $(CHROME_ARGS) \ --enable-nacl-debug \ --register-pepper-plugins="$(PPAPI_DEBUG),$(PPAPI_RELEASE)" +endif # uppercase aliases (for backward compatibility) diff --git a/native_client_sdk/src/tools/sel_ldr.py b/native_client_sdk/src/tools/sel_ldr.py new file mode 100755 index 0000000..01de0be --- /dev/null +++ b/native_client_sdk/src/tools/sel_ldr.py @@ -0,0 +1,116 @@ +#!/usr/bin/env python +# Copyright 2013 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +"""Wrapper script for launching application within the sel_ldr. +""" + +import optparse +import os +import subprocess +import sys + +import create_nmf +import getos + +SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) +NACL_SDK_ROOT = os.path.dirname(SCRIPT_DIR) + +if sys.version_info < (2, 6, 0): + sys.stderr.write("python 2.6 or later is required run this script\n") + sys.exit(1) + + +class Error(Exception): + pass + + +def Log(msg): + if Log.verbose: + sys.stderr.write(str(msg) + '\n') +Log.verbose = False + + +def main(argv): + usage = 'Usage: %prog [options] <.nexe>' + description = __doc__ + epilog = 'Example: sel_ldr.py my_nexe.nexe' + parser = optparse.OptionParser(usage, description=description, epilog=epilog) + parser.add_option('-v', '--verbose', action='store_true', + help='Verbose output') + parser.add_option('-d', '--debug', action='store_true', + help='Enable debug stub') + parser.add_option('--debug-libs', action='store_true', + help='For dynamic executables, reference debug ' + 'libraries rather then release') + options, args = parser.parse_args(argv) + if not args: + parser.error('No executable file specified') + + nexe = args[0] + if options.verbose: + Log.verbose = True + + osname = getos.GetPlatform() + if not os.path.exists(nexe): + raise Error('executable not found: %s' % nexe) + if not os.path.isfile(nexe): + raise Error('not a file: %s' % nexe) + + arch, dynamic = create_nmf.ParseElfHeader(nexe) + if osname == 'mac' and arch == 'x86-64': + raise Error('Running of x86-64 executables is not supported on mac') + + if arch == 'arm': + raise Error('Cannot run ARM executables under sel_ldr') + + arch_suffix = arch.replace('-', '_') + + sel_ldr = os.path.join(SCRIPT_DIR, 'sel_ldr_%s' % arch_suffix) + irt = os.path.join(SCRIPT_DIR, 'irt_core_%s.nexe' % arch_suffix) + if osname == 'win': + sel_ldr += '.exe' + Log('ROOT = %s' % NACL_SDK_ROOT) + Log('SEL_LDR = %s' % sel_ldr) + Log('IRT = %s' % irt) + cmd = [sel_ldr, '-a', '-B', irt, '-l', os.devnull] + + if options.debug: + cmd.append('-g') + + if osname == 'linux': + helper = os.path.join(SCRIPT_DIR, 'nacl_helper_bootstrap_%s' % arch_suffix) + Log('HELPER = %s' % helper) + cmd.insert(0, helper) + + if dynamic: + libpath = os.path.join(NACL_SDK_ROOT, 'lib', + 'glibc_%s' % arch_suffix, 'Release') + toolchain = '%s_x86_glibc' % osname + sdk_lib_dir = os.path.join(NACL_SDK_ROOT, 'toolchain', + toolchain, 'x86_64-nacl') + if arch == 'x86-64': + sdk_lib_dir = os.path.join(sdk_lib_dir, 'lib') + else: + sdk_lib_dir = os.path.join(sdk_lib_dir, 'lib32') + ldso = os.path.join(sdk_lib_dir, 'runnable-ld.so') + cmd.append(ldso) + Log('LD.SO = %s' % ldso) + libpath += ':' + sdk_lib_dir + cmd.append('--library-path') + cmd.append(libpath) + + + cmd += args + Log(cmd) + rtn = subprocess.call(cmd) + return rtn + + +if __name__ == '__main__': + try: + sys.exit(main(sys.argv[1:])) + except Error as e: + sys.stderr.write(str(e) + '\n') + sys.exit(1) diff --git a/native_client_sdk/src/tools/tests/sel_ldr_test.py b/native_client_sdk/src/tools/tests/sel_ldr_test.py new file mode 100755 index 0000000..6ad6961 --- /dev/null +++ b/native_client_sdk/src/tools/tests/sel_ldr_test.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python +# Copyright 2013 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import os +import sys +import unittest + +SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) +PARENT_DIR = os.path.dirname(SCRIPT_DIR) +DATA_DIR = os.path.join(SCRIPT_DIR, 'data') +CHROME_SRC = os.path.dirname(os.path.dirname(os.path.dirname(PARENT_DIR))) +MOCK_DIR = os.path.join(CHROME_SRC, "third_party", "pymock") + +# For the mock library +sys.path.append(MOCK_DIR) +sys.path.append(PARENT_DIR) + +import sel_ldr +import mock + + +class TestSelLdr(unittest.TestCase): + def testRequiresArg(self): + with mock.patch('sys.stderr'): + self.assertRaises(SystemExit, sel_ldr.main, []) + + def testUsesHelper(self): + with mock.patch('subprocess.call') as call: + with mock.patch('os.path.exists'): + with mock.patch('os.path.isfile'): + with mock.patch('create_nmf.ParseElfHeader') as parse_header: + parse_header.return_value = ('x8-64', False) + with mock.patch('getos.GetPlatform') as get_platform: + # assert that when we are running on linux + # the helper is used. + get_platform.return_value = 'linux' + sel_ldr.main(['foo.nexe']) + parse_header.assert_called_once_with('foo.nexe') + self.assertEqual(call.call_count, 1) + cmd = call.call_args[0][0] + self.assertTrue('helper_bootstrap' in cmd[0]) + + # assert that when not running on linux the + # helper is not used. + get_platform.reset_mock() + parse_header.reset_mock() + call.reset_mock() + get_platform.return_value = 'win' + sel_ldr.main(['foo.nexe']) + parse_header.assert_called_once_with('foo.nexe') + self.assertEqual(call.call_count, 1) + cmd = call.call_args[0][0] + self.assertTrue('helper_bootstrap' not in cmd[0]) + + +if __name__ == '__main__': + unittest.main() |