sm_config_crc_list_ut.cpp
1 #include "fff.h" 2 #include "mock_configuration.h" 3 #include "sm_config_crc_list.h" 4 #include "gtest/gtest.h" 5 6 DEFINE_FFF_GLOBALS; 7 8 using namespace testing; 9 10 TEST(SMConfigCRCListTests, EmptyList) { 11 MockConfiguration mock_cfg; 12 ON_CALL(mock_cfg, 13 getConfigCbor(StrEq(SMConfigCRCList::KEY), Eq(SMConfigCRCList::KEY_LEN), _, _)) 14 .WillByDefault( 15 Invoke([](const char *key, size_t key_len, uint8_t *value, size_t &value_len) { 16 (void)key; 17 (void)key_len; 18 uint8_t buf[] = {0x80}; // empty cbor array 19 value_len = sizeof(buf); 20 memcpy(value, buf, value_len); 21 return true; 22 })); 23 24 SMConfigCRCList sm_config_crc_list(&mock_cfg); 25 EXPECT_EQ(sm_config_crc_list.contains(0x12345678), false); 26 uint32_t list_size = 0; 27 uint32_t *crc_list = sm_config_crc_list.alloc_list(list_size); 28 EXPECT_EQ(list_size, 0); 29 EXPECT_EQ(crc_list, nullptr); 30 } 31 32 TEST(SMConfigCRCListTests, OneItemList) { 33 MockConfiguration mock_cfg; 34 ON_CALL(mock_cfg, 35 getConfigCbor(StrEq(SMConfigCRCList::KEY), Eq(SMConfigCRCList::KEY_LEN), _, _)) 36 .WillByDefault( 37 Invoke([](const char *key, size_t key_len, uint8_t *value, size_t &value_len) { 38 (void)key; 39 (void)key_len; 40 // cbor array containing one uint32 41 uint8_t buf[] = {0x81, 0x1A, 0x12, 0x34, 0x56, 0x78}; 42 value_len = sizeof(buf); 43 memcpy(value, buf, value_len); 44 return true; 45 })); 46 47 SMConfigCRCList sm_config_crc_list(&mock_cfg); 48 EXPECT_EQ(sm_config_crc_list.contains(0x78563412), false); 49 EXPECT_EQ(sm_config_crc_list.contains(0x12345678), true); 50 } 51 52 TEST(SMConfigCRCListTests, AddOneItem) { 53 uint8_t buf[SMConfigCRCList::MAX_BUFFER_SIZE] = {0x81, 0x1A, 0x12, 0x34, 0x56, 0x78}; 54 size_t buf_size = 6; 55 56 MockConfiguration mock_cfg; 57 ON_CALL(mock_cfg, 58 getConfigCbor(StrEq(SMConfigCRCList::KEY), Eq(SMConfigCRCList::KEY_LEN), _, _)) 59 .WillByDefault(Invoke([&buf, &buf_size](const char *key, size_t key_len, uint8_t *value, 60 size_t &value_len) { 61 (void)key; 62 (void)key_len; 63 value_len = buf_size; 64 memcpy(value, buf, value_len); 65 return true; 66 })); 67 EXPECT_CALL(mock_cfg, 68 setConfigCbor(StrEq(SMConfigCRCList::KEY), Eq(SMConfigCRCList::KEY_LEN), _, _)) 69 .WillOnce(Invoke( 70 [&buf, &buf_size](const char *key, size_t key_len, uint8_t *value, size_t value_len) { 71 (void)key; 72 (void)key_len; 73 buf_size = value_len; 74 memcpy(buf, value, value_len); 75 return true; 76 })); 77 78 SMConfigCRCList sm_config_crc_list(&mock_cfg); 79 EXPECT_TRUE(sm_config_crc_list.contains(0x12345678)); 80 EXPECT_FALSE(sm_config_crc_list.contains(0x78563412)); 81 EXPECT_FALSE(sm_config_crc_list.contains(0x21436587)); 82 EXPECT_FALSE(sm_config_crc_list.contains(0x87654321)); 83 sm_config_crc_list.add(0x87654321); 84 EXPECT_TRUE(sm_config_crc_list.contains(0x87654321)); 85 EXPECT_TRUE(sm_config_crc_list.contains(0x12345678)); 86 } 87 88 TEST(SMConfigCRCListTests, AddMoreItemsThanListMax) { 89 uint8_t buf[SMConfigCRCList::MAX_BUFFER_SIZE] = {0x80}; 90 size_t buf_size = 1; 91 92 MockConfiguration mock_cfg; 93 ON_CALL(mock_cfg, 94 getConfigCbor(StrEq(SMConfigCRCList::KEY), Eq(SMConfigCRCList::KEY_LEN), _, _)) 95 .WillByDefault(Invoke([&buf, &buf_size](const char *key, size_t key_len, uint8_t *value, 96 size_t &value_len) { 97 (void)key; 98 (void)key_len; 99 value_len = buf_size; 100 memcpy(value, buf, value_len); 101 return true; 102 })); 103 ON_CALL(mock_cfg, 104 setConfigCbor(StrEq(SMConfigCRCList::KEY), Eq(SMConfigCRCList::KEY_LEN), _, _)) 105 .WillByDefault(Invoke( 106 [&buf, &buf_size](const char *key, size_t key_len, uint8_t *value, size_t value_len) { 107 (void)key; 108 (void)key_len; 109 buf_size = value_len; 110 memcpy(buf, value, value_len); 111 return true; 112 })); 113 114 SMConfigCRCList sm_config_crc_list(&mock_cfg); 115 116 // Fill the list and check that they are all there 117 constexpr uint32_t crc_start = 0xF0000001; 118 constexpr uint32_t crc_endcap = crc_start + SMConfigCRCList::MAX_LIST_SIZE; 119 uint32_t crc; 120 for (crc = crc_start; crc < crc_endcap; crc++) { 121 sm_config_crc_list.add(crc); 122 } 123 for (crc = crc_start; crc < crc_endcap; crc++) { 124 EXPECT_TRUE(sm_config_crc_list.contains(crc)); 125 } 126 127 // Add one more and check that the first one is gone 128 sm_config_crc_list.add(crc_endcap); 129 EXPECT_FALSE(sm_config_crc_list.contains(crc_start)); 130 for (crc = crc_start + 1; crc <= crc_endcap; crc++) { 131 EXPECT_TRUE(sm_config_crc_list.contains(crc)); 132 } 133 } 134 135 TEST(SMConfigCRCListTests, Clear) { 136 MockConfiguration mock_cfg; 137 ON_CALL(mock_cfg, 138 getConfigCbor(StrEq(SMConfigCRCList::KEY), Eq(SMConfigCRCList::KEY_LEN), _, _)) 139 .WillByDefault( 140 Invoke([](const char *key, size_t key_len, uint8_t *value, size_t &value_len) { 141 (void)key; 142 (void)key_len; 143 uint8_t buf[] = {0x81, 0x1A, 0x12, 0x34, 0x56, 0x78}; 144 value_len = sizeof(buf); 145 memcpy(value, buf, value_len); 146 return true; 147 })); 148 EXPECT_CALL(mock_cfg, 149 setConfigCbor(StrEq(SMConfigCRCList::KEY), Eq(SMConfigCRCList::KEY_LEN), _, _)) 150 .WillOnce(Invoke([](const char *key, size_t key_len, uint8_t *value, size_t value_len) { 151 (void)key; 152 (void)key_len; 153 EXPECT_EQ(value_len, 1); 154 EXPECT_EQ(value[0], 0x80); 155 return true; 156 })); 157 158 SMConfigCRCList sm_config_crc_list(&mock_cfg); 159 sm_config_crc_list.clear(); 160 } 161 162 TEST(SMConfigCRCListTests, AllocList) { 163 MockConfiguration mock_cfg; 164 ON_CALL(mock_cfg, 165 getConfigCbor(StrEq(SMConfigCRCList::KEY), Eq(SMConfigCRCList::KEY_LEN), _, _)) 166 .WillByDefault( 167 Invoke([](const char *key, size_t key_len, uint8_t *value, size_t &value_len) { 168 (void)key; 169 (void)key_len; 170 // cbor array containing one uint32 171 uint8_t buf[] = {0x81, 0x1A, 0x12, 0x34, 0x56, 0x78}; 172 value_len = sizeof(buf); 173 memcpy(value, buf, value_len); 174 return true; 175 })); 176 177 SMConfigCRCList sm_config_crc_list(&mock_cfg); 178 EXPECT_EQ(sm_config_crc_list.contains(0x12345678), true); 179 uint32_t list_size; 180 uint32_t *crc_list = sm_config_crc_list.alloc_list(list_size); 181 EXPECT_EQ(list_size, 1); 182 EXPECT_EQ(crc_list[0], 0x12345678); 183 free(crc_list); 184 }