#include "memory.h"
#include "plist.h"
+#include "printfrr.h"
#include "bgpd/bgpd.h"
#include "bgpd/bgp_attr.h"
#include "bgpd/bgp_regex.h"
if ((T)->state != TEST_SUCCESS || (C)) \
break; \
(T)->state = TEST_ASSERT_ERROR; \
- (T)->error = str_printf("assertion failed: %s (%s:%d)", (#C), \
- __FILE__, __LINE__); \
+ (T)->error = \
+ asprintfrr(MTYPE_TMP, "assertion failed: %s (%s:%d)", \
+ (#C), __FILE__, __LINE__); \
} while (0)
#define TEST_ASSERT_EQ(T, A, B) \
if ((T)->state != TEST_SUCCESS || ((A) == (B))) \
break; \
(T)->state = TEST_ASSERT_ERROR; \
- (T)->error = str_printf( \
- "assertion failed: %s[%d] == [%d]%s (%s:%d)", (#A), \
- (A), (B), (#B), __FILE__, __LINE__); \
+ (T)->error = asprintfrr( \
+ MTYPE_TMP, \
+ "assertion failed: %s[%lld] == [%lld]%s (%s:%d)", \
+ (#A), (long long)(A), (long long)(B), (#B), __FILE__, \
+ __LINE__); \
} while (0)
#define TEST_HANDLER_MAX 5
{.afi = AFI_IP6, .safi = SAFI_MULTICAST},
};
-static char *str_vprintf(const char *fmt, va_list ap)
-{
- int ret;
- int buf_size = 0;
- char *buf = NULL;
- va_list apc;
-
- while (1) {
- va_copy(apc, ap);
- ret = vsnprintf(buf, buf_size, fmt, apc);
- va_end(apc);
-
- if (ret >= 0 && ret < buf_size)
- break;
-
- if (ret >= 0)
- buf_size = ret + 1;
- else
- buf_size *= 2;
-
- buf = XREALLOC(MTYPE_TMP, buf, buf_size);
- }
-
- return buf;
-}
-
-static char *str_printf(const char *fmt, ...)
-{
- char *buf;
- va_list ap;
-
- va_start(ap, fmt);
- buf = str_vprintf(fmt, ap);
- va_end(ap);
-
- return buf;
-}
-
TEST_ATTR_HANDLER_DECL(advertisement_interval, v_routeadv, 10, 20);
TEST_STR_ATTR_HANDLER_DECL(password, password, "FRR-Peer", "FRR-Group");
TEST_ATTR_HANDLER_DECL(local_as, change_local_as, 1, 2);
return at == PEER_AT_GLOBAL_FLAG || at == PEER_AT_GLOBAL_CUSTOM;
}
+PRINTFRR(2, 3)
static void test_log(struct test *test, const char *fmt, ...)
{
va_list ap;
/* Store formatted log message. */
va_start(ap, fmt);
- listnode_add(test->log, str_vprintf(fmt, ap));
+ listnode_add(test->log, vasprintfrr(MTYPE_TMP, fmt, ap));
va_end(ap);
}
+PRINTFRR(2, 3)
static void test_execute(struct test *test, const char *fmt, ...)
{
int ret;
/* Format command string with variadic arguments. */
va_start(ap, fmt);
- cmd = str_vprintf(fmt, ap);
+ cmd = vasprintfrr(MTYPE_TMP, fmt, ap);
va_end(ap);
if (!cmd) {
test->state = TEST_INTERNAL_ERROR;
- test->error =
- str_printf("could not format command string [%s]", fmt);
+ test->error = asprintfrr(
+ MTYPE_TMP, "could not format command string [%s]", fmt);
return;
}
vline = cmd_make_strvec(cmd);
if (vline == NULL) {
test->state = TEST_INTERNAL_ERROR;
- test->error = str_printf(
+ test->error = asprintfrr(
+ MTYPE_TMP,
"tokenizing command string [%s] returned empty result",
cmd);
XFREE(MTYPE_TMP, cmd);
ret = cmd_execute_command(vline, test->vty, NULL, 0);
if (ret != CMD_SUCCESS) {
test->state = TEST_COMMAND_ERROR;
- test->error = str_printf(
+ test->error = asprintfrr(
+ MTYPE_TMP,
"execution of command [%s] has failed with code [%d]",
cmd, ret);
}
XFREE(MTYPE_TMP, cmd);
}
+PRINTFRR(2, 0)
static void test_config(struct test *test, const char *fmt, bool invert,
va_list ap)
{
/* Format matcher string with variadic arguments. */
va_copy(apc, ap);
- matcher = str_vprintf(fmt, apc);
+ matcher = vasprintfrr(MTYPE_TMP, fmt, apc);
va_end(apc);
if (!matcher) {
test->state = TEST_INTERNAL_ERROR;
- test->error =
- str_printf("could not format matcher string [%s]", fmt);
+ test->error = asprintfrr(
+ MTYPE_TMP, "could not format matcher string [%s]", fmt);
return;
}
matched = !!strstr(config, matcher);
if (!matched && !invert) {
test->state = TEST_CONFIG_ERROR;
- test->error = str_printf("expected config [%s] to be present",
+ test->error = asprintfrr(MTYPE_TMP,
+ "expected config [%s] to be present",
matcher);
} else if (matched && invert) {
test->state = TEST_CONFIG_ERROR;
- test->error = str_printf("expected config [%s] to be absent",
+ test->error = asprintfrr(MTYPE_TMP,
+ "expected config [%s] to be absent",
matcher);
}
XFREE(MTYPE_TMP, config);
}
+PRINTFRR(2, 3)
static void test_config_present(struct test *test, const char *fmt, ...)
{
va_list ap;
va_end(ap);
}
+PRINTFRR(2, 3)
static void test_config_absent(struct test *test, const char *fmt, ...)
{
va_list ap;
test->bgp = bgp_get_default();
if (!test->bgp) {
test->state = TEST_INTERNAL_ERROR;
- test->error =
- str_printf("could not retrieve default bgp instance");
+ test->error = asprintfrr(
+ MTYPE_TMP, "could not retrieve default bgp instance");
return;
}
}
if (!test->peer) {
test->state = TEST_INTERNAL_ERROR;
- test->error = str_printf(
+ test->error = asprintfrr(
+ MTYPE_TMP,
"could not retrieve instance of bgp peer [%s]",
cfg.peer_address);
return;
test->group = peer_group_lookup(test->bgp, cfg.peer_group);
if (!test->group) {
test->state = TEST_INTERNAL_ERROR;
- test->error = str_printf(
+ test->error = asprintfrr(
+ MTYPE_TMP,
"could not retrieve instance of bgp peer-group [%s]",
cfg.peer_group);
return;
if (test->state != TEST_SUCCESS) {
test->state = TEST_CUSTOM_ERROR;
handler_error = test->error;
- test->error = str_printf("custom handler failed: %s",
+ test->error = asprintfrr(MTYPE_TMP,
+ "custom handler failed: %s",
handler_error);
XFREE(MTYPE_TMP, handler_error);
}
default:
test->state = TEST_INTERNAL_ERROR;
- test->error =
- str_printf("invalid attribute type: %d", pa->type);
+ test->error = asprintfrr(
+ MTYPE_TMP, "invalid attribute type: %d", pa->type);
break;
}
type = str_from_attr_type(pa->type);
if (!type) {
test->state = TEST_INTERNAL_ERROR;
- test->error =
- str_printf("invalid attribute type: %d", pa->type);
+ test->error = asprintfrr(
+ MTYPE_TMP, "invalid attribute type: %d", pa->type);
return;
}
/* Build test description string. */
if (pa->afi && pa->safi)
- desc = str_printf("peer\\%s-%s\\%s",
+ desc = asprintfrr(MTYPE_TMP, "peer\\%s-%s\\%s",
str_from_afi(pa->afi),
str_from_safi(pa->safi), pa->cmd);
else
- desc = str_printf("peer\\%s", pa->cmd);
+ desc = asprintfrr(MTYPE_TMP, "peer\\%s", pa->cmd);
/* Initialize new test instance. */
test = test_new(desc, pa->o.use_ibgp, pa->o.use_iface_peer);