#!/usr/bin/python # # Copyright (c) 2011 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. """Unit tests for cros_build_lib.""" import mox import os import tempfile import unittest import cros_build_lib class CrosBuildLibTest(mox.MoxTestBase): """Test class for cros_build_lib.""" def testRunCommandSimple(self): """Test that RunCommand can run a simple successful command.""" result = cros_build_lib.RunCommand(['ls'], # Keep the test quiet options print_cmd=False, redirect_stdout=True, redirect_stderr=True, # Test specific options exit_code=True) self.assertEqual(result, 0) def testRunCommandError(self): """Test that RunCommand can return an error code for a failed command.""" result = cros_build_lib.RunCommand(['ls', '/nosuchdir'], # Keep the test quiet options print_cmd=False, redirect_stdout=True, redirect_stderr=True, # Test specific options exit_code=True) self.assertNotEqual(result, 0) self.assertEquals(type(result), int) def testRunCommandErrorRetries(self): """Test that RunCommand can retry a failed command that always fails.""" # We don't actually check that it's retrying, just exercise the code path. result = cros_build_lib.RunCommand(['ls', '/nosuchdir'], # Keep the test quiet options print_cmd=False, redirect_stdout=True, redirect_stderr=True, # Test specific options num_retries=2, error_ok=True, exit_code=True) self.assertNotEqual(result, 0) self.assertEquals(type(result), int) def testRunCommandErrorException(self): """Test that RunCommand can throw an exception when a command fails.""" function = lambda : cros_build_lib.RunCommand(['ls', '/nosuchdir'], # Keep the test quiet options print_cmd=False, redirect_stdout=True, redirect_stderr=True) self.assertRaises(cros_build_lib.RunCommandException, function) def testRunCommandErrorCodeNoException(self): """Test that RunCommand doesn't throw an exception with exit_code.""" result = cros_build_lib.RunCommand(['ls', '/nosuchdir'], # Keep the test quiet options print_cmd=False, redirect_stdout=True, redirect_stderr=True, # Test specific options exit_code=True) # We are really testing that it doesn't throw an exception if exit_code # if true. self.assertNotEqual(result, 0) self.assertEquals(type(result), int) def testRunCommandCaptureOutput(self): """Test that RunCommand can capture stdout if a command succeeds.""" result = cros_build_lib.RunCommand(['echo', '-n', 'Hi'], # Keep the test quiet options print_cmd=False, redirect_stdout=True, redirect_stderr=True) self.assertEqual(result, 'Hi') def testRunCommandLogToFile(self): """Test that RunCommand can log output to a file correctly.""" log_file = tempfile.mktemp() cros_build_lib.RunCommand(['echo', '-n', 'Hi'], # Keep the test quiet options print_cmd=False, # Test specific options log_to_file=log_file) log_fh = open(log_file) log_data = log_fh.read() self.assertEquals('Hi', log_data) log_fh.close() os.remove(log_file) def testGetCrosUtilsPathInChroot(self): """Tests whether we can get crosutils from chroot.""" self.mox.StubOutWithMock(cros_build_lib, 'IsInsideChroot') crosutils_path_src = '/home/' + os.getenv('USER') + 'trunk/src/scripts' crosutils_path_installed = '/usr/lib/crosutils' cros_build_lib.IsInsideChroot().MultipleTimes().AndReturn(True) self.mox.ReplayAll() self.assertTrue(cros_build_lib.GetCrosUtilsPath(source_dir_path=True), crosutils_path_src) self.assertTrue(cros_build_lib.GetCrosUtilsPath(source_dir_path=False), crosutils_path_installed) self.mox.VerifyAll() def testGetCrosUtilsPathOutsideChroot(self): """Tests whether we can get crosutils from outside chroot.""" self.mox.StubOutWithMock(cros_build_lib, 'IsInsideChroot') path = os.path.join(os.path.dirname(os.path.realpath(__file__)), '..') cros_build_lib.IsInsideChroot().MultipleTimes().AndReturn(False) self.mox.ReplayAll() self.assertTrue(cros_build_lib.GetCrosUtilsPath(), path) self.mox.VerifyAll() def testGetCrosUtilsBinPath(self): """Tests whether we can get crosutilsbin correctly.""" self.mox.StubOutWithMock(cros_build_lib, 'IsInsideChroot') self.mox.StubOutWithMock(cros_build_lib, 'GetCrosUtilsPath') src_path = '/fake/src' chroot_src_path = '/chroot/fake/src' chroot_path = '/usr/bin' cros_build_lib.IsInsideChroot().AndReturn(False) cros_build_lib.GetCrosUtilsPath(True).AndReturn(src_path) cros_build_lib.IsInsideChroot().AndReturn(True) cros_build_lib.GetCrosUtilsPath(True).AndReturn(chroot_src_path) cros_build_lib.IsInsideChroot().AndReturn(True) self.mox.ReplayAll() # Outside chroot. self.assertTrue(cros_build_lib.GetCrosUtilsBinPath(source_dir_path=True), src_path + '/bin') # Rest inside chroot. self.assertTrue(cros_build_lib.GetCrosUtilsBinPath(source_dir_path=True), chroot_src_path + '/bin') self.assertTrue(cros_build_lib.GetCrosUtilsBinPath(source_dir_path=False), chroot_path) self.mox.VerifyAll() if __name__ == '__main__': unittest.main()