New upstream version 16.11.9
[deb_dpdk.git] / app / test / test_hash.c
index 7e41725..c55ec0d 100644 (file)
@@ -110,29 +110,23 @@ static uint32_t pseudo_hash(__attribute__((unused)) const void *keys,
        return 3;
 }
 
+#define UNIT_TEST_HASH_VERBOSE 0
 /*
  * Print out result of unit test hash operation.
  */
-#if defined(UNIT_TEST_HASH_VERBOSE)
 static void print_key_info(const char *msg, const struct flow_key *key,
                                                                int32_t pos)
 {
-       uint8_t *p = (uint8_t *)key;
-       unsigned i;
-
-       printf("%s key:0x", msg);
-       for (i = 0; i < sizeof(struct flow_key); i++) {
-               printf("%02X", p[i]);
+       if (UNIT_TEST_HASH_VERBOSE) {
+               const uint8_t *p = (const uint8_t *)key;
+               unsigned int i;
+
+               printf("%s key:0x", msg);
+               for (i = 0; i < sizeof(struct flow_key); i++)
+                       printf("%02X", p[i]);
+               printf(" @ pos %d\n", pos);
        }
-       printf(" @ pos %d\n", pos);
-}
-#else
-static void print_key_info(__attribute__((unused)) const char *msg,
-               __attribute__((unused)) const struct flow_key *key,
-               __attribute__((unused)) int32_t pos)
-{
 }
-#endif
 
 /* Keys used by unit test functions */
 static struct flow_key keys[5] = { {
@@ -420,6 +414,46 @@ static int test_add_update_delete(void)
        return 0;
 }
 
+/*
+ * Sequence of operations for retrieving a key with its position
+ *
+ *  - create table
+ *  - add key
+ *  - get the key with its position: hit
+ *  - delete key
+ *  - try to get the deleted key: miss
+ *
+ */
+static int test_hash_get_key_with_position(void)
+{
+       struct rte_hash *handle = NULL;
+       int pos, expectedPos, result;
+       void *key;
+
+       ut_params.name = "hash_get_key_w_pos";
+       handle = rte_hash_create(&ut_params);
+       RETURN_IF_ERROR(handle == NULL, "hash creation failed");
+
+       pos = rte_hash_add_key(handle, &keys[0]);
+       print_key_info("Add", &keys[0], pos);
+       RETURN_IF_ERROR(pos < 0, "failed to add key (pos0=%d)", pos);
+       expectedPos = pos;
+
+       result = rte_hash_get_key_with_position(handle, pos, &key);
+       RETURN_IF_ERROR(result != 0, "error retrieving a key");
+
+       pos = rte_hash_del_key(handle, &keys[0]);
+       print_key_info("Del", &keys[0], pos);
+       RETURN_IF_ERROR(pos != expectedPos,
+                       "failed to delete key (pos0=%d)", pos);
+
+       result = rte_hash_get_key_with_position(handle, pos, &key);
+       RETURN_IF_ERROR(result != -ENOENT, "non valid key retrieved");
+
+       rte_hash_free(handle);
+       return 0;
+}
+
 /*
  * Sequence of operations for find existing hash table
  *
@@ -743,7 +777,7 @@ fbk_hash_unit_test(void)
         */
        struct rte_fbk_hash_params different_name = {
                .name = "different_name",                       /* different name */
-               .entries = RTE_FBK_HASH_ENTRIES_MAX,
+               .entries = LOCAL_FBK_HASH_ENTRIES_MAX,
                .entries_per_bucket = 4,
                .socket_id = 0,
        };
@@ -1442,6 +1476,8 @@ test_hash(void)
                return -1;
        if (test_hash_add_delete_jhash_3word() < 0)
                return -1;
+       if (test_hash_get_key_with_position() < 0)
+               return -1;
        if (test_hash_find_existing() < 0)
                return -1;
        if (test_add_update_delete() < 0)
@@ -1472,8 +1508,4 @@ test_hash(void)
        return 0;
 }
 
-static struct test_command hash_cmd = {
-       .command = "hash_autotest",
-       .callback = test_hash,
-};
-REGISTER_TEST_COMMAND(hash_cmd);
+REGISTER_TEST_COMMAND(hash_autotest, test_hash);