Skip to content

Commit f0f0286

Browse files
committed
Merge branch 'feat/nvs_pytest_add_non_ascii_string_test' into 'master'
feat: Add NVS generator check test for CRC of non-ASCII strings Closes IDF-12979 See merge request espressif/esp-idf!38630
2 parents 40e1abf + 71921a4 commit f0f0286

File tree

1 file changed

+100
-41
lines changed

1 file changed

+100
-41
lines changed

components/nvs_flash/nvs_partition_tool/test_nvs_gen_check.py

Lines changed: 100 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,15 @@
1919
import nvs_check as nvs_check
2020
import pytest
2121
from esp_idf_nvs_partition_gen.nvs_partition_gen import NVS
22-
from nvs_logger import nvs_log
2322
from nvs_logger import NVS_Logger
23+
from nvs_logger import nvs_log
2424
from nvs_logger import print_minimal_json
25-
from nvs_parser import nvs_const
2625
from nvs_parser import NVS_Entry
2726
from nvs_parser import NVS_Partition
27+
from nvs_parser import nvs_const
2828
from packaging.version import Version
2929

30-
NVS_PART_GEN_VERSION_SKIP = '0.1.8'
30+
NVS_PART_GEN_VERSION_SKIP = '0.1.9'
3131

3232

3333
# Temporary workaround for pytest skipping tests based on the version of the esp-idf-nvs-partition-gen package
@@ -49,7 +49,7 @@ def info(self, *args, **kwargs) -> None: # type: ignore
4949

5050
logger = nvs_log # SilentLogger()
5151

