blob: da71123e30b34cd63e03fb7669cbe8670f0fa385 [file] [log] [blame]
# 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'], '')