aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorPetteri Aimonen <jpa@git.mail.kapsi.fi>2018-11-10 14:18:37 +0200
committerPetteri Aimonen <jpa@git.mail.kapsi.fi>2018-11-10 14:18:37 +0200
commite2f082fadde5142b7d300868c37fbe62293c3641 (patch)
tree636d14dc18fbba4c4a8e743abd53e6023186be8a /tests
parent04cd1f94cc513b4cb3eac924c74039ccc05a944b (diff)
parent3626b5c40e2457629ac60a563dde523be7c10bb4 (diff)
downloadnanopb-c-e2f082fadde5142b7d300868c37fbe62293c3641.tar.gz
Merge 'master' into maintenance_0.3
A bit of a mess, should have done the 0.3.9.2 release from this branch instead. Oh well, doesn't change anything.
Diffstat (limited to 'tests')
-rw-r--r--tests/SConstruct16
-rw-r--r--tests/mem_release/mem_release.c36
-rw-r--r--tests/mem_release/mem_release.proto6
-rw-r--r--tests/multiple_files/subdir/multifile2.proto5
-rw-r--r--tests/multiple_files/test_multiple_files.c3
-rw-r--r--tests/regression/issue_338/SConscript7
-rw-r--r--tests/regression/issue_338/bigvalue.proto204
-rw-r--r--tests/regression/issue_342/SConscript21
-rw-r--r--tests/regression/issue_342/extensions.proto11
-rw-r--r--tests/regression/issue_342/test_extensions.c52
-rw-r--r--tests/typename_mangling/SConscript20
-rw-r--r--tests/typename_mangling/test_flatten.c22
-rw-r--r--tests/typename_mangling/test_strip_package.c19
-rw-r--r--tests/typename_mangling/with_package.options5
-rw-r--r--tests/typename_mangling/with_package.proto38
15 files changed, 462 insertions, 3 deletions
diff --git a/tests/SConstruct b/tests/SConstruct
index f998024..d2dfeec 100644
--- a/tests/SConstruct
+++ b/tests/SConstruct
@@ -16,6 +16,14 @@ scons CC=clang CXX=clang++
import os
env = Environment(ENV = os.environ, tools = ['default', 'nanopb'])
+# Limit memory usage. This is to catch problems like issue #338
+try:
+ import resource
+ soft, hard = resource.getrlimit(resourse.RLIMIT_AS)
+ resource.setrlimit(resource.RLIMIT_AS, (100*1024*1024, hard))
+except:
+ pass
+
# Allow overriding the compiler with scons CC=???
if 'CC' in ARGUMENTS: env.Replace(CC = ARGUMENTS['CC'])
if 'CXX' in ARGUMENTS: env.Replace(CXX = ARGUMENTS['CXX'])
@@ -128,6 +136,12 @@ elif 'cl' in env['CC']:
# More strict checks on the nanopb core
env.Append(CORECFLAGS = '/W4')
+
+ # Disable warning about sizeof(union{}) construct that is used in
+ # message size macros, in e.g. multiple_files testcase. The C construct
+ # itself is valid, but quite rare, which causes Visual C++ to give a warning
+ # about it.
+ env.Append(CFLAGS = '/wd4116')
elif 'tcc' in env['CC']:
# Tiny C Compiler
env.Append(CFLAGS = '-Wall -Werror -g')
@@ -139,7 +153,7 @@ if 'clang' in env['CXX']:
elif 'g++' in env['CXX'] or 'gcc' in env['CXX']:
env.Append(CXXFLAGS = '-g -Wall -Werror -Wextra -Wno-missing-field-initializers')
elif 'cl' in env['CXX']:
- env.Append(CXXFLAGS = '/Zi /W2 /WX')
+ env.Append(CXXFLAGS = '/Zi /W2 /WX /wd4116')
# Now include the SConscript files from all subdirectories
import os.path
diff --git a/tests/mem_release/mem_release.c b/tests/mem_release/mem_release.c
index dc6f87d..6e06da5 100644
--- a/tests/mem_release/mem_release.c
+++ b/tests/mem_release/mem_release.c
@@ -177,9 +177,43 @@ static bool test_OneofMessage()
return true;
}
+static bool dummy_decode_cb(pb_istream_t *stream, const pb_field_t *field, void **arg)
+{
+ return false;
+}
+
+/* Garbage input */
+static bool test_Garbage()
+{
+ const uint8_t buffer[] = "I'm only happy when it rains";
+ const size_t msgsize = sizeof(buffer);
+
+ {
+ OneofMessage msg = OneofMessage_init_zero;
+ pb_istream_t stream = pb_istream_from_buffer(buffer, msgsize);
+ TEST(!pb_decode(&stream, OneofMessage_fields, &msg));
+ }
+
+ {
+ TestMessage msg = TestMessage_init_zero;
+ pb_istream_t stream = pb_istream_from_buffer(buffer, msgsize);
+ TEST(!pb_decode(&stream, TestMessage_fields, &msg));
+ }
+
+ {
+ RepeatedMessage msg = RepeatedMessage_init_zero;
+ pb_istream_t stream = pb_istream_from_buffer(buffer, msgsize);
+ msg.subs.arg = NULL;
+ msg.subs.funcs.decode = dummy_decode_cb;
+ TEST(!pb_decode(&stream, RepeatedMessage_fields, &msg));
+ }
+
+ return true;
+}
+
int main()
{
- if (test_TestMessage() && test_OneofMessage())
+ if (test_TestMessage() && test_OneofMessage() && test_Garbage())
return 0;
else
return 1;
diff --git a/tests/mem_release/mem_release.proto b/tests/mem_release/mem_release.proto
index 0816dc2..b0addbd 100644
--- a/tests/mem_release/mem_release.proto
+++ b/tests/mem_release/mem_release.proto
@@ -33,3 +33,9 @@ message OneofMessage
}
required int32 last = 4;
}
+
+message RepeatedMessage
+{
+ required int32 first = 1;
+ repeated SubMessage subs = 2;
+}
diff --git a/tests/multiple_files/subdir/multifile2.proto b/tests/multiple_files/subdir/multifile2.proto
index 847a929..99f094e 100644
--- a/tests/multiple_files/subdir/multifile2.proto
+++ b/tests/multiple_files/subdir/multifile2.proto
@@ -9,9 +9,14 @@ message Callback2Message {
required SubMessage submsg = 2;
}
+message SmallMessage {
+ required bool dummy = 1;
+}
+
message OneofMessage {
oneof msgs {
StaticMessage tstmsg = 1;
+ SmallMessage msg2 = 2;
}
}
diff --git a/tests/multiple_files/test_multiple_files.c b/tests/multiple_files/test_multiple_files.c
index 70a3e59..a4a600a 100644
--- a/tests/multiple_files/test_multiple_files.c
+++ b/tests/multiple_files/test_multiple_files.c
@@ -23,7 +23,8 @@ int main()
{
subdir_SubdirMessage foo = subdir_SubdirMessage_init_default;
TEST(foo.foo == 15);
- /* TEST(subdir_OneofMessage_size == 27); */ /* TODO: Issue #172 */
+ TEST(subdir_OneofMessage_size >= 27); /* Note: not perfectly accurate due to issue 172 */
+ TEST(subdir_OneofMessage_size <= 30);
}
return status;
diff --git a/tests/regression/issue_338/SConscript b/tests/regression/issue_338/SConscript
new file mode 100644
index 0000000..7b219b8
--- /dev/null
+++ b/tests/regression/issue_338/SConscript
@@ -0,0 +1,7 @@
+# Check that generator doesn't exceed memory limits
+
+Import('env')
+
+env.NanopbProto('bigvalue')
+
+
diff --git a/tests/regression/issue_338/bigvalue.proto b/tests/regression/issue_338/bigvalue.proto
new file mode 100644
index 0000000..3ff284a
--- /dev/null
+++ b/tests/regression/issue_338/bigvalue.proto
@@ -0,0 +1,204 @@
+syntax = "proto3";
+
+package enterprise;
+
+message BigData {
+ repeated BigEvent events = 1;
+}
+
+message BigEvent {
+ oneof event {
+ BigValue1 data1 = 1;
+ BigValue2 data2 = 2;
+ BigValue3 data3 = 3;
+ BigValue4 data4 = 4;
+ BigValue5 data5 = 5;
+ BigValue6 data6 = 6;
+ BigValue7 data7 = 7;
+ BigValue8 data8 = 8;
+ BigValue9 data9 = 9;
+ BigValue10 data10 = 10;
+ BigValue11 data11 = 11;
+ BigValue12 data12 = 12;
+ BigValue13 data13 = 13;
+ BigValue14 data14 = 14;
+ BigValue15 data15 = 15;
+ BigValue16 data16 = 16;
+ BigValue17 data17 = 17;
+ BigValue18 data18 = 18;
+ BigValue19 data19 = 19;
+ BigValue20 data20 = 20;
+ BigValue21 data21 = 21;
+ BigValue22 data22 = 22;
+ BigValue23 data23 = 23;
+ BigValue24 data24 = 24;
+ BigValue25 data25 = 25;
+ BigValue26 data26 = 26;
+ BigValue27 data27 = 27;
+ BigValue28 data28 = 28;
+ BigValue29 data29 = 29;
+ BigValue30 data30 = 30;
+ BigValue31 data31 = 31;
+ BigValue32 data32 = 32;
+ }
+}
+
+message BigValue1 {
+ int32 key = 1;
+ bytes value = 2;
+}
+
+message BigValue2 {
+ int32 key = 1;
+ bytes value = 2;
+}
+
+message BigValue3 {
+ int32 key = 1;
+ bytes value = 2;
+}
+
+message BigValue4 {
+ int32 key = 1;
+ bytes value = 2;
+}
+
+message BigValue5 {
+ int32 key = 1;
+ bytes value = 2;
+}
+
+message BigValue6 {
+ int32 key = 1;
+ bytes value = 2;
+}
+
+message BigValue7 {
+ int32 key = 1;
+ bytes value = 2;
+}
+
+message BigValue8 {
+ int32 key = 1;
+ bytes value = 2;
+}
+
+message BigValue9 {
+ int32 key = 1;
+ bytes value = 2;
+}
+
+message BigValue10 {
+ int32 key = 1;
+ bytes value = 2;
+}
+
+message BigValue11 {
+ int32 key = 1;
+ bytes value = 2;
+}
+
+message BigValue12 {
+ int32 key = 1;
+ bytes value = 2;
+}
+
+message BigValue13 {
+ int32 key = 1;
+ bytes value = 2;
+}
+
+message BigValue14 {
+ int32 key = 1;
+ bytes value = 2;
+}
+
+message BigValue15 {
+ int32 key = 1;
+ bytes value = 2;
+}
+
+message BigValue16 {
+ int32 key = 1;
+ bytes value = 2;
+}
+
+message BigValue17 {
+ int32 key = 1;
+ bytes value = 2;
+}
+
+message BigValue18 {
+ int32 key = 1;
+ bytes value = 2;
+}
+
+message BigValue19 {
+ int32 key = 1;
+ bytes value = 2;
+}
+
+message BigValue20 {
+ int32 key = 1;
+ bytes value = 2;
+}
+
+message BigValue21 {
+ int32 key = 1;
+ bytes value = 2;
+}
+
+message BigValue22 {
+ int32 key = 1;
+ bytes value = 2;
+}
+
+message BigValue23 {
+ int32 key = 1;
+ bytes value = 2;
+}
+
+message BigValue24 {
+ int32 key = 1;
+ bytes value = 2;
+}
+
+message BigValue25 {
+ int32 key = 1;
+ bytes value = 2;
+}
+
+message BigValue26 {
+ int32 key = 1;
+ bytes value = 2;
+}
+
+message BigValue27 {
+ int32 key = 1;
+ bytes value = 2;
+}
+
+message BigValue28 {
+ int32 key = 1;
+ bytes value = 2;
+}
+
+message BigValue29 {
+ int32 key = 1;
+ bytes value = 2;
+}
+
+message BigValue30 {
+ int32 key = 1;
+ bytes value = 2;
+}
+
+message BigValue31 {
+ int32 key = 1;
+ bytes value = 2;
+}
+
+message BigValue32 {
+ int32 key = 1;
+ bytes value = 2;
+}
diff --git a/tests/regression/issue_342/SConscript b/tests/regression/issue_342/SConscript
new file mode 100644
index 0000000..e15d022
--- /dev/null
+++ b/tests/regression/issue_342/SConscript
@@ -0,0 +1,21 @@
+# Regression test for #342:
+# Possible null-pointer dereference in pb_decode.c
+
+Import("env")
+
+# Define the compilation options
+opts = env.Clone()
+opts.Append(CPPDEFINES = {'PB_OLD_CALLBACK_STYLE': 1})
+
+# Build new version of core
+strict = opts.Clone()
+strict.Append(CFLAGS = strict['CORECFLAGS'])
+strict.Object("pb_decode_oldcallback.o", "$NANOPB/pb_decode.c")
+strict.Object("pb_encode_oldcallback.o", "$NANOPB/pb_encode.c")
+strict.Object("pb_common_oldcallback.o", "$NANOPB/pb_common.c")
+
+opts.NanopbProto("extensions")
+testprog = opts.Program(["test_extensions.c", "extensions.pb.c", "pb_encode_oldcallback.o", "pb_decode_oldcallback.o", "pb_common_oldcallback.o"])
+
+opts.RunTest(testprog)
+
diff --git a/tests/regression/issue_342/extensions.proto b/tests/regression/issue_342/extensions.proto
new file mode 100644
index 0000000..04b60ab
--- /dev/null
+++ b/tests/regression/issue_342/extensions.proto
@@ -0,0 +1,11 @@
+syntax = "proto2";
+
+message BaseMessage {
+ extensions 100 to 200;
+}
+
+extend BaseMessage {
+ optional string string_extension = 100;
+}
+
+
diff --git a/tests/regression/issue_342/test_extensions.c b/tests/regression/issue_342/test_extensions.c
new file mode 100644
index 0000000..1a48855
--- /dev/null
+++ b/tests/regression/issue_342/test_extensions.c
@@ -0,0 +1,52 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <pb_encode.h>
+#include <pb_decode.h>
+#include "extensions.pb.h"
+#include "unittests.h"
+
+static bool write_string(pb_ostream_t *stream, const pb_field_t *field, const void *arg)
+{
+ return pb_encode_tag_for_field(stream, field) &&
+ pb_encode_string(stream, (const void*)"abc", 3);
+}
+
+int main(int argc, char **argv)
+{
+ int status = 0;
+ uint8_t buffer[64];
+ pb_size_t msglen = 0;
+
+ {
+ pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
+ pb_callback_t callback_def = {{0}};
+ pb_extension_t ext = {0};
+ BaseMessage msg = {0};
+
+ callback_def.funcs.encode = &write_string;
+ ext.type = &string_extension;
+ ext.dest = &callback_def;
+ msg.extensions = &ext;
+
+ TEST(pb_encode(&stream, BaseMessage_fields, &msg));
+
+ msglen = stream.bytes_written;
+ TEST(msglen > 3);
+ }
+
+ {
+ pb_istream_t stream = pb_istream_from_buffer(buffer, msglen);
+ pb_extension_t ext = {0};
+ BaseMessage msg = {0};
+
+ ext.type = &string_extension;
+ /* Note: ext.dest remains null to trigger buf #342 */
+ msg.extensions = &ext;
+
+ TEST(pb_decode(&stream, BaseMessage_fields, &msg));
+ }
+
+ return status;
+}
+
diff --git a/tests/typename_mangling/SConscript b/tests/typename_mangling/SConscript
new file mode 100644
index 0000000..219e6e2
--- /dev/null
+++ b/tests/typename_mangling/SConscript
@@ -0,0 +1,20 @@
+# Test mangle_names option
+
+Import('env')
+
+def set_mangling(type):
+ def command(target, source, env):
+ with open(str(source[0])) as src, open(str(target[0]), "w") as dst:
+ dst.write("* mangle_names:{}\n".format(type))
+ dst.write(src.read())
+ return command
+
+env.Command("strip_package.options", "with_package.options", set_mangling("M_STRIP_PACKAGE"))
+env.Command("strip_package.proto", "with_package.proto", Copy("$TARGET", "$SOURCE"))
+env.NanopbProto(["strip_package", "strip_package.options"])
+env.Program(["test_strip_package.c", "strip_package.pb.c"])
+
+env.Command("flatten.options", "with_package.options", set_mangling("M_FLATTEN"))
+env.Command("flatten.proto", "with_package.proto", Copy("$TARGET", "$SOURCE"))
+env.NanopbProto(["flatten", "flatten.options"])
+env.Program(["test_flatten.c", "flatten.pb.c"])
diff --git a/tests/typename_mangling/test_flatten.c b/tests/typename_mangling/test_flatten.c
new file mode 100644
index 0000000..dbc126e
--- /dev/null
+++ b/tests/typename_mangling/test_flatten.c
@@ -0,0 +1,22 @@
+/*
+ * Tests if expected names are generated when M_FLATTEN is used.
+ */
+
+#include <stdio.h>
+#include "unittests.h"
+#include "flatten.pb.h"
+
+int main()
+{
+ TopLevelMessage msg = {0};
+ NestedMessage nmsg = msg.nested;
+ NestedLevel2 nmsg2 = nmsg.nested;
+ NestedLevel3 nmsg3 = nmsg2.nested;
+ nmsg3.nothing = 42;
+
+ msg.short_if_none = ShortIfNone_IfNone_A;
+ msg.short_if_strip_package = ShortIfStripPackage_IfPackage_A;
+ msg.short_if_flatten = IfFlatten_A;
+
+ return nmsg3.nothing; /* this sets `nmsg3` as used, to prevent warning */
+}
diff --git a/tests/typename_mangling/test_strip_package.c b/tests/typename_mangling/test_strip_package.c
new file mode 100644
index 0000000..329de54
--- /dev/null
+++ b/tests/typename_mangling/test_strip_package.c
@@ -0,0 +1,19 @@
+/*
+ * Tests if expected names are generated when M_STRIP_PACKAGE is used.
+ */
+
+#include <stdio.h>
+#include "unittests.h"
+#include "strip_package.pb.h"
+
+int main()
+{
+ TopLevelMessage msg = {0};
+ TopLevelMessage_NestedMessage_NestedLevel2_NestedLevel3 nmsg = msg.nested.nested.nested;
+
+ msg.short_if_none = TopLevelMessage_ShortIfNone_IfNone_A;
+ msg.short_if_strip_package = TopLevelMessage_IfPackage_A;
+ msg.short_if_flatten = TopLevelMessage_ShortIfFlatten_IfFlatten_A;
+
+ return nmsg.nothing; /* marks nmsg as used */
+}
diff --git a/tests/typename_mangling/with_package.options b/tests/typename_mangling/with_package.options
new file mode 100644
index 0000000..115c94d
--- /dev/null
+++ b/tests/typename_mangling/with_package.options
@@ -0,0 +1,5 @@
+* long_names:true
+
+com.example.nanopb.TopLevelMessage.ShortIfNone long_names:false
+TopLevelMessage.ShortIfStripPackage long_names:false
+ShortIfFlatten long_names: false
diff --git a/tests/typename_mangling/with_package.proto b/tests/typename_mangling/with_package.proto
new file mode 100644
index 0000000..c5af6e1
--- /dev/null
+++ b/tests/typename_mangling/with_package.proto
@@ -0,0 +1,38 @@
+syntax = "proto2";
+
+package com.example.nanopb;
+
+message TopLevelMessage {
+ required uint32 base_field = 1;
+ required NestedMessage nested = 2;
+ optional ShortIfNone short_if_none = 3;
+ optional ShortIfStripPackage short_if_strip_package = 4;
+ optional ShortIfFlatten short_if_flatten = 5;
+
+ message NestedMessage {
+ required NestedLevel2 nested = 1;
+
+ message NestedLevel2 {
+ required NestedLevel3 nested = 1;
+
+ message NestedLevel3 {
+ required uint32 nothing = 1;
+ }
+ }
+ }
+
+ enum ShortIfNone {
+ IfNone_A = 1;
+ IfNone_B = 2;
+ }
+
+ enum ShortIfStripPackage {
+ IfPackage_A = 1;
+ IfPackage_B = 2;
+ }
+
+ enum ShortIfFlatten {
+ IfFlatten_A = 1;
+ IfFlatten_B = 2;
+ }
+}