summaryrefslogtreecommitdiff
path: root/oslotest
diff options
context:
space:
mode:
authorDoug Hellmann <doug@doughellmann.com>2015-06-11 20:08:29 +0000
committerDoug Hellmann <doug@doughellmann.com>2015-06-12 19:15:18 +0000
commitcc57067355db081f66de04664f1f88a76cd0f16d (patch)
treed683eb3b5d0e44a0a2320d014cbe61da5c4c81c0 /oslotest
parent5f63439ee7211b874bb4e12d0c8addd2bcc478a8 (diff)
downloadoslotest-cc57067355db081f66de04664f1f88a76cd0f16d.tar.gz
Add CreateFileWithContent fixture
Add a fixture for creating real files on the filesystem with contents, to replace the implementation inside the test base class. Blueprint oslotest-refactor-test-base-class Change-Id: Ibca716d1054da973583e5bb4694ef1d64750d50a
Diffstat (limited to 'oslotest')
-rw-r--r--oslotest/base.py24
-rw-r--r--oslotest/createfile.py70
2 files changed, 78 insertions, 16 deletions
diff --git a/oslotest/base.py b/oslotest/base.py
index aa162f8..b77f846 100644
--- a/oslotest/base.py
+++ b/oslotest/base.py
@@ -15,15 +15,12 @@
"""Common utilities used in testing"""
-import os
-import tempfile
-
import fixtures
+from oslotest import createfile
from oslotest import log
from oslotest import output
from oslotest import timeout
-import six
from six.moves import mock
import testtools
@@ -128,16 +125,11 @@ class BaseTestCase(testtools.TestCase):
else:
basename, contents = f
encoding = default_encoding
- if isinstance(contents, six.text_type):
- contents = contents.encode(encoding)
- if not os.path.isabs(basename):
- (fd, path) = tempfile.mkstemp(prefix=basename, suffix=ext)
- else:
- path = basename + ext
- fd = os.open(path, os.O_CREAT | os.O_WRONLY)
- tempfiles.append(path)
- try:
- os.write(fd, contents)
- finally:
- os.close(fd)
+ fix = self.useFixture(createfile.CreateFileWithContent(
+ filename=basename,
+ contents=contents,
+ ext=ext,
+ encoding=encoding,
+ ))
+ tempfiles.append(fix.path)
return tempfiles
diff --git a/oslotest/createfile.py b/oslotest/createfile.py
new file mode 100644
index 0000000..86fa8b2
--- /dev/null
+++ b/oslotest/createfile.py
@@ -0,0 +1,70 @@
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+import os
+import tempfile
+
+import fixtures
+import six
+
+
+class CreateFileWithContent(fixtures.Fixture):
+ """Create a temporary file with the given content.
+
+ Creates a file using a predictable name, to be used by tests for
+ code that need a filename to load data or otherwise interact with
+ the real filesystem.
+
+ .. warning::
+
+ It is the responsibility of the caller to ensure that the file
+ is removed.
+
+ Users of this fixture may also want to use
+ :class:`fixtures.NestedTempfile` to set the temporary directory
+ somewhere safe and to ensure the files are cleaned up.
+
+ .. py:attribute:: path
+
+ The canonical name of the file created.
+
+ :param filename: Base file name or full literal path to the file
+ to be created.
+ :param contents: The data to write to the file. Unicode data will
+ be encoded before being written.
+ :param ext: An extension to add to filename.
+ :param encoding: An encoding to use for unicode data (ignored for
+ byte strings).
+
+ """
+
+ def __init__(self, filename, contents, ext='.conf', encoding='utf-8'):
+ self._filename = filename
+ self._contents = contents
+ self._ext = ext
+ self._encoding = encoding
+
+ def setUp(self):
+ super(CreateFileWithContent, self).setUp()
+ contents = self._contents
+ if isinstance(contents, six.text_type):
+ contents = contents.encode(self._encoding)
+ if not os.path.isabs(self._filename):
+ (fd, self.path) = tempfile.mkstemp(prefix=self._filename,
+ suffix=self._ext)
+ else:
+ self.path = self._filename + self._ext
+ fd = os.open(self.path, os.O_CREAT | os.O_WRONLY)
+ try:
+ os.write(fd, contents)
+ finally:
+ os.close(fd)