diff options
-rw-r--r-- | SConstruct | 371 | ||||
-rw-r--r-- | delta_performer_unittest.cc | 12 | ||||
-rw-r--r-- | payload_signer.cc | 4 | ||||
-rw-r--r-- | update_engine.gyp | 333 | ||||
-rw-r--r-- | utils.cc | 21 | ||||
-rw-r--r-- | utils.h | 4 |
6 files changed, 369 insertions, 376 deletions
diff --git a/SConstruct b/SConstruct deleted file mode 100644 index 9cc76e51..00000000 --- a/SConstruct +++ /dev/null @@ -1,371 +0,0 @@ -# Copyright (c) 2012 The Chromium OS 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 - -# Protobuffer compilation -def ProtocolBufferEmitter(target, source, env): - """ Inputs: - target: list of targets to compile to - source: list of sources to compile - env: the scons environment in which we are compiling - Outputs: - target: the list of targets we'll emit - source: the list of sources we'll compile""" - output = str(source[0]) - output = output[0:output.rfind('.proto')] - target = [ - output + '.pb.cc', - output + '.pb.h', - ] - return target, source - -def ProtocolBufferGenerator(source, target, env, for_signature): - """ Inputs: - source: list of sources to process - target: list of targets to generate - env: scons environment in which we are working - for_signature: unused - Outputs: a list of commands to execute to generate the targets from - the sources.""" - commands = [ - '/usr/bin/protoc ' - ' --proto_path . ${SOURCES} --cpp_out .'] - return commands - -proto_builder = Builder(generator = ProtocolBufferGenerator, - emitter = ProtocolBufferEmitter, - single_source = 1, - suffix = '.pb.cc') - -def DbusBindingsEmitter(target, source, env): - """ Inputs: - target: unused - source: list containing the source .xml file - env: the scons environment in which we are compiling - Outputs: - target: the list of targets we'll emit - source: the list of sources we'll process""" - output = str(source[0]) - output = output[0:output.rfind('.xml')] - target = [ - output + '.dbusserver.h', - output + '.dbusclient.h' - ] - return target, source - -def DbusBindingsGenerator(source, target, env, for_signature): - """ Inputs: - source: list of sources to process - target: list of targets to generate - env: scons environment in which we are working - for_signature: unused - Outputs: a list of commands to execute to generate the targets from - the sources.""" - commands = [] - for target_file in target: - if str(target_file).endswith('.dbusserver.h'): - mode_flag = '--mode=glib-server ' - else: - mode_flag = '--mode=glib-client ' - cmd = '/usr/bin/dbus-binding-tool %s --prefix=update_engine_service ' \ - '%s > %s' % (mode_flag, str(source[0]), str(target_file)) - commands.append(cmd) - return commands - -dbus_bindings_builder = Builder(generator = DbusBindingsGenerator, - emitter = DbusBindingsEmitter, - single_source = 1, - suffix = 'dbusclient.h') - -# Public key generation -def PublicKeyEmitter(target, source, env): - """ Inputs: - target: list of targets to compile to - source: list of sources to compile - env: the scons environment in which we are compiling - Outputs: - target: the list of targets we'll emit - source: the list of sources we'll compile""" - targets = [] - for source_file in source: - output = str(source_file) - output = output[0:output.rfind('.pem')] - output += '.pub.pem' - targets.append(output) - return targets, source - -def PublicKeyGenerator(source, target, env, for_signature): - """ Inputs: - source: list of sources to process - target: list of targets to generate - env: scons environment in which we are working - for_signature: unused - Outputs: a list of commands to execute to generate the targets from - the sources.""" - commands = [] - for source_file in source: - output = str(source_file) - output = output[0:output.rfind('.pem')] - output += '.pub.pem' - cmd = '/usr/bin/openssl rsa -in %s -pubout -out %s' % (source_file, output) - commands.append(cmd) - return commands - -public_key_builder = Builder(generator = PublicKeyGenerator, - emitter = PublicKeyEmitter, - suffix = '.pub.pem') - -env = Environment() -for key in Split('CC CXX AR RANLIB LD NM'): - value = os.environ.get(key) - if value != None: - env[key] = value -for key in Split('CFLAGS CCFLAGS LDFLAGS CPPPATH LIBPATH'): - value = os.environ.get(key) - if value != None: - env[key] = Split(value) - -for key in Split('PKG_CONFIG_LIBDIR PKG_CONFIG_PATH SYSROOT'): - if os.environ.has_key(key): - env['ENV'][key] = os.environ[key] - - -env['LINKFLAGS'] = Split(""" - -Wl,--gc-sections""") -env['LINKFLAGS'] += env.get('LDFLAGS', []) - -env['CCFLAGS'] = Split(""" - -g - -ffunction-sections - -fno-exceptions - -fno-strict-aliasing - -std=gnu++11 - -Wall - -Wextra - -Werror - -Wno-unused-parameter - -Wno-deprecated-register - -D__STDC_FORMAT_MACROS=1 - -D_FILE_OFFSET_BITS=64 - -D_POSIX_C_SOURCE=199309L""") -env['CCFLAGS'] += env['CFLAGS'] - -BASE_VER = os.environ.get('BASE_VER', '271506') -env['LIBS'] = Split("""bz2 - gflags - policy-%s - rootdev - rt - vboot_host""" % (BASE_VER,)) -env['CPPPATH'] = ['..'] -env['BUILDERS']['ProtocolBuffer'] = proto_builder -env['BUILDERS']['DbusBindings'] = dbus_bindings_builder -env['BUILDERS']['PublicKey'] = public_key_builder - -# Fix issue with scons not passing pkg-config vars through the environment. -for key in Split('PKG_CONFIG_LIBDIR PKG_CONFIG_PATH'): - if os.environ.has_key(key): - env['ENV'][key] = os.environ[key] - -pkgconfig = os.environ.get('PKG_CONFIG', 'pkg-config') - -env.ParseConfig(pkgconfig + ' --cflags --libs ' + ' '.join(( - 'dbus-1', - 'dbus-glib-1', - 'ext2fs', - 'gio-2.0', - 'gio-unix-2.0', - 'glib-2.0', - 'gthread-2.0', - 'libchrome-%s' % BASE_VER, - 'libchromeos-%s' % BASE_VER, - 'libcrypto', - 'libcurl', - 'libmetrics-%s' % BASE_VER, - 'libssl', - 'libxml-2.0', - 'protobuf'))) -env.ProtocolBuffer('update_metadata.pb.cc', 'update_metadata.proto') -env.PublicKey('unittest_key.pub.pem', 'unittest_key.pem') -env.PublicKey('unittest_key2.pub.pem', 'unittest_key2.pem') - -# Target name is derived from the source .xml filename. The passed name is -# unused. -env.DbusBindings(None, 'update_engine.xml') - -if ARGUMENTS.get('debug', 0): - env['CCFLAGS'] += ['-fprofile-arcs', '-ftest-coverage'] - env['LIBS'] += ['bz2', 'gcov'] - -sources = Split("""action_processor.cc - bzip.cc - bzip_extent_writer.cc - certificate_checker.cc - chrome_browser_proxy_resolver.cc - clock.cc - connection_manager.cc - constants.cc - dbus_service.cc - delta_performer.cc - download_action.cc - extent_ranges.cc - extent_writer.cc - file_descriptor.cc - file_writer.cc - filesystem_copier_action.cc - hardware.cc - http_common.cc - http_fetcher.cc - hwid_override.cc - install_plan.cc - libcurl_http_fetcher.cc - metrics.cc - multi_range_http_fetcher.cc - omaha_hash_calculator.cc - omaha_request_action.cc - omaha_request_params.cc - omaha_response_handler_action.cc - p2p_manager.cc - payload_constants.cc - payload_generator/cycle_breaker.cc - payload_generator/delta_diff_generator.cc - payload_generator/extent_mapper.cc - payload_generator/filesystem_iterator.cc - payload_generator/full_update_generator.cc - payload_generator/graph_utils.cc - payload_generator/metadata.cc - payload_generator/tarjan.cc - payload_generator/topological_sort.cc - payload_signer.cc - payload_state.cc - postinstall_runner_action.cc - prefs.cc - proxy_resolver.cc - real_system_state.cc - simple_key_value_store.cc - subprocess.cc - terminator.cc - update_attempter.cc - update_check_scheduler.cc - update_manager/boxed_value.cc - update_manager/chromeos_policy.cc - update_manager/evaluation_context.cc - update_manager/event_loop.cc - update_manager/policy.cc - update_manager/real_config_provider.cc - update_manager/real_device_policy_provider.cc - update_manager/real_random_provider.cc - update_manager/real_shill_provider.cc - update_manager/real_system_provider.cc - update_manager/real_time_provider.cc - update_manager/real_updater_provider.cc - update_manager/state_factory.cc - update_manager/update_manager.cc - update_metadata.pb.cc - utils.cc""") -main = ['main.cc'] - -unittest_sources = Split("""action_pipe_unittest.cc - action_processor_unittest.cc - action_unittest.cc - bzip_extent_writer_unittest.cc - certificate_checker_unittest.cc - chrome_browser_proxy_resolver_unittest.cc - connection_manager_unittest.cc - delta_performer_unittest.cc - download_action_unittest.cc - extent_ranges_unittest.cc - extent_writer_unittest.cc - fake_prefs.cc - fake_system_state.cc - file_writer_unittest.cc - filesystem_copier_action_unittest.cc - http_fetcher_unittest.cc - hwid_override_unittest.cc - mock_http_fetcher.cc - omaha_hash_calculator_unittest.cc - omaha_request_action_unittest.cc - omaha_request_params_unittest.cc - omaha_response_handler_action_unittest.cc - p2p_manager_unittest.cc - payload_generator/cycle_breaker_unittest.cc - payload_generator/delta_diff_generator_unittest.cc - payload_generator/extent_mapper_unittest.cc - payload_generator/filesystem_iterator_unittest.cc - payload_generator/full_update_generator_unittest.cc - payload_generator/graph_utils_unittest.cc - payload_generator/metadata_unittest.cc - payload_generator/tarjan_unittest.cc - payload_generator/topological_sort_unittest.cc - payload_signer_unittest.cc - payload_state_unittest.cc - postinstall_runner_action_unittest.cc - prefs_unittest.cc - simple_key_value_store_unittest.cc - subprocess_unittest.cc - terminator_unittest.cc - test_utils.cc - update_attempter_unittest.cc - update_check_scheduler_unittest.cc - update_manager/boxed_value_unittest.cc - update_manager/chromeos_policy_unittest.cc - update_manager/evaluation_context_unittest.cc - update_manager/event_loop_unittest.cc - update_manager/generic_variables_unittest.cc - update_manager/prng_unittest.cc - update_manager/real_config_provider_unittest.cc - update_manager/real_device_policy_provider_unittest.cc - update_manager/real_random_provider_unittest.cc - update_manager/real_shill_provider_unittest.cc - update_manager/real_system_provider_unittest.cc - update_manager/real_time_provider_unittest.cc - update_manager/real_updater_provider_unittest.cc - update_manager/umtest_utils.cc - update_manager/update_manager_unittest.cc - update_manager/variable_unittest.cc - utils_unittest.cc - zip_unittest.cc""") -unittest_main = ['testrunner.cc'] - -client_main = ['update_engine_client.cc'] - -delta_generator_main = ['payload_generator/generate_delta_main.cc'] - -# Hack to generate header files first. They are generated as a side effect -# of generating other files (usually their corresponding .c(c) files), -# so we make all sources depend on those other files. -all_sources = [] -all_sources.extend(sources) -all_sources.extend(unittest_sources) -all_sources.extend(main) -all_sources.extend(unittest_main) -all_sources.extend(client_main) -all_sources.extend(delta_generator_main) -for source in all_sources: - if source.endswith('_unittest.cc'): - env.Depends(source, 'unittest_key.pub.pem') - if source.endswith('.pb.cc'): - continue - env.Depends(source, 'update_metadata.pb.cc') - env.Depends(source, 'update_engine.dbusclient.h') - -update_engine_core = env.Library('update_engine_core', sources) -env.Prepend(LIBS=[update_engine_core]) - -env.Program('update_engine', main) - -client_cmd = env.Program('update_engine_client', client_main); - -delta_generator_cmd = env.Program('delta_generator', - delta_generator_main) - -http_server_cmd = env.Program('test_http_server', 'test_http_server.cc') - -unittest_env = env.Clone() -unittest_env.Append(LIBS=['gmock', 'gtest']) -unittest_cmd = unittest_env.Program('update_engine_unittests', - unittest_sources + unittest_main) -Clean(unittest_cmd, Glob('*.gcda') + Glob('*.gcno') + Glob('*.gcov') + - Split('html app.info')) diff --git a/delta_performer_unittest.cc b/delta_performer_unittest.cc index 8d4eacdf..226427f5 100644 --- a/delta_performer_unittest.cc +++ b/delta_performer_unittest.cc @@ -196,9 +196,9 @@ static void SignGeneratedShellPayload(SignatureTest signature_test, // Generates a new private key that will not match the public key. if (signature_test == kSignatureGeneratedShellBadKey) { LOG(INFO) << "Generating a mismatched private key."; - ASSERT_EQ(0, - System(base::StringPrintf("openssl genrsa -out %s 2048", - private_key_path.c_str()))); + ASSERT_EQ(0, System(base::StringPrintf( + "%s genrsa -out %s 2048", + utils::GetPathOnBoard("openssl").c_str(), private_key_path.c_str()))); } int signature_size = GetSignatureSize(private_key_path); string hash_file; @@ -230,7 +230,8 @@ static void SignGeneratedShellPayload(SignatureTest signature_test, ScopedPathUnlinker sig_unlinker(sig_file); ASSERT_EQ(0, System(base::StringPrintf( - "openssl rsautl -raw -sign -inkey %s -in %s -out %s", + "%s rsautl -raw -sign -inkey %s -in %s -out %s", + utils::GetPathOnBoard("openssl").c_str(), private_key_path.c_str(), hash_file.c_str(), sig_file.c_str()))); @@ -241,7 +242,8 @@ static void SignGeneratedShellPayload(SignatureTest signature_test, signature_test == kSignatureGeneratedShellRotateCl2) { ASSERT_EQ(0, System(base::StringPrintf( - "openssl rsautl -raw -sign -inkey %s -in %s -out %s", + "%s rsautl -raw -sign -inkey %s -in %s -out %s", + utils::GetPathOnBoard("openssl").c_str(), kUnittestPrivateKey2Path, hash_file.c_str(), sig_file2.c_str()))); diff --git a/payload_signer.cc b/payload_signer.cc index 15c2b329..3d09737c 100644 --- a/payload_signer.cc +++ b/payload_signer.cc @@ -230,6 +230,10 @@ bool PayloadSigner::SignHash(const vector<char>& hash, cmd[cmd.size() - 3] = hash_path; cmd[cmd.size() - 1] = sig_path; + // When running unittests, we need to use the openssl version from the + // SYSROOT instead of the one on the $PATH (host). + cmd[0] = utils::GetPathOnBoard("openssl"); + int return_code = 0; TEST_AND_RETURN_FALSE(Subprocess::SynchronousExec(cmd, &return_code, NULL)); TEST_AND_RETURN_FALSE(return_code == 0); diff --git a/update_engine.gyp b/update_engine.gyp new file mode 100644 index 00000000..24a9a98c --- /dev/null +++ b/update_engine.gyp @@ -0,0 +1,333 @@ +{ + 'target_defaults': { + 'variables': { + 'deps': [ + 'libchrome-<(libbase_ver)', + 'libchromeos-<(libbase_ver)', + ], + # Defaults if the -DUSE_* flags are not passed to gyp is 0. You can set + # the default value for the USE flag in the ebuild. + 'USE_hwid_override%': '0', + 'USE_power_management%': '0', + }, + 'cflags': [ + '-g', + '-ffunction-sections', + '-Wall', + '-Wextra', + '-Werror', + '-Wno-unused-parameter', + '-Wno-deprecated-register', + ], + 'cflags_cc': [ + '-fno-strict-aliasing', + '-std=gnu++11', + ], + 'ldflags': [ + '-Wl,--gc-sections', + ], + 'defines': [ + '__STDC_FORMAT_MACROS=1', + '_FILE_OFFSET_BITS=64', + '_POSIX_C_SOURCE=199309L', + 'USE_HWID_OVERRIDE=<(USE_hwid_override)', + 'USE_POWER_MANAGEMENT=<(USE_power_management)', + ], + }, + 'targets': [ + # Protobufs. + { + 'target_name': 'update_metadata-protos', + 'type': 'static_library', + 'variables': { + 'proto_in_dir': '.', + 'proto_out_dir': 'include/update_engine', + }, + 'sources': [ + 'update_metadata.proto' + ], + 'includes': ['../common-mk/protoc.gypi'], + }, + # D-Bus glib bindings. + { + 'target_name': 'update_engine-dbus-client', + 'type': 'none', + 'variables': { + 'dbus_glib_type': 'client', + 'dbus_glib_out_dir': 'include/update_engine', + 'dbus_glib_prefix': 'update_engine_service', + }, + 'sources': [ + 'update_engine.xml', + ], + 'includes': ['../common-mk/dbus_glib.gypi'], + }, + { + 'target_name': 'update_engine-dbus-server', + 'type': 'none', + 'variables': { + 'dbus_glib_type': 'server', + 'dbus_glib_out_dir': 'include/update_engine', + 'dbus_glib_prefix': 'update_engine_service', + }, + 'sources': [ + 'update_engine.xml', + ], + 'includes': ['../common-mk/dbus_glib.gypi'], + }, + # The main static_library with all the code. + { + 'target_name': 'libupdate_engine', + 'type': 'static_library', + 'dependencies': [ + 'update_metadata-protos', + 'update_engine-dbus-client', + 'update_engine-dbus-server', + ], + 'variables': { + 'exported_deps': [ + 'dbus-1', + 'dbus-glib-1', + 'ext2fs', + 'gio-2.0', + 'gio-unix-2.0', + 'glib-2.0', + 'gthread-2.0', + 'libchrome-<(libbase_ver)', + 'libchromeos-<(libbase_ver)', + 'libcrypto', + 'libcurl', + 'libmetrics-<(libbase_ver)', + 'libssl', + 'libxml-2.0', + 'protobuf', + ], + 'deps': ['<@(exported_deps)'], + }, + 'all_dependent_settings': { + 'variables': { + 'deps': [ + '<@(exported_deps)', + ], + }, + }, + 'link_settings': { + 'variables': { + 'deps': [ + '<@(exported_deps)', + ], + }, + 'libraries': [ + '-lbz2', + '-lgflags', + '-lpolicy-<(libbase_ver)', + '-lrootdev', + '-lrt', + '-lvboot_host', + ], + }, + 'sources': [ + 'action_processor.cc', + 'bzip.cc', + 'bzip_extent_writer.cc', + 'certificate_checker.cc', + 'chrome_browser_proxy_resolver.cc', + 'clock.cc', + 'connection_manager.cc', + 'constants.cc', + 'dbus_service.cc', + 'delta_performer.cc', + 'download_action.cc', + 'extent_ranges.cc', + 'extent_writer.cc', + 'file_descriptor.cc', + 'file_writer.cc', + 'filesystem_copier_action.cc', + 'hardware.cc', + 'http_common.cc', + 'http_fetcher.cc', + 'hwid_override.cc', + 'install_plan.cc', + 'libcurl_http_fetcher.cc', + 'metrics.cc', + 'multi_range_http_fetcher.cc', + 'omaha_hash_calculator.cc', + 'omaha_request_action.cc', + 'omaha_request_params.cc', + 'omaha_response_handler_action.cc', + 'p2p_manager.cc', + 'payload_constants.cc', + 'payload_generator/cycle_breaker.cc', + 'payload_generator/delta_diff_generator.cc', + 'payload_generator/extent_mapper.cc', + 'payload_generator/filesystem_iterator.cc', + 'payload_generator/full_update_generator.cc', + 'payload_generator/graph_utils.cc', + 'payload_generator/metadata.cc', + 'payload_generator/tarjan.cc', + 'payload_generator/topological_sort.cc', + 'payload_signer.cc', + 'payload_state.cc', + 'postinstall_runner_action.cc', + 'prefs.cc', + 'proxy_resolver.cc', + 'real_system_state.cc', + 'simple_key_value_store.cc', + 'subprocess.cc', + 'terminator.cc', + 'update_attempter.cc', + 'update_check_scheduler.cc', + 'update_manager/boxed_value.cc', + 'update_manager/chromeos_policy.cc', + 'update_manager/evaluation_context.cc', + 'update_manager/event_loop.cc', + 'update_manager/policy.cc', + 'update_manager/real_config_provider.cc', + 'update_manager/real_device_policy_provider.cc', + 'update_manager/real_random_provider.cc', + 'update_manager/real_shill_provider.cc', + 'update_manager/real_system_provider.cc', + 'update_manager/real_time_provider.cc', + 'update_manager/real_updater_provider.cc', + 'update_manager/state_factory.cc', + 'update_manager/update_manager.cc', + 'utils.cc', + ], + }, + # update_engine daemon. + { + 'target_name': 'update_engine', + 'type': 'executable', + 'dependencies': ['libupdate_engine'], + 'sources': [ + 'main.cc', + ] + }, + # update_engine console client. + { + 'target_name': 'update_engine_client', + 'type': 'executable', + 'dependencies': ['libupdate_engine'], + 'sources': [ + 'update_engine_client.cc', + ] + }, + # server-side delta generator. + { + 'target_name': 'delta_generator', + 'type': 'executable', + 'dependencies': ['libupdate_engine'], + 'link_settings': { + 'ldflags!': [ + '-pie', + ], + }, + 'sources': [ + 'payload_generator/generate_delta_main.cc', + ] + }, + ], + 'conditions': [ + ['USE_test == 1', { + 'targets': [ + # Public keys used for unit testing. + { + 'target_name': 'update_engine-testkeys', + 'type': 'none', + 'variables': { + 'openssl_pem_in_dir': '.', + 'openssl_pem_out_dir': 'include/update_engine', + }, + 'sources': [ + 'unittest_key.pem', + 'unittest_key2.pem', + ], + 'includes': ['../common-mk/openssl_pem.gypi'], + }, + # Test HTTP Server. + { + 'target_name': 'test_http_server', + 'type': 'executable', + 'dependencies': ['libupdate_engine'], + 'sources': [ + 'test_http_server.cc', + ] + }, + # Main unittest file. + { + 'target_name': 'update_engine_unittests', + 'type': 'executable', + 'dependencies': ['libupdate_engine'], + 'includes': ['../common-mk/common_test.gypi'], + 'defines': [ + 'SYSROOT="<(sysroot)"', + ], + 'sources': [ + 'action_pipe_unittest.cc', + 'action_processor_unittest.cc', + 'action_unittest.cc', + 'bzip_extent_writer_unittest.cc', + 'certificate_checker_unittest.cc', + 'chrome_browser_proxy_resolver_unittest.cc', + 'connection_manager_unittest.cc', + 'delta_performer_unittest.cc', + 'download_action_unittest.cc', + 'extent_ranges_unittest.cc', + 'extent_writer_unittest.cc', + 'fake_prefs.cc', + 'fake_system_state.cc', + 'file_writer_unittest.cc', + 'filesystem_copier_action_unittest.cc', + 'http_fetcher_unittest.cc', + 'hwid_override_unittest.cc', + 'mock_http_fetcher.cc', + 'omaha_hash_calculator_unittest.cc', + 'omaha_request_action_unittest.cc', + 'omaha_request_params_unittest.cc', + 'omaha_response_handler_action_unittest.cc', + 'p2p_manager_unittest.cc', + 'payload_generator/cycle_breaker_unittest.cc', + 'payload_generator/delta_diff_generator_unittest.cc', + 'payload_generator/extent_mapper_unittest.cc', + 'payload_generator/filesystem_iterator_unittest.cc', + 'payload_generator/full_update_generator_unittest.cc', + 'payload_generator/graph_utils_unittest.cc', + 'payload_generator/metadata_unittest.cc', + 'payload_generator/tarjan_unittest.cc', + 'payload_generator/topological_sort_unittest.cc', + 'payload_signer_unittest.cc', + 'payload_state_unittest.cc', + 'postinstall_runner_action_unittest.cc', + 'prefs_unittest.cc', + 'simple_key_value_store_unittest.cc', + 'subprocess_unittest.cc', + 'terminator_unittest.cc', + 'test_utils.cc', + 'update_attempter_unittest.cc', + 'update_check_scheduler_unittest.cc', + 'update_manager/boxed_value_unittest.cc', + 'update_manager/chromeos_policy_unittest.cc', + 'update_manager/evaluation_context_unittest.cc', + 'update_manager/event_loop_unittest.cc', + 'update_manager/generic_variables_unittest.cc', + 'update_manager/prng_unittest.cc', + 'update_manager/real_config_provider_unittest.cc', + 'update_manager/real_device_policy_provider_unittest.cc', + 'update_manager/real_random_provider_unittest.cc', + 'update_manager/real_shill_provider_unittest.cc', + 'update_manager/real_system_provider_unittest.cc', + 'update_manager/real_time_provider_unittest.cc', + 'update_manager/real_updater_provider_unittest.cc', + 'update_manager/umtest_utils.cc', + 'update_manager/update_manager_unittest.cc', + 'update_manager/variable_unittest.cc', + 'utils_unittest.cc', + 'zip_unittest.cc', + # Main entry point for runnning tests. + 'testrunner.cc', + ], + }, + ], + }], + ], +} @@ -669,6 +669,27 @@ bool GetFilesystemSizeFromFD(int fd, return true; } +string GetPathOnBoard(const string& command) { + int return_code = 0; + string command_path; + // TODO(deymo): prepend SYSROOT to each PATH instead of the result. + if (!Subprocess::SynchronousExec( + {"which", command}, &return_code, &command_path)) { + return command; + } + if (return_code != 0) + return command; + + base::TrimWhitespaceASCII(command_path, base::TRIM_ALL, &command_path); + const char* env_sysroot = getenv("SYSROOT"); + if (env_sysroot) { + string sysroot_command_path = env_sysroot + command_path; + if (utils::FileExists(sysroot_command_path.c_str())) + return sysroot_command_path; + } + return command_path; +} + // Tries to parse the header of an ELF file to obtain a human-readable // description of it on the |output| string. static bool GetFileFormatELF(const char* buffer, size_t size, string* output) { @@ -193,6 +193,10 @@ bool GetFilesystemSizeFromFD(int fd, int* out_block_count, int* out_block_size); +// Returns the path of the passed |command| on the board. This uses the +// environment variable SYSROOT to determine the path to the command on the +// board instead of the path on the running environment. +std::string GetPathOnBoard(const std::string& command); // Returns a human-readable string with the file format based on magic constants // on the header of the file. |