diff options
author | Petteri Aimonen <jpa@git.mail.kapsi.fi> | 2018-11-10 14:18:37 +0200 |
---|---|---|
committer | Petteri Aimonen <jpa@git.mail.kapsi.fi> | 2018-11-10 14:18:37 +0200 |
commit | e2f082fadde5142b7d300868c37fbe62293c3641 (patch) | |
tree | 636d14dc18fbba4c4a8e743abd53e6023186be8a /tests | |
parent | 04cd1f94cc513b4cb3eac924c74039ccc05a944b (diff) | |
parent | 3626b5c40e2457629ac60a563dde523be7c10bb4 (diff) | |
download | nanopb-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/SConstruct | 16 | ||||
-rw-r--r-- | tests/mem_release/mem_release.c | 36 | ||||
-rw-r--r-- | tests/mem_release/mem_release.proto | 6 | ||||
-rw-r--r-- | tests/multiple_files/subdir/multifile2.proto | 5 | ||||
-rw-r--r-- | tests/multiple_files/test_multiple_files.c | 3 | ||||
-rw-r--r-- | tests/regression/issue_338/SConscript | 7 | ||||
-rw-r--r-- | tests/regression/issue_338/bigvalue.proto | 204 | ||||
-rw-r--r-- | tests/regression/issue_342/SConscript | 21 | ||||
-rw-r--r-- | tests/regression/issue_342/extensions.proto | 11 | ||||
-rw-r--r-- | tests/regression/issue_342/test_extensions.c | 52 | ||||
-rw-r--r-- | tests/typename_mangling/SConscript | 20 | ||||
-rw-r--r-- | tests/typename_mangling/test_flatten.c | 22 | ||||
-rw-r--r-- | tests/typename_mangling/test_strip_package.c | 19 | ||||
-rw-r--r-- | tests/typename_mangling/with_package.options | 5 | ||||
-rw-r--r-- | tests/typename_mangling/with_package.proto | 38 |
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; + } +} |