diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ba9a808..1751b8ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,3 +15,4 @@ ml). - [addend] #87 allocate, deallocate and live actions - [fixed] #89 save json on disk only for shapshots - [addend] #83 add owner_id in all kind of device +- [fixed] #91 The most old time allow is 1970-01-01 diff --git a/ereuse_devicehub/resources/action/schemas.py b/ereuse_devicehub/resources/action/schemas.py index 71eb8224..4d07d405 100644 --- a/ereuse_devicehub/resources/action/schemas.py +++ b/ereuse_devicehub/resources/action/schemas.py @@ -41,6 +41,15 @@ class Action(Thing): parent = NestedOn(s_device.Computer, dump_only=True, description=m.Action.parent_id.comment) url = URL(dump_only=True, description=m.Action.url.__doc__) + @validates_schema + def validate_times(self, data: dict): + unix_time = datetime.fromisoformat("1970-01-02 00:00:00+00:00") + if 'end_time' in data and data['end_time'] < unix_time: + data['end_time'] = unix_time + + if 'start_time' in data and data['start_time'] < unix_time: + data['start_time'] = unix_time + class ActionWithOneDevice(Action): __doc__ = m.ActionWithOneDevice.__doc__ diff --git a/tests/files/asus-end_time_bug88.snapshot.yaml b/tests/files/asus-end_time_bug88.snapshot.yaml new file mode 100644 index 00000000..af6bd93f --- /dev/null +++ b/tests/files/asus-end_time_bug88.snapshot.yaml @@ -0,0 +1,135 @@ +{ + "closed": true, + "components": [ + { + "actions": [], + "manufacturer": "Intel Corporation", + "model": "NM10/ICH7 Family High Definition Audio Controller", + "serialNumber": null, + "type": "SoundCard" + }, + { + "actions": [], + "manufacturer": "Azurewave", + "model": "USB 2.0 UVC VGA WebCam", + "serialNumber": "0x0001", + "type": "SoundCard" + }, + { + "actions": [], + "format": "DIMM", + "interface": "DDR2", + "manufacturer": null, + "model": null, + "serialNumber": null, + "size": 1024, + "speed": 667.0, + "type": "RamModule" + }, + { + "address": 64, + "cores": 1, + "actions": [ + { + "elapsed": 165, + "rate": 164.8342, + "type": "BenchmarkProcessorSysbench" + }, + { + "elapsed": 0, + "rate": 6665.7, + "type": "BenchmarkProcessor" + } + ], + "manufacturer": "Intel Corp.", + "model": "Intel Atom CPU N455 @ 1.66GHz", + "serialNumber": null, + "speed": 1.667, + "threads": 2, + "type": "Processor" + }, + { + "actions": [ + { + "elapsed": 16, + "readSpeed": 66.2, + "type": "BenchmarkDataStorage", + "writeSpeed": 21.8 + } + ], + "interface": "ATA", + "manufacturer": "Hitachi", + "model": "HTS54322", + "serialNumber": "E2024242CV86HJ", + "size": 238475, + "type": "HardDrive" + }, + { + "actions": [], + "manufacturer": "Qualcomm Atheros", + "model": "AR9285 Wireless Network Adapter", + "serialNumber": "74:2f:68:8b:fd:c8", + "type": "NetworkAdapter", + "wireless": true + }, + { + "actions": [], + "manufacturer": "Qualcomm Atheros", + "model": "AR8152 v2.0 Fast Ethernet", + "serialNumber": "14:da:e9:42:f6:7c", + "speed": 100, + "type": "NetworkAdapter", + "wireless": false + }, + { + "actions": [], + "manufacturer": "Intel Corporation", + "memory": 256.0, + "model": "Atom Processor D4xx/D5xx/N4xx/N5xx Integrated Graphics Controller", + "serialNumber": null, + "type": "GraphicCard" + }, + { + "actions": [ + { + "type": "TestBios", + "accessRange": "A", + } + ], + "firewire": 0, + "manufacturer": "ASUSTeK Computer INC.", + "model": "1001PXD", + "pcmcia": 0, + "serial": 1, + "serialNumber": "Eee0123456789", + "slots": 2, + "type": "Motherboard", + "usb": 5 + } + ], + "device": { + "chassis": "Netbook", + "actions": [ + { + "elapsed": 16, + "rate": 15.8978, + "type": "BenchmarkRamSysbench" + }, + { + "appearanceRange": "A", + "functionalityRange": "A", + "type": "VisualTest" + } + ], + "manufacturer": "ASUSTeK Computer INC.", + "model": "1001PXD", + "serialNumber": "B8OAAS048286", + "type": "Laptop" + }, + "elapsed": 6, + "endTime": "0001-01-01 00:00:00+00:00", + "software": "Workbench", + "type": "Snapshot", + "uuid": "7dc4d19c-914e-4652-a381-d641325fb9c2", + "version": "11.0a6" +} diff --git a/tests/test_action.py b/tests/test_action.py index 09c60c05..11b15f08 100644 --- a/tests/test_action.py +++ b/tests/test_action.py @@ -3,6 +3,7 @@ import copy import pytest from datetime import datetime, timedelta +from dateutil.tz import tzutc from decimal import Decimal from typing import Tuple, Type @@ -502,8 +503,8 @@ def test_allocate_bad_dates(user: UserClient): """ Tests allocate """ snapshot, _ = user.post(file('basic.snapshot'), res=models.Snapshot) device_id = snapshot['device']['id'] - delta = timedelta(days=30) - future = datetime.now() + delta + delay = timedelta(days=30) + future = datetime.now().replace(tzinfo=tzutc()) + delay post_request = {"transaction": "ccc", "finalUserCode": "aabbcc", "name": "John", @@ -556,8 +557,8 @@ def test_deallocate_bad_dates(user: UserClient): """ Tests deallocate with bad date of start_time """ snapshot, _ = user.post(file('basic.snapshot'), res=models.Snapshot) device_id = snapshot['device']['id'] - delta = timedelta(days=30) - future = datetime.now() + delta + delay = timedelta(days=30) + future = datetime.now().replace(tzinfo=tzutc()) + delay post_deallocate = {"startTime": future, "devices": [device_id] } diff --git a/tests/test_snapshot.py b/tests/test_snapshot.py index e1f2f1d7..40243b74 100644 --- a/tests/test_snapshot.py +++ b/tests/test_snapshot.py @@ -729,3 +729,37 @@ def test_snapshot_failed_missing_chassis(app: Devicehub, user: UserClient): assert snapshot['version'] == snapshot_error['version'] assert snapshot['uuid'] == uuid + +@pytest.mark.mvp +def test_snapshot_failed_end_time_bug(app: Devicehub, user: UserClient): + """ This test check if the end_time = 0001-01-01 00:00:00+00:00 + and then we get a /devices, this create a crash + """ + snapshot_file = file('asus-end_time_bug88.snapshot') + snapshot, _ = user.post(res=Snapshot, data=snapshot_file) + device, _ = user.get(res=m.Device, item=snapshot['device']['id']) + end_times = [x['endTime'] for x in device['actions']] + + assert '1970-01-02T00:00:00+00:00' in end_times + assert not '0001-01-01T00:00:00+00:00' in end_times + + tmp_snapshots = app.config['TMP_SNAPSHOTS'] + shutil.rmtree(tmp_snapshots) + +@pytest.mark.mvp +def test_snapshot_not_failed_end_time_bug(app: Devicehub, user: UserClient): + """ This test check if the end_time != 0001-01-01 00:00:00+00:00 + and then we get a /devices, this create a crash + """ + snapshot_file = file('asus-end_time_bug88.snapshot') + snapshot_file['endTime'] = '2001-01-01 00:00:00+00:00' + snapshot, _ = user.post(res=Snapshot, data=snapshot_file) + device, _ = user.get(res=m.Device, item=snapshot['device']['id']) + end_times = [x['endTime'] for x in device['actions']] + + assert not '1970-01-02T00:00:00+00:00' in end_times + assert not '0001-01-01T00:00:00+00:00' in end_times + assert '2001-01-01T00:00:00+00:00' in end_times + + tmp_snapshots = app.config['TMP_SNAPSHOTS'] + shutil.rmtree(tmp_snapshots)