1 /*
2 * test_write_api.c
3 * Luabins Lua-less write API tests
4 * See copyright notice in luabins.h
5 */
6 
7 /*
8 * WARNING: This suite is format-specific. Change it when format changes.
9 */
10 
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <string.h>
14 
15 /* Should be included first */
16 #include "lualess.h"
17 #include "write.h"
18 
19 #include "test.h"
20 #include "util.h"
21 
22 /******************************************************************************/
23 
24 /*
25 * Note it is different from test_savebuffer variant.
26 * We're interested in higher level stuff here.
27 */
check_buffer(luabins_SaveBuffer * sb,const char * expected_buf_c,size_t expected_length)28 static void check_buffer(
29     luabins_SaveBuffer * sb,
30     const char * expected_buf_c,
31     size_t expected_length
32   )
33 {
34   const unsigned char * expected_buf = (const unsigned char *)expected_buf_c;
35 
36   size_t actual_length = (size_t)-1;
37   const unsigned char * actual_buf = lbsSB_buffer(sb, &actual_length);
38   if (actual_length != expected_length)
39   {
40     fprintf(
41         stderr,
42         "lsbSB_buffer length mismatch: got %lu, expected %lu\n",
43         actual_length, expected_length
44       );
45     fprintf(stderr, "actual:\n");
46     fprintbuf(stderr, actual_buf, actual_length);
47     fprintf(stderr, "expected:\n");
48     fprintbuf(stderr, expected_buf, expected_length);
49     exit(1);
50   }
51 
52   if (memcmp(actual_buf, expected_buf, expected_length) != 0)
53   {
54     fprintf(stderr, "lsbSB_buffer buffer mismatch\n");
55     fprintf(stderr, "actual:\n");
56     fprintbuf(stderr, actual_buf, actual_length);
57     fprintf(stderr, "expected:\n");
58     fprintbuf(stderr, expected_buf, expected_length);
59 
60     exit(1);
61   }
62 }
63 
64 /******************************************************************************/
65 
66 #define CAT(a, b) a ## b
67 
68 #define TEST_NAME(x) CAT(test_write, x)
69 #define CALL_NAME(x) CAT(lbs_write, x)
70 #define BUFFER_NAME (&sb)
71 #define INIT_BUFFER \
72   luabins_SaveBuffer sb; \
73   lbsSB_init(BUFFER_NAME, lbs_simplealloc, NULL);
74 
75 #define DESTROY_BUFFER \
76   lbsSB_destroy(BUFFER_NAME);
77 
78 #define CHECK_BUFFER check_buffer
79 
80 #include "write_tests.inc"
81 
82 /******************************************************************************/
83 
84 TEST (test_writeTableHeaderAt,
85 {
86   INIT_BUFFER;
87 
88   {
89     unsigned char tuple_size = 0x01;
90     int array_size = 0x00;
91     int hash_size = 0x00;
92     int table_header_pos = 0;
93 
94     lbs_writeTupleSize(BUFFER_NAME, tuple_size);
95     table_header_pos = lbsSB_length(BUFFER_NAME);
96     lbs_writeTableHeader(BUFFER_NAME, array_size, hash_size);
97 
98     CHECK_BUFFER(
99         &sb,
100         "\x01" "T" "\x00\x00\x00\x00" "\x00\x00\x00\x00",
101         1 + 1 + 4 + 4
102       );
103 
104     array_size = 0xAB;
105     hash_size = 0xCD;
106 
107     lbs_writeTableHeaderAt(
108         BUFFER_NAME,
109         table_header_pos,
110         array_size,
111         hash_size
112       );
113     CHECK_BUFFER(
114         BUFFER_NAME,
115         "\x01" "T" "\xAB\x00\x00\x00" "\xCD\x00\x00\x00",
116         1 + 1 + 4 + 4
117       );
118   }
119 
120   DESTROY_BUFFER;
121 })
122 
123 /******************************************************************************/
124 
test_write_api()125 void test_write_api()
126 {
127   RUN_GENERATED_TESTS;
128 
129   test_writeTableHeaderAt();
130 }
131