From 58d6c6478aba796d89ab0ff47b4ec0fc55046269 Mon Sep 17 00:00:00 2001 From: Ben Nemec Date: Tue, 1 Apr 2014 16:34:46 -0500 Subject: [PATCH] Add unit test for cache-url A sanity check that cache-url does the right thing when presented with the appropriate curl return codes. This change brings in the test code for scripts from tripleo-image-elements, which needs to be factored out into a place both projects can use it. I'm stubbing out curl so we don't have a dep on curl in our unit tests, and because I've seen some strange behavior out of curl in the gate that caused random failures in this test. Change-Id: I31e6b06b45415feec7285511d07e65eb78d0d045 --- .testr.conf | 7 ++- diskimage_builder/tests/base.py | 58 ++++++++++++++++++++++ elements/cache-url/__init__.py | 0 elements/cache-url/tests/__init__.py | 0 elements/cache-url/tests/test_cache_url.py | 41 +++++++++++++++ test-requirements.txt | 2 - 6 files changed, 105 insertions(+), 3 deletions(-) create mode 100644 diskimage_builder/tests/base.py create mode 100644 elements/cache-url/__init__.py create mode 100644 elements/cache-url/tests/__init__.py create mode 100644 elements/cache-url/tests/test_cache_url.py diff --git a/.testr.conf b/.testr.conf index e77dcc7f..25d7f8d9 100644 --- a/.testr.conf +++ b/.testr.conf @@ -1,5 +1,10 @@ [DEFAULT] -test_command=python -m subunit.run discover . $LISTOPT $IDOPTION +test_command=OS_STDOUT_CAPTURE=${OS_STDOUT_CAPTURE:-1} \ + OS_STDERR_CAPTURE=${OS_STDERR_CAPTURE:-1} \ + OS_LOG_CAPTURE=${OS_LOG_CAPTURE:-1} \ + OS_TEST_TIMEOUT=${OS_TEST_TIMEOUT:-60} \ + OS_DEBUG=${OS_DEBUG:-0} \ + python -m subunit.run discover . $LISTOPT $IDOPTION test_id_option=--load-list $IDFILE test_list_option=--list diff --git a/diskimage_builder/tests/base.py b/diskimage_builder/tests/base.py new file mode 100644 index 00000000..de514569 --- /dev/null +++ b/diskimage_builder/tests/base.py @@ -0,0 +1,58 @@ +# Copyright 2014 Red Hat, Inc. +# +# 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. + +# TODO(bnemec): This whole file is a copy-paste of the one in +# tripleo-image-elements. That duplication needs to be eliminated. + +import os +import subprocess +import sys +import tempfile + +from oslotest import base + + +class ScriptTestBase(base.BaseTestCase): + def setUp(self): + super(ScriptTestBase, self).setUp() + self.tmpdir = tempfile.mkdtemp() + self.env = os.environ.copy() + self.env['PATH'] = self.tmpdir + ':' + self.env['PATH'] + + def _stub_script(self, name, contents): + filename = os.path.join(self.tmpdir, name) + with open(filename, 'w') as f: + f.write('#!/bin/bash\n') + f.write(contents) + f.write('\n') + os.chmod(filename, 0o700) + + def _run_command(self, cmd): + try: + # check_output doesn't exist in Python < 2.7 + if sys.hexversion < 0x02070000: + runner = subprocess.check_call + else: + runner = subprocess.check_output + return runner(cmd, + stderr=subprocess.STDOUT, + env=self.env) + # NOTE(bnemec): Handle the exception so we can extract as much + # information as possible. + except subprocess.CalledProcessError as e: + # The check_call exception won't have any data in e.output + if sys.hexversion < 0x02070000: + self.fail(e) + else: + self.fail(e.output) diff --git a/elements/cache-url/__init__.py b/elements/cache-url/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/elements/cache-url/tests/__init__.py b/elements/cache-url/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/elements/cache-url/tests/test_cache_url.py b/elements/cache-url/tests/test_cache_url.py new file mode 100644 index 00000000..8f389e06 --- /dev/null +++ b/elements/cache-url/tests/test_cache_url.py @@ -0,0 +1,41 @@ +# Copyright 2014 Red Hat, Inc. +# +# 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 time + +from diskimage_builder.tests import base + + +class TestCacheUrl(base.ScriptTestBase): + def test_cache_url_caches(self): + tempdir = tempfile.mkdtemp() + target = os.path.join(tempdir, 'target') + source = 'http://fake/url' + # Write fake data to the target file and return success + self._stub_script('curl', 'echo "test" > ${3:7:100}\necho 200') + self._run_command(['elements/cache-url/bin/cache-url', + source, + target]) + self.assertTrue(os.path.exists(target)) + modification_time = os.path.getmtime(target) + # Make sure that the timestamp would change if the file does + time.sleep(1) + self._stub_script('curl', 'echo "304"') + self._run_command(['elements/cache-url/bin/cache-url', + source, + target]) + self.assertEqual(modification_time, os.path.getmtime(target)) diff --git a/test-requirements.txt b/test-requirements.txt index 936ec23b..0ae951c0 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -3,8 +3,6 @@ # process, which may cause wedges in the gate later. hacking>=0.9.2,<0.10 -coverage>=3.6 discover oslotest>=1.1.0 # Apache-2.0 testrepository>=0.0.18 -testtools>=0.9.34