<p>Max has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/12017">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">msgb: add test helper<br><br>It's often handy to compare msgb to a given array and print the position<br>where they differ.<br><br>Change-Id: I3bc95f2f5ab6e3f4b502647fb3e0aaaf1f7c4cf5<br>---<br>M include/osmocom/core/msgb.h<br>M src/msgb.c<br>2 files changed, 83 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/17/12017/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/core/msgb.h b/include/osmocom/core/msgb.h</span><br><span>index 2449151..6e344f1 100644</span><br><span>--- a/include/osmocom/core/msgb.h</span><br><span>+++ b/include/osmocom/core/msgb.h</span><br><span>@@ -565,6 +565,8 @@</span><br><span> void *msgb_talloc_ctx_init(void *root_ctx, unsigned int pool_size);</span><br><span> void msgb_set_talloc_ctx(void *ctx) OSMO_DEPRECATED("Use msgb_talloc_ctx_init() instead");</span><br><span> int msgb_printf(struct msgb *msgb, const char *format, ...);</span><br><span style="color: hsl(120, 100%, 40%);">+bool msgb_cmpr_l3(const char *f, size_t l, const struct msgb *msg, const uint8_t *data, size_t len, bool print);</span><br><span style="color: hsl(120, 100%, 40%);">+bool msgb_cmpr(const char *f, size_t l, const struct msgb *msg, const uint8_t *data, size_t len, bool print);</span><br><span> </span><br><span> static inline const char *msgb_hexdump_l2(const struct msgb *msg)</span><br><span> {</span><br><span>diff --git a/src/msgb.c b/src/msgb.c</span><br><span>index 844cfc6..ebecc3e 100644</span><br><span>--- a/src/msgb.c</span><br><span>+++ b/src/msgb.c</span><br><span>@@ -173,6 +173,87 @@</span><br><span>         return msg->data;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static inline bool compare_n_print(const char *f, size_t l, uint8_t level,</span><br><span style="color: hsl(120, 100%, 40%);">+                                const uint8_t *m, const uint8_t *d, size_t len, bool print)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     size_t i;</span><br><span style="color: hsl(120, 100%, 40%);">+     if (memcmp(m, d, len) == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+           return true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!print)</span><br><span style="color: hsl(120, 100%, 40%);">+           return false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       printf("%s:%zu L%u data mismatch:\nexpected %s\n         ",</span><br><span style="color: hsl(120, 100%, 40%);">+        f, l, level, osmo_hexdump(d, len));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  for(i = 0; i < len; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+           if (d[i] != m[i]) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   printf("!!\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                     break;</span><br><span style="color: hsl(120, 100%, 40%);">+                } else</span><br><span style="color: hsl(120, 100%, 40%);">+                        printf(".. ");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* N. B: that's intended to be used bymsgb_cmpr*() so length check is already passed,</span><br><span style="color: hsl(120, 100%, 40%);">+        so we can use len for both m and d */</span><br><span style="color: hsl(120, 100%, 40%);">+      printf("    msgb %s\n", osmo_hexdump(m, len));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    return false;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Compare and print: check L3 data in msgb against given data and print erros if any</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] f text prefix, usually __func__, ignored if print == false</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] l numeric prefix, usually __LINE__, ignored if print == false</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] msg message buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] data expected L3 data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] len length of data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] print boolean indicating whether we should print anything to stdout</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns boolean indicating whether msgb L3 content is equal to a given data</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+bool msgb_cmpr_l3(const char *f, size_t l, const struct msgb *msg, const uint8_t *data, size_t len, bool print)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!msg) {</span><br><span style="color: hsl(120, 100%, 40%);">+           if (print)</span><br><span style="color: hsl(120, 100%, 40%);">+                    printf("%s:%zu NULL msg comparison\n", f, l);</span><br><span style="color: hsl(120, 100%, 40%);">+               return false;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (msgb_l3len(msg) != len) {</span><br><span style="color: hsl(120, 100%, 40%);">+         if (print)</span><br><span style="color: hsl(120, 100%, 40%);">+                    printf("%s:%zu Length mismatch: %d != %zu, %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                          f, l, msgb_l3len(msg), len, msgb_hexdump_l3(msg));</span><br><span style="color: hsl(120, 100%, 40%);">+             return false;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return compare_n_print(f, l, 3, msgb_l3(msg), data, len, print);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Compare and print: check data in msgb against given data and print erros if any</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] f text prefix, usually __func__, ignored if print == false</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] l numeric prefix, usually __LINE__, ignored if print == false</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] msg message buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] data expected data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] len length of data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] print boolean indicating whether we should print anything to stdout</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns boolean indicating whether msgb content is equal to a given data</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+bool msgb_cmpr(const char *f, size_t l, const struct msgb *msg, const uint8_t *data, size_t len, bool print)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!msg) {</span><br><span style="color: hsl(120, 100%, 40%);">+           if (print)</span><br><span style="color: hsl(120, 100%, 40%);">+                    printf("%s:%zu NULL msg comparison\n", f, l);</span><br><span style="color: hsl(120, 100%, 40%);">+               return false;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (msgb_length(msg) != len) {</span><br><span style="color: hsl(120, 100%, 40%);">+                if (print)</span><br><span style="color: hsl(120, 100%, 40%);">+                    printf("%s:%zu Length mismatch: %d != %zu, %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                          f, l, msgb_length(msg), len, msgb_hexdump(msg));</span><br><span style="color: hsl(120, 100%, 40%);">+               return false;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return compare_n_print(f, l, 0, msgb_data(msg), data, len, print);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! get length of message buffer</span><br><span>  *  \param[in] msg message buffer</span><br><span>  *  \returns length of data section in message buffer</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12017">change 12017</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/12017"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I3bc95f2f5ab6e3f4b502647fb3e0aaaf1f7c4cf5 </div>
<div style="display:none"> Gerrit-Change-Number: 12017 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Max <msuraev@sysmocom.de> </div>