Skip to content

Commit b6161e8

Browse files
committed
SigMFFileError for ncd problems; improve ncd testing
1 parent 2159572 commit b6161e8

4 files changed

Lines changed: 85 additions & 86 deletions

File tree

.gitignore

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ SigMF.egg-info/*
1111

1212
# test related
1313
.coverage
14-
pytest.xml
15-
coverage.xml
14+
.hypothesis/
1615
.tox/
16+
coverage.xml
17+
pytest.xml
1718
htmlcov/*

sigmf/sigmffile.py

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -932,36 +932,36 @@ def get_dataset_filename_from_metadata(meta_fn, metadata=None):
932932
Parse provided metadata and return the expected data filename. In the case of
933933
a metadata only distribution, or if the file does not exist, this will return
934934
'None'. The priority for conflicting:
935-
1. The file named <METAFILE_BASENAME>.sigmf-data if it exists
936-
2. The file in the `core:dataset` field (Non-Compliant Dataset) if it exists
937-
3. None (may be a metadata only distribution)
935+
1. The file named <METAFILE_BASENAME>.sigmf-data if it exists
936+
2. The file in the `core:dataset` field (Non-Compliant Dataset) if it exists
937+
3. None (may be a metadata only distribution)
938938
"""
939-
compliant_data_fn = get_sigmf_filenames(meta_fn)["data_fn"]
940-
noncompliant_data_fn = metadata["global"].get("core:dataset", None)
939+
compliant_filename = get_sigmf_filenames(meta_fn)["data_fn"]
940+
noncompliant_filename = metadata["global"].get("core:dataset", None)
941941

942-
if path.isfile(compliant_data_fn):
943-
if noncompliant_data_fn:
942+
if path.isfile(compliant_filename):
943+
if noncompliant_filename:
944944
warnings.warn(
945-
f"Compliant Dataset `{compliant_data_fn}` exists but "
946-
f'"core:dataset" is also defined; using `{compliant_data_fn}`'
945+
f"Compliant Dataset `{compliant_filename}` exists but "
946+
f"{SigMFFile.DATASET_KEY} is also defined; using `{compliant_filename}`"
947947
)
948-
return compliant_data_fn
948+
return compliant_filename
949949

950-
elif noncompliant_data_fn:
950+
elif noncompliant_filename:
951951
dir_path = path.split(meta_fn)[0]
952-
noncompliant_data_file_path = path.join(dir_path, noncompliant_data_fn)
952+
noncompliant_data_file_path = path.join(dir_path, noncompliant_filename)
953953
if path.isfile(noncompliant_data_file_path):
954-
if metadata["global"].get("core:metadata_only", False):
955-
warnings.warn(
956-
'Schema defines "core:dataset" but "core:metadata_only" '
957-
f"also exists; using `{noncompliant_data_fn}`"
954+
if metadata["global"].get(SigMFFile.METADATA_ONLY_KEY, False):
955+
raise SigMFFileError(
956+
f"Schema defines {SigMFFile.DATASET_KEY} "
957+
f"but {SigMFFile.METADATA_ONLY_KEY} also exists; using `{noncompliant_filename}`"
958958
)
959959
return noncompliant_data_file_path
960960
else:
961-
warnings.warn(
962-
f"Non-Compliant Dataset `{noncompliant_data_fn}` is specified " 'in "core:dataset" but does not exist!'
961+
raise SigMFFileError(
962+
f"Non-Compliant Dataset `{noncompliant_filename}` is specified in {SigMFFile.DATASET_KEY} "
963+
"but does not exist!"
963964
)
964-
965965
return None
966966

967967

tests/test_load_ncd.py

Lines changed: 0 additions & 65 deletions
This file was deleted.

tests/test_ncd.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# Copyright: Multiple Authors
2+
#
3+
# This file is part of sigmf-python. https://github.com/sigmf/sigmf-python
4+
#
5+
# SPDX-License-Identifier: LGPL-3.0-or-later
6+
7+
"""Tests for Non-Conforming Datasets"""
8+
9+
import copy
10+
import os
11+
import shutil
12+
import tempfile
13+
import unittest
14+
from pathlib import Path
15+
16+
import numpy as np
17+
from hypothesis import given
18+
from hypothesis import strategies as st
19+
20+
from sigmf.error import SigMFFileError
21+
from sigmf.sigmffile import SigMFFile, fromfile
22+
23+
from .testdata import TEST_FLOAT32_DATA, TEST_METADATA
24+
25+
26+
class TestNonConformingDataset(unittest.TestCase):
27+
"""unit tests for NCD"""
28+
29+
def setUp(self):
30+
"""create temporary path"""
31+
self.temp_dir = Path(tempfile.mkdtemp())
32+
33+
def tearDown(self):
34+
"""remove temporary path"""
35+
shutil.rmtree(self.temp_dir)
36+
37+
@given(st.sampled_from([".", "subdir/", "sub0/sub1/sub2/"]))
38+
def test_load_ncd(self, subdir: str) -> None:
39+
"""test loading non-conforming dataset"""
40+
data_path = self.temp_dir / subdir / "dat.bin"
41+
meta_path = self.temp_dir / subdir / "dat.sigmf-meta"
42+
os.makedirs(data_path.parent, exist_ok=True)
43+
44+
# create data file
45+
TEST_FLOAT32_DATA.tofile(data_path)
46+
47+
# create metadata file
48+
ncd_metadata = copy.deepcopy(TEST_METADATA)
49+
meta = SigMFFile(metadata=ncd_metadata, data_file=data_path)
50+
# tell SigMF that the data is noncompliant
51+
meta.set_global_field(SigMFFile.DATASET_KEY, data_path.name)
52+
meta.validate()
53+
meta.tofile(meta_path)
54+
55+
# load dataset & validate we can read all the data
56+
meta_loopback = fromfile(meta_path)
57+
self.assertTrue(np.array_equal(TEST_FLOAT32_DATA, meta_loopback.read_samples()))
58+
self.assertTrue(np.array_equal(TEST_FLOAT32_DATA, meta_loopback[:]))
59+
60+
# delete the non-conforming dataset and ensure error is raised due to missing dataset
61+
os.remove(data_path)
62+
with self.assertRaises(SigMFFileError):
63+
_ = fromfile(meta_path)

0 commit comments

Comments
 (0)