From 9832648353432fa0e05a3003bbf67052453e9d3f Mon Sep 17 00:00:00 2001 From: Thomas Bechtold Date: Sat, 18 Apr 2015 13:39:25 +0200 Subject: [PATCH] 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: I9953019794ba53fcfcb20e32fecbe94da22c9565 --- os_testr/subunit_trace.py | 6 ++- os_testr/tests/test_subunit_trace.py | 61 ++++++++++++++++++++++++++++ test-requirements.txt | 1 + 3 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 os_testr/tests/test_subunit_trace.py diff --git a/os_testr/subunit_trace.py b/os_testr/subunit_trace.py index 91c2ff7..c509e43 100755 --- a/os_testr/subunit_trace.py +++ b/os_testr/subunit_trace.py @@ -220,7 +220,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/os_testr/tests/test_subunit_trace.py b/os_testr/tests/test_subunit_trace.py new file mode 100644 index 0000000..5544636 --- /dev/null +++ b/os_testr/tests/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 os_testr import subunit_trace +from os_testr.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 c7208f0..d0ca195 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -10,3 +10,4 @@ sphinx>=1.1.2,!=1.2.0,!=1.3b1,<1.3 oslosphinx>=2.2.0 # Apache-2.0 oslotest>=1.2.0 # Apache-2.0 testscenarios>=0.4 +ddt>=0.4.0