}
// Two streams, separated by a marker.
-uint8_t bytes[] = {
+uint8_t stream_bytes[] = {
0x01, 0x02, 0x03, 0xff, 0x00, 0x04, // some bytes
0xff, 0xf7, // a marker
0x05, 0x06, 0x07, 0x08, 0xff, 0x00 // more bytes
void test_basic_reading()
{
struct custom_read_userdata ud;
- ud.bytes = bytes;
- ud.bytes_left = sizeof(bytes);
+ ud.bytes = stream_bytes;
+ ud.bytes_left = sizeof(stream_bytes);
struct byte_source source;
init_byte_source(&source, custom_read, &ud);
void test_slow_source()
{
struct custom_read_userdata ud;
- ud.bytes = bytes;
- ud.bytes_left = sizeof(bytes);
+ ud.bytes = stream_bytes;
+ ud.bytes_left = sizeof(stream_bytes);
struct byte_source source;
init_byte_source(&source, custom_read_slow, &ud);
assert(ret == 0);
}
+// Data with a truncated marker should first give the first bytes, then failure
+// on next read since the stream EOFs.
+void test_broken_marker()
+{
+ uint8_t bytes[] = { 0x01, 0x02, 0x03, 0x04, 0xff };
+ uint8_t expected_bytes[] = { 0x01, 0x02, 0x03, 0x04 };
+
+ struct custom_read_userdata ud;
+ ud.bytes = bytes;
+ ud.bytes_left = sizeof(bytes);
+
+ struct byte_source source;
+ init_byte_source(&source, custom_read, &ud);
+
+ uint8_t buf[4096];
+ ssize_t ret;
+
+ ret = byte_source_input_func(&source, buf, 4096);
+ assert(ret == sizeof(expected_bytes));
+ assert(memcmp(buf, expected_bytes, sizeof(expected_bytes)) == 0);
+
+ ret = byte_source_input_func(&source, buf, 4096);
+ assert(ret == -1);
+}
+
int main(void)
{
init_choices();
printf("test_slow_source()\n");
test_slow_source();
+ printf("test_broken_marker()\n");
+ test_broken_marker();
+
printf("All tests pass.\n");
return 0;
}