]> git.ipfire.org Git - thirdparty/collectd.git/commitdiff
strbuf: Add tests for stack allocation.
authorFlorian Forster <octo@google.com>
Fri, 19 Jun 2020 07:41:19 +0000 (09:41 +0200)
committerFlorian Forster <octo@google.com>
Tue, 14 Jul 2020 17:18:50 +0000 (19:18 +0200)
Add tests for the STRBUF_CREATE[_STATIC] macros. This surfaced a bug with
the STRBUF_DESTROY macro, which was missing `… while (0)` at the end.

src/utils/strbuf/strbuf.h
src/utils/strbuf/strbuf_test.c

index 8fa2a8736e81ab13f54ee9b769cc29267c52da74..758709f081db1f2769c940971c7c21f0584c936f 100644 (file)
@@ -34,17 +34,17 @@ typedef struct {
   _Bool fixed;
 } strbuf_t;
 
-#define STRBUF_NEW                                                             \
+#define STRBUF_CREATE                                                          \
   &(strbuf_t) { .ptr = NULL }
-#define STRBUF_NEW_STATIC(b)                                                   \
+#define STRBUF_CREATE_STATIC(b)                                                \
   &(strbuf_t) { .ptr = b, .size = sizeof(b), .fixed = 1 }
-#define STRBUF_DELETE(buf)                                                     \
+#define STRBUF_DESTROY(buf)                                                    \
   do {                                                                         \
     if (!buf->fixed) {                                                         \
       free(buf->ptr);                                                          \
     }                                                                          \
     *buf = (strbuf_t){.ptr = NULL};                                            \
-  }
+  } while (0)
 
 strbuf_t *strbuf_create(void);
 strbuf_t *strbuf_create_static(void *buffer, size_t buffer_size);
index b35717b335ba5d71e8dba6be1160c37f96757b25..8323da3c8a23e2241af360ca66d4f3bb862a602d 100644 (file)
 #include "utils/strbuf/strbuf.h"
 
 #include <errno.h>
+#include <stdbool.h>
 
-DEF_TEST(dynamic) {
-  strbuf_t *buf;
-  CHECK_NOT_NULL(buf = strbuf_create());
+#define STATIC_BUFFER_SIZE 8
 
+int test_buffer(strbuf_t *buf, bool is_static) {
   CHECK_ZERO(strbuf_print(buf, "foo"));
   EXPECT_EQ_STR("foo", buf->ptr);
 
@@ -40,49 +40,72 @@ DEF_TEST(dynamic) {
   EXPECT_EQ_STR("foobar", buf->ptr);
 
   CHECK_ZERO(strbuf_printf(buf, "%d\n", 9000));
-  EXPECT_EQ_STR("foobar9000\n", buf->ptr);
+  char const *want = is_static ? "foobar9" : "foobar9000\n";
+  EXPECT_EQ_STR(want, buf->ptr);
+
+  if (is_static) {
+    EXPECT_EQ_INT(ENOSPC, strbuf_print(buf, "buffer already filled"));
+    EXPECT_EQ_STR("foobar9", buf->ptr);
+  }
 
   strbuf_reset(buf);
   CHECK_ZERO(strlen(buf->ptr));
 
   CHECK_ZERO(strbuf_print(buf, "new content"));
-  EXPECT_EQ_STR("new content", buf->ptr);
+  want = is_static ? "new con" : "new content";
+  EXPECT_EQ_STR(want, buf->ptr);
 
-  strbuf_destroy(buf);
   return 0;
 }
 
-DEF_TEST(static) {
+DEF_TEST(dynamic_heap) {
+  strbuf_t *buf;
+  CHECK_NOT_NULL(buf = strbuf_create());
+
+  int status = test_buffer(buf, false);
+
+  strbuf_destroy(buf);
+  return status;
+}
+
+DEF_TEST(static_heap) {
   char mem[8];
   strbuf_t *buf;
   CHECK_NOT_NULL(buf = strbuf_create_static(mem, sizeof(mem)));
 
-  CHECK_ZERO(strbuf_print(buf, "foo"));
-  EXPECT_EQ_STR("foo", buf->ptr);
+  int status = test_buffer(buf, true);
 
-  CHECK_ZERO(strbuf_print(buf, "bar"));
-  EXPECT_EQ_STR("foobar", buf->ptr);
+  strbuf_destroy(buf);
+  return status;
+}
 
-  CHECK_ZERO(strbuf_printf(buf, "%d\n", 9000));
-  EXPECT_EQ_STR("foobar9", buf->ptr);
+DEF_TEST(dynamic_stack) {
+  strbuf_t *buf;
+  CHECK_NOT_NULL(buf = STRBUF_CREATE);
 
-  EXPECT_EQ_INT(ENOSPC, strbuf_print(buf, "buffer already filled"));
-  EXPECT_EQ_STR("foobar9", buf->ptr);
+  int status = test_buffer(buf, false);
 
-  strbuf_reset(buf);
-  CHECK_ZERO(strlen(buf->ptr));
+  STRBUF_DESTROY(buf);
+  return status;
+}
 
-  CHECK_ZERO(strbuf_print(buf, "new content"));
-  EXPECT_EQ_STR("new con", buf->ptr);
+DEF_TEST(static_stack) {
+  char mem[8];
+  strbuf_t *buf;
+  CHECK_NOT_NULL(buf = STRBUF_CREATE_STATIC(mem));
 
-  strbuf_destroy(buf);
-  return 0;
+  int status = test_buffer(buf, true);
+
+  STRBUF_DESTROY(buf);
+  return status;
 }
 
 int main(int argc, char **argv) /* {{{ */
 {
-  RUN_TEST(dynamic);
-  RUN_TEST(static);
+  RUN_TEST(dynamic_heap);
+  RUN_TEST(static_heap);
+  RUN_TEST(dynamic_stack);
+  RUN_TEST(static_stack);
 
   END_TEST;
 } /* }}} int main */