| # Copyright 2014 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. |
| |
| """Script to mount a built image and run tests on it.""" |
| |
| from __future__ import print_function |
| |
| import os |
| import unittest |
| |
| from chromite.lib import constants |
| from chromite.lib import commandline |
| from chromite.lib import cros_logging as logging |
| from chromite.lib import image_test_lib |
| from chromite.lib import osutils |
| from chromite.lib import path_util |
| |
| |
| def ParseArgs(args): |
| """Return parsed commandline arguments.""" |
| |
| parser = commandline.ArgumentParser() |
| parser.add_argument('--test_results_root', type='path', |
| help='Directory to store test results') |
| parser.add_argument('--board', type=str, help='Board (wolf, beaglebone...)') |
| parser.add_argument('image_dir', type='path', |
| help='Image directory (or file) with mount_image.sh and ' |
| 'umount_image.sh') |
| opts = parser.parse_args(args) |
| opts.Freeze() |
| return opts |
| |
| |
| def FindImage(image_path): |
| """Return the path to the image file. |
| |
| Args: |
| image_path: A path to the image file, or a directory containing the base |
| image. |
| |
| Returns: |
| ImageFileAndMountScripts containing absolute paths to the image, |
| the mount and umount invocation commands |
| """ |
| |
| if os.path.isdir(image_path): |
| # Assume base image. |
| image_file = os.path.join(image_path, constants.BASE_IMAGE_NAME + '.bin') |
| if not os.path.exists(image_file): |
| raise ValueError('Cannot find base image %s' % image_file) |
| elif os.path.isfile(image_path): |
| image_file = image_path |
| else: |
| raise ValueError('%s is neither a directory nor a file' % image_path) |
| |
| return image_file |
| |
| |
| def main(args): |
| opts = ParseArgs(args) |
| |
| # Build up test suites. |
| loader = unittest.TestLoader() |
| loader.suiteClass = image_test_lib.ImageTestSuite |
| # We use a different prefix here so that unittest DO NOT pick up the |
| # image tests automatically because they depend on a proper environment. |
| loader.testMethodPrefix = 'Test' |
| all_tests = loader.loadTestsFromName('chromite.cros.test.image_test') |
| forgiving = image_test_lib.ImageTestSuite() |
| non_forgiving = image_test_lib.ImageTestSuite() |
| for suite in all_tests: |
| for test in suite.GetTests(): |
| if test.IsForgiving(): |
| forgiving.addTest(test) |
| else: |
| non_forgiving.addTest(test) |
| |
| # Run them in the image directory. |
| runner = image_test_lib.ImageTestRunner() |
| runner.SetBoard(opts.board) |
| runner.SetResultDir(opts.test_results_root) |
| image_file = FindImage(opts.image_dir) |
| tmp_in_chroot = path_util.FromChrootPath('/tmp') |
| with osutils.TempDir(base_dir=tmp_in_chroot) as temp_dir: |
| with osutils.MountImageContext(image_file, temp_dir): |
| with osutils.ChdirContext(temp_dir): |
| # Run non-forgiving tests first so that exceptions in forgiving tests |
| # do not skip any required tests. |
| logging.info('Running NON-forgiving tests.') |
| result = runner.run(non_forgiving) |
| logging.info('Running forgiving tests.') |
| runner.run(forgiving) |
| |
| if result and not result.wasSuccessful(): |
| return 1 |
| return 0 |