binman: Pass the toolpath to tests

Tools like ifwitool may not be available in the PATH, but are available in
the build. These tools may be needed by tests, so allow tests to use the
--toolpath flag.

Also use this flag with travis.

Signed-off-by: Simon Glass <sjg@chromium.org>
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index e27d86f..1b9db0c 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -176,7 +176,7 @@
       ./tools/buildman/buildman -P sandbox_spl && 
      export PYTHONPATH="${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc/pylibfdt";
      export PATH="${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc:${PATH}";
-     ./tools/binman/binman -t &&
+     ./tools/binman/binman --toolpath ${UBOOT_TRAVIS_BUILD_DIR}/tools -t &&
      ./tools/dtoc/dtoc -t
 
 # Test sandbox with test.py
diff --git a/.travis.yml b/.travis.yml
index f20268b..8bc7ec9 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -146,7 +146,7 @@
    if [[ -n "${TEST_PY_TOOLS}" ]]; then
      PYTHONPATH="${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc/pylibfdt"
      PATH="${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc:${PATH}"
-     ./tools/binman/binman -t &&
+     ./tools/binman/binman --toolpath ${UBOOT_TRAVIS_BUILD_DIR}/tools -t &&
      ./tools/patman/patman --test &&
      ./tools/buildman/buildman -t &&
      PYTHONPATH="${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc/pylibfdt"
diff --git a/test/run b/test/run
index 55a6649..b97647e 100755
--- a/test/run
+++ b/test/run
@@ -33,12 +33,14 @@
 	-k test_ut
 
 # Set up a path to dtc (device-tree compiler) and libfdt.py, a library it
-# provides and which is built by the sandbox_spl config.
+# provides and which is built by the sandbox_spl config. Also set up the path
+# to tools build by the build.
 DTC_DIR=build-sandbox_spl/scripts/dtc
 export PYTHONPATH=${DTC_DIR}/pylibfdt
 export DTC=${DTC_DIR}/dtc
+TOOLS_DIR=build-sandbox_spl/tools
 
-run_test "binman" ./tools/binman/binman -t
+run_test "binman" ./tools/binman/binman -t --toolpath ${TOOLS_DIR}
 run_test "patman" ./tools/patman/patman --test
 
 [ "$1" == "quick" ] && skip=--skip-net-tests
@@ -49,7 +51,8 @@
 # This needs you to set up Python test coverage tools.
 # To enable Python test coverage on Debian-type distributions (e.g. Ubuntu):
 #   $ sudo apt-get install python-pytest python-coverage
-run_test "binman code coverage" ./tools/binman/binman -T
+export PATH=$PATH:${TOOLS_DIR}
+run_test "binman code coverage" ./tools/binman/binman -T --toolpath ${TOOLS_DIR}
 run_test "dtoc code coverage" ./tools/dtoc/dtoc -T
 run_test "fdt code coverage" ./tools/dtoc/test_fdt -T
 
diff --git a/tools/binman/binman.py b/tools/binman/binman.py
index 9878eb8..52c03f6 100755
--- a/tools/binman/binman.py
+++ b/tools/binman/binman.py
@@ -46,7 +46,7 @@
 import control
 import test_util
 
-def RunTests(debug, verbosity, processes, test_preserve_dirs, args):
+def RunTests(debug, verbosity, processes, test_preserve_dirs, args, toolpath):
     """Run the functional tests and any embedded doctests
 
     Args:
@@ -60,6 +60,7 @@
         processes: Number of processes to use to run tests (None=same as #CPUs)
         args: List of positional args provided to binman. This can hold a test
             name to execute (as in 'binman -t testSections', for example)
+        toolpath: List of paths to use for tools
     """
     import elf_test
     import entry_test
@@ -79,6 +80,9 @@
         sys.argv.append('-D')
     if verbosity:
         sys.argv.append('-v%d' % verbosity)
+    if toolpath:
+        for path in toolpath:
+            sys.argv += ['--toolpath', path]
 
     # Run the entry tests first ,since these need to be the first to import the
     # 'entry' module.
@@ -91,7 +95,8 @@
         if hasattr(module, 'setup_test_args'):
             setup_test_args = getattr(module, 'setup_test_args')
             setup_test_args(preserve_indir=test_preserve_dirs,
-                preserve_outdirs=test_preserve_dirs and test_name is not None)
+                preserve_outdirs=test_preserve_dirs and test_name is not None,
+                toolpath=toolpath)
         if test_name:
             try:
                 suite.addTests(loader.loadTestsFromName(test_name, module))
@@ -167,7 +172,8 @@
 
     if options.test:
         ret_code = RunTests(options.debug, options.verbosity, options.processes,
-                            options.test_preserve_dirs, args[1:])
+                            options.test_preserve_dirs, args[1:],
+                            options.toolpath)
 
     elif options.test_coverage:
         RunTestCoverage()
diff --git a/tools/binman/ftest.py b/tools/binman/ftest.py
index 256d4a1..3455b8c 100644
--- a/tools/binman/ftest.py
+++ b/tools/binman/ftest.py
@@ -144,7 +144,8 @@
         self._indir = None
 
     @classmethod
-    def setup_test_args(cls, preserve_indir=False, preserve_outdirs=False):
+    def setup_test_args(cls, preserve_indir=False, preserve_outdirs=False,
+                        toolpath=None):
         """Accept arguments controlling test execution
 
         Args:
@@ -153,9 +154,11 @@
             preserve_outdir: Preserve the output directories used by tests. Each
                 test has its own, so this is normally only useful when running a
                 single test.
+            toolpath: ist of paths to use for tools
         """
         cls.preserve_indir = preserve_indir
         cls.preserve_outdirs = preserve_outdirs
+        cls.toolpath = toolpath
 
     def setUp(self):
         # Enable this to turn on debugging output
@@ -256,6 +259,9 @@
         if images:
             for image in images:
                 args += ['-i', image]
+        if self.toolpath:
+            for path in self.toolpath:
+                args += ['--toolpath', path]
         return self._DoBinman(*args)
 
     def _SetupDtb(self, fname, outfile='u-boot.dtb'):