From b04e4d7311e6327bb4f5b9a502d4daa9924169ad Mon Sep 17 00:00:00 2001 From: Rafael Leira Date: Mon, 27 Mar 2023 14:24:53 +0200 Subject: [PATCH] Added support for NVMe tests Fixes issue NVMe Windows self-test seems a bit off #64 --- pySMART/device.py | 34 +- pySMART/interface/nvme.py | 238 ++++++-- pySMART/testentry.py | 51 +- pySMART/utils.py | 2 +- .../singletests/issue_63_nvme/device.json | 1 + .../megaraid_ph_sas_hdd_0/device.json | 5 +- .../megaraid_ph_sata_hdd_0/device.json | 5 +- .../megaraid_ph_sata_ssd_0/device.json | 5 +- tests/dataset/singletests/nvme_0/device.json | 16 +- .../singletests/nvme_1_issue_37/device.json | 1 + .../singletests/nvme_2_issue_46/device.json | 1 + .../singletests/nvme_3_issue_52/device.json | 1 + .../singletests/nvme_4_issue_53/device.json | 16 +- .../singletests/nvme_5_issue_46/device.json | 1 + .../nvme_6/_-d_nvme_--all__dev_nvme0 | 72 +++ .../singletests/nvme_6/_-d_test__dev_nvme0 | 5 + tests/dataset/singletests/nvme_6/device.json | 425 +++++++++++++ .../nvme_win10_0_issue_64/_--scan-open | 1 + .../_-d_nvme_--all__dev_sda | 75 +++ .../nvme_win10_0_issue_64/device.json | 575 ++++++++++++++++++ .../nvme_win10_mingw32_0_issue_48/device.json | 1 + .../sas_ssd_0_issue_57/device.json | 25 +- .../sata_hdd_0_issue42/device.json | 40 +- .../sata_ssd_0_issue_49/device.json | 45 +- .../usb_ssd_0_issue_50/device.json | 45 +- 25 files changed, 1564 insertions(+), 122 deletions(-) create mode 100644 tests/dataset/singletests/nvme_6/_-d_nvme_--all__dev_nvme0 create mode 100644 tests/dataset/singletests/nvme_6/_-d_test__dev_nvme0 create mode 100644 tests/dataset/singletests/nvme_6/device.json create mode 100644 tests/dataset/singletests/nvme_win10_0_issue_64/_--scan-open create mode 100644 tests/dataset/singletests/nvme_win10_0_issue_64/_-d_nvme_--all__dev_sda create mode 100644 tests/dataset/singletests/nvme_win10_0_issue_64/device.json diff --git a/pySMART/device.py b/pySMART/device.py index 01f31e6..34c3d11 100644 --- a/pySMART/device.py +++ b/pySMART/device.py @@ -957,6 +957,11 @@ class members, including the SMART attribute table and self-test log. if interface == 'nvme': self.if_attributes = NvmeAttributes(iter(_stdout)) + + # Get Tests + for test in self.if_attributes.tests: + self.tests.append(TestEntry('nvme', test.num, test.description, test.status, test.powerOnHours, + test.failingLBA, nsid=test.nsid, sct=test.sct, code=test.code, remain=100-test.progress)) else: self.if_attributes = None @@ -974,10 +979,6 @@ class members, including the SMART attribute table and self-test log. if parse_ascq: message += ' ' + line.lstrip().rstrip() if parse_self_tests: - num = line[0:3] - if '#' not in num: - continue - # Detect Test Format ## SCSI/SAS FORMAT ## @@ -987,7 +988,15 @@ class members, including the SMART attribute table and self-test log. # Description number (hours) # # 1 Background short Completed - 33124 - [- - -] format_scsi = re.compile( - r'^[#\s]*([^\s]+)\s{2,}(.*[^\s])\s{2,}(.*[^\s])\s{2,}(.*[^\s])\s{2,}(.*[^\s])\s{2,}(.*[^\s])\s+\[([^\s]+)\s+([^\s]+)\s+([^\s]+)\]$').match(line) + r'^[#\s]*(\d+)\s{2,}(.*[^\s])\s{2,}(.*[^\s])\s{2,}(.*[^\s])\s{2,}(.*[^\s])\s{2,}(.*[^\s])\s+\[([^\s]+)\s+([^\s]+)\s+([^\s]+)\]$').match(line) + + ## ATA FORMAT ## + # Example smartctl output: + # SMART Self-test log structure revision number 1 + # Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error + # # 1 Extended offline Completed without error 00% 46660 - + format_ata = re.compile( + r'^[#\s]*(\d+)\s{2,}(.*[^\s])\s{2,}(.*[^\s])\s{1,}(.*[^\s])\s{2,}(.*[^\s])\s{2,}(.*[^\s])$').match(line) if format_scsi is not None: format = 'scsi' @@ -1013,15 +1022,10 @@ class members, including the SMART attribute table and self-test log. asc=asc, ascq=ascq )) - else: + elif format_ata is not None: ## ATA FORMAT ## - # Example smartctl output: - # SMART Self-test log structure revision number 1 - # Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error - # # 1 Extended offline Completed without error 00% 46660 - format = 'ata' - parsed = re.compile( - r'^[#\s]*([^\s]+)\s{2,}(.*[^\s])\s{2,}(.*[^\s])\s{1,}(.*[^\s])\s{2,}(.*[^\s])\s{2,}(.*[^\s])$').match(line).groups() + parsed = format_ata.groups() num = parsed[0] test_type = parsed[1] status = parsed[2] @@ -1038,6 +1042,9 @@ class members, including the SMART attribute table and self-test log. TestEntry(format, num, test_type, status, hours, lba, remain=remain) ) + else: + pass + # Basic device information parsing if any_in(line, 'Device Model', 'Product', 'Model Number'): self.model = line.split(':')[1].lstrip().rstrip() @@ -1182,8 +1189,9 @@ class members, including the SMART attribute table and self-test log. pass parse_running_test = False - if all_in(line, 'Description', '(hours)'): + if "Self-test log" in line: parse_self_tests = True # Set flag to capture test entries + continue ####################################### # SCSI only # diff --git a/pySMART/interface/nvme.py b/pySMART/interface/nvme.py index f2fc043..3da055c 100644 --- a/pySMART/interface/nvme.py +++ b/pySMART/interface/nvme.py @@ -1,7 +1,7 @@ from enum import Enum import re import humanfriendly -from typing import Iterator, Union, List +from typing import Optional, Iterator, Union, List class NvmeStatus(Enum): @@ -168,17 +168,17 @@ class NvmeError(object): cs : The command specific """ - def __init__(self, id: int = None, count: int = None, sqid: int = None, cmdid: int = None, status: int = None, peloc: int = None, lba: int = None, nsid: int = None, vs: int = None): - self.id: int = id - self.count: int = count - self.sqid: int = sqid - self.cmdid: int = cmdid + def __init__(self, num: int, errCount: int, sqId: int, cmdId: int, status: int, peLoc: int, lba: Optional[int] = None, nsid: Optional[int] = None, vs: Optional[int] = None): + self.num: int = num + self.errCount: int = errCount + self.sqId: int = sqId + self.cmdId: int = cmdId self.status: int = status - self.peloc: int = peloc - self.lba: Union[int, None] = lba - self.nsid: Union[int, None] = nsid - self.vs: Union[int, None] = vs - self.cs: Union[int, None] = None + self.peLoc: int = peLoc + self.lba: Optional[int] = lba + self.nsid: Optional[int] = nsid + self.vs: Optional[int] = vs + self.cs: Optional[int] = None @property def status_str(self) -> str: @@ -409,7 +409,66 @@ def __str__(self): return self.__repr__() def __repr__(self): - return f'{self.status}: ({self.status_str()})' + return f'{self.status}: ({self.status_str})' + + def __getstate__(self, all_info=True): + """ + Allows us to send a pySMART diagnostics object over a serializable + medium which uses json (or the likes of json) payloads + """ + return vars(self) + + def __setstate__(self, state): + self.__dict__.update(state) + + +class NvmeSelfTest(object): + """This class represents a test entry of a NVMe device + + Attributes: + num (int): The test number + description (str): The test description + status (str): The test status + powerOnHours (int): The power on hours + failingLBA (Optional[int]): The failing LBA + nsid (Optional[int]): The namespace ID + sct (Optional[str]): The SCT + code (Optional[str]): The code + progress (int): The progress of the test. Defaults to 100% + + """ + + def __init__(self, num: int, description: str, status: str, powerOnHours: int, failingLBA: Optional[int] = None, nsid: Optional[int] = None, sct: Optional[str] = None, code: Optional[str] = None, progress: int = 100): + + self.num: int = num + self.description: str = description + self.status: str = status + self.powerOnHours: int = powerOnHours + self.failingLBA: Optional[int] = failingLBA + self.nsid: Optional[int] = nsid + self.sct: Optional[str] = sct + self.code: Optional[str] = code + self.progress: int = progress + + def __str__(self): + return self.__repr__() + + def __repr__(self): + # Example smartctl output + # Self-test Log (NVMe Log 0x06) + # Self-test status: Extended self-test in progress (28% completed) + # Num Test_Description Status Power_on_Hours Failing_LBA NSID SCT Code + # 0 Extended Completed without error 3441 - - - - + return ("{0:>2} {1:18}{2:29}{3:16}{4:13}{5:5}{6:4}{7:4}".format( + self.num, + self.description, + self.status, + self.powerOnHours, + self.failingLBA, + self.nsid, + self.sct, + self.code + )) def __getstate__(self, all_info=True): """ @@ -449,7 +508,7 @@ class NvmeAttributes(object): errors : List of errors """ - def __init__(self, data: Iterator[str] = None): + def __init__(self, data: Optional[Iterator[str]] = None): """Initializes the attributes Args: @@ -457,27 +516,28 @@ def __init__(self, data: Iterator[str] = None): """ - self.critialWarning: int = None - self.temperature: int = None - self.availableSpare: int = None - self.availableSpareThreshold: int = None - self.percentageUsed: int = None - self.dataUnitsRead: int = None - self.bytesRead: int = None - self.dataUnitsWritten: int = None - self.bytesWritten: int = None - self.hostReadCommands: int = None - self.hostWriteCommands: int = None - self.controllerBusyTime: int = None - self.powerCycles: int = None - self.powerOnHours: int = None - self.unsafeShutdowns: int = None - self.integrityErrors: int = None - self.errorEntries: int = None - self.warningTemperatureTime: int = None - self.criticalTemperatureTime: int = None + self.critialWarning: Optional[int] = None + self.temperature: Optional[int] = None + self.availableSpare: Optional[int] = None + self.availableSpareThreshold: Optional[int] = None + self.percentageUsed: Optional[int] = None + self.dataUnitsRead: Optional[int] = None + self.bytesRead: Optional[int] = None + self.dataUnitsWritten: Optional[int] = None + self.bytesWritten: Optional[int] = None + self.hostReadCommands: Optional[int] = None + self.hostWriteCommands: Optional[int] = None + self.controllerBusyTime: Optional[int] = None + self.powerCycles: Optional[int] = None + self.powerOnHours: Optional[int] = None + self.unsafeShutdowns: Optional[int] = None + self.integrityErrors: Optional[int] = None + self.errorEntries: Optional[int] = None + self.warningTemperatureTime: Optional[int] = None + self.criticalTemperatureTime: Optional[int] = None self.errors: List[NvmeError] = [] + self.tests: List[NvmeSelfTest] = [] if data is not None: self.parse(data) @@ -591,32 +651,107 @@ def parse(self, data: Iterator[str]) -> None: r'^\s*(?P\d+)\s+(?P\d+)\s+(?P\d+)\s+(?P\w+)\s+(?P\w+)\s+(?P\w+)\s+(?P\S+)\s+(?P\S+)\s+(?P\S+)\s*$', line) if match: - error = NvmeError() - - error.num = int(match.group('num')) - error.errCount = int(match.group('errCount')) - error.sqId = int(match.group('sqId')) - error.cmdId = int(match.group('cmdId'), 16) - error.status = int(match.group('status'), 16) - error.peLoc = int(match.group('peLoc'), 16) - - if match.group('lba') == '-': - error.lba = None - else: + error = NvmeError( + num=int(match.group('num')), + errCount=int(match.group('errCount')), + sqId=int(match.group('sqId')), + cmdId=int(match.group('cmdId'), 16), + status=int(match.group('status'), 16), + peLoc=int(match.group('peLoc'), 16) + ) + + if match.group('lba') != '-': error.lba = int(match.group('lba'), 16) - if match.group('nsid') == '-': - error.nsid = None - else: + if match.group('nsid') != '-': error.nsid = int(match.group('nsid')) - if match.group('vs') == '-': - error.vs = None - else: + if match.group('vs') != '-': error.vs = int(match.group('vs'), 16) self.errors.append(error) + elif line.startswith('Self-test Log (NVMe Log 0x06)'): + + ## NVME FORMAT ## + # Example smartctl output + # Self-test Log (NVMe Log 0x06) + # Self-test status: Extended self-test in progress (28% completed) + # Num Test_Description Status Power_on_Hours Failing_LBA NSID SCT Code + # 0 Extended Completed without error 3441 - - - - + nvme_entry_regex = re.compile( + r'^[#\s]*(\d+)\s{2,}(.*[^\s])\s{2,}(.*[^\s])\s{2,}(\d+)\s{2,}(.*[^\s])\s{2,}(.*[^\s])\s{2,}(.*[^\s])\s{2,}(.*)$') + + line = next(data) + + # Check the current test + # Example of non running test: Self-test status: No self-test in progress + # Example of running test: Self-test status: Extended self-test in progress (4% completed) + currentTest = None + if line.startswith('Self-test status:'): + line = line[18:].strip() + + # check + if line.startswith('No self-test in progress'): + pass + else: + # parse the test + match = re.match( + r'^(\w+) self-test in progress \((\d+)% completed\)$', line) + if match: + powerOnHours = self.powerOnHours + if powerOnHours is None: + powerOnHours = 0 + + currentTest = NvmeSelfTest( + num=-1, + description=match.group(1), + status='Running', + powerOnHours=powerOnHours, + progress=int(match.group(2)) + ) + + # Parse tests + for line in data: + line = line.strip() + + match = nvme_entry_regex.match(line) + + if match: + + num = int(match.group(1)) + description = match.group(2) + status = match.group(3) + powerOnHours = int(match.group(4)) + + failingLBA = None + if match.group(5) != '-': + failingLBA = int(match.group(5)) + + nsid = None + if match.group(6) != '-': + nsid = int(match.group(6)) + + sct = match.group(7) + code = match.group(8) + + test = NvmeSelfTest( + num=num, + description=description, + status=status, + powerOnHours=powerOnHours, + failingLBA=failingLBA, + nsid=nsid, + sct=sct, + code=code + ) + + self.tests.append(test) + + if currentTest is not None: + currentTest.num = len(self.tests) + self.tests.append(currentTest) + def __getstate__(self, all_info=True): """ Allows us to send a pySMART diagnostics object over a serializable @@ -627,5 +762,8 @@ def __getstate__(self, all_info=True): if ret['errors'] is not None: ret['errors'] = [vars(e) for e in ret['errors']] + if ret['tests'] is not None: + ret['tests'] = [vars(e) for e in ret['tests']] + def __setstate__(self, state): self.__dict__.update(state) diff --git a/pySMART/testentry.py b/pySMART/testentry.py index 4b54766..96dd22b 100644 --- a/pySMART/testentry.py +++ b/pySMART/testentry.py @@ -30,8 +30,16 @@ class TestEntry(object): smartctl. """ - def __init__(self, format, num: Optional[int], test_type, status, hours, lba, remain=None, segment=None, sense=None, asc=None, - ascq=None): + def __init__(self, format, num: Optional[int], test_type, status, hours, lba, + remain=None, + segment=None, + sense=None, + asc=None, + ascq=None, + nsid=None, + sct=None, + code=None): + self._format = format """ **(str):** Indicates whether this entry was taken from an 'ata' or @@ -91,6 +99,21 @@ def __init__(self, format, num: Optional[int], test_type, status, hours, lba, re **(str):** SCSI 'Additonal Sense Code Quaifier' reported on self-test failure. Set to '-' otherwise. """ + self.nsid = nsid + """ + **(str):** NVMe 'Name Space Identifier' reported on self-test failure. + Set to '-' if no namespace is defined. + """ + self.sct = sct + """ + **(str):** NVMe 'Status Code Type' reported on self-test failure. + Set to '-' if undefined. + """ + self.code = code + """ + **(str):** NVMe 'Status Code' reported on self-test failure. + Set to '-' if undefined. + """ def __getstate__(self): return { @@ -103,7 +126,10 @@ def __getstate__(self): 'segment': self.segment, 'sense': self.sense, 'asc': self.ASC, - 'ascq': self.ASCQ + 'ascq': self.ASCQ, + 'nsid': self.nsid, + 'sct': self.sct, + 'code': self.code } def __repr__(self): @@ -121,7 +147,7 @@ def __str__(self): return "{0:>2} {1:17}{2:30}{3:5}{4:7}{5:17}".format( self.num, self.type, self.status, self.remain, self.hours, self.LBA) - else: + elif self._format == 'scsi': # 'Segment' could not be fit on the 80-char line. It's of limited # utility anyway due to it's manufacturer-proprietary nature... return ("{0:>2} {1:17}{2:23}{3:7}{4:14}[{5:4}{6:5}{7:4}]".format( @@ -134,6 +160,23 @@ def __str__(self): self.ASC, self.ASCQ )) + elif self._format == 'nvme': + ## NVME FORMAT ## + # Example smartctl output + # Self-test Log (NVMe Log 0x06) + # Self-test status: Extended self-test in progress (28% completed) + # Num Test_Description Status Power_on_Hours Failing_LBA NSID SCT Code + # 0 Extended Completed without error 3441 - - - - + return ("{0:>2} {1:18}{2:29}{3:16}{4:13}{5:5}{6:4}{7:4}".format( + self.num, + self.type, + self.status, + self.hours, + self.LBA, + self.nsid, + self.sct, + self.code + )) __all__ = ['TestEntry'] diff --git a/pySMART/utils.py b/pySMART/utils.py index db7110a..e6007d1 100644 --- a/pySMART/utils.py +++ b/pySMART/utils.py @@ -175,7 +175,7 @@ def get_object_properties(obj: Any, deep_copy: bool = True, remove_private: bool ret = vars(obj) available_types = ['dict', 'str', 'int', 'float', 'list', 'NoneType'] - recursion_types = ['object', 'NvmeError'] + recursion_types = ['object', 'NvmeError', 'NvmeSelfTest'] for prop_name in prop_names: prop_val = getattr(obj, prop_name) diff --git a/tests/dataset/singletests/issue_63_nvme/device.json b/tests/dataset/singletests/issue_63_nvme/device.json index 91699ba..16022a8 100644 --- a/tests/dataset/singletests/issue_63_nvme/device.json +++ b/tests/dataset/singletests/issue_63_nvme/device.json @@ -340,6 +340,7 @@ "warningTemperatureTime": null, "criticalTemperatureTime": 0, "errors": [], + "tests": [], "criticalWarning": 0 }, "capacity": null, diff --git a/tests/dataset/singletests/megaraid_ph_sas_hdd_0/device.json b/tests/dataset/singletests/megaraid_ph_sas_hdd_0/device.json index 7b5e63e..fba23ca 100644 --- a/tests/dataset/singletests/megaraid_ph_sas_hdd_0/device.json +++ b/tests/dataset/singletests/megaraid_ph_sas_hdd_0/device.json @@ -291,7 +291,10 @@ "segment": "-", "sense": "-", "ASC": "-", - "ASCQ": "-" + "ASCQ": "-", + "nsid": null, + "sct": null, + "code": null } ], "diagnostics": { diff --git a/tests/dataset/singletests/megaraid_ph_sata_hdd_0/device.json b/tests/dataset/singletests/megaraid_ph_sata_hdd_0/device.json index 2a8b748..d58428b 100644 --- a/tests/dataset/singletests/megaraid_ph_sata_hdd_0/device.json +++ b/tests/dataset/singletests/megaraid_ph_sata_hdd_0/device.json @@ -580,7 +580,10 @@ "segment": null, "sense": null, "ASC": null, - "ASCQ": null + "ASCQ": null, + "nsid": null, + "sct": null, + "code": null } ], "diagnostics": { diff --git a/tests/dataset/singletests/megaraid_ph_sata_ssd_0/device.json b/tests/dataset/singletests/megaraid_ph_sata_ssd_0/device.json index c91bd85..2f1a46a 100644 --- a/tests/dataset/singletests/megaraid_ph_sata_ssd_0/device.json +++ b/tests/dataset/singletests/megaraid_ph_sata_ssd_0/device.json @@ -716,7 +716,10 @@ "segment": null, "sense": null, "ASC": null, - "ASCQ": null + "ASCQ": null, + "nsid": null, + "sct": null, + "code": null } ], "diagnostics": { diff --git a/tests/dataset/singletests/nvme_0/device.json b/tests/dataset/singletests/nvme_0/device.json index 7cce03b..6c84764 100644 --- a/tests/dataset/singletests/nvme_0/device.json +++ b/tests/dataset/singletests/nvme_0/device.json @@ -342,24 +342,20 @@ "criticalTemperatureTime": 0, "errors": [ { - "id": null, - "count": null, - "sqid": null, - "cmdid": null, - "status": 49157, - "peloc": null, - "lba": null, - "nsid": 0, - "vs": null, - "cs": null, "num": 0, "errCount": 1356, "sqId": 0, "cmdId": 18, + "status": 49157, "peLoc": 40, + "lba": null, + "nsid": 0, + "vs": null, + "cs": null, "status_str": "Unknown" } ], + "tests": [], "criticalWarning": 0 }, "capacity": "256 GB", diff --git a/tests/dataset/singletests/nvme_1_issue_37/device.json b/tests/dataset/singletests/nvme_1_issue_37/device.json index d9dfb56..9e98ca0 100644 --- a/tests/dataset/singletests/nvme_1_issue_37/device.json +++ b/tests/dataset/singletests/nvme_1_issue_37/device.json @@ -343,6 +343,7 @@ "warningTemperatureTime": null, "criticalTemperatureTime": 0, "errors": [], + "tests": [], "criticalWarning": 0 }, "capacity": "500 GB", diff --git a/tests/dataset/singletests/nvme_2_issue_46/device.json b/tests/dataset/singletests/nvme_2_issue_46/device.json index c552f8c..b52c32e 100644 --- a/tests/dataset/singletests/nvme_2_issue_46/device.json +++ b/tests/dataset/singletests/nvme_2_issue_46/device.json @@ -340,6 +340,7 @@ "warningTemperatureTime": null, "criticalTemperatureTime": 0, "errors": [], + "tests": [], "criticalWarning": 0 }, "capacity": "512 GB", diff --git a/tests/dataset/singletests/nvme_3_issue_52/device.json b/tests/dataset/singletests/nvme_3_issue_52/device.json index 99e9f99..7d9dd82 100644 --- a/tests/dataset/singletests/nvme_3_issue_52/device.json +++ b/tests/dataset/singletests/nvme_3_issue_52/device.json @@ -340,6 +340,7 @@ "warningTemperatureTime": 0, "criticalTemperatureTime": 0, "errors": [], + "tests": [], "criticalWarning": 0 }, "capacity": "1.00 TB", diff --git a/tests/dataset/singletests/nvme_4_issue_53/device.json b/tests/dataset/singletests/nvme_4_issue_53/device.json index cb0d779..da18bd5 100644 --- a/tests/dataset/singletests/nvme_4_issue_53/device.json +++ b/tests/dataset/singletests/nvme_4_issue_53/device.json @@ -341,24 +341,20 @@ "criticalTemperatureTime": 0, "errors": [ { - "id": null, - "count": null, - "sqid": null, - "cmdid": null, - "status": 49156, - "peloc": null, - "lba": null, - "nsid": 0, - "vs": null, - "cs": null, "num": 0, "errCount": 283, "sqId": 0, "cmdId": 12, + "status": 49156, "peLoc": 43, + "lba": null, + "nsid": 0, + "vs": null, + "cs": null, "status_str": "Unknown" } ], + "tests": [], "criticalWarning": 0 }, "capacity": "1.60 TB", diff --git a/tests/dataset/singletests/nvme_5_issue_46/device.json b/tests/dataset/singletests/nvme_5_issue_46/device.json index b305fda..53d1d2b 100644 --- a/tests/dataset/singletests/nvme_5_issue_46/device.json +++ b/tests/dataset/singletests/nvme_5_issue_46/device.json @@ -343,6 +343,7 @@ "warningTemperatureTime": null, "criticalTemperatureTime": 0, "errors": [], + "tests": [], "criticalWarning": 0 }, "capacity": "500 GB", diff --git a/tests/dataset/singletests/nvme_6/_-d_nvme_--all__dev_nvme0 b/tests/dataset/singletests/nvme_6/_-d_nvme_--all__dev_nvme0 new file mode 100644 index 0000000..f8071c1 --- /dev/null +++ b/tests/dataset/singletests/nvme_6/_-d_nvme_--all__dev_nvme0 @@ -0,0 +1,72 @@ +smartctl pre-7.4 2023-03-21 r5470 [x86_64-linux-6.2.7-200.fc37.x86_64] (CircleCI) +Copyright (C) 2002-23, Bruce Allen, Christian Franke, www.smartmontools.org + +=== START OF INFORMATION SECTION === +Model Number: KBG30ZMV256G TOSHIBA +Serial Number: 68APC048P12P +Firmware Version: ADHA0101 +PCI Vendor/Subsystem ID: 0x1179 +IEEE OUI Identifier: 0x00080d +Controller ID: 0 +NVMe Version: 1.2.1 +Number of Namespaces: 1 +Namespace 1 Size/Capacity: 256.060.514.304 [256 GB] +Namespace 1 Formatted LBA Size: 512 +Namespace 1 IEEE EUI-64: 00080d 040017b710 +Local Time is: Mon Mar 27 12:52:23 2023 CEST +Firmware Updates (0x12): 1 Slot, no Reset required +Optional Admin Commands (0x0017): Security Format Frmw_DL Self_Test +Optional NVM Commands (0x0017): Comp Wr_Unc DS_Mngmt Sav/Sel_Feat +Log Page Attributes (0x02): Cmd_Eff_Lg +Maximum Data Transfer Size: 512 Pages +Warning Comp. Temp. Threshold: 82 Celsius +Critical Comp. Temp. Threshold: 85 Celsius + +Supported Power States +St Op Max Active Idle RL RT WL WT Ent_Lat Ex_Lat + 0 + 3.30W - - 0 0 0 0 0 0 + 1 + 2.70W - - 1 1 1 1 0 0 + 2 + 2.30W - - 2 2 2 2 0 0 + 3 - 0.0500W - - 4 4 4 4 8000 32000 + 4 - 0.0050W - - 4 4 4 4 8000 40000 + +Supported LBA Sizes (NSID 0x1) +Id Fmt Data Metadt Rel_Perf + 0 - 4096 0 0 + 1 + 512 0 3 + +=== START OF SMART DATA SECTION === +SMART overall-health self-assessment test result: PASSED + +SMART/Health Information (NVMe Log 0x02) +Critical Warning: 0x00 +Temperature: 59 Celsius +Available Spare: 100% +Available Spare Threshold: 10% +Percentage Used: 32% +Data Units Read: 33.835.011 [17,3 TB] +Data Units Written: 36.580.058 [18,7 TB] +Host Read Commands: 661.971.168 +Host Write Commands: 1.017.975.532 +Controller Busy Time: 14.050 +Power Cycles: 1.545 +Power On Hours: 8.737 +Unsafe Shutdowns: 102 +Media and Data Integrity Errors: 0 +Error Information Log Entries: 2.597 +Warning Comp. Temperature Time: 0 +Critical Comp. Temperature Time: 0 +Temperature Sensor 1: 59 Celsius +Thermal Temp. 1 Transition Count: 5939 +Thermal Temp. 2 Transition Count: 3423 +Thermal Temp. 1 Total Time: 70406 +Thermal Temp. 2 Total Time: 7129 + +Error Information (NVMe Log 0x01, 16 of 64 entries) +Num ErrCount SQId CmdId Status PELoc LBA NSID VS + 0 2597 0 0x1001 0xc005 0x028 - 0 - + +Self-test Log (NVMe Log 0x06) +Self-test status: No self-test in progress +Num Test_Description Status Power_on_Hours Failing_LBA NSID SCT Code + 0 Short Completed without error 8737 - - - - diff --git a/tests/dataset/singletests/nvme_6/_-d_test__dev_nvme0 b/tests/dataset/singletests/nvme_6/_-d_test__dev_nvme0 new file mode 100644 index 0000000..0425308 --- /dev/null +++ b/tests/dataset/singletests/nvme_6/_-d_test__dev_nvme0 @@ -0,0 +1,5 @@ +smartctl pre-7.4 2023-03-21 r5470 [x86_64-linux-6.2.7-200.fc37.x86_64] (CircleCI) +Copyright (C) 2002-23, Bruce Allen, Christian Franke, www.smartmontools.org + +/dev/nvme0: Device of type 'nvme' [NVMe] detected +/dev/nvme0: Device of type 'nvme' [NVMe] opened diff --git a/tests/dataset/singletests/nvme_6/device.json b/tests/dataset/singletests/nvme_6/device.json new file mode 100644 index 0000000..2cc439a --- /dev/null +++ b/tests/dataset/singletests/nvme_6/device.json @@ -0,0 +1,425 @@ +{ + "name": "/dev/nvme0", + "values": { + "abridged": false, + "name": "nvme0", + "family": null, + "model": "KBG30ZMV256G TOSHIBA", + "serial": "68APC048P12P", + "firmware": "ADHA0101", + "smart_capable": true, + "smart_enabled": true, + "assessment": "PASS", + "messages": [], + "is_ssd": true, + "rotation_rate": null, + "attributes": [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null + ], + "test_capabilities": { + "offline": false, + "short": false, + "long": false, + "conveyance": false, + "selective": false + }, + "tests": [ + { + "_format": "nvme", + "num": 0, + "type": "Short", + "status": "Completed without error", + "hours": 8737, + "LBA": null, + "remain": 0, + "segment": null, + "sense": null, + "ASC": null, + "ASCQ": null, + "nsid": null, + "sct": "-", + "code": "-" + } + ], + "diagnostics": { + "_block_size": 512, + "Reallocated_Sector_Ct": null, + "Start_Stop_Spec": null, + "Start_Stop_Cycles": null, + "Start_Stop_Pct_Left": null, + "Load_Cycle_Spec": null, + "Load_Cycle_Count": null, + "Load_Cycle_Pct_Left": null, + "Power_On_Hours": null, + "Life_Left": null, + "Corrected_Reads": null, + "Corrected_Writes": null, + "Corrected_Verifies": null, + "_Uncorrected_Reads": null, + "_Uncorrected_Writes": null, + "_Uncorrected_Verifies": null, + "_Reads_GB": null, + "_Writes_GB": null, + "_Verifies_GB": null, + "_Reads_count": null, + "_Writes_count": null, + "_Verifies_count": null, + "Non_Medium_Errors": null, + "Reads_GB": null, + "Reads_count": null, + "Uncorrected_Reads": null, + "Uncorrected_Verifies": null, + "Uncorrected_Writes": null, + "Verifies_GB": null, + "Verifies_count": null, + "Writes_GB": null, + "Writes_count": null, + "block_size": 512 + }, + "temperature": 59, + "temperatures": { + "1": 59 + }, + "logical_sector_size": 512, + "physical_sector_size": null, + "if_attributes": { + "critialWarning": null, + "temperature": 59, + "availableSpare": 100, + "availableSpareThreshold": 10, + "percentageUsed": 32, + "dataUnitsRead": 33835011, + "bytesRead": 17300000000000, + "dataUnitsWritten": 36580058, + "bytesWritten": 18700000000000, + "hostReadCommands": 661971168, + "hostWriteCommands": 1017975532, + "controllerBusyTime": 14050, + "powerCycles": 1545, + "powerOnHours": 8737, + "unsafeShutdowns": 102, + "integrityErrors": 0, + "errorEntries": 2597, + "warningTemperatureTime": null, + "criticalTemperatureTime": 0, + "errors": [ + { + "num": 0, + "errCount": 2597, + "sqId": 0, + "cmdId": 4097, + "status": 49157, + "peLoc": 40, + "lba": null, + "nsid": 0, + "vs": null, + "cs": null, + "status_str": "Unknown" + } + ], + "tests": [ + { + "num": 0, + "description": "Short", + "status": "Completed without error", + "powerOnHours": 8737, + "failingLBA": null, + "nsid": null, + "sct": "-", + "code": "-", + "progress": 100 + } + ], + "criticalWarning": 0 + }, + "capacity": "256 GB", + "dev_interface": "nvme", + "dev_reference": "/dev/nvme0", + "diags": { + "Reallocated_Sector_Ct": "-", + "Start_Stop_Spec": "-", + "Start_Stop_Cycles": "-", + "Start_Stop_Pct_Left": "-", + "Load_Cycle_Spec": "-", + "Load_Cycle_Count": "-", + "Load_Cycle_Pct_Left": "-", + "Power_On_Hours": "-", + "Life_Left": "-", + "Corrected_Reads": "-", + "Corrected_Writes": "-", + "Corrected_Verifies": "-", + "Uncorrected_Reads": "-", + "Uncorrected_Writes": "-", + "Uncorrected_Verifies": "-", + "Reads_GB": "-", + "Writes_GB": "-", + "Verifies_GB": "-", + "Reads_count": "-", + "Writes_count": "-", + "Verifies_count": "-", + "block_size": "512", + "Non-Medium_Errors": "-" + }, + "interface": "nvme", + "sector_size": 512, + "size": 256060514304, + "size_raw": "256 GB", + "smartctl_interface": "nvme", + "vendor": "KBG" + } +} \ No newline at end of file diff --git a/tests/dataset/singletests/nvme_win10_0_issue_64/_--scan-open b/tests/dataset/singletests/nvme_win10_0_issue_64/_--scan-open new file mode 100644 index 0000000..10e47ff --- /dev/null +++ b/tests/dataset/singletests/nvme_win10_0_issue_64/_--scan-open @@ -0,0 +1 @@ +/dev/sda -d nvme # /dev/sda, NVMe device \ No newline at end of file diff --git a/tests/dataset/singletests/nvme_win10_0_issue_64/_-d_nvme_--all__dev_sda b/tests/dataset/singletests/nvme_win10_0_issue_64/_-d_nvme_--all__dev_sda new file mode 100644 index 0000000..b01d311 --- /dev/null +++ b/tests/dataset/singletests/nvme_win10_0_issue_64/_-d_nvme_--all__dev_sda @@ -0,0 +1,75 @@ +smartctl pre-7.4 2023-03-21 r5470 [x86_64-w64-mingw32-w10-22H2] (CircleCI) +Copyright (C) 2002-23, Bruce Allen, Christian Franke, www.smartmontools.org + +=== START OF INFORMATION SECTION === +Model Number: Samsung SSD 980 PRO 1TB +Serial Number: S5P2NG0NB05964V +Firmware Version: 5B2QGXA7 +PCI Vendor/Subsystem ID: 0x144d +IEEE OUI Identifier: 0x002538 +Total NVM Capacity: 1,000,204,886,016 [1.00 TB] +Unallocated NVM Capacity: 0 +Controller ID: 6 +NVMe Version: 1.3 +Number of Namespaces: 1 +Namespace 1 Size/Capacity: 1,000,204,886,016 [1.00 TB] +Namespace 1 Utilization: 471,137,140,736 [471 GB] +Namespace 1 Formatted LBA Size: 512 +Namespace 1 IEEE EUI-64: 002538 bb01501f70 +Local Time is: Sat Mar 25 16:14:42 2023 PDT +Firmware Updates (0x16): 3 Slots, no Reset required +Optional Admin Commands (0x0017): Security Format Frmw_DL Self_Test +Optional NVM Commands (0x0057): Comp Wr_Unc DS_Mngmt Sav/Sel_Feat Timestmp +Log Page Attributes (0x0f): S/H_per_NS Cmd_Eff_Lg Ext_Get_Lg Telmtry_Lg +Maximum Data Transfer Size: 128 Pages +Warning Comp. Temp. Threshold: 82 Celsius +Critical Comp. Temp. Threshold: 85 Celsius + +Supported Power States +St Op Max Active Idle RL RT WL WT Ent_Lat Ex_Lat + 0 + 8.49W - - 0 0 0 0 0 0 + 1 + 4.48W - - 1 1 1 1 0 200 + 2 + 3.18W - - 2 2 2 2 0 1000 + 3 - 0.0400W - - 3 3 3 3 2000 1200 + 4 - 0.0050W - - 4 4 4 4 500 9500 + +Supported LBA Sizes (NSID 0x1) +Id Fmt Data Metadt Rel_Perf + 0 + 512 0 0 + +=== START OF SMART DATA SECTION === +SMART overall-health self-assessment test result: PASSED + +SMART/Health Information (NVMe Log 0x02) +Critical Warning: 0x00 +Temperature: 62 Celsius +Available Spare: 100% +Available Spare Threshold: 10% +Percentage Used: 13% +Data Units Read: 151,288,508 [77.4 TB] +Data Units Written: 264,489,347 [135 TB] +Host Read Commands: 5,047,031,068 +Host Write Commands: 7,842,130,574 +Controller Busy Time: 19,134 +Power Cycles: 662 +Power On Hours: 3,441 +Unsafe Shutdowns: 36 +Media and Data Integrity Errors: 0 +Error Information Log Entries: 0 +Warning Comp. Temperature Time: 0 +Critical Comp. Temperature Time: 0 +Temperature Sensor 1: 62 Celsius +Temperature Sensor 2: 72 Celsius + +Error Information (NVMe Log 0x01, 16 of 64 entries) +No Errors Logged + +Self-test Log (NVMe Log 0x06) +Self-test status: Extended self-test in progress (28% completed) +Num Test_Description Status Power_on_Hours Failing_LBA NSID SCT Code + 0 Extended Completed without error 3441 - - - - + 1 Short Completed without error 3441 - - - - + 2 Short Completed without error 1361 - - - - + 3 Extended Completed without error 866 - - - - + 4 Short Aborted: Self-test command 865 - - - - + 5 Short Completed without error 340 - - - - diff --git a/tests/dataset/singletests/nvme_win10_0_issue_64/device.json b/tests/dataset/singletests/nvme_win10_0_issue_64/device.json new file mode 100644 index 0000000..7bb3149 --- /dev/null +++ b/tests/dataset/singletests/nvme_win10_0_issue_64/device.json @@ -0,0 +1,575 @@ +{ + "name": "/dev/sda", + "interface": "nvme", + "values": { + "abridged": false, + "name": "sda", + "family": null, + "model": "Samsung SSD 980 PRO 1TB", + "serial": "S5P2NG0NB05964V", + "firmware": "5B2QGXA7", + "smart_capable": false, + "smart_enabled": false, + "assessment": "PASS", + "messages": [], + "is_ssd": false, + "rotation_rate": null, + "attributes": [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null + ], + "test_capabilities": { + "offline": false, + "short": true, + "long": true, + "conveyance": false, + "selective": false + }, + "tests": [ + { + "_format": "nvme", + "num": 0, + "type": "Extended", + "status": "Completed without error", + "hours": 3441, + "LBA": null, + "remain": 0, + "segment": null, + "sense": null, + "ASC": null, + "ASCQ": null, + "nsid": null, + "sct": "-", + "code": "-" + }, + { + "_format": "nvme", + "num": 1, + "type": "Short", + "status": "Completed without error", + "hours": 3441, + "LBA": null, + "remain": 0, + "segment": null, + "sense": null, + "ASC": null, + "ASCQ": null, + "nsid": null, + "sct": "-", + "code": "-" + }, + { + "_format": "nvme", + "num": 2, + "type": "Short", + "status": "Completed without error", + "hours": 1361, + "LBA": null, + "remain": 0, + "segment": null, + "sense": null, + "ASC": null, + "ASCQ": null, + "nsid": null, + "sct": "-", + "code": "-" + }, + { + "_format": "nvme", + "num": 3, + "type": "Extended", + "status": "Completed without error", + "hours": 866, + "LBA": null, + "remain": 0, + "segment": null, + "sense": null, + "ASC": null, + "ASCQ": null, + "nsid": null, + "sct": "-", + "code": "-" + }, + { + "_format": "nvme", + "num": 4, + "type": "Short", + "status": "Aborted: Self-test command", + "hours": 865, + "LBA": null, + "remain": 0, + "segment": null, + "sense": null, + "ASC": null, + "ASCQ": null, + "nsid": null, + "sct": "-", + "code": "-" + }, + { + "_format": "nvme", + "num": 5, + "type": "Short", + "status": "Completed without error", + "hours": 340, + "LBA": null, + "remain": 0, + "segment": null, + "sense": null, + "ASC": null, + "ASCQ": null, + "nsid": null, + "sct": "-", + "code": "-" + }, + { + "_format": "nvme", + "num": 6, + "type": "Extended", + "status": "Running", + "hours": 3441, + "LBA": null, + "remain": 72, + "segment": null, + "sense": null, + "ASC": null, + "ASCQ": null, + "nsid": null, + "sct": null, + "code": null + } + ], + "diagnostics": { + "_block_size": 512, + "Reallocated_Sector_Ct": null, + "Start_Stop_Spec": null, + "Start_Stop_Cycles": null, + "Start_Stop_Pct_Left": null, + "Load_Cycle_Spec": null, + "Load_Cycle_Count": null, + "Load_Cycle_Pct_Left": null, + "Power_On_Hours": null, + "Life_Left": null, + "Corrected_Reads": null, + "Corrected_Writes": null, + "Corrected_Verifies": null, + "_Uncorrected_Reads": null, + "_Uncorrected_Writes": null, + "_Uncorrected_Verifies": null, + "_Reads_GB": null, + "_Writes_GB": null, + "_Verifies_GB": null, + "_Reads_count": null, + "_Writes_count": null, + "_Verifies_count": null, + "Non_Medium_Errors": null, + "Reads_GB": null, + "Reads_count": null, + "Uncorrected_Reads": null, + "Uncorrected_Verifies": null, + "Uncorrected_Writes": null, + "Verifies_GB": null, + "Verifies_count": null, + "Writes_GB": null, + "Writes_count": null, + "block_size": 512 + }, + "temperature": 62, + "temperatures": { + "1": 62, + "2": 72 + }, + "logical_sector_size": 512, + "physical_sector_size": null, + "if_attributes": { + "critialWarning": null, + "temperature": 62, + "availableSpare": 100, + "availableSpareThreshold": 10, + "percentageUsed": 13, + "dataUnitsRead": 151288508, + "bytesRead": 77400000000000, + "dataUnitsWritten": 264489347, + "bytesWritten": 135000000000000, + "hostReadCommands": 5047031068, + "hostWriteCommands": 7842130574, + "controllerBusyTime": 19134, + "powerCycles": 662, + "powerOnHours": 3441, + "unsafeShutdowns": 36, + "integrityErrors": 0, + "errorEntries": 0, + "warningTemperatureTime": null, + "criticalTemperatureTime": 0, + "errors": [], + "tests": [ + { + "num": 0, + "description": "Extended", + "status": "Completed without error", + "powerOnHours": 3441, + "failingLBA": null, + "nsid": null, + "sct": "-", + "code": "-", + "progress": 100 + }, + { + "num": 1, + "description": "Short", + "status": "Completed without error", + "powerOnHours": 3441, + "failingLBA": null, + "nsid": null, + "sct": "-", + "code": "-", + "progress": 100 + }, + { + "num": 2, + "description": "Short", + "status": "Completed without error", + "powerOnHours": 1361, + "failingLBA": null, + "nsid": null, + "sct": "-", + "code": "-", + "progress": 100 + }, + { + "num": 3, + "description": "Extended", + "status": "Completed without error", + "powerOnHours": 866, + "failingLBA": null, + "nsid": null, + "sct": "-", + "code": "-", + "progress": 100 + }, + { + "num": 4, + "description": "Short", + "status": "Aborted: Self-test command", + "powerOnHours": 865, + "failingLBA": null, + "nsid": null, + "sct": "-", + "code": "-", + "progress": 100 + }, + { + "num": 5, + "description": "Short", + "status": "Completed without error", + "powerOnHours": 340, + "failingLBA": null, + "nsid": null, + "sct": "-", + "code": "-", + "progress": 100 + }, + { + "num": 6, + "description": "Extended", + "status": "Running", + "powerOnHours": 3441, + "failingLBA": null, + "nsid": null, + "sct": null, + "code": null, + "progress": 28 + } + ], + "criticalWarning": 0 + }, + "capacity": "1.00 TB", + "dev_interface": "nvme", + "dev_reference": "/dev/sda", + "diags": { + "Reallocated_Sector_Ct": "-", + "Start_Stop_Spec": "-", + "Start_Stop_Cycles": "-", + "Start_Stop_Pct_Left": "-", + "Load_Cycle_Spec": "-", + "Load_Cycle_Count": "-", + "Load_Cycle_Pct_Left": "-", + "Power_On_Hours": "-", + "Life_Left": "-", + "Corrected_Reads": "-", + "Corrected_Writes": "-", + "Corrected_Verifies": "-", + "Uncorrected_Reads": "-", + "Uncorrected_Writes": "-", + "Uncorrected_Verifies": "-", + "Reads_GB": "-", + "Writes_GB": "-", + "Verifies_GB": "-", + "Reads_count": "-", + "Writes_count": "-", + "Verifies_count": "-", + "block_size": "512", + "Non-Medium_Errors": "-" + }, + "interface": "nvme", + "sector_size": 512, + "size": 1000204886016, + "size_raw": "1.00 TB", + "smartctl_interface": "nvme", + "vendor": "Samsung" + } +} \ No newline at end of file diff --git a/tests/dataset/singletests/nvme_win10_mingw32_0_issue_48/device.json b/tests/dataset/singletests/nvme_win10_mingw32_0_issue_48/device.json index 04257a0..1b13316 100644 --- a/tests/dataset/singletests/nvme_win10_mingw32_0_issue_48/device.json +++ b/tests/dataset/singletests/nvme_win10_mingw32_0_issue_48/device.json @@ -339,6 +339,7 @@ "warningTemperatureTime": 2, "criticalTemperatureTime": 0, "errors": [], + "tests": [], "criticalWarning": 0 }, "capacity": "1.00 TB", diff --git a/tests/dataset/singletests/sas_ssd_0_issue_57/device.json b/tests/dataset/singletests/sas_ssd_0_issue_57/device.json index 962d0d3..5043403 100644 --- a/tests/dataset/singletests/sas_ssd_0_issue_57/device.json +++ b/tests/dataset/singletests/sas_ssd_0_issue_57/device.json @@ -291,7 +291,10 @@ "segment": "-", "sense": "-", "ASC": "-", - "ASCQ": "-" + "ASCQ": "-", + "nsid": null, + "sct": null, + "code": null }, { "_format": "scsi", @@ -304,7 +307,10 @@ "segment": "-", "sense": "-", "ASC": "-", - "ASCQ": "-" + "ASCQ": "-", + "nsid": null, + "sct": null, + "code": null }, { "_format": "scsi", @@ -317,7 +323,10 @@ "segment": "-", "sense": "-", "ASC": "-", - "ASCQ": "-" + "ASCQ": "-", + "nsid": null, + "sct": null, + "code": null }, { "_format": "scsi", @@ -330,7 +339,10 @@ "segment": "-", "sense": "-", "ASC": "-", - "ASCQ": "-" + "ASCQ": "-", + "nsid": null, + "sct": null, + "code": null }, { "_format": "scsi", @@ -343,7 +355,10 @@ "segment": "-", "sense": "-", "ASC": "-", - "ASCQ": "-" + "ASCQ": "-", + "nsid": null, + "sct": null, + "code": null } ], "diagnostics": { diff --git a/tests/dataset/singletests/sata_hdd_0_issue42/device.json b/tests/dataset/singletests/sata_hdd_0_issue42/device.json index 463f2d7..bf131bd 100644 --- a/tests/dataset/singletests/sata_hdd_0_issue42/device.json +++ b/tests/dataset/singletests/sata_hdd_0_issue42/device.json @@ -665,7 +665,10 @@ "segment": null, "sense": null, "ASC": null, - "ASCQ": null + "ASCQ": null, + "nsid": null, + "sct": null, + "code": null }, { "_format": "ata", @@ -678,7 +681,10 @@ "segment": null, "sense": null, "ASC": null, - "ASCQ": null + "ASCQ": null, + "nsid": null, + "sct": null, + "code": null }, { "_format": "ata", @@ -691,7 +697,10 @@ "segment": null, "sense": null, "ASC": null, - "ASCQ": null + "ASCQ": null, + "nsid": null, + "sct": null, + "code": null }, { "_format": "ata", @@ -704,7 +713,10 @@ "segment": null, "sense": null, "ASC": null, - "ASCQ": null + "ASCQ": null, + "nsid": null, + "sct": null, + "code": null }, { "_format": "ata", @@ -717,7 +729,10 @@ "segment": null, "sense": null, "ASC": null, - "ASCQ": null + "ASCQ": null, + "nsid": null, + "sct": null, + "code": null }, { "_format": "ata", @@ -730,7 +745,10 @@ "segment": null, "sense": null, "ASC": null, - "ASCQ": null + "ASCQ": null, + "nsid": null, + "sct": null, + "code": null }, { "_format": "ata", @@ -743,7 +761,10 @@ "segment": null, "sense": null, "ASC": null, - "ASCQ": null + "ASCQ": null, + "nsid": null, + "sct": null, + "code": null }, { "_format": "ata", @@ -756,7 +777,10 @@ "segment": null, "sense": null, "ASC": null, - "ASCQ": null + "ASCQ": null, + "nsid": null, + "sct": null, + "code": null } ], "diagnostics": { diff --git a/tests/dataset/singletests/sata_ssd_0_issue_49/device.json b/tests/dataset/singletests/sata_ssd_0_issue_49/device.json index ce41ffa..0600a0c 100644 --- a/tests/dataset/singletests/sata_ssd_0_issue_49/device.json +++ b/tests/dataset/singletests/sata_ssd_0_issue_49/device.json @@ -546,7 +546,10 @@ "segment": null, "sense": null, "ASC": null, - "ASCQ": null + "ASCQ": null, + "nsid": null, + "sct": null, + "code": null }, { "_format": "ata", @@ -559,7 +562,10 @@ "segment": null, "sense": null, "ASC": null, - "ASCQ": null + "ASCQ": null, + "nsid": null, + "sct": null, + "code": null }, { "_format": "ata", @@ -572,7 +578,10 @@ "segment": null, "sense": null, "ASC": null, - "ASCQ": null + "ASCQ": null, + "nsid": null, + "sct": null, + "code": null }, { "_format": "ata", @@ -585,7 +594,10 @@ "segment": null, "sense": null, "ASC": null, - "ASCQ": null + "ASCQ": null, + "nsid": null, + "sct": null, + "code": null }, { "_format": "ata", @@ -598,7 +610,10 @@ "segment": null, "sense": null, "ASC": null, - "ASCQ": null + "ASCQ": null, + "nsid": null, + "sct": null, + "code": null }, { "_format": "ata", @@ -611,7 +626,10 @@ "segment": null, "sense": null, "ASC": null, - "ASCQ": null + "ASCQ": null, + "nsid": null, + "sct": null, + "code": null }, { "_format": "ata", @@ -624,7 +642,10 @@ "segment": null, "sense": null, "ASC": null, - "ASCQ": null + "ASCQ": null, + "nsid": null, + "sct": null, + "code": null }, { "_format": "ata", @@ -637,7 +658,10 @@ "segment": null, "sense": null, "ASC": null, - "ASCQ": null + "ASCQ": null, + "nsid": null, + "sct": null, + "code": null }, { "_format": "ata", @@ -650,7 +674,10 @@ "segment": null, "sense": null, "ASC": null, - "ASCQ": null + "ASCQ": null, + "nsid": null, + "sct": null, + "code": null } ], "diagnostics": { diff --git a/tests/dataset/singletests/usb_ssd_0_issue_50/device.json b/tests/dataset/singletests/usb_ssd_0_issue_50/device.json index b78d767..263323d 100644 --- a/tests/dataset/singletests/usb_ssd_0_issue_50/device.json +++ b/tests/dataset/singletests/usb_ssd_0_issue_50/device.json @@ -716,7 +716,10 @@ "segment": null, "sense": null, "ASC": null, - "ASCQ": null + "ASCQ": null, + "nsid": null, + "sct": null, + "code": null }, { "_format": "ata", @@ -729,7 +732,10 @@ "segment": null, "sense": null, "ASC": null, - "ASCQ": null + "ASCQ": null, + "nsid": null, + "sct": null, + "code": null }, { "_format": "ata", @@ -742,7 +748,10 @@ "segment": null, "sense": null, "ASC": null, - "ASCQ": null + "ASCQ": null, + "nsid": null, + "sct": null, + "code": null }, { "_format": "ata", @@ -755,7 +764,10 @@ "segment": null, "sense": null, "ASC": null, - "ASCQ": null + "ASCQ": null, + "nsid": null, + "sct": null, + "code": null }, { "_format": "ata", @@ -768,7 +780,10 @@ "segment": null, "sense": null, "ASC": null, - "ASCQ": null + "ASCQ": null, + "nsid": null, + "sct": null, + "code": null }, { "_format": "ata", @@ -781,7 +796,10 @@ "segment": null, "sense": null, "ASC": null, - "ASCQ": null + "ASCQ": null, + "nsid": null, + "sct": null, + "code": null }, { "_format": "ata", @@ -794,7 +812,10 @@ "segment": null, "sense": null, "ASC": null, - "ASCQ": null + "ASCQ": null, + "nsid": null, + "sct": null, + "code": null }, { "_format": "ata", @@ -807,7 +828,10 @@ "segment": null, "sense": null, "ASC": null, - "ASCQ": null + "ASCQ": null, + "nsid": null, + "sct": null, + "code": null }, { "_format": "ata", @@ -820,7 +844,10 @@ "segment": null, "sense": null, "ASC": null, - "ASCQ": null + "ASCQ": null, + "nsid": null, + "sct": null, + "code": null } ], "diagnostics": {