On 11/17/2011 05:07 PM, Eric Blake wrote:
Excercise the new hash API, to ensure we avoid regressions.
* tests/hashtest.c (testHashGetItems): New test.
---
> I'd still feel a bit better if we had coverage for the new function in
> tests/hashtest.c, but I'll let that slide to another patch;
On second thought, writing a test now wasn't too hard.
tests/hashtest.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 86 insertions(+), 0 deletions(-)
diff --git a/tests/hashtest.c b/tests/hashtest.c
index f02b3a9..898a95d 100644
--- a/tests/hashtest.c
+++ b/tests/hashtest.c
@@ -9,6 +9,7 @@
#include "hash.h"
#include "hashdata.h"
#include "testutils.h"
+#include "memory.h"
#define testError(...) \
@@ -491,6 +492,90 @@ cleanup:
static int
+testHashGetItemsCompKey(const virHashKeyValuePairPtr a,
+ const virHashKeyValuePairPtr b)
+{
+ return strcmp (a->key, b->key);
+}
+
+static int
+testHashGetItemsCompValue(const virHashKeyValuePairPtr a,
+ const virHashKeyValuePairPtr b)
+{
+ return strcmp (a->value, b->value);
+}
+
+static int
+testHashGetItems(const void *data ATTRIBUTE_UNUSED)
+{
+ virHashTablePtr hash;
+ virHashKeyValuePairPtr array = NULL;
+ int ret = -1;
+ char keya[] = "a";
+ char keyb[] = "b";
+ char keyc[] = "c";
+ char value1[] = "1";
+ char value2[] = "2";
+ char value3[] = "3";
+
+ if (!(hash = virHashCreate(0, NULL)) ||
+ virHashAddEntry(hash, keya, value3)< 0 ||
+ virHashAddEntry(hash, keyc, value1)< 0 ||
+ virHashAddEntry(hash, keyb, value2)< 0) {
+ if (virTestGetVerbose()) {
+ testError("\nfailed to create hash");
+ }
+ goto cleanup;
+ }
+
+ if (!(array = virHashGetItems(hash, NULL)) ||
+ array[3].key || array[3].value) {
+ if (virTestGetVerbose()) {
+ testError("\nfailed to get items with NULL sort");
+ }
+ goto cleanup;
+ }
+ VIR_FREE(array);
+
+ if (!(array = virHashGetItems(hash, testHashGetItemsCompKey)) ||
+ STRNEQ(array[0].key, "a") ||
+ STRNEQ(array[0].value, "3") ||
+ STRNEQ(array[1].key, "b") ||
+ STRNEQ(array[1].value, "2") ||
+ STRNEQ(array[2].key, "c") ||
+ STRNEQ(array[2].value, "1") ||
+ array[3].key || array[3].value) {
+ if (virTestGetVerbose()) {
+ testError("\nfailed to get items with key sort");
+ }
+ goto cleanup;
+ }
+ VIR_FREE(array);
+
+ if (!(array = virHashGetItems(hash, testHashGetItemsCompValue)) ||
+ STRNEQ(array[0].key, "c") ||
+ STRNEQ(array[0].value, "1") ||
+ STRNEQ(array[1].key, "b") ||
+ STRNEQ(array[1].value, "2") ||
+ STRNEQ(array[2].key, "a") ||
+ STRNEQ(array[2].value, "3") ||
+ array[3].key || array[3].value) {
+ if (virTestGetVerbose()) {
+ testError("\nfailed to get items with value sort");
+ }
+ goto cleanup;
+ }
+
+ ret = 0;
+
+cleanup:
+ VIR_FREE(array);
+ virHashFree(hash);
+ return ret;
+}
+
+
+static int
mymain(void)
{
int ret = 0;
@@ -526,6 +611,7 @@ mymain(void)
DO_TEST("Forbidden ops in ForEach", ForEach);
DO_TEST("RemoveSet", RemoveSet);
DO_TEST("Search", Search);
+ DO_TEST("GetItems", GetItems);
return (ret == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
}
ACK