summaryrefslogtreecommitdiffstats
path: root/tests/utils
diff options
context:
space:
mode:
authorNeels Hofmeyr <neels@hofmeyr.de>2019-02-11 20:32:06 +0100
committerNeels Hofmeyr <nhofmeyr@sysmocom.de>2019-02-17 20:40:17 +0000
commit2cbe25f4844c82930078bbada753a9b079bf287b (patch)
tree57705cf8e662610843f9540e6909cc143e31f556 /tests/utils
parent8667f7a815bb4d968f23d85d7428495eb0289d61 (diff)
add OSMO_STRBUF_PRINTF()
We are using macros like this or different workarounds in libmsc. In the course of implementing inter-MSC handover, I am encountering yet another such situation of appending multiple strings to a limited char buffer. Standardize. Add a unit test to utils_test.c. Change-Id: I2497514e26c5e7a5d88985fc7e58343be1a027b2
Diffstat (limited to 'tests/utils')
-rw-r--r--tests/utils/utils_test.c86
-rw-r--r--tests/utils/utils_test.ok17
2 files changed, 103 insertions, 0 deletions
diff --git a/tests/utils/utils_test.c b/tests/utils/utils_test.c
index 822861fb..d592fe04 100644
--- a/tests/utils/utils_test.c
+++ b/tests/utils/utils_test.c
@@ -33,6 +33,7 @@
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
+#include <limits.h>
static void hexdump_test(void)
{
@@ -936,6 +937,90 @@ static void osmo_str_tolowupper_test()
OSMO_ASSERT(ok);
}
+/* Copy of the examples from OSMO_STRBUF_APPEND() */
+int print_spaces(char *dst, size_t dst_len, int argument)
+{
+ int i;
+ if (argument < 0)
+ return -EINVAL;
+ for (i = 0; i < argument && i < dst_len; i++)
+ dst[i] = ' ';
+ if (dst_len)
+ dst[OSMO_MIN(dst_len - 1, argument)] = '\0';
+ return argument;
+}
+
+void strbuf_example(char *buf, size_t buflen)
+{
+ struct osmo_strbuf sb = { .buf = buf, .len = buflen };
+
+ OSMO_STRBUF_APPEND(sb, print_spaces, 5);
+ OSMO_STRBUF_APPEND(sb, snprintf, "The answer is %d but what is the question?", 42);
+ OSMO_STRBUF_APPEND(sb, print_spaces, 423423);
+
+ printf("%s\n", buf);
+ printf("would have needed %zu bytes\n", sb.chars_needed);
+}
+
+/* Copy of the examples from OSMO_STRBUF_PRINTF() */
+int strbuf_example2(char *buf, size_t buflen)
+{
+ int i;
+ struct osmo_strbuf sb = { .buf = buf, .len = buflen };
+
+ OSMO_STRBUF_PRINTF(sb, "T minus");
+ for (i = 10; i; i--)
+ OSMO_STRBUF_PRINTF(sb, " %d", i);
+ OSMO_STRBUF_PRINTF(sb, " ... Lift off!");
+
+ return sb.chars_needed;
+}
+
+int strbuf_cascade(char *buf, size_t buflen)
+{
+ struct osmo_strbuf sb = { .buf = buf, .len = buflen };
+
+ OSMO_STRBUF_APPEND(sb, strbuf_example2);
+ OSMO_STRBUF_PRINTF(sb, " -- ");
+ OSMO_STRBUF_APPEND(sb, strbuf_example2);
+ OSMO_STRBUF_PRINTF(sb, " -- ");
+ OSMO_STRBUF_APPEND(sb, strbuf_example2);
+
+ return sb.chars_needed;
+}
+
+void strbuf_test()
+{
+ char buf[256];
+ int rc;
+ printf("\n%s\n", __func__);
+
+ printf("OSMO_STRBUF_APPEND():\n");
+ strbuf_example(buf, 23);
+
+ printf("\nOSMO_STRBUF_PRINTF():\n");
+ rc = strbuf_example2(buf, 23);
+ printf("1: (need %d chars, had size=23) %s\n", rc, buf);
+
+ rc = strbuf_example2(buf, rc);
+ printf("2: (need %d chars, had size=%d) %s\n", rc, rc, buf);
+
+ rc = strbuf_example2(buf, rc + 1);
+ printf("3: (need %d chars, had size=%d+1) %s\n", rc, rc, buf);
+
+ rc = strbuf_example2(buf, 0);
+ snprintf(buf, sizeof(buf), "0x2b 0x2b 0x2b...");
+ printf("4: (need %d chars, had size=0) %s\n", rc, buf);
+
+ rc = strbuf_example2(NULL, 99);
+ printf("5: (need %d chars, had NULL buffer)\n", rc);
+
+ printf("\ncascade:\n");
+ rc = strbuf_cascade(buf, sizeof(buf));
+ printf("(need %d chars)\n%s\n", rc, buf);
+ rc = strbuf_cascade(buf, 63);
+ printf("(need %d chars, had size=63) %s\n", rc, buf);
+}
int main(int argc, char **argv)
{
@@ -954,5 +1039,6 @@ int main(int argc, char **argv)
isqrt_test();
osmo_sockaddr_to_str_and_uint_test();
osmo_str_tolowupper_test();
+ strbuf_test();
return 0;
}
diff --git a/tests/utils/utils_test.ok b/tests/utils/utils_test.ok
index 8d7ced83..1215ddd1 100644
--- a/tests/utils/utils_test.ok
+++ b/tests/utils/utils_test.ok
@@ -325,3 +325,20 @@ osmo_str_toupper_buf(28, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@
= 62, "ABCDEFGHIJKLMNOPQRSTUVWXYZA"
osmo_str_toupper_buf(28, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()", in-place)
= 27, "ABCDEFGHIJKLMNOPQRSTUVWXYZA"
+
+strbuf_test
+OSMO_STRBUF_APPEND():
+ The answer is 42
+would have needed 423470 bytes
+
+OSMO_STRBUF_PRINTF():
+1: (need 42 chars, had size=23) T minus 10 9 8 7 6 5 4
+2: (need 42 chars, had size=42) T minus 10 9 8 7 6 5 4 3 2 1 ... Lift off
+3: (need 42 chars, had size=42+1) T minus 10 9 8 7 6 5 4 3 2 1 ... Lift off!
+4: (need 42 chars, had size=0) 0x2b 0x2b 0x2b...
+5: (need 42 chars, had NULL buffer)
+
+cascade:
+(need 134 chars)
+T minus 10 9 8 7 6 5 4 3 2 1 ... Lift off! -- T minus 10 9 8 7 6 5 4 3 2 1 ... Lift off! -- T minus 10 9 8 7 6 5 4 3 2 1 ... Lift off!
+(need 134 chars, had size=63) T minus 10 9 8 7 6 5 4 3 2 1 ... Lift off! -- T minus 10 9 8 7