Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions include/crm/common/output_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -997,6 +997,9 @@ pcmk__output_select_rc(int old_rc, int new_rc)
* inspect the internal formatters hash table.
*/
GHashTable *pcmk__output_formatters(void);

// Add this one so that we can restore a saved table
void pcmk__set_output_formatters(GHashTable *value);
#endif

#define PCMK__OUTPUT_SPACER_IF(out_obj, cond) \
Expand Down
15 changes: 14 additions & 1 deletion include/crm/common/unittest_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

#include <cmocka.h>

#include <crm/common/xml.h>
#include <crm/common/internal.h> // pcmk__output_t

#ifdef __cplusplus
extern "C" {
Expand Down Expand Up @@ -138,6 +138,19 @@ void pcmk__cib_test_cleanup(char *out_path);

void pcmk__test_init_logging(const char *name, const char *filename);

pcmk__output_t *pcmk__mk_fake_text_output(char **argv);
int pcmk__output_test_setup_group(void **state);
int pcmk__output_test_teardown_group(void **state);
void pcmk__set_fake_text_init_succeeds(bool value);
void pcmk__set_testing_output_free(bool value);
void pcmk__set_testing_output_and_clear_error(bool value);
void pcmk__expect_fake_text_free_priv(void);
void pcmk__expect_fake_text_err(void);
pcmk__output_t *pcmk__output_null_create1(char **argv);
pcmk__output_t *pcmk__output_null_create2(char **argv);
int pcmk__output_message_dummy1(pcmk__output_t *out, va_list args);
int pcmk__output_message_dummy2(pcmk__output_t *out, va_list args);

/*!
* \internal
* \brief Assert that a statement aborts through pcmk__assert().
Expand Down
6 changes: 6 additions & 0 deletions lib/common/output.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,12 @@ GHashTable *
pcmk__output_formatters(void) {
return formatters;
}

void
pcmk__set_output_formatters(GHashTable *value)
{
formatters = value;
}
// LCOV_EXCL_STOP
#endif

Expand Down
74 changes: 21 additions & 53 deletions lib/common/tests/output/pcmk__call_message_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,71 +14,36 @@
#include <crm/common/unittest_internal.h>

static int
default_message_fn(pcmk__output_t *out, va_list args) {
default_message_fn(pcmk__output_t *out, va_list args)
{
function_called();
return pcmk_rc_ok;
}

static int
failed_message_fn(pcmk__output_t *out, va_list args) {
failed_message_fn(pcmk__output_t *out, va_list args)
{
function_called();
return pcmk_rc_no_output;
}

static int
message_fn_1(pcmk__output_t *out, va_list args) {
message_fn_1(pcmk__output_t *out, va_list args)
{
function_called();
return pcmk_rc_ok;
}

static int
message_fn_2(pcmk__output_t *out, va_list args) {
message_fn_2(pcmk__output_t *out, va_list args)
{
function_called();
return pcmk_rc_ok;
}

static bool
fake_text_init(pcmk__output_t *out) {
return true;
}

static void
fake_text_free_priv(pcmk__output_t *out) {
/* This function intentionally left blank */
}

static pcmk__output_t *
mk_fake_text_output(char **argv) {
pcmk__output_t *retval = calloc(1, sizeof(pcmk__output_t));

if (retval == NULL) {
return NULL;
}

retval->fmt_name = "text";
retval->init = fake_text_init;
retval->free_priv = fake_text_free_priv;

retval->register_message = pcmk__register_message;
retval->message = pcmk__call_message;

return retval;
}

static int
setup(void **state) {
pcmk__register_format(NULL, "text", mk_fake_text_output, NULL);
return 0;
}

static int
teardown(void **state) {
pcmk__unregister_formats();
return 0;
}

