Add regression test for issue 242
authorPetteri Aimonen <jpa@git.mail.kapsi.fi>
Sun, 12 Feb 2017 08:45:07 +0000 (10:45 +0200)
committerPetteri Aimonen <jpa@git.mail.kapsi.fi>
Sun, 12 Feb 2017 08:50:05 +0000 (10:50 +0200)
tests/regression/issue_242/SConscript [new file with mode: 0644]
tests/regression/issue_242/zero_value.c [new file with mode: 0644]
tests/regression/issue_242/zero_value.proto [new file with mode: 0644]

diff --git a/tests/regression/issue_242/SConscript b/tests/regression/issue_242/SConscript
new file mode 100644 (file)
index 0000000..000063e
--- /dev/null
@@ -0,0 +1,13 @@
+# Regression test for Issue 242: pb_encode does not encode tag for
+# extension fields that is all zeros
+Import('env')
+
+env.NanopbProto('zero_value')
+
+p = env.Program(["zero_value.c",
+                 "zero_value.pb.c",
+                 "$COMMON/pb_decode.o",
+                 "$COMMON/pb_encode.o",
+                 "$COMMON/pb_common.o"])
+env.RunTest(p)
+
diff --git a/tests/regression/issue_242/zero_value.c b/tests/regression/issue_242/zero_value.c
new file mode 100644 (file)
index 0000000..b3d96b7
--- /dev/null
@@ -0,0 +1,51 @@
+#include <unittests.h>
+#include <pb_encode.h>
+#include <pb_decode.h>
+#include <string.h>
+#include "zero_value.pb.h"
+
+int main()
+{
+    int status = 0;
+    
+    COMMENT("Test extension fields with zero values");
+    {
+        uint8_t buffer[256] = {0};
+        pb_ostream_t ostream;
+        int32_t value = 0;
+        Extendable source = {0};
+
+        pb_extension_t source_ext = {0};
+        source_ext.type = &opt_int32;
+        source_ext.dest = &value;
+        source.extensions = &source_ext;
+
+        ostream = pb_ostream_from_buffer(buffer, sizeof(buffer));
+        TEST(pb_encode(&ostream, Extendable_fields, &source));
+
+        TEST(ostream.bytes_written == 2);
+        TEST(memcmp(buffer, "\x58\x00", 2) == 0);
+    }
+    
+    /* Note: There never was a bug here, but this check is included
+     * in the regression test because the logic is closely related.
+     */
+    COMMENT("Test pointer fields with zero values");
+    {
+        uint8_t buffer[256] = {0};
+        pb_ostream_t ostream;
+        int32_t value = 0;
+        PointerMessage source = {0};
+
+        source.opt_int32 = &value;
+
+        ostream = pb_ostream_from_buffer(buffer, sizeof(buffer));
+        TEST(pb_encode(&ostream, PointerMessage_fields, &source));
+
+        TEST(ostream.bytes_written == 2);
+        TEST(memcmp(buffer, "\x58\x00", 2) == 0);
+    }    
+    
+    return status;
+}
+
diff --git a/tests/regression/issue_242/zero_value.proto b/tests/regression/issue_242/zero_value.proto
new file mode 100644 (file)
index 0000000..020a39a
--- /dev/null
@@ -0,0 +1,15 @@
+syntax = "proto2";
+import "nanopb.proto";
+
+message Extendable {
+    extensions 10 to 100;
+}
+
+extend Extendable {
+    optional int32 opt_int32 = 11;
+}
+
+message PointerMessage {
+    optional int32 opt_int32 = 11 [(nanopb).type = FT_POINTER];
+}
+