test_webm.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. /** test_webm.c
  2. *
  3. * Unit tests for the relay station webm parser
  4. */
  5. #include <check.h>
  6. #include "../flow.h"
  7. #include "test_util.h"
  8. #include "../webm.h"
  9. #include "../webm.c"
  10. START_TEST(variable_header_parser) {
  11. //set up common webm length field
  12. uint8_t *p = malloc(4);
  13. p[0] = 0x1a;
  14. p[1] = 0x45;
  15. p[2] = 0xdf;
  16. p[3] = 0xa3;
  17. uint8_t header_len;
  18. uint32_t header = variable_header(p, &header_len);
  19. ck_assert_int_eq(header_len, 4);
  20. ck_assert_int_eq(header, 0x1a45dfa3);
  21. }
  22. END_TEST
  23. START_TEST(variable_length_parser) {
  24. uint8_t *p = malloc(8);
  25. p[0] = 0x9f;
  26. p[1] = 0x00;
  27. p[2] = 0x00;
  28. p[3] = 0x00;
  29. uint8_t int_len;
  30. uint32_t len = variable_length(p, &int_len);
  31. ck_assert_int_eq(int_len, 1);
  32. ck_assert_int_eq(len, 0x1f);
  33. p[0] = 0x21;
  34. p[1] = 0x0d;
  35. p[2] = 0x8c;
  36. p[3] = 0x00;
  37. len = variable_length(p, &int_len);
  38. ck_assert_int_eq(int_len, 3);
  39. ck_assert_int_eq(len, 0x10d8c);
  40. }
  41. END_TEST
  42. START_TEST(webm_parser) {
  43. //need to create a flow for this
  44. flow *f = smalloc(sizeof(flow));
  45. //we only need to set the webmstate and remaining_element fields of the flow
  46. f->webmstate = WEBM_HEADER;
  47. f->remaining_element = 0;
  48. uint8_t *data;
  49. int32_t file_len;
  50. /* Read in webm data */
  51. if(!read_file_len("data/webm_0x7fd590016250", &data, &file_len)){
  52. ck_abort();
  53. }
  54. uint8_t *p = data;
  55. parse_webm(f, p, 8);
  56. //The remaining element length should be the element length (31) - the extra
  57. //three bytes we parsed (28)
  58. ck_assert_int_eq(f->remaining_element, 28);
  59. ck_assert_int_eq(f->webmstate, MID_ELEMENT);
  60. p += 8;
  61. file_len -= 8;
  62. //Parse the rest of the header
  63. parse_webm(f, p, 28);
  64. ck_assert_int_eq(f->remaining_element, 0);
  65. ck_assert_int_eq(f->webmstate, WEBM_HEADER);
  66. p+= 28;
  67. file_len -= 28;
  68. //Now parse segment header
  69. parse_webm(f, p, 16);
  70. //ck_assert_int_eq(f->webmstate, MID_ELEMENT);
  71. p+= 16;
  72. file_len -= 16;
  73. parse_webm(f, p, 185);
  74. ck_assert_int_eq(f->webmstate, WEBM_HEADER);
  75. //Detect cluster element ID
  76. p += 185;
  77. file_len -= 185;
  78. ck_assert_int_eq(p[0], 0x1f);
  79. ck_assert_int_eq(p[1], 0x43);
  80. ck_assert_int_eq(p[2], 0xb6);
  81. ck_assert_int_eq(p[3], 0x75);
  82. //Parse into media element
  83. //parse_webm(f, p, 8);
  84. //ck_assert_int_eq(f->webmstate, MEDIA);
  85. //parse to end of file
  86. //p += 8;
  87. //file_len -= 8;
  88. parse_webm(f, p, file_len);
  89. free(data);
  90. }
  91. END_TEST
  92. Suite *webm_suite(void) {
  93. Suite *s;
  94. TCase *tc_core;
  95. s = suite_create("WebM Parser");
  96. tc_core = tcase_create("Core");
  97. tcase_add_test(tc_core, variable_header_parser);
  98. tcase_add_test(tc_core, variable_length_parser);
  99. tcase_add_test(tc_core, webm_parser);
  100. suite_add_tcase(s, tc_core);
  101. return s;
  102. }
  103. int main(void){
  104. int number_failed;
  105. Suite *s;
  106. SRunner *sr;
  107. s = webm_suite();
  108. sr = srunner_create(s);
  109. srunner_set_fork_status(sr, CK_NOFORK);
  110. srunner_run_all(sr, CK_NORMAL);
  111. number_failed = srunner_ntests_failed(sr);
  112. srunner_free(sr);
  113. return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
  114. }