From 2507ba3e4b9c83e9fa345dfd73f7d7f60689794b Mon Sep 17 00:00:00 2001 From: Milo Casagrande Date: Mon, 2 Mar 2015 17:51:01 +0100 Subject: Fix case of boot time being negative. * Add tests. Change-Id: If8ed5bb49415bae685b24e871ba4547e763db744 --- app/utils/bootimport.py | 30 +++++++++---- app/utils/tests/test_bootimport.py | 92 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+), 9 deletions(-) diff --git a/app/utils/bootimport.py b/app/utils/bootimport.py index 03be149..0437ebd 100644 --- a/app/utils/bootimport.py +++ b/app/utils/bootimport.py @@ -345,15 +345,27 @@ def _update_boot_doc_from_json(boot_doc, boot_json, json_pop_f): :param json_pop_f: The function used to pop elements out of the JSON object. :type json_pop_f: function """ - time_d = datetime.timedelta( - seconds=float(json_pop_f(models.BOOT_TIME_KEY, 0.0)) - ) - boot_doc.time = datetime.datetime( - 1970, 1, 1, - minute=time_d.seconds / 60, - second=time_d.seconds % 60, - microsecond=time_d.microseconds - ) + seconds = float(json_pop_f(models.BOOT_TIME_KEY, 0.0)) + if seconds < 0: + seconds = 0.0 + + try: + if seconds == 0: + boot_doc.time = datetime.datetime( + 1970, 1, 1, hour=0, minute=0, second=0) + else: + time_d = datetime.timedelta(seconds=seconds) + boot_doc.time = datetime.datetime( + 1970, 1, 1, + minute=time_d.seconds / 60, + second=time_d.seconds % 60, + microsecond=time_d.microseconds + ) + except OverflowError: + utils.LOG.error("Boot time passed value is too large for a time value") + utils.LOG.info("Boot time will be set to 0") + boot_doc.time = datetime.datetime( + 1970, 1, 1, hour=0, minute=0, second=0) boot_doc.status = json_pop_f( models.BOOT_RESULT_KEY, models.UNKNOWN_STATUS diff --git a/app/utils/tests/test_bootimport.py b/app/utils/tests/test_bootimport.py index e0fe4ca..22bec01 100644 --- a/app/utils/tests/test_bootimport.py +++ b/app/utils/tests/test_bootimport.py @@ -11,10 +11,12 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +import datetime import json import logging import mongomock import os +import sys import tempfile import types import unittest @@ -188,6 +190,96 @@ class TestParseBoot(unittest.TestCase): finally: os.remove(boot_log.name) + def test_parse_from_file_wrong_boot_time_too_big(self): + boot_log = tempfile.NamedTemporaryFile( + mode='w+b', bufsize=-1, suffix="json", delete=False + ) + boot_obj = { + "job": "job", + "kernel": "kernel", + "defconfig": "defconfig", + "board": "board", + "dtb": "dtb", + "lab_name": "lab_name", + "boot_time": sys.maxint + } + + try: + with open(boot_log.name, mode="w") as boot_write: + boot_write.write(json.dumps(boot_obj)) + + doc = utils.bootimport._parse_boot_from_file( + boot_log.name, self.db) + + self.assertEqual(doc.board, "board") + self.assertEqual(doc.job, "job") + self.assertEqual(doc.kernel, "kernel") + self.assertEqual(doc.defconfig, "defconfig") + self.assertEqual(doc.dtb, "dtb") + self.assertEqual(doc.time, datetime.datetime(1970, 1, 1, 0, 0)) + finally: + os.remove(boot_log.name) + + def test_parse_from_file_wrong_boot_time_too_big_negative(self): + boot_log = tempfile.NamedTemporaryFile( + mode='w+b', bufsize=-1, suffix="json", delete=False + ) + boot_obj = { + "job": "job", + "kernel": "kernel", + "defconfig": "defconfig", + "board": "board", + "dtb": "dtb", + "lab_name": "lab_name", + "boot_time": -sys.maxint - 1 + } + + try: + with open(boot_log.name, mode="w") as boot_write: + boot_write.write(json.dumps(boot_obj)) + + doc = utils.bootimport._parse_boot_from_file( + boot_log.name, self.db) + + self.assertEqual(doc.board, "board") + self.assertEqual(doc.job, "job") + self.assertEqual(doc.kernel, "kernel") + self.assertEqual(doc.defconfig, "defconfig") + self.assertEqual(doc.dtb, "dtb") + self.assertEqual(doc.time, datetime.datetime(1970, 1, 1, 0, 0)) + finally: + os.remove(boot_log.name) + + def test_parse_from_file_wrong_boot_time_negative(self): + boot_log = tempfile.NamedTemporaryFile( + mode='w+b', bufsize=-1, suffix="json", delete=False + ) + boot_obj = { + "job": "job", + "kernel": "kernel", + "defconfig": "defconfig", + "board": "board", + "dtb": "dtb", + "lab_name": "lab_name", + "boot_time": -1500.0 + } + + try: + with open(boot_log.name, mode="w") as boot_write: + boot_write.write(json.dumps(boot_obj)) + + doc = utils.bootimport._parse_boot_from_file( + boot_log.name, self.db) + + self.assertEqual(doc.board, "board") + self.assertEqual(doc.job, "job") + self.assertEqual(doc.kernel, "kernel") + self.assertEqual(doc.defconfig, "defconfig") + self.assertEqual(doc.dtb, "dtb") + self.assertEqual(doc.time, datetime.datetime(1970, 1, 1, 0, 0)) + finally: + os.remove(boot_log.name) + def test_parse_from_file_valid(self): boot_log = tempfile.NamedTemporaryFile( mode='w+b', bufsize=-1, suffix="json", delete=False -- cgit v1.2.3