| # Copyright 2015 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. |
| |
| """Tests for the sysroot library.""" |
| |
| from __future__ import print_function |
| |
| import os |
| import re |
| |
| from chromite.lib import cros_test_lib |
| from chromite.lib import osutils |
| from chromite.lib import sysroot_lib |
| from chromite.lib import toolchain |
| |
| |
| class SysrootLibTest(cros_test_lib.MockTempDirTestCase): |
| """Unittest for sysroot_lib.py""" |
| |
| def setUp(self): |
| """Setup the test environment.""" |
| # Fake being root to avoid running all filesystem commands with |
| # SudoRunCommand. |
| self.PatchObject(os, 'getuid', return_value=0) |
| |
| def testGetStandardField(self): |
| """Tests that standard field can be fetched correctly.""" |
| sysroot = sysroot_lib.Sysroot(self.tempdir) |
| sysroot.WriteConfig('FOO="bar"') |
| self.assertEqual('bar', sysroot.GetStandardField('FOO')) |
| |
| # Works with multiline strings |
| multiline = """foo |
| bar |
| baz |
| """ |
| sysroot.WriteConfig('TEST="%s"' % multiline) |
| self.assertEqual(multiline, sysroot.GetStandardField('TEST')) |
| |
| def testReadWriteCache(self): |
| """Tests that we can write and read to the cache.""" |
| sysroot = sysroot_lib.Sysroot(self.tempdir) |
| |
| # If a field is not defined we get None. |
| self.assertEqual(None, sysroot.GetCachedField('foo')) |
| |
| # If we set a field, we can get it. |
| sysroot.SetCachedField('foo', 'bar') |
| self.assertEqual('bar', sysroot.GetCachedField('foo')) |
| |
| # Setting a field in an existing cache preserve the previous values. |
| sysroot.SetCachedField('hello', 'bonjour') |
| self.assertEqual('bar', sysroot.GetCachedField('foo')) |
| self.assertEqual('bonjour', sysroot.GetCachedField('hello')) |
| |
| # Setting a field to None unsets it. |
| sysroot.SetCachedField('hello', None) |
| self.assertEqual(None, sysroot.GetCachedField('hello')) |
| |
| def testErrorOnBadCachedValue(self): |
| """Tests that we detect bad value for the sysroot cache.""" |
| sysroot = sysroot_lib.Sysroot(self.tempdir) |
| |
| forbidden = [ |
| 'hello"bonjour', |
| 'hello\\bonjour', |
| 'hello\nbonjour', |
| 'hello$bonjour', |
| 'hello`bonjour', |
| ] |
| for value in forbidden: |
| with self.assertRaises(ValueError): |
| sysroot.SetCachedField('FOO', value) |
| |
| def testProfileGeneration(self): |
| """Tests that we generate the portage profile correctly.""" |
| # pylint: disable=protected-access |
| overlay_dir = os.path.join(self.tempdir, 'overlays') |
| sysroot_dir = os.path.join(self.tempdir, 'sysroot') |
| overlays = [os.path.join(overlay_dir, letter) for letter in ('a', 'b', 'c')] |
| for o in overlays: |
| osutils.SafeMakedirs(o) |
| sysroot = sysroot_lib.Sysroot(sysroot_dir) |
| |
| sysroot.WriteConfig(sysroot_lib._DictToKeyValue( |
| {'ARCH': 'arm', |
| 'BOARD_OVERLAY': '\n'.join(overlays)})) |
| |
| sysroot._GenerateProfile() |
| |
| profile_link = os.path.join(sysroot.path, 'etc', 'portage', 'make.profile') |
| profile_parent = osutils.ReadFile( |
| os.path.join(profile_link, 'parent')).splitlines() |
| self.assertTrue(os.path.islink(profile_link)) |
| self.assertEqual(1, len(profile_parent)) |
| self.assertTrue(re.match('chromiumos:.*arm.*', profile_parent[0])) |
| |
| profile_dir = os.path.join(overlays[1], 'profiles', 'base') |
| osutils.SafeMakedirs(profile_dir) |
| |
| sysroot._GenerateProfile() |
| profile_parent = osutils.ReadFile( |
| os.path.join(profile_link, 'parent')).splitlines() |
| self.assertEqual(2, len(profile_parent)) |
| self.assertEqual(profile_dir, profile_parent[1]) |
| |
| def testGenerateConfigNoToolchainRaisesError(self): |
| """Tests _GenerateConfig() with no toolchain raises an error.""" |
| self.PatchObject(toolchain, 'FilterToolchains', autospec=True, |
| return_value={}) |
| sysroot = sysroot_lib.Sysroot(self.tempdir) |
| |
| with self.assertRaises(sysroot_lib.ConfigurationError): |
| # pylint: disable=protected-access |
| sysroot._GenerateConfig({}, ['foo_overlay'], ['foo_overlay'], '') |