diff options
author | Dylan Baker <baker.dylan.c@gmail.com> | 2015-06-29 14:55:28 -0700 |
---|---|---|
committer | Dylan Baker <baker.dylan.c@gmail.com> | 2015-07-09 13:18:00 -0700 |
commit | 54bf9304b2a1f192f6daa1c69bac2c18574ea1c8 (patch) | |
tree | 658d45f6efa2cf550ec26f3e41de00db4b66f15f | |
parent | 7be0c99c75589b4810160772a79d7dc088bc8f0e (diff) |
framework: add support for gzip compressionn
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@intel.com>
-rw-r--r-- | framework/backends/compression.py | 9 | ||||
-rw-r--r-- | framework/tests/compressed_backend_tests.py | 89 | ||||
-rw-r--r-- | piglit.conf.example | 6 |
3 files changed, 97 insertions, 7 deletions
diff --git a/framework/backends/compression.py b/framework/backends/compression.py index 37383e4f0..44b8b9e35 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 eb40f0aad..897a1549a 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) + + +@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') + + +@_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 49bc8b6ed..baf810893 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 |