Fix regression in generating message size defines (issue #172).
authorPetteri Aimonen <jpa@git.mail.kapsi.fi>
Mon, 5 Oct 2015 13:01:53 +0000 (16:01 +0300)
committerPetteri Aimonen <jpa@git.mail.kapsi.fi>
Mon, 5 Oct 2015 13:01:53 +0000 (16:01 +0300)
This bug was triggered when:
1. A .proto file included another .proto from a different directory.
2. The another .proto has an associated .options file.

Added regression test for the same.

generator/nanopb_generator.py
tests/regression/issue_172/SConscript [new file with mode: 0644]
tests/regression/issue_172/msg_size.c [new file with mode: 0644]
tests/regression/issue_172/submessage/submessage.options [new file with mode: 0644]
tests/regression/issue_172/submessage/submessage.proto [new file with mode: 0644]
tests/regression/issue_172/test.proto [new file with mode: 0644]

index 37f7beb..bc38895 100755 (executable)
@@ -514,18 +514,18 @@ class Field:
             return None
         
         if self.pbtype == 'MESSAGE':
+            encsize = None
             if str(self.submsgname) in dependencies:
                 submsg = dependencies[str(self.submsgname)]
                 encsize = submsg.encoded_size(dependencies)
-                if encsize is None:
-                    return None # Submessage size is indeterminate
-                    
-                # Include submessage length prefix
-                encsize += varint_max_size(encsize.upperlimit())
-            else:
-                # Submessage cannot be found, this currently occurs when
-                # the submessage type is defined in a different file and
-                # not using the protoc plugin.
+                if encsize is not None:
+                    # Include submessage length prefix
+                    encsize += varint_max_size(encsize.upperlimit())
+
+            if encsize is None:
+                # Submessage or its size cannot be found.
+                # This can occur if submessage is defined in different
+                # file, and it or its .options could not be found.
                 # Instead of direct numeric value, reference the size that
                 # has been #defined in the other file.
                 encsize = EncodedSize(self.submsgname + 'size')
diff --git a/tests/regression/issue_172/SConscript b/tests/regression/issue_172/SConscript
new file mode 100644 (file)
index 0000000..49c919e
--- /dev/null
@@ -0,0 +1,16 @@
+# Verify that _size define is generated for messages that have
+# includes from another directory.
+
+Import('env')
+
+incpath = env.Clone()
+incpath.Append(PROTOCPATH="#regression/issue_172/submessage")
+incpath.Append(CPPPATH="$BUILD/regression/issue_172/submessage")
+incpath.NanopbProto('test')
+incpath.NanopbProto(['submessage/submessage', 'submessage/submessage.options'])
+
+p = incpath.Program(["msg_size.c",
+                     "test.pb.c",
+                     "submessage/submessage.pb.c"])
+
+
diff --git a/tests/regression/issue_172/msg_size.c b/tests/regression/issue_172/msg_size.c
new file mode 100644 (file)
index 0000000..be45acb
--- /dev/null
@@ -0,0 +1,9 @@
+#include "test.pb.h"
+
+PB_STATIC_ASSERT(testmessage_size >= 1+1+1+1+16, TESTMESSAGE_SIZE_IS_WRONG)
+
+int main()
+{
+    return 0;
+}
+
diff --git a/tests/regression/issue_172/submessage/submessage.options b/tests/regression/issue_172/submessage/submessage.options
new file mode 100644 (file)
index 0000000..12fb198
--- /dev/null
@@ -0,0 +1 @@
+submessage.data max_size: 16
diff --git a/tests/regression/issue_172/submessage/submessage.proto b/tests/regression/issue_172/submessage/submessage.proto
new file mode 100644 (file)
index 0000000..ce6804a
--- /dev/null
@@ -0,0 +1,4 @@
+syntax = "proto2";
+message submessage {
+    required bytes data = 1;
+}
diff --git a/tests/regression/issue_172/test.proto b/tests/regression/issue_172/test.proto
new file mode 100644 (file)
index 0000000..fbd97be
--- /dev/null
@@ -0,0 +1,6 @@
+syntax = "proto2";
+import "submessage.proto";
+
+message testmessage {
+ optional submessage sub = 1;
+}