[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [PATCH 12/12] Add a test for the new error reporting mechanism.



Signed-off-by: Miloslav Trmač <mitr redhat com>
---
 src/libvirt_private.syms |   4 +
 tests/Makefile.am        |   6 +-
 tests/errorjsontest.c    | 211 +++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 220 insertions(+), 1 deletion(-)
 create mode 100644 tests/errorjsontest.c

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 0b6068d..1f24de2 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -704,6 +704,10 @@ iptablesRemoveUdpInput;
 
 
 # json.h
+virJSONStringGeneratorAddProperties;
+virJSONStringGeneratorFinishObject;
+virJSONStringGeneratorFree;
+virJSONStringGeneratorInitObject;
 virJSONValueArrayAppend;
 virJSONValueArrayGet;
 virJSONValueArraySize;
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 8dbad97..a46502b 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -138,7 +138,7 @@ test_programs += object-locking
 endif
 
 if HAVE_YAJL
-test_programs += jsontest
+test_programs += jsontest errorjsontest
 endif
 
 test_programs += networkxml2xmltest
@@ -598,6 +598,10 @@ jsontest_SOURCES = \
 	jsontest.c testutils.h testutils.c
 jsontest_LDADD = $(LDADDS)
 
+errorjsontest_SOURCES = \
+	errorjsontest.c testutils.h testutils.c
+errorjsontest_LDADD = $(LDADDS)
+
 utiltest_SOURCES = \
 	utiltest.c testutils.h testutils.c
 utiltest_LDADD = $(LDADDS)
diff --git a/tests/errorjsontest.c b/tests/errorjsontest.c
new file mode 100644
index 0000000..491306b
--- /dev/null
+++ b/tests/errorjsontest.c
@@ -0,0 +1,211 @@
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "internal.h"
+#include "json.h"
+#include "logging.h"
+#include "testutils.h"
+#include "virterror_internal.h"
+
+#define VIR_FROM_THIS VIR_FROM_NONE
+
+/* Ideally we should test the syslog/json output, this tests only the inputs to
+   the logging function. */
+
+struct lastMessage
+{
+    int priority;
+    char *properties;
+};
+
+static void
+lmReset(struct lastMessage *lm)
+{
+    lm->priority = -1;
+    VIR_FREE(lm->properties);
+}
+
+static void
+logOutputToLM(const char *category ATTRIBUTE_UNUSED, int priority,
+              const char *funcname ATTRIBUTE_UNUSED,
+              long long linenr ATTRIBUTE_UNUSED,
+              const char *timestamp ATTRIBUTE_UNUSED,
+              virJSONObjectPtr properties, unsigned int flags,
+              const char *rawstr ATTRIBUTE_UNUSED,
+              const char *str ATTRIBUTE_UNUSED, void *data)
+{
+    struct lastMessage *lm;
+    virJSONStringGeneratorPtr g = NULL;
+    const char *json_string;
+
+    virCheckFlags(VIR_LOG_STACK_TRACE,);
+
+    lm = data;
+    lmReset(lm);
+    /* category (== file name) is not expected to be stable */
+    lm->priority = priority;
+    /* funcname, linenr, timestamp, rawstr, str are not expected to be stable */
+
+    g = virJSONStringGeneratorInitObject();
+    if (g == NULL)
+        goto cleanup;
+    if (properties != NULL
+        && virJSONStringGeneratorAddProperties(g, properties) != 0)
+        goto cleanup;
+    json_string = strdup(virJSONStringGeneratorFinishObject(g));
+    if (json_string == NULL)
+        goto cleanup;
+    lm->properties = strdup(json_string);
+ cleanup:
+    virJSONStringGeneratorFree(g);
+}
+
+static int
+testBasicMessage(const void *data)
+{
+    struct lastMessage *lm;
+    virConnectPtr conn = NULL;
+    virDomainPtr dom = NULL;
+    int ret = -1;
+
+    lm = (struct lastMessage *)data;
+    conn = virConnectOpen("test:///default");
+    if (conn == NULL) {
+        if (virTestGetVerbose())
+            fprintf(stderr, "Could not connect to test URI\n");
+        goto cleanup;
+    }
+
+    dom = virDomainLookupByName(conn, "this_doesnt_exist");
+    if (dom != NULL) {
+        if (virTestGetVerbose())
+            fprintf(stderr,
+                    "Should not have connected to nonexistent domain\n");
+        goto cleanup;
+    }
+
+    if (lm->priority != VIR_LOG_ERROR) {
+        if (virTestGetVerbose())
+            fprintf(stderr, "Unexpected priority\n");
+        goto cleanup;
+    }
+
+    ret = 0;
+
+ cleanup:
+    if (dom != NULL)
+        virDomainFree(dom);
+    if (conn != NULL)
+        virConnectClose(conn);
+    return ret;
+}
+
+static int
+testJSONError(const void *data)
+{
+    struct lastMessage *lm;
+    virConnectPtr conn = NULL;
+    virDomainPtr dom = NULL;
+    virJSONValuePtr json = NULL;
+    int ret = -1, val;
+
+    lm = (struct lastMessage *)data;
+    conn = virConnectOpen("test:///default");
+    if (conn == NULL) {
+        if (virTestGetVerbose())
+            fprintf(stderr, "Could not connect to test URI\n");
+        goto cleanup;
+    }
+
+    dom = virDomainLookupByName(conn, "this_doesnt_exist");
+    if (dom != NULL) {
+        if (virTestGetVerbose())
+            fprintf(stderr,
+                    "Should not have connected to nonexistent domain\n");
+        goto cleanup;
+    }
+
+    if (lm->properties == NULL) {
+        if (virTestGetVerbose())
+            fprintf(stderr, "Properties missing\n");
+        goto cleanup;
+    }
+    json = virJSONValueFromString(lm->properties);
+    if (json == NULL) {
+        if (virTestGetVerbose())
+            fprintf(stderr, "Error parsing properties\n");
+        goto cleanup;
+    }
+    if (json->type != VIR_JSON_TYPE_OBJECT) {
+        if (virTestGetVerbose())
+            /* logOutputToLM did create an object for us */
+            fprintf(stderr, "Didn't get an object?!\n");
+        goto cleanup;
+    }
+
+    if (virJSONValueObjectGetNumberInt(json, "domain", &val) != 0) {
+        if (virTestGetVerbose())
+            fprintf(stderr, "\"domain\" missing\n");
+        goto cleanup;
+    }
+    if (val != VIR_FROM_TEST) {
+        if (virTestGetVerbose())
+            fprintf(stderr, "Unexpected domain %d (wanted %d)\n", val,
+                    VIR_FROM_TEST);
+        goto cleanup;
+    }
+
+    if (virJSONValueObjectGetNumberInt(json, "code", &val) != 0) {
+        if (virTestGetVerbose())
+            fprintf(stderr, "\"code\" missing\n");
+        goto cleanup;
+    }
+    if (val != VIR_ERR_NO_DOMAIN) {
+        if (virTestGetVerbose())
+            fprintf(stderr, "Unexpected code %d (wanted %d)\n", val,
+                    VIR_ERR_NO_DOMAIN);
+        goto cleanup;
+    }
+
+    ret = 0;
+
+ cleanup:
+    virJSONValueFree(json);
+    if (dom != NULL)
+        virDomainFree(dom);
+    if (conn != NULL)
+        virConnectClose(conn);
+    return ret;
+}
+
+static void
+testQuietError(void *userData ATTRIBUTE_UNUSED,
+               virErrorPtr error ATTRIBUTE_UNUSED)
+{
+    /* nothing */
+}
+
+static int
+mymain(void)
+{
+    struct lastMessage lm;
+    int ret = 0;
+
+    memset(&lm, 0, sizeof(lm));
+    if (virLogReset() < 0)
+        return EXIT_FAILURE;
+    if (virLogDefineOutput(logOutputToLM, NULL, &lm, 0, 0, NULL, 0) < 0)
+        return EXIT_FAILURE;
+    virSetErrorFunc(NULL, testQuietError);
+    if (virtTestRun("Basic message details", 1, testBasicMessage, &lm) != 0)
+        ret = -1;
+    if (virtTestRun("JSON error details", 1, testJSONError, &lm) != 0)
+        ret = -1;
+    lmReset(&lm);
+    return (ret == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
+}
+
+VIRT_TEST_MAIN(mymain)
-- 
1.7.11.4


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]