[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 09/31] tests/functional: add helpers for building file paths
From: |
Daniel P . Berrangé |
Subject: |
[PATCH v2 09/31] tests/functional: add helpers for building file paths |
Date: |
Wed, 11 Dec 2024 17:26:25 +0000 |
Add helper methods that construct paths for
* log files - to be preserved at the end of a test
* scratch files - to be purged at the end of a test
* build files - anything relative to the build root
* data files - anything relative to the functional test source root
* socket files - a short temporary dir to avoid UNIX socket limits
These are to be used instead of direct access to the self.workdir,
or self.logdir variables, or any other place where paths are built
manually.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
tests/functional/qemu_test/testcase.py | 95 ++++++++++++++++++++++++++
1 file changed, 95 insertions(+)
diff --git a/tests/functional/qemu_test/testcase.py
b/tests/functional/qemu_test/testcase.py
index 90ae59eb54..89425b737c 100644
--- a/tests/functional/qemu_test/testcase.py
+++ b/tests/functional/qemu_test/testcase.py
@@ -13,10 +13,12 @@
import logging
import os
+from pathlib import Path
import pycotap
import shutil
import subprocess
import sys
+import tempfile
import unittest
import uuid
@@ -37,9 +39,99 @@ class QemuBaseTest(unittest.TestCase):
log = None
logdir = None
+ '''
+ Create a temporary directory suitable for storing UNIX
+ socket paths.
+
+ Returns: a tempfile.TemporaryDirectory instance
+ '''
+ def socket_dir(self):
+ if self.socketdir is None:
+ self.socketdir = tempfile.TemporaryDirectory(
+ prefix="qemu_func_test_sock_")
+ return self.socketdir
+
+ '''
+ @params args list of zero or more subdirectories or file
+
+ Construct a path for accessing a data file located
+ relative to the source directory that is the root for
+ functional tests.
+
+ @args may be an empty list to reference the root dir
+ itself, may be a single element to reference a file in
+ the root directory, or may be multiple elements to
+ reference a file nested below. The path components
+ will be joined using the platform appropriate path
+ separator.
+
+ Returns: string representing a file path
+ '''
+ def data_file(self, *args):
+ return str(Path(Path(__file__).parent.parent, *args))
+
+ '''
+ @params args list of zero or more subdirectories or file
+
+ Construct a path for accessing a data file located
+ relative to the build directory root.
+
+ @args may be an empty list to reference the build dir
+ itself, may be a single element to reference a file in
+ the build directory, or may be multiple elements to
+ reference a file nested below. The path components
+ will be joined using the platform appropriate path
+ separator.
+
+ Returns: string representing a file path
+ '''
+ def build_file(self, *args):
+ return str(Path(BUILD_DIR, *args))
+
+ '''
+ @params args list of zero or more subdirectories or file
+
+ Construct a path for accessing/creating a scratch file
+ located relative to a temporary directory dedicated to
+ this test case. The directory and its contents will be
+ purged upon completion of the test.
+
+ @args may be an empty list to reference the scratch dir
+ itself, may be a single element to reference a file in
+ the scratch directory, or may be multiple elements to
+ reference a file nested below. The path components
+ will be joined using the platform appropriate path
+ separator.
+
+ Returns: string representing a file path
+ '''
+ def scratch_file(self, *args):
+ return str(Path(self.workdir, *args))
+
+ '''
+ @params args list of zero or more subdirectories or file
+
+ Construct a path for accessing/creating a log file
+ located relative to a temporary directory dedicated to
+ this test case. The directory and its log files will be
+ preserved upon completion of the test.
+
+ @args may be an empty list to reference the log dir
+ itself, may be a single element to reference a file in
+ the log directory, or may be multiple elements to
+ reference a file nested below. The path components
+ will be joined using the platform appropriate path
+ separator.
+
+ Returns: string representing a file path
+ '''
+ def log_file(self, *args):
+ return str(Path(self.logdir, *args))
+
def setUp(self, bin_prefix):
self.assertIsNotNone(self.qemu_bin, 'QEMU_TEST_QEMU_BINARY must be
set')
self.arch = self.qemu_bin.split('-')[-1]
+ self.socketdir = None
self.outputdir = os.path.join(BUILD_DIR, 'tests', 'functional',
self.arch, self.id())
@@ -65,6 +157,9 @@ def setUp(self, bin_prefix):
def tearDown(self):
if "QEMU_TEST_KEEP_SCRATCH" not in os.environ:
shutil.rmtree(self.workdir)
+ if self.socketdir is not None:
+ shutil.rmtree(self.socketdir.name)
+ self.socketdir = None
self.machinelog.removeHandler(self._log_fh)
self.log.removeHandler(self._log_fh)
--
2.46.0
- [PATCH v2 03/31] tests/functional: remove duplicated 'which' function impl, (continued)
- [PATCH v2 03/31] tests/functional: remove duplicated 'which' function impl, Daniel P . Berrangé, 2024/12/11
- [PATCH v2 04/31] tests/functional: simplify 'which' implementation, Daniel P . Berrangé, 2024/12/11
- [PATCH v2 05/31] tests/functional: drop 'tesseract_available' helper, Daniel P . Berrangé, 2024/12/11
- [PATCH v2 06/31] tests/functional: introduce some helpful decorators, Daniel P . Berrangé, 2024/12/11
- [PATCH v2 07/31] tests/functional: switch to new test skip decorators, Daniel P . Berrangé, 2024/12/11
- [PATCH v2 09/31] tests/functional: add helpers for building file paths,
Daniel P . Berrangé <=
- [PATCH v2 08/31] tests/functional: drop 'has_cmd' and 'has_cmds' helpers, Daniel P . Berrangé, 2024/12/11
- [PATCH v2 10/31] tests/functional: switch over to using self.log_file(...), Daniel P . Berrangé, 2024/12/11
- [PATCH v2 11/31] tests/functional: switch over to using self.build_file(...), Daniel P . Berrangé, 2024/12/11
- [PATCH v2 12/31] tests/functional: switch over to using self.data_file(...), Daniel P . Berrangé, 2024/12/11
- [PATCH v2 14/31] tests/functional: switch over to using self.socket_dir(...), Daniel P . Berrangé, 2024/12/11