1919import nvs_check as nvs_check
2020import pytest
2121from esp_idf_nvs_partition_gen .nvs_partition_gen import NVS
22- from nvs_logger import nvs_log
2322from nvs_logger import NVS_Logger
23+ from nvs_logger import nvs_log
2424from nvs_logger import print_minimal_json
25- from nvs_parser import nvs_const
2625from nvs_parser import NVS_Entry
2726from nvs_parser import NVS_Partition
27+ from nvs_parser import nvs_const
2828from 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
5050logger = 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.
5353Nullam eget orci fringilla, cursus nisi sit amet, hendrerit tortor.
5454Vivamus lectus dolor, rhoncus eget metus id, convallis placerat quam.
5555Nulla facilisi.
@@ -82,7 +82,7 @@ def info(self, *args, **kwargs) -> None: # type: ignore
8282Vivamus imperdiet non augue in tincidunt.
8383Sed aliquet tincidunt dignissim.
8484Name vehicula leo eu dolor pellentesque, ultrices tempus ex hendrerit.
85- '''
85+ """
8686
8787
8888def 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
375415def 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
453493def 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