52-
LOREM_STRING = '''Lorem ipsum dolor sit amet, consectetur adipiscing elit.
52+
LOREM_STRING = """Lorem ipsum dolor sit amet, consectetur adipiscing elit.
5353
Nullam eget orci fringilla, cursus nisi sit amet, hendrerit tortor.
5454
Vivamus lectus dolor, rhoncus eget metus id, convallis placerat quam.
5555
Nulla facilisi.
@@ -82,7 +82,7 @@ def info(self, *args, **kwargs) -> None: # type: ignore
8282
Vivamus imperdiet non augue in tincidunt.
8383
Sed aliquet tincidunt dignissim.
8484
Name vehicula leo eu dolor pellentesque, ultrices tempus ex hendrerit.
85-
'''
85+
"""
8686

8787

8888
def get_entry_type_bin(entry_type_str: str) -> Optional[int]:
@@ -93,7 +93,9 @@ def get_entry_type_bin(entry_type_str: str) -> Optional[int]:
9393
return entry_type_bin
9494

9595

96-
def create_entry_data_bytearray(namespace_index: int, entry_type: int, span: int, chunk_index: int, key: str, data: Any) -> bytearray:
96+
def create_entry_data_bytearray(
97+
namespace_index: int, entry_type: int, span: int, chunk_index: int, key: str, data: Any
98+
) -> bytearray:
9799
key_bytearray = bytearray(key, 'ascii')
98100
key_encoded = (key_bytearray + bytearray({0x00}) * (16 - len(key_bytearray)))[:16] # Pad key with null bytes
99101
key_encoded[15] = 0x00 # Null-terminate the key
@@ -131,6 +133,7 @@ def _execute_nvs_setup(nvs_setup_func: Callable, output: Optional[Path] = None)
131133
nvs_parsed = NVS_Partition('test', bytearray(nvs_file.read()))
132134
nvs_file.close()
133135
return nvs_parsed
136+
134137
return _execute_nvs_setup
135138

136139

@@ -143,7 +146,7 @@ def setup_ok_primitive(nvs_file: Optional[Union[BytesIO, BufferedRandom]]) -> NV
143146
version=nvs_partition_gen.Page.VERSION2,
144147
is_encrypt=False,
145148
key=None,
146-
read_only=read_only
149+
read_only=read_only,
147150
)
148151

149152
nvs_partition_gen.write_entry(nvs_obj, 'storage', 'namespace', '', '')
@@ -162,17 +165,19 @@ def setup_ok_variable_len(nvs_file: Optional[Union[BytesIO, BufferedRandom]]) ->
162165
version=nvs_partition_gen.Page.VERSION2,
163166
is_encrypt=False,
164167
key=None,
165-
read_only=read_only
168+
read_only=read_only,
166169
)
167170

168171
nvs_partition_gen.write_entry(nvs_obj, 'storage', 'namespace', '', '')
169172
nvs_partition_gen.write_entry(nvs_obj, 'short_string_key', 'data', 'string', 'Hello world!')
170-
nvs_partition_gen.write_entry(nvs_obj, 'blob_key', 'file', 'binary',
171-
'../nvs_partition_generator/testdata/sample_blob.bin')
173+
nvs_partition_gen.write_entry(
174+
nvs_obj, 'blob_key', 'file', 'binary', '../nvs_partition_generator/testdata/sample_blob.bin'
175+
)
172176
nvs_partition_gen.write_entry(nvs_obj, 'lorem_string_key', 'data', 'string', LOREM_STRING * 2)
173177
nvs_partition_gen.write_entry(nvs_obj, 'uniq_string_key', 'data', 'string', 'I am unique!')
174-
nvs_partition_gen.write_entry(nvs_obj, 'multi_blob_key', 'file', 'binary',
175-
'../nvs_partition_generator/testdata/sample_multipage_blob.bin')
178+
nvs_partition_gen.write_entry(
179+
nvs_obj, 'multi_blob_key', 'file', 'binary', '../nvs_partition_generator/testdata/sample_multipage_blob.bin'
180+
)
176181

177182
return nvs_obj
178183

@@ -185,16 +190,17 @@ def setup_ok_mixed(nvs_file: Optional[Union[BytesIO, BufferedRandom]]) -> NVS:
185190
version=nvs_partition_gen.Page.VERSION2,
186191
is_encrypt=False,
187192
key=None,
188-
read_only=read_only
193+
read_only=read_only,
189194
)
190195

191196
prim_types = ['i8', 'u8', 'i16', 'u16', 'i32', 'u32']
192197

193198
nvs_partition_gen.write_entry(nvs_obj, 'storage', 'namespace', '', '')
194199
for i in range(20):
195200
nvs_partition_gen.write_entry(nvs_obj, f'test_{i}', 'data', prim_types[i % len(prim_types)], str(i))
196-
nvs_partition_gen.write_entry(nvs_obj, 'blob_key', 'file', 'binary',
197-
'../nvs_partition_generator/testdata/sample_singlepage_blob.bin')
201+
nvs_partition_gen.write_entry(
202+
nvs_obj, 'blob_key', 'file', 'binary', '../nvs_partition_generator/testdata/sample_singlepage_blob.bin'
203+
)
198204

199205
nvs_partition_gen.write_entry(nvs_obj, 'etc', 'namespace', '', '')
200206
for i in range(20):
@@ -207,8 +213,9 @@ def setup_ok_mixed(nvs_file: Optional[Union[BytesIO, BufferedRandom]]) -> NVS:
207213
nvs_partition_gen.write_entry(nvs_obj, f'test_{i}', 'data', prim_types[i % len(prim_types)], str(i))
208214

209215
nvs_partition_gen.write_entry(nvs_obj, 'uniq_string_key', 'data', 'string', 'I am unique!')
210-
nvs_partition_gen.write_entry(nvs_obj, 'blob_key', 'file', 'binary',
211-
'../nvs_partition_generator/testdata/sample_multipage_blob.bin')
216+
nvs_partition_gen.write_entry(
217+
nvs_obj, 'blob_key', 'file', 'binary', '../nvs_partition_generator/testdata/sample_multipage_blob.bin'
218+
)
212219

213220
return nvs_obj
214221

@@ -221,16 +228,17 @@ def setup_bad_mixed_same_key_different_page(nvs_file: Optional[Union[BytesIO, Bu
221228
version=nvs_partition_gen.Page.VERSION2,
222229
is_encrypt=False,
223230
key=None,
224-
read_only=read_only
231+
read_only=read_only,
225232
)
226233

227234
prim_types = ['i8', 'u8', 'i16', 'u16', 'i32', 'u32']
228235

229236
nvs_partition_gen.write_entry(nvs_obj, 'storage', 'namespace', '', '')
230237
for i in range(20):
231238
nvs_partition_gen.write_entry(nvs_obj, f'test_{i}', 'data', prim_types[i % len(prim_types)], str(i))
232-
nvs_partition_gen.write_entry(nvs_obj, 'blob_key', 'file', 'binary',
233-
'../nvs_partition_generator/testdata/sample_singlepage_blob.bin')
239+
nvs_partition_gen.write_entry(
240+
nvs_obj, 'blob_key', 'file', 'binary', '../nvs_partition_generator/testdata/sample_singlepage_blob.bin'
241+
)
234242

235243
nvs_partition_gen.write_entry(nvs_obj, 'etc', 'namespace', '', '')
236244
for i in range(20):
@@ -239,22 +247,33 @@ def setup_bad_mixed_same_key_different_page(nvs_file: Optional[Union[BytesIO, Bu
239247
nvs_partition_gen.write_entry(nvs_obj, 'lorem_string_key', 'data', 'string', LOREM_STRING * 2)
240248

241249
nvs_partition_gen.write_entry(nvs_obj, 'uniq_string_key', 'data', 'string', 'I am unique!')
242-
nvs_partition_gen.write_entry(nvs_obj, 'blob_key', 'file', 'binary',
243-
'../nvs_partition_generator/testdata/sample_multipage_blob.bin')
250+
nvs_partition_gen.write_entry(
251+
nvs_obj, 'blob_key', 'file', 'binary', '../nvs_partition_generator/testdata/sample_multipage_blob.bin'
252+
)
244253

245254
# Should be on a different page already - start creating duplicates
246255

247256
for i in range(6):
248257
data_type = prim_types[i % len(prim_types)]
249-
nvs_partition_gen.write_entry(nvs_obj, f'test_{i}', 'data', data_type, str(i)) # Conflicting keys under "abcd" namespace - 6 duplicates
250-
nvs_partition_gen.write_entry(nvs_obj, 'lorem_string_key', 'data', 'string', 'abc') # Conflicting key for string - 7th duplicate
258+
nvs_partition_gen.write_entry(
259+
nvs_obj, f'test_{i}', 'data', data_type, str(i)
260+
) # Conflicting keys under "abcd" namespace - 6 duplicates
261+
nvs_partition_gen.write_entry(
262+
nvs_obj, 'lorem_string_key', 'data', 'string', 'abc'
263+
) # Conflicting key for string - 7th duplicate
251264

252265
# Create new duplicates of storage namespace with an unsafe version of write_namespace function
253-
nvs_obj.write_namespace_unsafe('storage') # Conflicting namespace - 8th duplicate (the function is only for testing)
266+
nvs_obj.write_namespace_unsafe(
267+
'storage'
268+
) # Conflicting namespace - 8th duplicate (the function is only for testing)
254269

255270
nvs_partition_gen.write_entry(nvs_obj, 'storage2', 'namespace', '', '') # New namespace, ignored
256-
nvs_partition_gen.write_entry(nvs_obj, 'lorem_string_key', 'data', 'string', 'abc') # Should be ignored as is under different "storage2" namespace
257-
nvs_partition_gen.write_entry(nvs_obj, 'lorem_string', 'data', 'string', 'abc') # 3 conflicting keys under "storage2" namespace - 9th duplicate
271+
nvs_partition_gen.write_entry(
272+
nvs_obj, 'lorem_string_key', 'data', 'string', 'abc'
273+
) # Should be ignored as is under different "storage2" namespace
274+
nvs_partition_gen.write_entry(
275+
nvs_obj, 'lorem_string', 'data', 'string', 'abc'
276+
) # 3 conflicting keys under "storage2" namespace - 9th duplicate
258277
nvs_partition_gen.write_entry(nvs_obj, 'lorem_string', 'data', 'string', 'def')
259278
nvs_partition_gen.write_entry(nvs_obj, 'lorem_string', 'data', 'string', '123')
260279

@@ -273,7 +292,7 @@ def setup_bad_same_key_primitive(nvs_file: Optional[Union[BytesIO, BufferedRando
273292
version=nvs_partition_gen.Page.VERSION2,
274293
is_encrypt=False,
275294
key=None,
276-
read_only=read_only
295+
read_only=read_only,
277296
)
278297

279298
nvs_partition_gen.write_entry(nvs_obj, 'storage', 'namespace', '', '')
@@ -295,7 +314,7 @@ def setup_bad_same_key_variable_len(nvs_file: Optional[Union[BytesIO, BufferedRa
295314
version=nvs_partition_gen.Page.VERSION2,
296315
is_encrypt=False,
297316
key=None,
298-
read_only=read_only
317+
read_only=read_only,
299318
)
300319

301320
nvs_partition_gen.write_entry(nvs_obj, 'storage', 'namespace', '', '')
@@ -314,16 +333,19 @@ def setup_bad_same_key_blob_index(nvs_file: Optional[Union[BytesIO, BufferedRand
314333
version=nvs_partition_gen.Page.VERSION2,
315334
is_encrypt=False,
316335
key=None,
317-
read_only=read_only
336+
read_only=read_only,
318337
)
319338

320339
nvs_partition_gen.write_entry(nvs_obj, 'storage', 'namespace', '', '')
321-
nvs_partition_gen.write_entry(nvs_obj, 'blob_key', 'file', 'binary',
322-
'../nvs_partition_generator/testdata/sample_multipage_blob.bin')
323-
nvs_partition_gen.write_entry(nvs_obj, 'blob_key_2', 'file', 'binary',
324-
'../nvs_partition_generator/testdata/sample_multipage_blob.bin')
325-
nvs_partition_gen.write_entry(nvs_obj, 'blob_key', 'file', 'binary',
326-
'../nvs_partition_generator/testdata/sample_multipage_blob.bin') # Duplicate key
340+
nvs_partition_gen.write_entry(
341+
nvs_obj, 'blob_key', 'file', 'binary', '../nvs_partition_generator/testdata/sample_multipage_blob.bin'
342+
)
343+
nvs_partition_gen.write_entry(
344+
nvs_obj, 'blob_key_2', 'file', 'binary', '../nvs_partition_generator/testdata/sample_multipage_blob.bin'
345+
)
346+
nvs_partition_gen.write_entry(
347+
nvs_obj, 'blob_key', 'file', 'binary', '../nvs_partition_generator/testdata/sample_multipage_blob.bin'
348+
) # Duplicate key
327349

328350
return nvs_obj
329351

@@ -336,7 +358,7 @@ def setup_read_only(nvs_file: Optional[Union[BytesIO, BufferedRandom]]) -> NVS:
336358
version=nvs_partition_gen.Page.VERSION2,
337359
is_encrypt=False,
338360
key=None,
339-
read_only=read_only
361+
read_only=read_only,
340362
)
341363

342364
nvs_partition_gen.write_entry(nvs_obj, 'storage', 'namespace', '', '')
@@ -356,21 +378,39 @@ def setup_minimal_json(nvs_file: Optional[Union[BytesIO, BufferedRandom]]) -> NV
356378
version=nvs_partition_gen.Page.VERSION2,
357379
is_encrypt=False,
358380
key=None,
359-
read_only=read_only
381+
read_only=read_only,
360382
)
361383

362384
nvs_partition_gen.write_entry(nvs_obj, 'storage', 'namespace', '', '')
363385
nvs_partition_gen.write_entry(nvs_obj, 'int32_test', 'data', 'i32', str(-42))
364386
nvs_partition_gen.write_entry(nvs_obj, 'uint32_test', 'data', 'u32', str(96))
365387
nvs_partition_gen.write_entry(nvs_obj, 'int8_test', 'data', 'i8', str(100))
366-
nvs_partition_gen.write_entry(nvs_obj, 'blob_key', 'file', 'binary',
367-
'../nvs_partition_generator/testdata/sample_multipage_blob.bin')
388+
nvs_partition_gen.write_entry(
389+
nvs_obj, 'blob_key', 'file', 'binary', '../nvs_partition_generator/testdata/sample_multipage_blob.bin'
390+
)
368391
nvs_partition_gen.write_entry(nvs_obj, 'short_str_key', 'data', 'string', 'Another string data')
369392
nvs_partition_gen.write_entry(nvs_obj, 'long_str_key', 'data', 'string', LOREM_STRING)
370393

371394
return nvs_obj
372395

373396

397+
def setup_ok_non_ascii_string(nvs_file: Optional[Union[BytesIO, BufferedRandom]]) -> NVS:
398+
size_fixed, read_only = nvs_partition_gen.check_size(str(0x4000))
399+
nvs_obj = nvs_partition_gen.nvs_open(
400+
result_obj=nvs_file,
401+
input_size=size_fixed,
402+
version=nvs_partition_gen.Page.VERSION2,
403+
is_encrypt=False,
404+
key=None,
405+
read_only=read_only,
406+
)
407+
408+
nvs_partition_gen.write_entry(nvs_obj, 'storage', 'namespace', '', '')
409+
nvs_partition_gen.write_entry(nvs_obj, 'string_key', 'data', 'string', 'ÄÄÄÄ')
410+
411+
return nvs_obj
412+
413+
374414
# Helper functions
375415
def prepare_duplicate_list(nvs: NVS_Partition) -> Dict[str, List[NVS_Entry]]:
376416
seen_written_entires_all: Dict[str, List[NVS_Entry]] = {}
@@ -453,7 +493,9 @@ def test_check_duplicates_bad_same_key_different_pages(generate_nvs: Callable, s
453493
def test_check_duplicates_bad_same_key_blob_index(generate_nvs: Callable, setup_func: Callable) -> None:
454494
nvs = generate_nvs(setup_func)
455495
duplicates = prepare_duplicate_list(nvs)
456-
assert len(duplicates) == 1 # Only one duplicate key list - blob_index and blob_data share the same key (which is OK),
496+
assert (
497+
len(duplicates) == 1
498+
) # Only one duplicate key list - blob_index and blob_data share the same key (which is OK),
457499
# however there are 2 duplicates of each blob_index and blob_data
458500
assert len(list(duplicates.values())[0]) == 6 # 6 entries with the blob_key (2x blob_index, 4x blob_data)
459501
nvs_check.integrity_check(nvs, logger)
@@ -513,3 +555,20 @@ def test_print_minimal_json(generate_nvs: Callable, setup_func: Callable, capsys
513555
assert captured.out.count('int32_test') == 2 # 2 entries for int32_test
514556
assert captured.out.count('uint32_test') == 1
515557
assert captured.out.count('int8_test') == 1
558+
559+
560+
@pytest.mark.parametrize('setup_func', [setup_ok_non_ascii_string])
561+
def test_check_non_ascii_string(generate_nvs: Callable, setup_func: Callable) -> None:
562+
nvs = generate_nvs(setup_func)
563+
assert nvs.raw_data is not None
564+
assert nvs_check.check_partition_size(nvs, logger, read_only=True)
565+
nvs_check.integrity_check(nvs, logger)
566+
567+
non_ascii_string_entry = nvs.pages[0].entries[1] # entries[0] is the namespace entry
568+
assert non_ascii_string_entry.key == 'string_key'
569+
570+
assert non_ascii_string_entry.metadata['crc']['original'] == non_ascii_string_entry.metadata['crc']['computed']
571+
assert (
572+
non_ascii_string_entry.metadata['crc']['data_original']
573+
== non_ascii_string_entry.metadata['crc']['data_computed']
574+
)

0 commit comments

Comments
 (0)