aboutsummaryrefslogtreecommitdiff
path: root/lib/cpluff/test/loggers.c
diff options
context:
space:
mode:
authoralcoheca <alcoheca@svn>2010-03-26 13:35:35 +0000
committeralcoheca <alcoheca@svn>2010-03-26 13:35:35 +0000
commitb632a42d5cacdda7bb07a3fee995a4f0de1deba9 (patch)
treeb174ecd7ce4830785293fa6d18ab65d30c0cc375 /lib/cpluff/test/loggers.c
parent5ccef76d00e1dc22d6ae5d1c08172630f5972e58 (diff)
copied cpluff-0.1.3 from vendor branch
git-svn-id: https://xbmc.svn.sourceforge.net/svnroot/xbmc/trunk@28834 568bbfeb-2a22-0410-94d2-cc84cf5bfa90
Diffstat (limited to 'lib/cpluff/test/loggers.c')
-rw-r--r--lib/cpluff/test/loggers.c247
1 files changed, 247 insertions, 0 deletions
diff --git a/lib/cpluff/test/loggers.c b/lib/cpluff/test/loggers.c
new file mode 100644
index 0000000000..36f83e353f
--- /dev/null
+++ b/lib/cpluff/test/loggers.c
@@ -0,0 +1,247 @@
+/*-------------------------------------------------------------------------
+ * C-Pluff, a plug-in framework for C
+ * Copyright 2007 Johannes Lehtinen
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *-----------------------------------------------------------------------*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "test.h"
+
+void errorlogger(void) {
+ cp_context_t *ctx;
+ cp_status_t status;
+ int errors;
+
+ ctx = init_context(CP_LOG_ERROR + 1, &errors);
+ check(cp_load_plugin_descriptor(ctx, "nonexisting", &status) == NULL && status != CP_OK);
+ cp_destroy();
+ check(errors > 0);
+}
+
+struct log_count_t {
+ cp_log_severity_t max_severity;
+ int count_max;
+ int count_above_max;
+};
+
+static void counting_logger(cp_log_severity_t severity, const char *msg, const char *apid, void *user_data) {
+ struct log_count_t *lc = user_data;
+
+ if (severity <= lc->max_severity) {
+ lc->count_max++;
+ } else {
+ lc->count_above_max++;
+ }
+}
+
+void warninglogger(void) {
+ cp_context_t *ctx;
+ struct log_count_t lc = { CP_LOG_WARNING, 0, 0 };
+
+ ctx = init_context(CP_LOG_ERROR, NULL);
+ check(cp_register_logger(ctx, counting_logger, &lc, CP_LOG_WARNING) == CP_OK);
+ check(cp_start_plugin(ctx, "nonexisting") == CP_ERR_UNKNOWN);
+ cp_destroy();
+ check(lc.count_max > 0 && lc.count_above_max == 0);
+}
+
+void infologger(void) {
+ cp_context_t *ctx;
+ cp_plugin_info_t *plugin;
+ cp_status_t status;
+ struct log_count_t lc = { CP_LOG_INFO, 0, 0 };
+
+ ctx = init_context(CP_LOG_WARNING, NULL);
+ check(cp_register_logger(ctx, counting_logger, &lc, CP_LOG_INFO) == CP_OK);
+ check((plugin = cp_load_plugin_descriptor(ctx, plugindir("minimal"), &status)) != NULL && status == CP_OK);
+ check(cp_install_plugin(ctx, plugin) == CP_OK);
+ cp_release_info(ctx, plugin);
+ cp_destroy();
+ check(lc.count_max > 0 && lc.count_above_max == 0);
+}
+
+void debuglogger(void) {
+ cp_context_t *ctx;
+ struct log_count_t lc = { CP_LOG_DEBUG, 0, 0 };
+
+ ctx = init_context(CP_LOG_INFO, NULL);
+ check(cp_register_logger(ctx, counting_logger, &lc, CP_LOG_DEBUG) == CP_OK);
+ cp_destroy();
+ check(lc.count_max > 0 && lc.count_above_max == 0);
+}
+
+static void increment_logger(cp_log_severity_t severity, const char *msg, const char *apid, void *user_data) {
+ (*((int *) user_data))++;
+}
+
+void twologgers(void) {
+ cp_context_t *ctx;
+ cp_plugin_info_t *plugin;
+ cp_status_t status;
+ struct log_count_t lc = { CP_LOG_DEBUG, 0, 0 };
+ int count = 0;
+ int errors;
+
+ ctx = init_context(CP_LOG_ERROR, &errors);
+ check(cp_register_logger(ctx, counting_logger, &lc, CP_LOG_DEBUG) == CP_OK);
+ check(count == 0 && lc.count_max > 0 && lc.count_above_max == 0);
+ check(cp_register_logger(ctx, increment_logger, &count, CP_LOG_INFO) == CP_OK);
+ check(count == 0 && lc.count_max > 0 && lc.count_above_max == 0);
+ check((plugin = cp_load_plugin_descriptor(ctx, plugindir("minimal"), &status)) != NULL && status == CP_OK);
+ check(cp_install_plugin(ctx, plugin) == CP_OK);
+ cp_release_info(ctx, plugin);
+ check(count > 0 && lc.count_max > 0 && lc.count_above_max > 0);
+ cp_destroy();
+ check(errors == 0);
+}
+
+void unreglogger(void) {
+ cp_context_t *ctx;
+ cp_plugin_info_t *plugin;
+ cp_status_t status;
+ struct log_count_t lc = { CP_LOG_DEBUG, 0, 0 };
+ int count = 0;
+ int errors;
+
+ ctx = init_context(CP_LOG_ERROR, &errors);
+ check(cp_register_logger(ctx, counting_logger, &lc, CP_LOG_DEBUG) == CP_OK);
+ check(count == 0 && lc.count_max > 0 && lc.count_above_max == 0);
+ check(cp_register_logger(ctx, increment_logger, &count, CP_LOG_INFO) == CP_OK);
+ check(count == 0 && lc.count_max > 0 && lc.count_above_max == 0);
+ cp_unregister_logger(ctx, counting_logger);
+ check((plugin = cp_load_plugin_descriptor(ctx, plugindir("minimal"), &status)) != NULL && status == CP_OK);
+ check(cp_install_plugin(ctx, plugin) == CP_OK);
+ cp_release_info(ctx, plugin);
+ check(count > 0 && lc.count_max > 0 && lc.count_above_max == 0);
+ cp_destroy();
+ check(errors == 0);
+}
+
+void updatelogger(void) {
+ cp_context_t *ctx;
+ cp_plugin_info_t *plugin;
+ cp_status_t status;
+ struct log_count_t lc = { CP_LOG_DEBUG, 0, 0 };
+ struct log_count_t lc2 = { CP_LOG_INFO, 0, 0 };
+ int count = 0;
+ int errors;
+
+ ctx = init_context(CP_LOG_ERROR, &errors);
+ check(cp_register_logger(ctx, counting_logger, &lc, CP_LOG_DEBUG) == CP_OK);
+ check(count == 0 && lc.count_max > 0 && lc.count_above_max == 0);
+ check(cp_register_logger(ctx, increment_logger, &count, CP_LOG_INFO) == CP_OK);
+ check(count == 0 && lc.count_max > 0 && lc.count_above_max == 0);
+ check(cp_register_logger(ctx, counting_logger, &lc2, CP_LOG_DEBUG) == CP_OK);
+ check((plugin = cp_load_plugin_descriptor(ctx, plugindir("minimal"), &status)) != NULL && status == CP_OK);
+ check(cp_install_plugin(ctx, plugin) == CP_OK);
+ cp_release_info(ctx, plugin);
+ check(count > 0 && lc.count_max > 0 && lc.count_above_max == 0);
+ cp_destroy();
+ check(errors == 0);
+}
+
+struct log_info_t {
+ cp_log_severity_t severity;
+ char *msg;
+ char *apid;
+};
+
+static void store_logger(cp_log_severity_t severity, const char *msg, const char *apid, void *user_data) {
+ struct log_info_t *li = user_data;
+
+ // Free previous data
+ if (li->msg != NULL) {
+ free(li->msg);
+ li->msg = NULL;
+ }
+ if (li->apid != NULL) {
+ free(li->apid);
+ li->apid = NULL;
+ }
+
+ // Copy information
+ li->severity = severity;
+ if (msg != NULL) {
+ check((li->msg = strdup(msg)) != NULL);
+ }
+ if (apid != NULL) {
+ check((li->apid = strdup(apid)) != NULL);
+ }
+}
+
+static void logmsg_sev(cp_context_t *ctx, cp_log_severity_t severity, const char *msg) {
+ struct log_info_t li = { -1, NULL, NULL };
+
+ check(cp_register_logger(ctx, store_logger, &li, CP_LOG_DEBUG) == CP_OK);
+ cp_log(ctx, severity, msg);
+ check(li.severity == severity);
+ check(li.msg != NULL && !strcmp(li.msg, msg));
+ check(li.apid == NULL);
+ free(li.msg);
+ li.msg = NULL;
+ cp_unregister_logger(ctx, store_logger);
+}
+
+void logmsg(void) {
+ cp_context_t *ctx;
+
+ ctx = init_context(CP_LOG_ERROR + 1, NULL);
+ logmsg_sev(ctx, CP_LOG_DEBUG, "debug");
+ logmsg_sev(ctx, CP_LOG_INFO, "info");
+ logmsg_sev(ctx, CP_LOG_WARNING, "warning");
+ logmsg_sev(ctx, CP_LOG_ERROR, "error");
+ cp_destroy();
+}
+
+static void islogged_sev(cp_context_t *ctx, cp_log_severity_t severity) {
+ int count = 0;
+
+ check(!cp_is_logged(ctx, severity));
+ check(cp_register_logger(ctx, increment_logger, &count, severity) == CP_OK);
+ check(cp_is_logged(ctx, CP_LOG_ERROR));
+ check(cp_is_logged(ctx, severity));
+ switch (severity) {
+ case CP_LOG_DEBUG:
+ break;
+ case CP_LOG_INFO:
+ check(!cp_is_logged(ctx, CP_LOG_DEBUG));
+ break;
+ case CP_LOG_WARNING:
+ check(!cp_is_logged(ctx, CP_LOG_INFO));
+ break;
+ case CP_LOG_ERROR:
+ check(!cp_is_logged(ctx, CP_LOG_WARNING));
+ break;
+ }
+ cp_unregister_logger(ctx, increment_logger);
+}
+
+void islogged(void) {
+ cp_context_t *ctx;
+
+ ctx = init_context(CP_LOG_ERROR + 1, NULL);
+ islogged_sev(ctx, CP_LOG_DEBUG);
+ islogged_sev(ctx, CP_LOG_INFO);
+ islogged_sev(ctx, CP_LOG_WARNING);
+ islogged_sev(ctx, CP_LOG_ERROR);
+ cp_destroy();
+}