mirror of https://gerrit.osmocom.org/libosmocore
utils_test: add osmo_print_n_test()
A couple of times recently I've needed to copy out a substring to a buffer with limited size. Use of strncpy() or osmo_strlcpy() are nontrivial here. I wanted to have a dedicated function. After I wrote that function with a test, I noticed that I had already implemented the same thing a while ago, as osmo_print_n() :P So here is just the test. Change-Id: Ia716abdc1f58af6065b84f4f567388a32a7b39fc
This commit is contained in:
parent
63cb949ebc
commit
ff65d24ec4
|
@ -509,6 +509,8 @@ uint8_t *osmo_encode_big_endian(uint64_t value, size_t data_len)
|
|||
* Copy at most \a siz bytes from \a src to \a dst, ensuring that the result is
|
||||
* NUL terminated. The NUL character is included in \a siz, i.e. passing the
|
||||
* actual sizeof(*dst) is correct.
|
||||
*
|
||||
* Note, a similar function that also limits the input buffer size is osmo_print_n().
|
||||
*/
|
||||
size_t osmo_strlcpy(char *dst, const char *src, size_t siz)
|
||||
{
|
||||
|
|
|
@ -1138,6 +1138,59 @@ static void name_c_impl_test()
|
|||
talloc_free(ctx);
|
||||
}
|
||||
|
||||
static void osmo_print_n_test(void)
|
||||
{
|
||||
struct token_test {
|
||||
const char *src;
|
||||
size_t token_len;
|
||||
size_t buf_size;
|
||||
const char *expect_token;
|
||||
int expect_rc;
|
||||
};
|
||||
struct token_test tests[] = {
|
||||
{ "foo=bar", 3, 100, "foo", 3 },
|
||||
{ "foo", 10, 100, "foo", 3 },
|
||||
{ "foo", 3, 100, "foo", 3 },
|
||||
{ NULL, 10, 100, "", 0 },
|
||||
{ "", 10, 100, "", 0 },
|
||||
{ "foo=bar", 0, 100, "", 0 },
|
||||
|
||||
{ "foo=bar", 3, 2, "f", 3 },
|
||||
{ "foo", 10, 2, "f", 3 },
|
||||
{ "foo", 3, 2, "f", 3 },
|
||||
{ NULL, 10, 2, "", 0 },
|
||||
{ "", 10, 2, "", 0 },
|
||||
{ "foo=bar", 0, 2, "", 0 },
|
||||
|
||||
{ "foo=bar", 3, 1, "", 3 },
|
||||
{ "foo", 10, 1, "", 3 },
|
||||
{ "foo", 3, 1, "", 3 },
|
||||
{ NULL, 10, 1, "", 0 },
|
||||
{ "", 10, 1, "", 0 },
|
||||
{ "foo=bar", 0, 1, "", 0 },
|
||||
|
||||
{ "foo=bar", 3, 0, "unchanged", 3 },
|
||||
{ "foo", 10, 0, "unchanged", 3 },
|
||||
{ "foo", 3, 0, "unchanged", 3 },
|
||||
{ NULL, 10, 0, "unchanged", 0 },
|
||||
{ "", 10, 0, "unchanged", 0 },
|
||||
{ "foo=bar", 0, 0, "unchanged", 0 },
|
||||
};
|
||||
struct token_test *t;
|
||||
printf("\n%s()\n", __func__);
|
||||
for (t = tests; t - tests < ARRAY_SIZE(tests); t++) {
|
||||
char buf[100] = "unchanged";
|
||||
int rc = osmo_print_n(buf, t->buf_size, t->src, t->token_len);
|
||||
printf("%s token_len=%zu buf_size=%zu", osmo_quote_str(t->src, -1), t->token_len, t->buf_size);
|
||||
printf(" -> token=%s rc=%d", osmo_quote_str(buf, -1), rc);
|
||||
if (strcmp(buf, t->expect_token))
|
||||
printf(" ERROR: expected token %s", osmo_quote_str(t->expect_token, -1));
|
||||
if (rc != t->expect_rc)
|
||||
printf(" ERROR: expected rc %d", t->expect_rc);
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
static const struct log_info log_info = {};
|
||||
|
@ -1159,5 +1212,6 @@ int main(int argc, char **argv)
|
|||
strbuf_test_nolen();
|
||||
startswith_test();
|
||||
name_c_impl_test();
|
||||
osmo_print_n_test();
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -377,3 +377,29 @@ name_c_impl_test
|
|||
OSMO_NAME_C_IMPL(10, NULL) -> NULL allocated 0
|
||||
OSMO_NAME_C_IMPL(0, "ERROR") -> "ERROR" allocated 1 6 bytes, name 'foo_name_c_zero'
|
||||
OSMO_NAME_C_IMPL(0, NULL) -> NULL allocated 0
|
||||
|
||||
osmo_print_n_test()
|
||||
"foo=bar" token_len=3 buf_size=100 -> token="foo" rc=3
|
||||
"foo" token_len=10 buf_size=100 -> token="foo" rc=3
|
||||
"foo" token_len=3 buf_size=100 -> token="foo" rc=3
|
||||
NULL token_len=10 buf_size=100 -> token="" rc=0
|
||||
"" token_len=10 buf_size=100 -> token="" rc=0
|
||||
"foo=bar" token_len=0 buf_size=100 -> token="" rc=0
|
||||
"foo=bar" token_len=3 buf_size=2 -> token="f" rc=3
|
||||
"foo" token_len=10 buf_size=2 -> token="f" rc=3
|
||||
"foo" token_len=3 buf_size=2 -> token="f" rc=3
|
||||
NULL token_len=10 buf_size=2 -> token="" rc=0
|
||||
"" token_len=10 buf_size=2 -> token="" rc=0
|
||||
"foo=bar" token_len=0 buf_size=2 -> token="" rc=0
|
||||
"foo=bar" token_len=3 buf_size=1 -> token="" rc=3
|
||||
"foo" token_len=10 buf_size=1 -> token="" rc=3
|
||||
"foo" token_len=3 buf_size=1 -> token="" rc=3
|
||||
NULL token_len=10 buf_size=1 -> token="" rc=0
|
||||
"" token_len=10 buf_size=1 -> token="" rc=0
|
||||
"foo=bar" token_len=0 buf_size=1 -> token="" rc=0
|
||||
"foo=bar" token_len=3 buf_size=0 -> token="unchanged" rc=3
|
||||
"foo" token_len=10 buf_size=0 -> token="unchanged" rc=3
|
||||
"foo" token_len=3 buf_size=0 -> token="unchanged" rc=3
|
||||
NULL token_len=10 buf_size=0 -> token="unchanged" rc=0
|
||||
"" token_len=10 buf_size=0 -> token="unchanged" rc=0
|
||||
"foo=bar" token_len=0 buf_size=0 -> token="unchanged" rc=0
|
||||
|
|
Loading…
Reference in New Issue