1 /* Simulate IO errors after each byte in a stream.
2 * Verifies proper error propagation.
8 #include "alltypes.pb.h"
9 #include "test_helpers.h"
17 bool read_callback(pb_istream_t *stream, uint8_t *buf, size_t count)
19 faulty_stream_t *state = stream->state;
23 if (state->fail_after == 0)
24 PB_RETURN_ERROR(stream, "simulated");
26 *buf++ = *state->buffer++;
31 bool write_callback(pb_ostream_t *stream, const uint8_t *buf, size_t count)
33 faulty_stream_t *state = stream->state;
37 if (state->fail_after == 0)
38 PB_RETURN_ERROR(stream, "simulated");
40 *state->buffer++ = *buf++;
50 AllTypes msg = AllTypes_init_zero;
52 /* Get some base data to run the tests with */
53 SET_BINARY_MODE(stdin);
54 msglen = fread(buffer, 1, sizeof(buffer), stdin);
56 /* Test IO errors on decoding */
59 pb_istream_t stream = {&read_callback, NULL, SIZE_MAX};
63 for (i = 0; i < msglen; i++)
65 stream.bytes_left = msglen;
70 status = pb_decode(&stream, AllTypes_fields, &msg);
73 fprintf(stderr, "Unexpected success in decode\n");
76 else if (strcmp(stream.errmsg, "simulated") != 0)
78 fprintf(stderr, "Wrong error in decode: %s\n", stream.errmsg);
83 stream.bytes_left = msglen;
86 fs.fail_after = msglen;
87 status = pb_decode(&stream, AllTypes_fields, &msg);
91 fprintf(stderr, "Decoding failed: %s\n", stream.errmsg);
96 /* Test IO errors on encoding */
99 pb_ostream_t stream = {&write_callback, NULL, SIZE_MAX, 0};
103 for (i = 0; i < msglen; i++)
105 stream.max_size = msglen;
106 stream.bytes_written = 0;
111 status = pb_encode(&stream, AllTypes_fields, &msg);
114 fprintf(stderr, "Unexpected success in encode\n");
117 else if (strcmp(stream.errmsg, "simulated") != 0)
119 fprintf(stderr, "Wrong error in encode: %s\n", stream.errmsg);
124 stream.max_size = msglen;
125 stream.bytes_written = 0;
128 fs.fail_after = msglen;
129 status = pb_encode(&stream, AllTypes_fields, &msg);
133 fprintf(stderr, "Encoding failed: %s\n", stream.errmsg);