[Piglit] [PATCH v4 3/6] framework: add support for gzip compressionn
Dylan Baker
baker.dylan.c at gmail.com
Wed Jul 1 16:04:55 PDT 2015
This adds support to compress results with gzip compression. This
reduces the size of json results significantly (from 21M to 1.6M when
running the quick profile (which is about 7% of the uncompressed size).
v4: - add additional tests
Signed-off-by: Dylan Baker <dylanx.c.baker at intel.com>
---
framework/backends/compression.py | 9 ++-
framework/tests/compressed_backend_tests.py | 89 ++++++++++++++++++++++++++++-
piglit.conf.example | 6 +-
3 files changed, 97 insertions(+), 7 deletions(-)
diff --git a/framework/backends/compression.py b/framework/backends/compression.py
index 37383e4..44b8b9e 100644
--- a/framework/backends/compression.py
+++ b/framework/backends/compression.py
@@ -43,21 +43,24 @@ they're passing unicode and not bytes.
from __future__ import print_function, absolute_import, division
import functools
+import gzip
import os
from framework import exceptions
from framework.core import PIGLIT_CONFIG
-COMPRESSION_SUFFIXES = []
+COMPRESSION_SUFFIXES = ['.gz']
-DEFAULT = 'none'
+DEFAULT = 'gz'
COMPRESSORS = {
+ 'gz': functools.partial(gzip.open, mode='w'),
'none': functools.partial(open, mode='w'),
}
DECOMPRESSORS = {
- 'none': functools.partial(open, mode='r')
+ 'gz': functools.partial(gzip.open, mode='r'),
+ 'none': functools.partial(open, mode='r'),
}
diff --git a/framework/tests/compressed_backend_tests.py b/framework/tests/compressed_backend_tests.py
index eb40f0a..897a154 100644
--- a/framework/tests/compressed_backend_tests.py
+++ b/framework/tests/compressed_backend_tests.py
@@ -32,10 +32,31 @@ import functools
import nose.tools as nt
from framework.tests import utils
-from framework.backends import compression
+from framework.backends import compression, abstract
# pylint: disable=line-too-long,protected-access
+# Helpers
+
+
+class _TestBackend(abstract.FileBackend):
+ """A class for testing backend compression."""
+ _file_extension = 'test_extension'
+
+ def initialize(self, *args, **kwargs): # pylint: disable=unused-argument
+ os.mkdir(os.path.join(self._dest, 'tests'))
+
+ def finalize(self, *args, **kwargs): # pylint: disable=unused-argument
+ tests = os.path.join(self._dest, 'tests')
+ with self._write_final(os.path.join(self._dest, 'results.txt')) as f:
+ for file_ in os.listdir(tests):
+ with open(os.path.join(tests, file_), 'r') as t:
+ f.write(t.read())
+
+ @staticmethod
+ def _write(f, name, data): # pylint: disable=arguments-differ
+ f.write('{}: {}'.format(name, data))
+
def _add_compression(value):
"""Decorator that temporarily adds support for a compression method."""
@@ -60,6 +81,31 @@ def _add_compression(value):
return _wrapper
+def _set_compression_mode(mode):
+ """Change the compression mode for one test."""
+
+ def _wrapper(func):
+ """The actual decorator."""
+
+ @functools.wraps(func)
+ @utils.set_env(PIGLIT_COMPRESSION=mode)
+ def _inner(*args, **kwargs):
+ """The called function."""
+ restore = compression.MODE
+ compression.MODE = compression._set_mode()
+ compression.COMPRESSOR = compression.COMPRESSORS[compression.MODE]
+
+ try:
+ func(*args, **kwargs)
+ finally:
+ compression.MODE = restore
+ compression.COMPRESSOR = compression.COMPRESSORS[compression.MODE]
+
+ return _inner
+
+ return _wrapper
+
+
def _test_compressor(mode):
"""Helper to simplify testing compressors."""
func = compression.COMPRESSORS[mode]
@@ -83,6 +129,29 @@ def _test_decompressor(mode):
nt.eq_(f.read(), 'foo')
+def _test_extension():
+ """Create an final file and return the extension."""
+ with utils.tempdir() as d:
+ obj = _TestBackend(d)
+ obj.initialize()
+ with obj.write_test('foo') as t:
+ t({'result': 'foo'})
+
+ obj.finalize()
+
+ for each in os.listdir(d):
+ if each.startswith('results.txt'):
+ ext = os.path.splitext(each)[1]
+ break
+ else:
+ raise utils.TestFailure('No results file generated')
+
+ return ext
+
+
+# Tests
+
+
@utils.no_error
def test_compress_none():
"""framework.backends.compression: can compress to 'none'"""
@@ -94,6 +163,7 @@ def test_decompress_none():
_test_decompressor('none')
+
@_add_compression('foobar')
@utils.set_env(PIGLIT_COMPRESSION='foobar')
def test_set_mode_env():
@@ -114,3 +184,20 @@ def test_set_mode_piglit_conf():
def test_set_mode_default():
"""framework.backends.compression._set_mode: uses DEFAULT if env and piglit.conf are unset"""
nt.eq_(compression._set_mode(), compression.DEFAULT)
+
+
+ at utils.no_error
+def test_compress_gz():
+ """framework.backends.compression: can compress to 'gz'"""
+ _test_compressor('gz')
+
+
+def test_decompress_gz():
+ """framework.backends.compression: can decompress from 'gz'"""
+ _test_decompressor('gz')
+
+
+ at _set_compression_mode('gz')
+def test_gz_output():
+ """framework.backends: when using gz compression a gz file is created"""
+ nt.eq_(_test_extension(), '.gz')
diff --git a/piglit.conf.example b/piglit.conf.example
index 49bc8b6..baf8108 100644
--- a/piglit.conf.example
+++ b/piglit.conf.example
@@ -111,9 +111,9 @@ run_test=./%(test_name)s
;backend=json
; Set the default compression method to use,
-; May be one of: 'none'
-; Default: none (Note that this may change in the future)
-;compression=none
+; May be one of: 'none', 'gz'
+; Default: 'gz'
+;compression=gz
[expected-failures]
; Provide a list of test names that are expected to fail. These tests
--
2.4.5
More information about the Piglit
mailing list