mirror of
https://github.com/google/pebble.git
synced 2025-08-23 08:17:27 -04:00
Import of the watch repository from Pebble
This commit is contained in:
commit
3b92768480
10334 changed files with 2564465 additions and 0 deletions
15
third_party/nanopb/tests/io_errors/SConscript
vendored
Normal file
15
third_party/nanopb/tests/io_errors/SConscript
vendored
Normal file
|
@ -0,0 +1,15 @@
|
|||
# Simulate io errors when encoding and decoding
|
||||
|
||||
Import("env")
|
||||
|
||||
c = Copy("$TARGET", "$SOURCE")
|
||||
env.Command("alltypes.proto", "#alltypes/alltypes.proto", c)
|
||||
|
||||
env.NanopbProto(["alltypes", "alltypes.options"])
|
||||
|
||||
ioerr = env.Program(["io_errors.c", "alltypes.pb.c",
|
||||
"$COMMON/pb_encode.o", "$COMMON/pb_decode.o", "$COMMON/pb_common.o"])
|
||||
|
||||
env.RunTest("io_errors.output", [ioerr, "$BUILD/alltypes/encode_alltypes.output"])
|
||||
|
||||
|
8
third_party/nanopb/tests/io_errors/alltypes.options
vendored
Normal file
8
third_party/nanopb/tests/io_errors/alltypes.options
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
* max_size:16
|
||||
* max_count:5
|
||||
*.*fbytes fixed_length:true max_size:4
|
||||
*.*farray fixed_count:true max_count:5
|
||||
*.*farray2 fixed_count:true max_count:3
|
||||
IntSizes.*int8 int_size:IS_8
|
||||
IntSizes.*int16 int_size:IS_16
|
||||
DescriptorSize8 descriptorsize:DS_8
|
140
third_party/nanopb/tests/io_errors/io_errors.c
vendored
Normal file
140
third_party/nanopb/tests/io_errors/io_errors.c
vendored
Normal file
|
@ -0,0 +1,140 @@
|
|||
/* Simulate IO errors after each byte in a stream.
|
||||
* Verifies proper error propagation.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <pb_decode.h>
|
||||
#include <pb_encode.h>
|
||||
#include "alltypes.pb.h"
|
||||
#include "test_helpers.h"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint8_t *buffer;
|
||||
size_t fail_after;
|
||||
} faulty_stream_t;
|
||||
|
||||
bool read_callback(pb_istream_t *stream, uint8_t *buf, size_t count)
|
||||
{
|
||||
faulty_stream_t *state = stream->state;
|
||||
|
||||
while (count--)
|
||||
{
|
||||
if (state->fail_after == 0)
|
||||
PB_RETURN_ERROR(stream, "simulated");
|
||||
state->fail_after--;
|
||||
*buf++ = *state->buffer++;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
bool write_callback(pb_ostream_t *stream, const uint8_t *buf, size_t count)
|
||||
{
|
||||
faulty_stream_t *state = stream->state;
|
||||
|
||||
while (count--)
|
||||
{
|
||||
if (state->fail_after == 0)
|
||||
PB_RETURN_ERROR(stream, "simulated");
|
||||
state->fail_after--;
|
||||
*state->buffer++ = *buf++;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
uint8_t buffer[2048];
|
||||
size_t msglen;
|
||||
AllTypes msg = AllTypes_init_zero;
|
||||
|
||||
/* Get some base data to run the tests with */
|
||||
SET_BINARY_MODE(stdin);
|
||||
msglen = fread(buffer, 1, sizeof(buffer), stdin);
|
||||
|
||||
/* Test IO errors on decoding */
|
||||
{
|
||||
bool status;
|
||||
pb_istream_t stream = {&read_callback, NULL, SIZE_MAX};
|
||||
faulty_stream_t fs;
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < msglen; i++)
|
||||
{
|
||||
stream.bytes_left = msglen;
|
||||
stream.state = &fs;
|
||||
fs.buffer = buffer;
|
||||
fs.fail_after = i;
|
||||
|
||||
status = pb_decode(&stream, AllTypes_fields, &msg);
|
||||
if (status != false)
|
||||
{
|
||||
fprintf(stderr, "Unexpected success in decode\n");
|
||||
return 2;
|
||||
}
|
||||
else if (strcmp(stream.errmsg, "simulated") != 0)
|
||||
{
|
||||
fprintf(stderr, "Wrong error in decode: %s\n", stream.errmsg);
|
||||
return 3;
|
||||
}
|
||||
}
|
||||
|
||||
stream.bytes_left = msglen;
|
||||
stream.state = &fs;
|
||||
fs.buffer = buffer;
|
||||
fs.fail_after = msglen;
|
||||
status = pb_decode(&stream, AllTypes_fields, &msg);
|
||||
|
||||
if (!status)
|
||||
{
|
||||
fprintf(stderr, "Decoding failed: %s\n", stream.errmsg);
|
||||
return 4;
|
||||
}
|
||||
}
|
||||
|
||||
/* Test IO errors on encoding */
|
||||
{
|
||||
bool status;
|
||||
pb_ostream_t stream = {&write_callback, NULL, SIZE_MAX, 0};
|
||||
faulty_stream_t fs;
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < msglen; i++)
|
||||
{
|
||||
stream.max_size = msglen;
|
||||
stream.bytes_written = 0;
|
||||
stream.state = &fs;
|
||||
fs.buffer = buffer;
|
||||
fs.fail_after = i;
|
||||
|
||||
status = pb_encode(&stream, AllTypes_fields, &msg);
|
||||
if (status != false)
|
||||
{
|
||||
fprintf(stderr, "Unexpected success in encode\n");
|
||||
return 5;
|
||||
}
|
||||
else if (strcmp(stream.errmsg, "simulated") != 0)
|
||||
{
|
||||
fprintf(stderr, "Wrong error in encode: %s\n", stream.errmsg);
|
||||
return 6;
|
||||
}
|
||||
}
|
||||
|
||||
stream.max_size = msglen;
|
||||
stream.bytes_written = 0;
|
||||
stream.state = &fs;
|
||||
fs.buffer = buffer;
|
||||
fs.fail_after = msglen;
|
||||
status = pb_encode(&stream, AllTypes_fields, &msg);
|
||||
|
||||
if (!status)
|
||||
{
|
||||
fprintf(stderr, "Encoding failed: %s\n", stream.errmsg);
|
||||
return 7;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue