test_verify_image.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. /*
  2. * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. /*
  7. * Tests for bootloader_support esp_load(ESP_IMAGE_VERIFY, ...)
  8. */
  9. #include <esp_types.h>
  10. #include <stdio.h>
  11. #include "string.h"
  12. #include "freertos/FreeRTOS.h"
  13. #include "freertos/task.h"
  14. #include "freertos/semphr.h"
  15. #include "freertos/queue.h"
  16. #include "unity.h"
  17. #include "bootloader_common.h"
  18. #include "bootloader_util.h"
  19. #include "esp_partition.h"
  20. #include "esp_ota_ops.h"
  21. #include "esp_image_format.h"
  22. TEST_CASE("Verify bootloader image in flash", "[bootloader_support]")
  23. {
  24. const esp_partition_pos_t fake_bootloader_partition = {
  25. .offset = ESP_BOOTLOADER_OFFSET,
  26. .size = ESP_PARTITION_TABLE_OFFSET - ESP_BOOTLOADER_OFFSET,
  27. };
  28. esp_image_metadata_t data = { 0 };
  29. TEST_ASSERT_EQUAL_HEX(ESP_OK, esp_image_verify(ESP_IMAGE_VERIFY, &fake_bootloader_partition, &data));
  30. TEST_ASSERT_NOT_EQUAL(0, data.image_len);
  31. uint32_t bootloader_length = 0;
  32. TEST_ASSERT_EQUAL_HEX(ESP_OK, esp_image_verify_bootloader(&bootloader_length));
  33. TEST_ASSERT_EQUAL(data.image_len, bootloader_length);
  34. }
  35. TEST_CASE("Verify unit test app image", "[bootloader_support]")
  36. {
  37. esp_image_metadata_t data = { 0 };
  38. const esp_partition_t *running = esp_ota_get_running_partition();
  39. TEST_ASSERT_NOT_EQUAL(NULL, running);
  40. const esp_partition_pos_t running_pos = {
  41. .offset = running->address,
  42. .size = running->size,
  43. };
  44. TEST_ASSERT_EQUAL_HEX(ESP_OK, esp_image_verify(ESP_IMAGE_VERIFY, &running_pos, &data));
  45. TEST_ASSERT_NOT_EQUAL(0, data.image_len);
  46. TEST_ASSERT_TRUE(data.image_len <= running->size);
  47. }
  48. void check_label_search (int num_test, const char *list, const char *t_label, bool result)
  49. {
  50. // gen_esp32part.py trims up to 16 characters
  51. // and the string may not have a null terminal symbol.
  52. // below is cutting as it does the generator.
  53. char label[16 + 1] = {0};
  54. strncpy(label, t_label, sizeof(label) - 1);
  55. bool ret = bootloader_common_label_search(list, label);
  56. if (ret != result) {
  57. printf("%d) %s | %s \n", num_test, list, label);
  58. }
  59. TEST_ASSERT_MESSAGE(ret == result, "Test failed");
  60. }
  61. TEST_CASE("Test label_search", "[bootloader_support]")
  62. {
  63. TEST_ASSERT_FALSE(bootloader_common_label_search(NULL, NULL));
  64. TEST_ASSERT_FALSE(bootloader_common_label_search("nvs", NULL));
  65. check_label_search(1, "nvs", "nvs", true);
  66. check_label_search(2, "nvs, ", "nvs", true);
  67. check_label_search(3, "nvs1", "nvs", false);
  68. check_label_search(3, "nvs1, ", "nvs", false);
  69. check_label_search(4, "nvs1nvs1, phy", "nvs1", false);
  70. check_label_search(5, "nvs1, nvs1, phy", "nvs1", true);
  71. check_label_search(6, "nvs12, nvs12, phy", "nvs1", false);
  72. check_label_search(7, "nvs12, nvs1, phy", "nvs1", true);
  73. check_label_search(8, "nvs12, nvs3, phy, nvs1","nvs1", true);
  74. check_label_search(9, "nvs1nvs1, phy, nvs", "nvs", true);
  75. check_label_search(10, "nvs1nvs1, phy, nvs1", "nvs", false);
  76. check_label_search(11, "nvs1, nvs, phy, nvs1", "nvs", true);
  77. check_label_search(12, "nvs1, nvs2, phy, nvs","nvs", true);
  78. check_label_search(13, "ota_data, backup_nvs", "nvs", false);
  79. check_label_search(14, "nvs1, nvs2, ota, nvs", "vs1", false);
  80. check_label_search(20, "12345678901234, phy, nvs1", "12345678901234", true);
  81. check_label_search(21, "123456789012345, phy, nvs1", "123456789012345", true);
  82. check_label_search(22, "1234567890123456, phy, nvs1", "1234567890123456", true);
  83. check_label_search(23, "12345678901234567, phy, nvs1", "12345678901234567", false);
  84. check_label_search(24, "1234567890123456, phy, nvs1", "12345678901234567", true);
  85. check_label_search(25, "phy, 1234567890123456, nvs1", "12345678901234567", true);
  86. }
  87. TEST_CASE("Test regions_overlap", "[bootloader_support]")
  88. {
  89. TEST_ASSERT( bootloader_util_regions_overlap(1, 2, 1, 2) );
  90. TEST_ASSERT( bootloader_util_regions_overlap(1, 2, 0, 2) );
  91. TEST_ASSERT( bootloader_util_regions_overlap(1, 2, 1, 3) );
  92. TEST_ASSERT( bootloader_util_regions_overlap(1, 2, 0, 3) );
  93. TEST_ASSERT( bootloader_util_regions_overlap(0, 2, 1, 2) );
  94. TEST_ASSERT( bootloader_util_regions_overlap(1, 3, 1, 2) );
  95. TEST_ASSERT( bootloader_util_regions_overlap(0, 3, 1, 2) );
  96. TEST_ASSERT( !bootloader_util_regions_overlap(2, 3, 1, 2) );
  97. TEST_ASSERT( !bootloader_util_regions_overlap(1, 2, 2, 3) );
  98. TEST_ASSERT( !bootloader_util_regions_overlap(3, 4, 1, 2) );
  99. TEST_ASSERT( !bootloader_util_regions_overlap(1, 2, 3, 4) );
  100. }