blob: c863a1dc961b1d3ffa71a67c98b5b4fd262cf5b8 [file] [log] [blame]
# Copyright 2012 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Unit tests for common_util module."""
import os
import shutil
import tempfile
from chromite.lib import cros_test_lib
from chromite.lib import osutils
from chromite.lib.xbuddy import common_util
from chromite.lib.xbuddy import devserver_constants
pytestmark = cros_test_lib.pytestmark_inside_only
# Fake Dev Server Layout:
TEST_LAYOUT = {
"test-board-1": ["R17-1413.0.0-a1-b1346", "R17-18.0.0-a1-b1346"],
"test-board-2": ["R16-2241.0.0-a0-b2", "R17-2.0.0-a1-b1346"],
"test-board-3": [],
}
class CommonUtilTest(cros_test_lib.TestCase):
"""Base class for CommonUtil tests."""
def setUp(self) -> None:
self._static_dir = tempfile.mkdtemp("common_util_unittest")
self._outside_sandbox_dir = tempfile.mkdtemp("common_util_unittest")
# Set up some basic existing structure used by GetLatest* tests.
for board, builds in TEST_LAYOUT.items():
board_path = os.path.join(self._static_dir, board)
os.mkdir(board_path)
for build in builds:
build_path = os.path.join(board_path, build)
osutils.WriteFile(
os.path.join(
build_path, devserver_constants.TEST_IMAGE_FILE
),
"TEST_IMAGE_FILE",
makedirs=True,
)
osutils.WriteFile(
os.path.join(build_path, devserver_constants.STATEFUL_FILE),
"STATEFUL_FILE",
)
osutils.WriteFile(
os.path.join(build_path, devserver_constants.UPDATE_FILE),
"UPDATE_FILE",
)
def tearDown(self) -> None:
shutil.rmtree(self._static_dir)
shutil.rmtree(self._outside_sandbox_dir)
def testPathInDir(self) -> None:
"""Various tests around the PathInDir test."""
# Path is in sandbox.
self.assertTrue(
common_util.PathInDir(
self._static_dir, os.path.join(self._static_dir, "some-board")
)
)
# Path is sandbox.
self.assertFalse(
common_util.PathInDir(self._static_dir, self._static_dir)
)
# Path is outside the sandbox.
self.assertFalse(
common_util.PathInDir(self._static_dir, self._outside_sandbox_dir)
)
# Path contains '..'.
self.assertFalse(
common_util.PathInDir(
self._static_dir, os.path.join(self._static_dir, os.pardir)
)
)
# Path contains symbolic link references.
os.chdir(self._static_dir)
os.symlink(os.pardir, "parent")
self.assertFalse(
common_util.PathInDir(
self._static_dir, os.path.join(self._static_dir, os.pardir)
)
)
def testGetLatestBuildVersion(self) -> None:
"""Tests that the latest version is correct given our setup."""
self.assertEqual(
common_util.GetLatestBuildVersion(self._static_dir, "test-board-1"),
"R17-1413.0.0-a1-b1346",
)
def testGetLatestBuildVersionLatest(self) -> None:
"""Test that we raise CommonUtilError when a build dir is empty."""
self.assertRaises(
common_util.CommonUtilError,
common_util.GetLatestBuildVersion,
self._static_dir,
"test-board-3",
)
def testGetLatestBuildVersionUnknownBuild(self) -> None:
"""Verify we raise CommonUtilError when a build dir does not exist."""
self.assertRaises(
common_util.CommonUtilError,
common_util.GetLatestBuildVersion,
self._static_dir,
"bad-dir",
)
def testGetLatestBuildVersionMilestone(self) -> None:
"""Test that we can get builds based on milestone."""
expected_build_str = "R16-2241.0.0-a0-b2"
milestone = "R16"
build_str = common_util.GetLatestBuildVersion(
self._static_dir, "test-board-2", milestone
)
self.assertEqual(expected_build_str, build_str)
def testGetControlFile(self) -> None:
"""Creates a fake control file and verifies that we can get it."""
control_file_dir = os.path.join(
self._static_dir,
"test-board-1",
"R17-1413.0.0-a1-b1346",
"autotest",
"server",
"site_tests",
"network_VPN",
)
os.makedirs(control_file_dir)
osutils.WriteFile(os.path.join(control_file_dir, "control"), "hello!")
control_content = common_util.GetControlFile(
self._static_dir,
"test-board-1/R17-1413.0.0-a1-b1346",
os.path.join("server", "site_tests", "network_VPN", "control"),
)
self.assertEqual(control_content, "hello!")
def testSymlinkFile(self) -> None:
link_fd, link_base = tempfile.mkstemp(prefix="common-symlink-test")
link_a = link_base + "-link-a"
link_b = link_base + "-link-b"
# Create the "link a" --> "base".
common_util.SymlinkFile(link_base, link_a)
self.assertTrue(os.path.lexists(link_a))
self.assertEqual(os.readlink(link_a), link_base)
# Create the "link b" --> "base".
common_util.SymlinkFile(link_base, link_b)
self.assertTrue(os.path.lexists(link_b))
self.assertEqual(os.readlink(link_b), link_base)
# Replace the existing "link b" to point to "link a".
common_util.SymlinkFile(link_a, link_b)
self.assertTrue(os.path.lexists(link_b))
self.assertEqual(os.readlink(link_b), link_a)
os.close(link_fd)
os.unlink(link_b)
os.unlink(link_a)
os.unlink(link_base)