<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/16165">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">utils_test: add osmo_print_n_test()<br><br>A couple of times recently I've needed to copy out a substring to a buffer with<br>limited size. Use of strncpy() or osmo_strlcpy() are nontrivial here.<br>I wanted to have a dedicated function.<br><br>After I wrote that function with a test, I noticed that I had already<br>implemented the same thing a while ago, as osmo_print_n() :P<br>So here is just the test.<br><br>Change-Id: Ia716abdc1f58af6065b84f4f567388a32a7b39fc<br>---<br>M src/utils.c<br>M tests/utils/utils_test.c<br>M tests/utils/utils_test.ok<br>3 files changed, 82 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/65/16165/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/utils.c b/src/utils.c</span><br><span>index 8dfa7ec..4e55a89 100644</span><br><span>--- a/src/utils.c</span><br><span>+++ b/src/utils.c</span><br><span>@@ -509,6 +509,8 @@</span><br><span>  * Copy at most \a siz bytes from \a src to \a dst, ensuring that the result is</span><br><span>  * NUL terminated. The NUL character is included in \a siz, i.e. passing the</span><br><span>  * actual sizeof(*dst) is correct.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Note, a similar function that also limits the input buffer size is osmo_print_n().</span><br><span>  */</span><br><span> size_t osmo_strlcpy(char *dst, const char *src, size_t siz)</span><br><span> {</span><br><span>diff --git a/tests/utils/utils_test.c b/tests/utils/utils_test.c</span><br><span>index 3c6d17b..458458e 100644</span><br><span>--- a/tests/utils/utils_test.c</span><br><span>+++ b/tests/utils/utils_test.c</span><br><span>@@ -1264,6 +1264,59 @@</span><br><span>       talloc_free(ctx);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void osmo_print_n_test(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct token_test {</span><br><span style="color: hsl(120, 100%, 40%);">+           const char *src;</span><br><span style="color: hsl(120, 100%, 40%);">+              size_t token_len;</span><br><span style="color: hsl(120, 100%, 40%);">+             size_t buf_size;</span><br><span style="color: hsl(120, 100%, 40%);">+              const char *expect_token;</span><br><span style="color: hsl(120, 100%, 40%);">+             int expect_rc;</span><br><span style="color: hsl(120, 100%, 40%);">+        };</span><br><span style="color: hsl(120, 100%, 40%);">+    struct token_test tests[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+         { "foo=bar", 3, 100, "foo", 3 },</span><br><span style="color: hsl(120, 100%, 40%);">+          { "foo", 10, 100, "foo", 3 },</span><br><span style="color: hsl(120, 100%, 40%);">+             { "foo", 3, 100, "foo", 3 },</span><br><span style="color: hsl(120, 100%, 40%);">+              { NULL, 10, 100, "", 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           { "", 10, 100, "", 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+           { "foo=bar", 0, 100, "", 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           { "foo=bar", 3, 2, "f", 3 },</span><br><span style="color: hsl(120, 100%, 40%);">+              { "foo", 10, 2, "f", 3 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { "foo", 3, 2, "f", 3 },</span><br><span style="color: hsl(120, 100%, 40%);">+          { NULL, 10, 2, "", 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+             { "", 10, 2, "", 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+             { "foo=bar", 0, 2, "", 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             { "foo=bar", 3, 1, "", 3 },</span><br><span style="color: hsl(120, 100%, 40%);">+               { "foo", 10, 1, "", 3 },</span><br><span style="color: hsl(120, 100%, 40%);">+          { "foo", 3, 1, "", 3 },</span><br><span style="color: hsl(120, 100%, 40%);">+           { NULL, 10, 1, "", 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+             { "", 10, 1, "", 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+             { "foo=bar", 0, 1, "", 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             { "foo=bar", 3, 0, "unchanged", 3 },</span><br><span style="color: hsl(120, 100%, 40%);">+              { "foo", 10, 0, "unchanged", 3 },</span><br><span style="color: hsl(120, 100%, 40%);">+         { "foo", 3, 0, "unchanged", 3 },</span><br><span style="color: hsl(120, 100%, 40%);">+          { NULL, 10, 0, "unchanged", 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            { "", 10, 0, "unchanged", 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+            { "foo=bar", 0, 0, "unchanged", 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      };</span><br><span style="color: hsl(120, 100%, 40%);">+    struct token_test *t;</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("\n%s()\n", __func__);</span><br><span style="color: hsl(120, 100%, 40%);">+       for (t = tests; t - tests < ARRAY_SIZE(tests); t++) {</span><br><span style="color: hsl(120, 100%, 40%);">+              char buf[100] = "unchanged";</span><br><span style="color: hsl(120, 100%, 40%);">+                int rc = osmo_print_n(buf, t->buf_size, t->src, t->token_len);</span><br><span style="color: hsl(120, 100%, 40%);">+               printf("%s token_len=%zu buf_size=%zu", osmo_quote_str(t->src, -1), t->token_len, t->buf_size);</span><br><span style="color: hsl(120, 100%, 40%);">+            printf(" -> token=%s rc=%d", osmo_quote_str(buf, -1), rc);</span><br><span style="color: hsl(120, 100%, 40%);">+               if (strcmp(buf, t->expect_token))</span><br><span style="color: hsl(120, 100%, 40%);">+                  printf(" ERROR: expected token %s", osmo_quote_str(t->expect_token, -1));</span><br><span style="color: hsl(120, 100%, 40%);">+                if (rc != t->expect_rc)</span><br><span style="color: hsl(120, 100%, 40%);">+                    printf(" ERROR: expected rc %d", t->expect_rc);</span><br><span style="color: hsl(120, 100%, 40%);">+          printf("\n");</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%);">+</span><br><span> int main(int argc, char **argv)</span><br><span> {</span><br><span>       static const struct log_info log_info = {};</span><br><span>@@ -1287,5 +1340,6 @@</span><br><span>  strbuf_test_nolen();</span><br><span>         startswith_test();</span><br><span>   name_c_impl_test();</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_print_n_test();</span><br><span>         return 0;</span><br><span> }</span><br><span>diff --git a/tests/utils/utils_test.ok b/tests/utils/utils_test.ok</span><br><span>index 10436ce..bd43365 100644</span><br><span>--- a/tests/utils/utils_test.ok</span><br><span>+++ b/tests/utils/utils_test.ok</span><br><span>@@ -449,3 +449,29 @@</span><br><span>       OSMO_NAME_C_IMPL(10, NULL) -> NULL  allocated 0</span><br><span>     OSMO_NAME_C_IMPL(0, "ERROR") -> "ERROR"  allocated 1  6 bytes, name 'foo_name_c_zero'</span><br><span>        OSMO_NAME_C_IMPL(0, NULL) -> NULL  allocated 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_print_n_test()</span><br><span style="color: hsl(120, 100%, 40%);">+"foo=bar" token_len=3 buf_size=100 -> token="foo" rc=3</span><br><span style="color: hsl(120, 100%, 40%);">+"foo" token_len=10 buf_size=100 -> token="foo" rc=3</span><br><span style="color: hsl(120, 100%, 40%);">+"foo" token_len=3 buf_size=100 -> token="foo" rc=3</span><br><span style="color: hsl(120, 100%, 40%);">+NULL token_len=10 buf_size=100 -> token="" rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+"" token_len=10 buf_size=100 -> token="" rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+"foo=bar" token_len=0 buf_size=100 -> token="" rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+"foo=bar" token_len=3 buf_size=2 -> token="f" rc=3</span><br><span style="color: hsl(120, 100%, 40%);">+"foo" token_len=10 buf_size=2 -> token="f" rc=3</span><br><span style="color: hsl(120, 100%, 40%);">+"foo" token_len=3 buf_size=2 -> token="f" rc=3</span><br><span style="color: hsl(120, 100%, 40%);">+NULL token_len=10 buf_size=2 -> token="" rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+"" token_len=10 buf_size=2 -> token="" rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+"foo=bar" token_len=0 buf_size=2 -> token="" rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+"foo=bar" token_len=3 buf_size=1 -> token="" rc=3</span><br><span style="color: hsl(120, 100%, 40%);">+"foo" token_len=10 buf_size=1 -> token="" rc=3</span><br><span style="color: hsl(120, 100%, 40%);">+"foo" token_len=3 buf_size=1 -> token="" rc=3</span><br><span style="color: hsl(120, 100%, 40%);">+NULL token_len=10 buf_size=1 -> token="" rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+"" token_len=10 buf_size=1 -> token="" rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+"foo=bar" token_len=0 buf_size=1 -> token="" rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+"foo=bar" token_len=3 buf_size=0 -> token="unchanged" rc=3</span><br><span style="color: hsl(120, 100%, 40%);">+"foo" token_len=10 buf_size=0 -> token="unchanged" rc=3</span><br><span style="color: hsl(120, 100%, 40%);">+"foo" token_len=3 buf_size=0 -> token="unchanged" rc=3</span><br><span style="color: hsl(120, 100%, 40%);">+NULL token_len=10 buf_size=0 -> token="unchanged" rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+"" token_len=10 buf_size=0 -> token="unchanged" rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+"foo=bar" token_len=0 buf_size=0 -> token="unchanged" rc=0</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/16165">change 16165</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/c/libosmocore/+/16165"/><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-Change-Id: Ia716abdc1f58af6065b84f4f567388a32a7b39fc </div>
<div style="display:none"> Gerrit-Change-Number: 16165 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>