@@ -14,16 +14,11 @@ uint8_t tmp[8];
1414void
1515my_buff_evt_fn (lwrb_t * buff , lwrb_evt_type_t type , size_t len ) {
1616 (void )buff ;
17+ (void )len ;
1718 switch (type ) {
18- case LWRB_EVT_RESET :
19- printf ("[EVT] Buffer reset event!\r\n" );
20- break ;
21- case LWRB_EVT_READ :
22- printf ("[EVT] Buffer read event: %d byte(s)!\r\n" , (int )len );
23- break ;
24- case LWRB_EVT_WRITE :
25- printf ("[EVT] Buffer write event: %d byte(s)!\r\n" , (int )len );
26- break ;
19+ case LWRB_EVT_RESET : printf ("[EVT] Buffer reset event!\r\n" ); break ;
20+ case LWRB_EVT_READ : printf ("[EVT] Buffer read event: %d byte(s)!\r\n" , (int )len ); break ;
21+ case LWRB_EVT_WRITE : printf ("[EVT] Buffer write event: %d byte(s)!\r\n" , (int )len ); break ;
2722 default : break ;
2823 }
2924}
@@ -34,31 +29,150 @@ main() {
3429
3530 /* Init buffer */
3631 lwrb_init (& buff , lwrb_data , sizeof (lwrb_data ));
37- lwrb_set_evt_fn (& buff , my_buff_evt_fn );
3832
39- lwrb_write (& buff , "abc" , 3 );
40- lwrb_write (& buff , "abc" , 3 );
41- lwrb_write (& buff , "abc" , 3 );
42- len = lwrb_read (& buff , tmp , 9 );
33+ printf ("Read/Write test\r\n" );
34+ {
35+ uint8_t rw_buff [8 ];
36+
37+ #define RW_TEST (_w_exp_ , _r_exp_ , _rw_len_ , _rw_exp_len_ ) \
38+ do { \
39+ printf("W ptr: %u, R ptr: %u, R/W len: %u, as_expected: %u\r\n", (unsigned)buff.w, (unsigned)buff.r, \
40+ (unsigned)(_rw_len_), \
41+ (unsigned)(buff.w == (_w_exp_) && buff.r == (_r_exp_) && (_rw_len_) == (_rw_exp_len_))); \
42+ } while (0)
43+
44+ lwrb_reset (& buff );
45+ len = lwrb_write (& buff , "abc" , 3 ); /* Write 3 bytes */
46+ RW_TEST (3 , 0 , len , 3 );
47+ len = lwrb_write (& buff , "abc" , 3 ); /* Write 3 bytes */
48+ RW_TEST (6 , 0 , len , 3 );
49+ len = lwrb_read (& buff , rw_buff , 3 ); /* Read 3 bytes */
50+ RW_TEST (6 , 3 , len , 3 );
51+ len = lwrb_read (& buff , rw_buff , 4 ); /* Read 4 bytes */
52+ RW_TEST (6 , 6 , len , 3 );
53+
54+ len = lwrb_write (& buff , "abc" , 3 ); /* Write 3 bytes -> buffer should go over */
55+ RW_TEST (0 , 6 , len , 3 );
56+
57+ #undef RW_TEST
58+ }
59+
60+ printf ("Overwrite test\r\n" );
61+ {
62+ #define OVERWRITE_TEST (_exp_content_ , _exp_len_ ) \
63+ do { \
64+ len = lwrb_peek(&buff, 0, tmp, buff.size); \
65+ printf("overwrite data read: %.*s, len: %u, as_expected: %u\r\n", (int)len, tmp, (unsigned)len, \
66+ (unsigned)(strncmp((_exp_content_), (const void*)tmp, len) == 0 && len == (_exp_len_))); \
67+ } while (0)
4368
44- buff . r = 0 ;
45- buff . w = 0 ;
46- memset ( lwrb_get_linear_block_write_address ( & buff ), 'A' , lwrb_get_linear_block_write_length ( & buff ));
47- lwrb_advance ( & buff , lwrb_get_linear_block_write_length ( & buff ) );
69+ /* Test overwrite */
70+ lwrb_reset ( & buff ) ;
71+ lwrb_write ( & buff , "abcdef" , 6 ); /* Initial data */
72+ OVERWRITE_TEST ( "abcdef" , 6 );
4873
49- buff .r = 2 ;
50- buff .w = 0 ;
51- memset (lwrb_get_linear_block_write_address (& buff ), 'B' , lwrb_get_linear_block_write_length (& buff ));
52- lwrb_advance (& buff , lwrb_get_linear_block_write_length (& buff ));
74+ lwrb_overwrite (& buff , "0" , 1 );
75+ OVERWRITE_TEST ("abcdef0" , 7 );
76+
77+ lwrb_overwrite (& buff , "1" , 1 );
78+ OVERWRITE_TEST ("abcdef01" , 8 );
79+
80+ lwrb_overwrite (& buff , "2" , 1 );
81+ OVERWRITE_TEST ("bcdef012" , 8 );
82+
83+ lwrb_overwrite (& buff , "3" , 1 );
84+ OVERWRITE_TEST ("cdef0123" , 8 );
85+
86+ lwrb_overwrite (& buff , "4" , 1 );
87+ OVERWRITE_TEST ("def01234" , 8 );
88+
89+ lwrb_overwrite (& buff , "5" , 1 );
90+ OVERWRITE_TEST ("ef012345" , 8 );
91+
92+ /* Bigger write which will completely change the buffer structure */
93+ lwrb_overwrite (& buff , "lwrb_new_test_structure" , 23 );
94+ OVERWRITE_TEST ("tructure" , 8 );
95+ #undef OVERWRITE_TEST
96+ }
5397
54- buff .r = 3 ;
55- buff .w = 3 ;
56- memset (lwrb_get_linear_block_write_address (& buff ), 'C' , lwrb_get_linear_block_write_length (& buff ));
57- lwrb_advance (& buff , lwrb_get_linear_block_write_length (& buff ));
98+ printf ("Move test\r\n" );
99+ {
100+ #define MOVE_TEST (_exp_content_ , _exp_move_len_ , _exp_buff_len_ ) \
101+ do { \
102+ size_t move_len; \
103+ move_len = lwrb_move(&dst, &src); \
104+ len = lwrb_peek(&dst, 0, tmp, dst.size); \
105+ printf("move data: len: %d, dest data: %.*s, as_expected: %u\r\n", (int)len, (int)len, tmp, \
106+ (unsigned)(strncmp((_exp_content_), (const void*)tmp, len) == 0 && move_len == (_exp_move_len_) \
107+ && len == (_exp_buff_len_))); \
108+ } while (0)
58109
59- lwrb_reset (& buff );
110+ lwrb_t src , dst ;
111+ uint8_t src_data [16 ], dst_data [8 ];
112+ lwrb_init (& src , src_data , sizeof (src_data ));
113+ lwrb_init (& dst , dst_data , sizeof (dst_data ));
114+
115+ lwrb_reset (& src );
116+ lwrb_reset (& dst );
117+ lwrb_write (& src , "012345" , 6 );
118+ MOVE_TEST ("012345" , 6 , 6 );
119+
120+ lwrb_reset (& src );
121+ lwrb_reset (& dst );
122+ lwrb_write (& src , "0123456789ABCDEF" , 16 );
123+ MOVE_TEST ("0123456" , 7 , 7 );
124+
125+ lwrb_reset (& src );
126+ lwrb_reset (& dst );
127+ lwrb_write (& src , "0123456789ABCDEF" , 16 );
128+ lwrb_write (& dst , "TT" , 2 );
129+ MOVE_TEST ("TT01234" , 5 , 7 );
130+
131+ #undef MOVE_TEST
132+ }
60133
61134 (void )len ;
62135
136+ printf ("Find test\r\n" );
137+ {
138+ #define FIND_TEST (_bts_ , _bts_len_ , _start_offset_ , _exp_result_ ) \
139+ do { \
140+ size_t found_idx; \
141+ uint8_t found; \
142+ found = lwrb_find(&buff, (_bts_), (_bts_len_), (_start_offset_), &found_idx); \
143+ printf("Find \"%s\" (len %d), start_offset: %d, found_index: %d; Found: %d; As expected: %d\r\n", (_bts_), \
144+ (_bts_len_), (_start_offset_), (int)found_idx, (int)found, (int)(!!found == !!(_exp_result_))); \
145+ } while (0)
146+
147+ /* Prepare buffer and write data */
148+ lwrb_reset (& buff );
149+ lwrb_write (& buff , "12345678" , 8 );
150+
151+ FIND_TEST ("123" , 3 , 0 , 1 ); /* Must find it */
152+ FIND_TEST ("456" , 3 , 0 , 1 ); /* Must find it */
153+ FIND_TEST ("123" , 3 , 1 , 0 ); /* Must not find it - start offset is later */
154+ FIND_TEST ("678" , 3 , 0 , 1 );
155+
156+ /* Restart by setting write and read as empty with offset */
157+ buff .w = 6 ;
158+ buff .r = 6 ;
159+ lwrb_write (& buff , "12345678" , 8 );
160+
161+ FIND_TEST ("123" , 3 , 0 , 1 ); /* Must find it */
162+ FIND_TEST ("456" , 3 , 0 , 1 ); /* Must find it */
163+ FIND_TEST ("123" , 3 , 1 , 0 ); /* Must not find it - start offset is later */
164+
165+ /* Restart by setting write and read as empty with offset */
166+ /* This should generate data for search in overflow mode */
167+ buff .w = 8 ;
168+ buff .r = 8 ;
169+ lwrb_write (& buff , "12345678" , 8 );
170+
171+ FIND_TEST ("1234" , 3 , 0 , 1 ); /* Must find it */
172+ FIND_TEST ("4567" , 3 , 0 , 1 ); /* Must find it */
173+ FIND_TEST ("1234" , 3 , 1 , 0 ); /* Must not find it - start offset is later */
174+
175+ #undef FIND_TEST
176+ }
63177 return 0 ;
64178}
0 commit comments