byte_stuffer_tests.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506
  1. /*
  2. The MIT License (MIT)
  3. Copyright (c) 2016 Fred Sundvik
  4. Permission is hereby granted, free of charge, to any person obtaining a copy
  5. of this software and associated documentation files (the "Software"), to deal
  6. in the Software without restriction, including without limitation the rights
  7. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  8. copies of the Software, and to permit persons to whom the Software is
  9. furnished to do so, subject to the following conditions:
  10. The above copyright notice and this permission notice shall be included in all
  11. copies or substantial portions of the Software.
  12. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  13. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  14. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  15. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  16. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  17. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  18. SOFTWARE.
  19. */
  20. #include <cgreen/cgreen.h>
  21. #include <cgreen/mocks.h>
  22. #include "serial_link/protocol/byte_stuffer.h"
  23. #include "serial_link/protocol/byte_stuffer.c"
  24. #include "serial_link/protocol/frame_validator.h"
  25. #include "serial_link/protocol/physical.h"
  26. static uint8_t sent_data[MAX_FRAME_SIZE*2];
  27. static uint16_t sent_data_size;
  28. Describe(ByteStuffer);
  29. BeforeEach(ByteStuffer) {
  30. init_byte_stuffer();
  31. sent_data_size = 0;
  32. }
  33. AfterEach(ByteStuffer) {}
  34. void validator_recv_frame(uint8_t link, uint8_t* data, uint16_t size) {
  35. mock(data, size);
  36. }
  37. void send_data(uint8_t link, const uint8_t* data, uint16_t size) {
  38. memcpy(sent_data + sent_data_size, data, size);
  39. sent_data_size += size;
  40. }
  41. Ensure(ByteStuffer, receives_no_frame_for_a_single_zero_byte) {
  42. never_expect(validator_recv_frame);
  43. byte_stuffer_recv_byte(0, 0);
  44. }
  45. Ensure(ByteStuffer, receives_no_frame_for_a_single_FF_byte) {
  46. never_expect(validator_recv_frame);
  47. byte_stuffer_recv_byte(0, 0xFF);
  48. }
  49. Ensure(ByteStuffer, receives_no_frame_for_a_single_random_byte) {
  50. never_expect(validator_recv_frame);
  51. byte_stuffer_recv_byte(0, 0x4A);
  52. }
  53. Ensure(ByteStuffer, receives_no_frame_for_a_zero_length_frame) {
  54. never_expect(validator_recv_frame);
  55. byte_stuffer_recv_byte(0, 1);
  56. byte_stuffer_recv_byte(0, 0);
  57. }
  58. Ensure(ByteStuffer, receives_single_byte_valid_frame) {
  59. uint8_t expected[] = {0x37};
  60. expect(validator_recv_frame,
  61. when(size, is_equal_to(1)),
  62. when(data, is_equal_to_contents_of(expected, 1))
  63. );
  64. byte_stuffer_recv_byte(0, 2);
  65. byte_stuffer_recv_byte(0, 0x37);
  66. byte_stuffer_recv_byte(0, 0);
  67. }
  68. Ensure(ByteStuffer, receives_three_bytes_valid_frame) {
  69. uint8_t expected[] = {0x37, 0x99, 0xFF};
  70. expect(validator_recv_frame,
  71. when(size, is_equal_to(3)),
  72. when(data, is_equal_to_contents_of(expected, 3))
  73. );
  74. byte_stuffer_recv_byte(0, 4);
  75. byte_stuffer_recv_byte(0, 0x37);
  76. byte_stuffer_recv_byte(0, 0x99);
  77. byte_stuffer_recv_byte(0, 0xFF);
  78. byte_stuffer_recv_byte(0, 0);
  79. }
  80. Ensure(ByteStuffer, receives_single_zero_valid_frame) {
  81. uint8_t expected[] = {0};
  82. expect(validator_recv_frame,
  83. when(size, is_equal_to(1)),
  84. when(data, is_equal_to_contents_of(expected, 1))
  85. );
  86. byte_stuffer_recv_byte(0, 1);
  87. byte_stuffer_recv_byte(0, 1);
  88. byte_stuffer_recv_byte(0, 0);
  89. }
  90. Ensure(ByteStuffer, receives_valid_frame_with_zeroes) {
  91. uint8_t expected[] = {5, 0, 3, 0};
  92. expect(validator_recv_frame,
  93. when(size, is_equal_to(4)),
  94. when(data, is_equal_to_contents_of(expected, 4))
  95. );
  96. byte_stuffer_recv_byte(0, 2);
  97. byte_stuffer_recv_byte(0, 5);
  98. byte_stuffer_recv_byte(0, 2);
  99. byte_stuffer_recv_byte(0, 3);
  100. byte_stuffer_recv_byte(0, 1);
  101. byte_stuffer_recv_byte(0, 0);
  102. }
  103. Ensure(ByteStuffer, receives_two_valid_frames) {
  104. uint8_t expected1[] = {5, 0};
  105. uint8_t expected2[] = {3};
  106. expect(validator_recv_frame,
  107. when(size, is_equal_to(2)),
  108. when(data, is_equal_to_contents_of(expected1, 2))
  109. );
  110. expect(validator_recv_frame,
  111. when(size, is_equal_to(1)),
  112. when(data, is_equal_to_contents_of(expected2, 1))
  113. );
  114. byte_stuffer_recv_byte(1, 2);
  115. byte_stuffer_recv_byte(1, 5);
  116. byte_stuffer_recv_byte(1, 1);
  117. byte_stuffer_recv_byte(1, 0);
  118. byte_stuffer_recv_byte(1, 2);
  119. byte_stuffer_recv_byte(1, 3);
  120. byte_stuffer_recv_byte(1, 0);
  121. }
  122. Ensure(ByteStuffer, receives_valid_frame_after_unexpected_zero) {
  123. uint8_t expected[] = {5, 7};
  124. expect(validator_recv_frame,
  125. when(size, is_equal_to(2)),
  126. when(data, is_equal_to_contents_of(expected, 2))
  127. );
  128. byte_stuffer_recv_byte(1, 3);
  129. byte_stuffer_recv_byte(1, 1);
  130. byte_stuffer_recv_byte(1, 0);
  131. byte_stuffer_recv_byte(1, 3);
  132. byte_stuffer_recv_byte(1, 5);
  133. byte_stuffer_recv_byte(1, 7);
  134. byte_stuffer_recv_byte(1, 0);
  135. }
  136. Ensure(ByteStuffer, receives_valid_frame_after_unexpected_non_zero) {
  137. uint8_t expected[] = {5, 7};
  138. expect(validator_recv_frame,
  139. when(size, is_equal_to(2)),
  140. when(data, is_equal_to_contents_of(expected, 2))
  141. );
  142. byte_stuffer_recv_byte(0, 2);
  143. byte_stuffer_recv_byte(0, 9);
  144. byte_stuffer_recv_byte(0, 4); // This should have been zero
  145. byte_stuffer_recv_byte(0, 0);
  146. byte_stuffer_recv_byte(0, 3);
  147. byte_stuffer_recv_byte(0, 5);
  148. byte_stuffer_recv_byte(0, 7);
  149. byte_stuffer_recv_byte(0, 0);
  150. }
  151. Ensure(ByteStuffer, receives_a_valid_frame_with_over254_non_zeroes_and_then_end_of_frame) {
  152. uint8_t expected[254];
  153. int i;
  154. for (i=0;i<254;i++) {
  155. expected[i] = i + 1;
  156. }
  157. expect(validator_recv_frame,
  158. when(size, is_equal_to(254)),
  159. when(data, is_equal_to_contents_of(expected, 254))
  160. );
  161. byte_stuffer_recv_byte(0, 0xFF);
  162. for (i=0;i<254;i++) {
  163. byte_stuffer_recv_byte(0, i+1);
  164. }
  165. byte_stuffer_recv_byte(0, 0);
  166. }
  167. Ensure(ByteStuffer, receives_a_valid_frame_with_over254_non_zeroes_next_byte_is_non_zero) {
  168. uint8_t expected[255];
  169. int i;
  170. for (i=0;i<254;i++) {
  171. expected[i] = i + 1;
  172. }
  173. expected[254] = 7;
  174. expect(validator_recv_frame,
  175. when(size, is_equal_to(255)),
  176. when(data, is_equal_to_contents_of(expected, 255))
  177. );
  178. byte_stuffer_recv_byte(0, 0xFF);
  179. for (i=0;i<254;i++) {
  180. byte_stuffer_recv_byte(0, i+1);
  181. }
  182. byte_stuffer_recv_byte(0, 2);
  183. byte_stuffer_recv_byte(0, 7);
  184. byte_stuffer_recv_byte(0, 0);
  185. }
  186. Ensure(ByteStuffer, receives_a_valid_frame_with_over254_non_zeroes_next_byte_is_zero) {
  187. uint8_t expected[255];
  188. int i;
  189. for (i=0;i<254;i++) {
  190. expected[i] = i + 1;
  191. }
  192. expected[254] = 0;
  193. expect(validator_recv_frame,
  194. when(size, is_equal_to(255)),
  195. when(data, is_equal_to_contents_of(expected, 255))
  196. );
  197. byte_stuffer_recv_byte(0, 0xFF);
  198. for (i=0;i<254;i++) {
  199. byte_stuffer_recv_byte(0, i+1);
  200. }
  201. byte_stuffer_recv_byte(0, 1);
  202. byte_stuffer_recv_byte(0, 1);
  203. byte_stuffer_recv_byte(0, 0);
  204. }
  205. Ensure(ByteStuffer, receives_two_long_frames_and_some_more) {
  206. uint8_t expected[515];
  207. int i;
  208. int j;
  209. for (j=0;j<2;j++) {
  210. for (i=0;i<254;i++) {
  211. expected[i+254*j] = i + 1;
  212. }
  213. }
  214. for (i=0;i<7;i++) {
  215. expected[254*2+i] = i + 1;
  216. }
  217. expect(validator_recv_frame,
  218. when(size, is_equal_to(515)),
  219. when(data, is_equal_to_contents_of(expected, 510))
  220. );
  221. byte_stuffer_recv_byte(0, 0xFF);
  222. for (i=0;i<254;i++) {
  223. byte_stuffer_recv_byte(0, i+1);
  224. }
  225. byte_stuffer_recv_byte(0, 0xFF);
  226. for (i=0;i<254;i++) {
  227. byte_stuffer_recv_byte(0, i+1);
  228. }
  229. byte_stuffer_recv_byte(0, 8);
  230. byte_stuffer_recv_byte(0, 1);
  231. byte_stuffer_recv_byte(0, 2);
  232. byte_stuffer_recv_byte(0, 3);
  233. byte_stuffer_recv_byte(0, 4);
  234. byte_stuffer_recv_byte(0, 5);
  235. byte_stuffer_recv_byte(0, 6);
  236. byte_stuffer_recv_byte(0, 7);
  237. byte_stuffer_recv_byte(0, 0);
  238. }
  239. Ensure(ByteStuffer, receives_an_all_zeros_frame_that_is_maximum_size) {
  240. uint8_t expected[MAX_FRAME_SIZE] = {};
  241. expect(validator_recv_frame,
  242. when(size, is_equal_to(MAX_FRAME_SIZE)),
  243. when(data, is_equal_to_contents_of(expected, MAX_FRAME_SIZE))
  244. );
  245. int i;
  246. byte_stuffer_recv_byte(0, 1);
  247. for(i=0;i<MAX_FRAME_SIZE;i++) {
  248. byte_stuffer_recv_byte(0, 1);
  249. }
  250. byte_stuffer_recv_byte(0, 0);
  251. }
  252. Ensure(ByteStuffer, doesnt_recv_a_frame_thats_too_long_all_zeroes) {
  253. uint8_t expected[1] = {0};
  254. never_expect(validator_recv_frame);
  255. int i;
  256. byte_stuffer_recv_byte(0, 1);
  257. for(i=0;i<MAX_FRAME_SIZE;i++) {
  258. byte_stuffer_recv_byte(0, 1);
  259. }
  260. byte_stuffer_recv_byte(0, 1);
  261. byte_stuffer_recv_byte(0, 0);
  262. }
  263. Ensure(ByteStuffer, received_frame_is_aborted_when_its_too_long) {
  264. uint8_t expected[1] = {1};
  265. expect(validator_recv_frame,
  266. when(size, is_equal_to(1)),
  267. when(data, is_equal_to_contents_of(expected, 1))
  268. );
  269. int i;
  270. byte_stuffer_recv_byte(0, 1);
  271. for(i=0;i<MAX_FRAME_SIZE;i++) {
  272. byte_stuffer_recv_byte(0, 1);
  273. }
  274. byte_stuffer_recv_byte(0, 2);
  275. byte_stuffer_recv_byte(0, 1);
  276. byte_stuffer_recv_byte(0, 0);
  277. }
  278. Ensure(ByteStuffer, does_nothing_when_sending_zero_size_frame) {
  279. assert_that(sent_data_size, is_equal_to(0));
  280. byte_stuffer_send_frame(0, NULL, 0);
  281. }
  282. Ensure(ByteStuffer, send_one_byte_frame) {
  283. uint8_t data[] = {5};
  284. byte_stuffer_send_frame(1, data, 1);
  285. uint8_t expected[] = {2, 5, 0};
  286. assert_that(sent_data_size, is_equal_to(sizeof(expected)));
  287. assert_that(sent_data, is_equal_to_contents_of(expected, sizeof(expected)));
  288. }
  289. Ensure(ByteStuffer, sends_two_byte_frame) {
  290. uint8_t data[] = {5, 0x77};
  291. byte_stuffer_send_frame(0, data, 2);
  292. uint8_t expected[] = {3, 5, 0x77, 0};
  293. assert_that(sent_data_size, is_equal_to(sizeof(expected)));
  294. assert_that(sent_data, is_equal_to_contents_of(expected, sizeof(expected)));
  295. }
  296. Ensure(ByteStuffer, sends_one_byte_frame_with_zero) {
  297. uint8_t data[] = {0};
  298. byte_stuffer_send_frame(0, data, 1);
  299. uint8_t expected[] = {1, 1, 0};
  300. assert_that(sent_data_size, is_equal_to(sizeof(expected)));
  301. assert_that(sent_data, is_equal_to_contents_of(expected, sizeof(expected)));
  302. }
  303. Ensure(ByteStuffer, sends_two_byte_frame_starting_with_zero) {
  304. uint8_t data[] = {0, 9};
  305. byte_stuffer_send_frame(1, data, 2);
  306. uint8_t expected[] = {1, 2, 9, 0};
  307. assert_that(sent_data_size, is_equal_to(sizeof(expected)));
  308. assert_that(sent_data, is_equal_to_contents_of(expected, sizeof(expected)));
  309. }
  310. Ensure(ByteStuffer, sends_two_byte_frame_starting_with_non_zero) {
  311. uint8_t data[] = {9, 0};
  312. byte_stuffer_send_frame(1, data, 2);
  313. uint8_t expected[] = {2, 9, 1, 0};
  314. assert_that(sent_data_size, is_equal_to(sizeof(expected)));
  315. assert_that(sent_data, is_equal_to_contents_of(expected, sizeof(expected)));
  316. }
  317. Ensure(ByteStuffer, sends_three_byte_frame_zero_in_the_middle) {
  318. uint8_t data[] = {9, 0, 0x68};
  319. byte_stuffer_send_frame(0, data, 3);
  320. uint8_t expected[] = {2, 9, 2, 0x68, 0};
  321. assert_that(sent_data_size, is_equal_to(sizeof(expected)));
  322. assert_that(sent_data, is_equal_to_contents_of(expected, sizeof(expected)));
  323. }
  324. Ensure(ByteStuffer, sends_three_byte_frame_data_in_the_middle) {
  325. uint8_t data[] = {0, 0x55, 0};
  326. byte_stuffer_send_frame(0, data, 3);
  327. uint8_t expected[] = {1, 2, 0x55, 1, 0};
  328. assert_that(sent_data_size, is_equal_to(sizeof(expected)));
  329. assert_that(sent_data, is_equal_to_contents_of(expected, sizeof(expected)));
  330. }
  331. Ensure(ByteStuffer, sends_three_byte_frame_with_all_zeroes) {
  332. uint8_t data[] = {0, 0, 0};
  333. byte_stuffer_send_frame(0, data, 3);
  334. uint8_t expected[] = {1, 1, 1, 1, 0};
  335. assert_that(sent_data_size, is_equal_to(sizeof(expected)));
  336. assert_that(sent_data, is_equal_to_contents_of(expected, sizeof(expected)));
  337. }
  338. Ensure(ByteStuffer, sends_frame_with_254_non_zeroes) {
  339. uint8_t data[254];
  340. int i;
  341. for(i=0;i<254;i++) {
  342. data[i] = i + 1;
  343. }
  344. byte_stuffer_send_frame(0, data, 254);
  345. uint8_t expected[256];
  346. expected[0] = 0xFF;
  347. for(i=1;i<255;i++) {
  348. expected[i] = i;
  349. }
  350. expected[255] = 0;
  351. assert_that(sent_data_size, is_equal_to(sizeof(expected)));
  352. assert_that(sent_data, is_equal_to_contents_of(expected, sizeof(expected)));
  353. }
  354. Ensure(ByteStuffer, sends_frame_with_255_non_zeroes) {
  355. uint8_t data[255];
  356. int i;
  357. for(i=0;i<255;i++) {
  358. data[i] = i + 1;
  359. }
  360. byte_stuffer_send_frame(0, data, 255);
  361. uint8_t expected[258];
  362. expected[0] = 0xFF;
  363. for(i=1;i<255;i++) {
  364. expected[i] = i;
  365. }
  366. expected[255] = 2;
  367. expected[256] = 255;
  368. expected[257] = 0;
  369. assert_that(sent_data_size, is_equal_to(sizeof(expected)));
  370. assert_that(sent_data, is_equal_to_contents_of(expected, sizeof(expected)));
  371. }
  372. Ensure(ByteStuffer, sends_frame_with_254_non_zeroes_followed_by_zero) {
  373. uint8_t data[255];
  374. int i;
  375. for(i=0;i<254;i++) {
  376. data[i] = i + 1;
  377. }
  378. data[255] = 0;
  379. byte_stuffer_send_frame(0, data, 255);
  380. uint8_t expected[258];
  381. expected[0] = 0xFF;
  382. for(i=1;i<255;i++) {
  383. expected[i] = i;
  384. }
  385. expected[255] = 1;
  386. expected[256] = 1;
  387. expected[257] = 0;
  388. assert_that(sent_data_size, is_equal_to(sizeof(expected)));
  389. assert_that(sent_data, is_equal_to_contents_of(expected, sizeof(expected)));
  390. }
  391. Ensure(ByteStuffer, sends_and_receives_full_roundtrip_small_packet) {
  392. uint8_t original_data[] = { 1, 2, 3};
  393. byte_stuffer_send_frame(0, original_data, sizeof(original_data));
  394. expect(validator_recv_frame,
  395. when(size, is_equal_to(sizeof(original_data))),
  396. when(data, is_equal_to_contents_of(original_data, sizeof(original_data)))
  397. );
  398. int i;
  399. for(i=0;i<sent_data_size;i++) {
  400. byte_stuffer_recv_byte(1, sent_data[i]);
  401. }
  402. }
  403. Ensure(ByteStuffer, sends_and_receives_full_roundtrip_small_packet_with_zeros) {
  404. uint8_t original_data[] = { 1, 0, 3, 0, 0, 9};
  405. byte_stuffer_send_frame(1, original_data, sizeof(original_data));
  406. expect(validator_recv_frame,
  407. when(size, is_equal_to(sizeof(original_data))),
  408. when(data, is_equal_to_contents_of(original_data, sizeof(original_data)))
  409. );
  410. int i;
  411. for(i=0;i<sent_data_size;i++) {
  412. byte_stuffer_recv_byte(0, sent_data[i]);
  413. }
  414. }
  415. Ensure(ByteStuffer, sends_and_receives_full_roundtrip_254_bytes) {
  416. uint8_t original_data[254];
  417. int i;
  418. for(i=0;i<254;i++) {
  419. original_data[i] = i + 1;
  420. }
  421. byte_stuffer_send_frame(0, original_data, sizeof(original_data));
  422. expect(validator_recv_frame,
  423. when(size, is_equal_to(sizeof(original_data))),
  424. when(data, is_equal_to_contents_of(original_data, sizeof(original_data)))
  425. );
  426. for(i=0;i<sent_data_size;i++) {
  427. byte_stuffer_recv_byte(1, sent_data[i]);
  428. }
  429. }
  430. Ensure(ByteStuffer, sends_and_receives_full_roundtrip_256_bytes) {
  431. uint8_t original_data[256];
  432. int i;
  433. for(i=0;i<254;i++) {
  434. original_data[i] = i + 1;
  435. }
  436. original_data[254] = 22;
  437. original_data[255] = 23;
  438. byte_stuffer_send_frame(0, original_data, sizeof(original_data));
  439. expect(validator_recv_frame,
  440. when(size, is_equal_to(sizeof(original_data))),
  441. when(data, is_equal_to_contents_of(original_data, sizeof(original_data)))
  442. );
  443. for(i=0;i<sent_data_size;i++) {
  444. byte_stuffer_recv_byte(1, sent_data[i]);
  445. }
  446. }
  447. Ensure(ByteStuffer, sends_and_receives_full_roundtrip_254_bytes_and_then_zero) {
  448. uint8_t original_data[255];
  449. int i;
  450. for(i=0;i<254;i++) {
  451. original_data[i] = i + 1;
  452. }
  453. original_data[254] = 0;
  454. byte_stuffer_send_frame(0, original_data, sizeof(original_data));
  455. expect(validator_recv_frame,
  456. when(size, is_equal_to(sizeof(original_data))),
  457. when(data, is_equal_to_contents_of(original_data, sizeof(original_data)))
  458. );
  459. for(i=0;i<sent_data_size;i++) {
  460. byte_stuffer_recv_byte(1, sent_data[i]);
  461. }
  462. }