@@ -119,10 +119,76 @@ TEST(partition_bdl, test_two_partitions_bdl_ops)
119119 TEST_ESP_OK (part_blockdev_2 -> ops -> release (part_blockdev_2 ));
120120}
121121
122+ TEST (partition_bdl , test_partition_bdl_limits )
123+ {
124+ // Limits tested:
125+ // - geometry alignment with parameter size for all ops
126+ // - dst buffer size check when reading
127+ // Partition boundaries and other checks are provided by underlying partition APIs and are not verified here
128+
129+ esp_blockdev_handle_t part_blockdev = NULL ;
130+ TEST_ESP_OK (esp_partition_get_blockdev (ESP_PARTITION_TYPE_DATA , ESP_PARTITION_SUBTYPE_ANY , "storage1" , & part_blockdev ));
131+
132+ //artifitial setup setup for this test only
133+ part_blockdev -> geometry .erase_size = 512 ;
134+ part_blockdev -> geometry .read_size = 4 ;
135+ part_blockdev -> geometry .write_size = 16 ;
136+
137+ const size_t data_size = part_blockdev -> geometry .erase_size ;
138+ uint8_t test_data [data_size ];
139+ uint8_t test_data_err [data_size - 3 ];
140+ const off_t target_addr_err = 3 ;
141+
142+ //correct addr, wrong length
143+ TEST_ASSERT_EQUAL (ESP_ERR_INVALID_SIZE , part_blockdev -> ops -> erase (part_blockdev , 0 , data_size + 3 ));
144+ //wrong addr, correct length
145+ TEST_ASSERT_EQUAL (ESP_ERR_INVALID_SIZE , part_blockdev -> ops -> erase (part_blockdev , target_addr_err , part_blockdev -> geometry .erase_size ));
146+
147+ //correct addr, correct dst buff, wrong length
148+ TEST_ASSERT_EQUAL (ESP_ERR_INVALID_SIZE , part_blockdev -> ops -> read (part_blockdev , test_data , data_size , 0 , data_size + 3 ));
149+ //wrong addr, correct dst buff, correct length
150+ TEST_ASSERT_EQUAL (ESP_ERR_INVALID_SIZE , part_blockdev -> ops -> read (part_blockdev , test_data , data_size , target_addr_err , data_size ));
151+ //correct addr, wrong dst buff, correct length
152+ TEST_ASSERT_EQUAL (ESP_ERR_INVALID_ARG , part_blockdev -> ops -> read (part_blockdev , test_data_err , sizeof (test_data_err ), 0 , data_size ));
153+
154+ //correct addr, wrong length
155+ TEST_ASSERT_EQUAL (ESP_ERR_INVALID_SIZE , part_blockdev -> ops -> write (part_blockdev , test_data , 0 , data_size + 3 ));
156+ //wrong addr, correct length
157+ TEST_ASSERT_EQUAL (ESP_ERR_INVALID_SIZE , part_blockdev -> ops -> write (part_blockdev , test_data , target_addr_err , data_size ));
158+
159+ //release the BDL objects
160+ TEST_ESP_OK (part_blockdev -> ops -> release (part_blockdev ));
161+ }
162+
163+ TEST (partition_bdl , test_bdl_partition_readonly )
164+ {
165+ //storage3 is readonly partition
166+ esp_blockdev_handle_t part_blockdev = NULL ;
167+ TEST_ESP_OK (esp_partition_get_blockdev (ESP_PARTITION_TYPE_DATA , ESP_PARTITION_SUBTYPE_ANY , "storage3" , & part_blockdev ));
168+
169+ //test flags
170+ TEST_ASSERT_EQUAL (1 , part_blockdev -> device_flags .read_only );
171+ TEST_ASSERT_EQUAL (0 , part_blockdev -> geometry .write_size );
172+ TEST_ASSERT_EQUAL (0 , part_blockdev -> geometry .erase_size );
173+ TEST_ASSERT_EQUAL (0 , part_blockdev -> geometry .recommended_write_size );
174+ TEST_ASSERT_EQUAL (0 , part_blockdev -> geometry .recommended_erase_size );
175+
176+ uint8_t dummy_test_buff [1024 ];
177+
178+ //write & erase must fail and read must work normally
179+ TEST_ASSERT_EQUAL (ESP_ERR_NOT_SUPPORTED , part_blockdev -> ops -> erase (part_blockdev , 0 , sizeof (dummy_test_buff )));
180+ TEST_ASSERT_EQUAL (ESP_ERR_NOT_SUPPORTED , part_blockdev -> ops -> write (part_blockdev , dummy_test_buff , 0 , sizeof (dummy_test_buff )));
181+ TEST_ESP_OK (part_blockdev -> ops -> read (part_blockdev , dummy_test_buff , sizeof (dummy_test_buff ), 0 , sizeof (dummy_test_buff )));
182+
183+ TEST_ESP_OK (part_blockdev -> ops -> release (part_blockdev ));
184+ }
185+
122186TEST_GROUP_RUNNER (partition_bdl )
123187{
124188 RUN_TEST_CASE (partition_bdl , test_partition_bdl_ops );
125189 RUN_TEST_CASE (partition_bdl , test_two_partitions_bdl_ops );
190+ RUN_TEST_CASE (partition_bdl , test_partition_bdl_limits );
191+ RUN_TEST_CASE (partition_bdl , test_bdl_partition_readonly );
126192}
127193
128194static void run_all_tests (void )
0 commit comments