static void
no_such_message(void **state) {
no_such_message(void **state)
{
pcmk__output_t *out = NULL;

pcmk__output_new(&out, "text", NULL, NULL);
Expand All @@ -91,7 +56,8 @@ no_such_message(void **state) {
}

static void
message_return_value(void **state) {
message_return_value(void **state)
{
pcmk__output_t *out = NULL;

pcmk__message_entry_t entries[] = {
Expand All @@ -115,7 +81,8 @@ message_return_value(void **state) {
}

static void
wrong_format(void **state) {
wrong_format(void **state)
{
pcmk__output_t *out = NULL;

pcmk__message_entry_t entries[] = {
Expand All @@ -132,7 +99,8 @@ wrong_format(void **state) {
}

static void
default_called(void **state) {
default_called(void **state)
{
pcmk__output_t *out = NULL;

pcmk__message_entry_t entries[] = {
Expand All @@ -150,8 +118,8 @@ default_called(void **state) {
pcmk__output_free(out);
}

PCMK__UNIT_TEST(NULL, NULL,
cmocka_unit_test_setup_teardown(no_such_message, setup, teardown),
cmocka_unit_test_setup_teardown(message_return_value, setup, teardown),
cmocka_unit_test_setup_teardown(wrong_format, setup, teardown),
cmocka_unit_test_setup_teardown(default_called, setup, teardown))
PCMK__UNIT_TEST(pcmk__output_test_setup_group, pcmk__output_test_teardown_group,
cmocka_unit_test(no_such_message),
cmocka_unit_test(message_return_value),
cmocka_unit_test(wrong_format),
cmocka_unit_test(default_called))
57 changes: 13 additions & 44 deletions lib/common/tests/output/pcmk__output_and_clear_error_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,69 +15,38 @@

#include <glib.h>

static bool
fake_text_init(pcmk__output_t *out) {
return true;
}

static void
fake_text_free_priv(pcmk__output_t *out) {
/* This function intentionally left blank */
}

G_GNUC_PRINTF(2, 3)
static void
fake_text_err(pcmk__output_t *out, const char *format, ...) {
function_called();
}

static pcmk__output_t *
mk_fake_text_output(char **argv) {
pcmk__output_t *retval = calloc(1, sizeof(pcmk__output_t));

if (retval == NULL) {
return NULL;
}

retval->fmt_name = "text";
retval->init = fake_text_init;
retval->free_priv = fake_text_free_priv;

retval->register_message = pcmk__register_message;
retval->message = pcmk__call_message;

retval->err = fake_text_err;

return retval;
}

static int
setup(void **state) {
pcmk__register_format(NULL, "text", mk_fake_text_output, NULL);
setup(void **state)
{
pcmk__set_testing_output_and_clear_error(true);
pcmk__output_test_setup_group(state);
return 0;
}

static int
teardown(void **state) {
pcmk__unregister_formats();
teardown(void **state)
{
pcmk__output_test_teardown_group(state);
pcmk__set_testing_output_and_clear_error(false);
return 0;
}

static void
standard_usage(void **state) {
standard_usage(void **state)
{
GError *error = NULL;
pcmk__output_t *out = NULL;

pcmk__output_new(&out, "text", NULL, NULL);
g_set_error(&error, PCMK__RC_ERROR, pcmk_rc_bad_nvpair,
"some error message");

expect_function_call(fake_text_err);
pcmk__expect_fake_text_err();
pcmk__output_and_clear_error(&error, out);

pcmk__output_free(out);
assert_null(error);
}

PCMK__UNIT_TEST(NULL, NULL,
cmocka_unit_test_setup_teardown(standard_usage, setup, teardown))
PCMK__UNIT_TEST(setup, teardown,
cmocka_unit_test(standard_usage))
64 changes: 18 additions & 46 deletions lib/common/tests/output/pcmk__output_free_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,72 +14,44 @@
#include <crm/common/unittest_internal.h>

static int
null_message_fn(pcmk__output_t *out, va_list args) {
return pcmk_rc_ok;
}

static bool
fake_text_init(pcmk__output_t *out) {
return true;
}

static void
fake_text_free_priv(pcmk__output_t *out) {
function_called();
/* This function intentionally left blank */
}

static pcmk__output_t *
mk_fake_text_output(char **argv) {
pcmk__output_t *retval = calloc(1, sizeof(pcmk__output_t));

if (retval == NULL) {
return NULL;
}

retval->fmt_name = "text";
retval->init = fake_text_init;
retval->free_priv = fake_text_free_priv;

retval->register_message = pcmk__register_message;
retval->message = pcmk__call_message;

return retval;
}

static int
setup(void **state) {
pcmk__register_format(NULL, "text", mk_fake_text_output, NULL);
setup(void **state)
{
pcmk__set_testing_output_free(true);
pcmk__output_test_setup_group(state);
return 0;
}

static int
teardown(void **state) {
pcmk__unregister_formats();
teardown(void **state)
{
pcmk__output_test_teardown_group(state);
pcmk__set_testing_output_free(false);
return 0;
}

static void
no_messages(void **state) {
no_messages(void **state)
{
pcmk__output_t *out = NULL;

pcmk__output_new(&out, "text", NULL, NULL);

expect_function_call(fake_text_free_priv);
pcmk__expect_fake_text_free_priv();
pcmk__output_free(out);
}

static void
messages(void **state) {
messages(void **state)
{
pcmk__output_t *out = NULL;

pcmk__output_new(&out, "text", NULL, NULL);
pcmk__register_message(out, "fake", null_message_fn);
pcmk__register_message(out, "fake", pcmk__output_message_dummy1);

expect_function_call(fake_text_free_priv);
pcmk__expect_fake_text_free_priv();
pcmk__output_free(out);
}

PCMK__UNIT_TEST(NULL, NULL,
cmocka_unit_test_setup_teardown(no_messages, setup, teardown),
cmocka_unit_test_setup_teardown(messages, setup, teardown))
PCMK__UNIT_TEST(setup, teardown,
cmocka_unit_test(no_messages),
cmocka_unit_test(messages))
Loading