Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2018-03-01 19:39:57 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2018-03-01 19:44:35 +0300
commit3a3dfd4e650cfcbf93fe6439f444108760d27b61 (patch)
treebe7f8cf9c6648d22f12a03a6492317d2dca97785 /tests
parent1178518a689eba1b53b455a07612fcc77bde45df (diff)
Python tests: Split re-usable test related functionality to a module
The idea is to avoid re-implementing this for an upcoming FFmpeg tests.
Diffstat (limited to 'tests')
-rwxr-xr-xtests/python/alembic_tests.py59
-rwxr-xr-xtests/python/modules/test_utils.py97
2 files changed, 101 insertions, 55 deletions
diff --git a/tests/python/alembic_tests.py b/tests/python/alembic_tests.py
index 96a68de9801..b9dc78a821f 100755
--- a/tests/python/alembic_tests.py
+++ b/tests/python/alembic_tests.py
@@ -28,37 +28,17 @@ import sys
import tempfile
import unittest
+from modules.test_utils import (with_tempdir,
+ AbstractBlenderRunnerTest,
+ )
-def with_tempdir(wrapped):
- """Creates a temporary directory for the function, cleaning up after it returns normally.
-
- When the wrapped function raises an exception, the contents of the temporary directory
- remain available for manual inspection.
-
- The wrapped function is called with an extra positional argument containing
- the pathlib.Path() of the temporary directory.
- """
-
- @functools.wraps(wrapped)
- def decorator(*args, **kwargs):
- dirname = tempfile.mkdtemp(prefix='blender-alembic-test')
- try:
- retval = wrapped(*args, pathlib.Path(dirname), **kwargs)
- except:
- print('Exception in %s, not cleaning up temporary directory %s' % (wrapped, dirname))
- raise
- else:
- shutil.rmtree(dirname)
- return retval
-
- return decorator
class AbcPropError(Exception):
"""Raised when AbstractAlembicTest.abcprop() finds an error."""
-class AbstractAlembicTest(unittest.TestCase):
+class AbstractAlembicTest(AbstractBlenderRunnerTest):
@classmethod
def setUpClass(cls):
import re
@@ -74,37 +54,6 @@ class AbstractAlembicTest(unittest.TestCase):
# 'abcls' array notation, like "name[16]"
cls.abcls_array = re.compile(r'^(?P<name>[^\[]+)(\[(?P<arraysize>\d+)\])?$')
- def run_blender(self, filepath: str, python_script: str, timeout: int=300) -> str:
- """Runs Blender by opening a blendfile and executing a script.
-
- Returns Blender's stdout + stderr combined into one string.
-
- :param filepath: taken relative to self.testdir.
- :param timeout: in seconds
- """
-
- blendfile = self.testdir / filepath
-
- command = (
- self.blender,
- '--background',
- '-noaudio',
- '--factory-startup',
- '--enable-autoexec',
- str(blendfile),
- '-E', 'CYCLES',
- '--python-exit-code', '47',
- '--python-expr', python_script,
- )
-
- proc = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
- timeout=timeout)
- output = proc.stdout.decode('utf8')
- if proc.returncode:
- self.fail('Error %d running Blender:\n%s' % (proc.returncode, output))
-
- return output
-
def abcprop(self, filepath: pathlib.Path, proppath: str) -> dict:
"""Uses abcls to obtain compound property values from an Alembic object.
diff --git a/tests/python/modules/test_utils.py b/tests/python/modules/test_utils.py
new file mode 100755
index 00000000000..489f36c913f
--- /dev/null
+++ b/tests/python/modules/test_utils.py
@@ -0,0 +1,97 @@
+#!/usr/bin/env python3
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+import argparse
+import functools
+import shutil
+import pathlib
+import re
+import subprocess
+import sys
+import tempfile
+import unittest
+
+
+def with_tempdir(wrapped):
+ """Creates a temporary directory for the function, cleaning up after it returns normally.
+
+ When the wrapped function raises an exception, the contents of the temporary directory
+ remain available for manual inspection.
+
+ The wrapped function is called with an extra positional argument containing
+ the pathlib.Path() of the temporary directory.
+ """
+
+ @functools.wraps(wrapped)
+ def decorator(*args, **kwargs):
+ dirname = tempfile.mkdtemp(prefix='blender-alembic-test')
+ try:
+ retval = wrapped(*args, pathlib.Path(dirname), **kwargs)
+ except:
+ print('Exception in %s, not cleaning up temporary directory %s' % (wrapped, dirname))
+ raise
+ else:
+ shutil.rmtree(dirname)
+ return retval
+
+ return decorator
+
+
+class AbstractBlenderRunnerTest(unittest.TestCase):
+ """Base class for all test suites which needs to run Blender"""
+
+ @classmethod
+ def setUpClass(cls):
+ global args
+ cls.blender = args.blender
+ cls.testdir = pathlib.Path(args.testdir)
+
+ def run_blender(self, filepath: str, python_script: str, timeout: int=300) -> str:
+ """Runs Blender by opening a blendfile and executing a script.
+
+ Returns Blender's stdout + stderr combined into one string.
+
+ :param filepath: taken relative to self.testdir.
+ :param timeout: in seconds
+ """
+
+ blendfile = self.testdir / filepath
+
+ command = (
+ self.blender,
+ '--background',
+ '-noaudio',
+ '--factory-startup',
+ '--enable-autoexec',
+ str(blendfile),
+ '-E', 'CYCLES',
+ '--python-exit-code', '47',
+ '--python-expr', python_script,
+ )
+
+ proc = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
+ timeout=timeout)
+ output = proc.stdout.decode('utf8')
+ if proc.returncode:
+ self.fail('Error %d running Blender:\n%s' % (proc.returncode, output))
+
+ return output
+