blob: 0b3ec6b6fc7a2dcdc64bc3c099a16dcb9bb3573c [file] [log] [blame]
# Copyright 2014 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Functions related to image tests."""
import enum
import unittest
# Symlinks to mounted partitions.
ROOT_A = "dir-ROOT-A"
STATEFUL = "dir-STATE"
class ImageType(enum.Enum):
"""The image we are testing."""
# A chromeos image file to test
BIN_FILE = enum.auto()
# A path in the filesystem to test.
BIND_MOUNT = enum.auto()
class _ImageTestMixin:
"""A mixin to hold image test's specific info."""
_board = None
_image_type: ImageType = None
_result_dir = None
def SetBoard(self, board) -> None:
self._board = board
def SetImageType(self, image_type: ImageType) -> None:
self._image_type = image_type
def SetResultDir(self, result_dir) -> None:
self._result_dir = result_dir
class ImageTestCase(unittest.TestCase, _ImageTestMixin):
"""Subclass unittest.TestCase to provide utility methods for image tests.
Tests MUST use prefix "Test" (e.g.: TestLinkage, TestDiskSpace), not "test"
prefix, in order to be picked up by the test runner.
Tests are run inside chroot. Tests are run as root. DO NOT modify any
mounted partitions.
The current working directory is set up so that "ROOT_A", and "STATEFUL"
constants refer to the mounted partitions. The partitions are mounted
readonly.
current working directory
+ ROOT_A
+ /
+ bin
+ etc
+ usr
...
+ STATEFUL
+ var_overlay
...
"""
class ImageTestSuite(unittest.TestSuite, _ImageTestMixin):
"""Wrap around unittest.TestSuite to pass more info to the actual tests."""
def run(self, result, debug=False):
for t in self._tests:
t.SetResultDir(self._result_dir)
t.SetImageType(self._image_type)
t.SetBoard(self._board)
return super().run(result)
class ImageTestRunner(unittest.TextTestRunner, _ImageTestMixin):
"""Wrap around unittest.TextTestRunner to pass more info down the chain."""
def run(self, test):
test.SetResultDir(self._result_dir)
test.SetBoard(self._board)
test.SetImageType(self._image_type)
return super().run(test)