From d118faf43a05381362695d3c074678130e53119d Mon Sep 17 00:00:00 2001 From: Thomas Bechtold Date: Fri, 17 Apr 2015 15:55:11 +0200 Subject: Fix ValueError in subunit_trace When a subunit stream for a testcase doesn't contain start end enddate, the duration can't be calculated which leads to a: ValueError: could not convert string to float Check now if the duration is an empty string and add basic test coverage based on ddt for the subunit_trace command. Change-Id: I6fdc8d283e67becbecf58b7779e33271db048a73 --- tempest_lib/cmd/subunit_trace.py | 6 ++- tempest_lib/tests/cmd/__init__.py | 0 tempest_lib/tests/cmd/test_subunit_trace.py | 61 +++++++++++++++++++++++++++++ test-requirements.txt | 1 + 4 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 tempest_lib/tests/cmd/__init__.py create mode 100644 tempest_lib/tests/cmd/test_subunit_trace.py diff --git a/tempest_lib/cmd/subunit_trace.py b/tempest_lib/cmd/subunit_trace.py index 5b69fb6..43bb275 100755 --- a/tempest_lib/cmd/subunit_trace.py +++ b/tempest_lib/cmd/subunit_trace.py @@ -190,7 +190,11 @@ def run_time(): runtime = 0.0 for k, v in RESULTS.items(): for test in v: - runtime += float(get_duration(test['timestamps']).strip('s')) + test_dur = get_duration(test['timestamps']).strip('s') + # NOTE(toabctl): get_duration() can return an empty string + # which leads to a ValueError when casting to float + if test_dur: + runtime += float(test_dur) return runtime diff --git a/tempest_lib/tests/cmd/__init__.py b/tempest_lib/tests/cmd/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tempest_lib/tests/cmd/test_subunit_trace.py b/tempest_lib/tests/cmd/test_subunit_trace.py new file mode 100644 index 0000000..c1653d2 --- /dev/null +++ b/tempest_lib/tests/cmd/test_subunit_trace.py @@ -0,0 +1,61 @@ +# Copyright 2015 SUSE Linux GmbH +# All Rights Reserved. +# +# 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. + +from datetime import datetime as dt + +from ddt import data +from ddt import ddt +from ddt import unpack +from mock import patch + +from tempest_lib.cmd import subunit_trace +from tempest_lib.tests import base + + +@ddt +class TestSubunitTrace(base.TestCase): + + @data(([dt(2015, 4, 17, 22, 23, 14, 111111), + dt(2015, 4, 17, 22, 23, 14, 111111)], + "0.000000s"), + ([dt(2015, 4, 17, 22, 23, 14, 111111), + dt(2015, 4, 17, 22, 23, 15, 111111)], + "1.000000s"), + ([dt(2015, 4, 17, 22, 23, 14, 111111), + None], + "")) + @unpack + def test_get_durating(self, timestamps, expected_result): + self.assertEqual(subunit_trace.get_duration(timestamps), + expected_result) + + @data(([dt(2015, 4, 17, 22, 23, 14, 111111), + dt(2015, 4, 17, 22, 23, 14, 111111)], + 0.0), + ([dt(2015, 4, 17, 22, 23, 14, 111111), + dt(2015, 4, 17, 22, 23, 15, 111111)], + 1.0), + ([dt(2015, 4, 17, 22, 23, 14, 111111), + None], + 0.0)) + @unpack + def test_run_time(self, timestamps, expected_result): + patched_res = { + 0: [ + {'timestamps': timestamps} + ] + } + with patch.dict(subunit_trace.RESULTS, patched_res, clear=True): + self.assertEqual(subunit_trace.run_time(), expected_result) diff --git a/test-requirements.txt b/test-requirements.txt index 158a921..2d695aa 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -14,3 +14,4 @@ testrepository>=0.0.18 testscenarios>=0.4 testtools>=0.9.36,!=1.2.0 mock>=1.0 +ddt>=0.4.0 -- cgit v1.2.1