summaryrefslogtreecommitdiffstats
path: root/libs/nanopb/tests/anonymous_oneof
diff options
context:
space:
mode:
Diffstat (limited to 'libs/nanopb/tests/anonymous_oneof')
-rw-r--r--libs/nanopb/tests/anonymous_oneof/SConscript30
-rw-r--r--libs/nanopb/tests/anonymous_oneof/decode_oneof.c88
-rw-r--r--libs/nanopb/tests/anonymous_oneof/oneof.proto23
3 files changed, 141 insertions, 0 deletions
diff --git a/libs/nanopb/tests/anonymous_oneof/SConscript b/libs/nanopb/tests/anonymous_oneof/SConscript
new file mode 100644
index 0000000..1067228
--- /dev/null
+++ b/libs/nanopb/tests/anonymous_oneof/SConscript
@@ -0,0 +1,30 @@
+# Test anonymous_oneof generator option
+
+Import('env')
+
+import re
+
+match = None
+if 'PROTOC_VERSION' in env:
+ match = re.search('([0-9]+).([0-9]+).([0-9]+)', env['PROTOC_VERSION'])
+
+if match:
+ version = map(int, match.groups())
+
+# Oneof is supported by protoc >= 2.6.0
+if env.GetOption('clean') or (match and (version[0] > 2 or (version[0] == 2 and version[1] >= 6))):
+ # Anonymous oneofs are supported by clang and gcc
+ if 'clang' in env['CC'] or 'gcc' in env['CC']:
+ env2 = env.Clone()
+ if '-pedantic' in env2['CFLAGS']:
+ env2['CFLAGS'].remove('-pedantic')
+ env2.NanopbProto('oneof')
+
+ dec = env2.Program(['decode_oneof.c',
+ 'oneof.pb.c',
+ '$COMMON/pb_decode.o',
+ '$COMMON/pb_common.o'])
+
+ env2.RunTest("message1.txt", [dec, '$BUILD/oneof/message1.pb'], ARGS = ['1'])
+ env2.RunTest("message2.txt", [dec, '$BUILD/oneof/message2.pb'], ARGS = ['2'])
+ env2.RunTest("message3.txt", [dec, '$BUILD/oneof/message3.pb'], ARGS = ['3'])
diff --git a/libs/nanopb/tests/anonymous_oneof/decode_oneof.c b/libs/nanopb/tests/anonymous_oneof/decode_oneof.c
new file mode 100644
index 0000000..0f774db
--- /dev/null
+++ b/libs/nanopb/tests/anonymous_oneof/decode_oneof.c
@@ -0,0 +1,88 @@
+/* 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 'AnonymousOneOfMessage' */
+int test_oneof_1(pb_istream_t *stream, int option)
+{
+ AnonymousOneOfMessage msg;
+ int status = 0;
+
+ /* To better catch initialization errors */
+ memset(&msg, 0xAA, sizeof(msg));
+
+ if (!pb_decode(stream, AnonymousOneOfMessage_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 == AnonymousOneOfMessage_first_tag);
+ TEST(msg.first == 999);
+ }
+ else if (option == 2)
+ {
+ TEST(msg.which_values == AnonymousOneOfMessage_second_tag);
+ TEST(strcmp(msg.second, "abcd") == 0);
+ }
+ else if (option == 3)
+ {
+ TEST(msg.which_values == AnonymousOneOfMessage_third_tag);
+ TEST(msg.third.array[0] == 1);
+ TEST(msg.third.array[1] == 2);
+ TEST(msg.third.array[2] == 3);
+ TEST(msg.third.array[3] == 4);
+ TEST(msg.third.array[4] == 5);
+ }
+
+ return status;
+}
+
+int main(int argc, char **argv)
+{
+ uint8_t buffer[AnonymousOneOfMessage_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;
+ }
+
+ return 0;
+}
diff --git a/libs/nanopb/tests/anonymous_oneof/oneof.proto b/libs/nanopb/tests/anonymous_oneof/oneof.proto
new file mode 100644
index 0000000..d56285c
--- /dev/null
+++ b/libs/nanopb/tests/anonymous_oneof/oneof.proto
@@ -0,0 +1,23 @@
+syntax = "proto2";
+
+import 'nanopb.proto';
+
+message SubMessage
+{
+ repeated int32 array = 1 [(nanopb).max_count = 8];
+}
+
+/* Oneof in a message with other fields */
+message AnonymousOneOfMessage
+{
+ option (nanopb_msgopt).anonymous_oneof = true;
+ required int32 prefix = 1;
+ oneof values
+ {
+ int32 first = 5;
+ string second = 6 [(nanopb).max_size = 8];
+ SubMessage third = 7;
+ }
+ required int32 suffix = 99;
+}
+