mirror of https://github.com/grpc/grpc.git
The C based gRPC (C++, Python, Ruby, Objective-C, PHP, C#)
https://grpc.io/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
3.1 KiB
131 lines
3.1 KiB
/* Decode a message using oneof fields */ |
|
|
|
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include <string.h> |
|
#include <pb_decode.h> |
|
#include "oneof.pb.h" |
|
#include "test_helpers.h" |
|
#include "unittests.h" |
|
|
|
/* Test the 'OneOfMessage' */ |
|
int test_oneof_1(pb_istream_t *stream, int option) |
|
{ |
|
OneOfMessage msg; |
|
int status = 0; |
|
|
|
/* To better catch initialization errors */ |
|
memset(&msg, 0xAA, sizeof(msg)); |
|
|
|
if (!pb_decode(stream, OneOfMessage_fields, &msg)) |
|
{ |
|
printf("Decoding failed: %s\n", PB_GET_ERROR(stream)); |
|
return 1; |
|
} |
|
|
|
/* Check that the basic fields work normally */ |
|
TEST(msg.prefix == 123); |
|
TEST(msg.suffix == 321); |
|
|
|
/* Check that we got the right oneof according to command line */ |
|
if (option == 1) |
|
{ |
|
TEST(msg.which_values == OneOfMessage_first_tag); |
|
TEST(msg.values.first == 999); |
|
} |
|
else if (option == 2) |
|
{ |
|
TEST(msg.which_values == OneOfMessage_second_tag); |
|
TEST(strcmp(msg.values.second, "abcd") == 0); |
|
} |
|
else if (option == 3) |
|
{ |
|
TEST(msg.which_values == OneOfMessage_third_tag); |
|
TEST(msg.values.third.array[0] == 1); |
|
TEST(msg.values.third.array[1] == 2); |
|
TEST(msg.values.third.array[2] == 3); |
|
TEST(msg.values.third.array[3] == 4); |
|
TEST(msg.values.third.array[4] == 5); |
|
} |
|
|
|
return status; |
|
} |
|
|
|
|
|
/* Test the 'PlainOneOfMessage' */ |
|
int test_oneof_2(pb_istream_t *stream, int option) |
|
{ |
|
PlainOneOfMessage msg = PlainOneOfMessage_init_zero; |
|
int status = 0; |
|
|
|
if (!pb_decode(stream, PlainOneOfMessage_fields, &msg)) |
|
{ |
|
printf("Decoding failed: %s\n", PB_GET_ERROR(stream)); |
|
return 1; |
|
} |
|
|
|
/* Check that we got the right oneof according to command line */ |
|
if (option == 1) |
|
{ |
|
TEST(msg.which_values == OneOfMessage_first_tag); |
|
TEST(msg.values.first == 999); |
|
} |
|
else if (option == 2) |
|
{ |
|
TEST(msg.which_values == OneOfMessage_second_tag); |
|
TEST(strcmp(msg.values.second, "abcd") == 0); |
|
} |
|
else if (option == 3) |
|
{ |
|
TEST(msg.which_values == OneOfMessage_third_tag); |
|
TEST(msg.values.third.array[0] == 1); |
|
TEST(msg.values.third.array[1] == 2); |
|
TEST(msg.values.third.array[2] == 3); |
|
TEST(msg.values.third.array[3] == 4); |
|
TEST(msg.values.third.array[4] == 5); |
|
} |
|
|
|
return status; |
|
} |
|
|
|
int main(int argc, char **argv) |
|
{ |
|
uint8_t buffer[OneOfMessage_size]; |
|
size_t count; |
|
int option; |
|
|
|
if (argc != 2) |
|
{ |
|
fprintf(stderr, "Usage: decode_oneof [number]\n"); |
|
return 1; |
|
} |
|
option = atoi(argv[1]); |
|
|
|
SET_BINARY_MODE(stdin); |
|
count = fread(buffer, 1, sizeof(buffer), stdin); |
|
|
|
if (!feof(stdin)) |
|
{ |
|
printf("Message does not fit in buffer\n"); |
|
return 1; |
|
} |
|
|
|
{ |
|
int status = 0; |
|
pb_istream_t stream; |
|
|
|
stream = pb_istream_from_buffer(buffer, count); |
|
status = test_oneof_1(&stream, option); |
|
|
|
if (status != 0) |
|
return status; |
|
|
|
stream = pb_istream_from_buffer(buffer, count); |
|
status = test_oneof_2(&stream, option); |
|
|
|
if (status != 0) |
|
return status; |
|
} |
|
|
|
return 0; |
|
}
|
|
|