X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=tests%2Ftest_decode1.c;h=56bbd8f880987409ee78cab3eb5481600f5749fb;hb=5f3bf35e01a0eb5d7c31949bcd32265be056ed5c;hp=def45a67be1ce78e410e8ee470efe8118a754404;hpb=9cb63dd2667360e165739ab06a1aeb68d4007a24;p=apps%2Fagl-service-can-low-level.git diff --git a/tests/test_decode1.c b/tests/test_decode1.c index def45a67..56bbd8f8 100644 --- a/tests/test_decode1.c +++ b/tests/test_decode1.c @@ -1,7 +1,17 @@ +/* A very simple decoding test case, using person.proto. + * Produces output compatible with protoc --decode. + * Reads the encoded data from stdin and prints the values + * to stdout as text. + * + * Run e.g. ./test_encode1 | ./test_decode1 + */ + #include #include #include "person.pb.h" +/* This function is called once from main(), it handles + the decoding and printing. */ bool print_person(pb_istream_t *stream) { int i; @@ -10,8 +20,10 @@ bool print_person(pb_istream_t *stream) if (!pb_decode(stream, Person_fields, &person)) return false; + /* Now the decoding is done, rest is just to print stuff out. */ + printf("name: \"%s\"\n", person.name); - printf("id: %d\n", person.id); + printf("id: %ld\n", (long)person.id); if (person.has_email) printf("email: \"%s\"\n", person.email); @@ -22,19 +34,22 @@ bool print_person(pb_istream_t *stream) printf("phone {\n"); printf(" number: \"%s\"\n", phone->number); - switch (phone->type) + if (phone->has_type) { - case Person_PhoneType_WORK: - printf(" type: WORK\n"); - break; - - case Person_PhoneType_HOME: - printf(" type: HOME\n"); - break; - - case Person_PhoneType_MOBILE: - printf(" type: MOBILE\n"); - break; + switch (phone->type) + { + case Person_PhoneType_WORK: + printf(" type: WORK\n"); + break; + + case Person_PhoneType_HOME: + printf(" type: HOME\n"); + break; + + case Person_PhoneType_MOBILE: + printf(" type: MOBILE\n"); + break; + } } printf("}\n"); } @@ -42,30 +57,27 @@ bool print_person(pb_istream_t *stream) return true; } -bool callback(pb_istream_t *stream, uint8_t *buf, size_t count) +int main() { - FILE *file = (FILE*)stream->state; - bool status; + /* Read the data into buffer */ + uint8_t buffer[512]; + size_t count = fread(buffer, 1, sizeof(buffer), stdin); - if (buf == NULL) + if (!feof(stdin)) { - while (count-- && fgetc(file) != EOF); - return count == 0; + printf("Message does not fit in buffer\n"); + return 1; } - status = (fread(buf, 1, count, file) == count); + /* Construct a pb_istream_t for reading from the buffer */ + pb_istream_t stream = pb_istream_from_buffer(buffer, count); - if (feof(file)) - stream->bytes_left = 0; - - return status; -} - -int main() -{ - pb_istream_t stream = {&callback, stdin, SIZE_MAX}; + /* Decode and print out the stuff */ if (!print_person(&stream)) - printf("Parsing failed.\n"); - - return 0; + { + printf("Parsing failed: %s\n", PB_GET_ERROR(&stream)); + return 1; + } else { + return 0; + } }