aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEnrico Loparco (eloparco) <eloparco@cisco.com>2021-06-18 14:32:44 +0200
committerEnrico Loparco (eloparco) <eloparco@cisco.com>2021-06-24 09:31:04 +0200
commit05bcac416bcddaf05bd0437bd27a19933502baf2 (patch)
treeb34ef95bf3dffc27eabda12e055933703b9017bb
parent4c5b811c7d105aafb847f9006fd1e5235206e5cd (diff)
[HICN-709] Fix bugs in listener and connection tables and add unit tests
Signed-off-by: Enrico Loparco (eloparco) <eloparco@cisco.com> Change-Id: Idf86a3c6a1dd50d29c1a245a00352a553a5fdb42
-rw-r--r--hicn-light/src/hicn/config/configuration.c2
-rw-r--r--hicn-light/src/hicn/core/address.c4
-rw-r--r--hicn-light/src/hicn/core/address.h10
-rw-r--r--hicn-light/src/hicn/core/connection_table.h4
-rw-r--r--hicn-light/src/hicn/core/content_store.h4
-rw-r--r--hicn-light/src/hicn/core/listener_table.h6
-rw-r--r--hicn-light/src/hicn/core/pit.h4
-rw-r--r--hicn-light/src/hicn/core/test/CMakeLists.txt2
-rw-r--r--hicn-light/src/hicn/core/test/test-connection_table.cc76
-rw-r--r--hicn-light/src/hicn/core/test/test-listener_table.cc76
10 files changed, 177 insertions, 11 deletions
diff --git a/hicn-light/src/hicn/config/configuration.c b/hicn-light/src/hicn/config/configuration.c
index 92f3d6359..591352377 100644
--- a/hicn-light/src/hicn/config/configuration.c
+++ b/hicn-light/src/hicn/config/configuration.c
@@ -71,7 +71,7 @@ do { \
*
* prefix_str -> strategy_type
*/
-KHASH_INIT(strategy_map, const char *, unsigned, 0, str_hash, str_hash_eq);
+KHASH_MAP_INIT_STR(strategy_map, unsigned);
struct configuration_s {
forwarder_t * forwarder;
diff --git a/hicn-light/src/hicn/core/address.c b/hicn-light/src/hicn/core/address.c
index cc86b7875..10f65f2f3 100644
--- a/hicn-light/src/hicn/core/address.c
+++ b/hicn-light/src/hicn/core/address.c
@@ -51,4 +51,8 @@ int address_to_string(const address_t *address, char *buffer) {
strncpy(buffer, "N/A", INET6_ADDRSTRLEN);
}
return err;
+}
+
+address_t _ADDRESS4_LOCALHOST(uint16_t port) {
+ return ADDRESS4_LOCALHOST(port);
} \ No newline at end of file
diff --git a/hicn-light/src/hicn/core/address.h b/hicn-light/src/hicn/core/address.h
index 1cee29df3..f1f2ac1e0 100644
--- a/hicn-light/src/hicn/core/address.h
+++ b/hicn-light/src/hicn/core/address.h
@@ -61,6 +61,15 @@ int address_from_ip_port(address_t * address, int family, ip_address_t * addr, u
}))
#define ADDRESS4_LOCALHOST(port) ADDRESS4(INADDR_LOOPBACK, (port))
+
+/**
+ * @brief Helper function to avoid macro expansion in c++ tests. Wrapper around 'ADDRESS4_LOCALHOST()'.
+ *
+ * @param port
+ * @return address_t
+ */
+address_t _ADDRESS4_LOCALHOST(uint16_t port);
+
#define ADDRESS4_ANY(port) ADDRESS4(INADDR_ANY, (port))
#define ADDRESS6(ip, port) (*(address_t*) &((struct sockaddr_in6) {\
@@ -94,4 +103,3 @@ extern const char * _address_family_str[];
int address_to_string(const address_t *address, char *buffer);
#endif /* HICNLIGHT_ADDRESS_H */
-
diff --git a/hicn-light/src/hicn/core/connection_table.h b/hicn-light/src/hicn/core/connection_table.h
index 160867176..6814967c9 100644
--- a/hicn-light/src/hicn/core/connection_table.h
+++ b/hicn-light/src/hicn/core/connection_table.h
@@ -39,8 +39,8 @@
#define _ct_var(x) _ct_var_##x
/* Hash functions for indices. */
-#define address_pair_hash(pair) (hash32(pair, sizeof(address_pair_t)))
-#define address_pair_hash_eq(a, b) (address_pair_hash(b) - address_pair_hash(a))
+#define address_pair_hash(pair) (hash_struct(pair))
+#define address_pair_hash_eq(a, b) (address_pair_hash(b) == address_pair_hash(a))
/* Hash table types for indices. */
KHASH_INIT(ct_pair, const address_pair_t *, unsigned, 1, address_pair_hash, address_pair_hash_eq);
diff --git a/hicn-light/src/hicn/core/content_store.h b/hicn-light/src/hicn/core/content_store.h
index 95b0a1d0a..754796d31 100644
--- a/hicn-light/src/hicn/core/content_store.h
+++ b/hicn-light/src/hicn/core/content_store.h
@@ -42,9 +42,9 @@ typedef struct {
// XXX TODO
#define name_hash(name) (name_HashCode(name))
-#define name_hash_eq(a, b) (name_hash(b) - name_hash(a))
+#define name_hash_eq(a, b) (name_hash(b) == name_hash(a))
-KHASH_INIT(cs_name, const Name *, unsigned, 0, name_hash, name_hash_eq);
+KHASH_INIT(cs_name, const Name *, unsigned, 1, name_hash, name_hash_eq);
typedef struct {
cs_type_t type;
diff --git a/hicn-light/src/hicn/core/listener_table.h b/hicn-light/src/hicn/core/listener_table.h
index 91b68ee94..3d21cc88f 100644
--- a/hicn-light/src/hicn/core/listener_table.h
+++ b/hicn-light/src/hicn/core/listener_table.h
@@ -40,8 +40,8 @@
#define _lt_var(x) _lt_var_##x
/* Hash functions for indices */
-#define key_hash(key) (hash(key, sizeof(listener_key_t)))
-#define key_hash_eq(a, b) (key_hash(b) - key_hash(a))
+#define key_hash(key) (hash_struct(key))
+#define key_hash_eq(a, b) (key_hash(b) == key_hash(a))
/* Hash table types for indices */
KHASH_MAP_INIT_STR(lt_name, unsigned);
@@ -72,7 +72,7 @@ typedef struct {
*/
#define listener_table_allocate(TABLE, LISTENER, KEY, NAME) \
do { \
- pool_get(table->listeners, (LISTENER)); \
+ pool_get(TABLE->listeners, (LISTENER)); \
if (LISTENER) { \
off_t _lt_var(id) = (LISTENER) - (TABLE)->listeners; \
int _lt_var(res); \
diff --git a/hicn-light/src/hicn/core/pit.h b/hicn-light/src/hicn/core/pit.h
index 85958f88e..9164aab60 100644
--- a/hicn-light/src/hicn/core/pit.h
+++ b/hicn-light/src/hicn/core/pit.h
@@ -64,9 +64,9 @@ typedef enum {
nexthops_add(pit_entry_get_egress(E), (NH))
#define name_hash(name) (name_HashCode(name))
-#define name_hash_eq(a, b) (name_hash(b) - name_hash(a))
+#define name_hash_eq(a, b) (name_hash(b) == name_hash(a))
-KHASH_INIT(pit_name, const Name *, unsigned, 0, name_hash, name_hash_eq);
+KHASH_INIT(pit_name, const Name *, unsigned, 1, name_hash, name_hash_eq);
typedef struct {
size_t max_size;
diff --git a/hicn-light/src/hicn/core/test/CMakeLists.txt b/hicn-light/src/hicn/core/test/CMakeLists.txt
index 1043ce580..95f64594e 100644
--- a/hicn-light/src/hicn/core/test/CMakeLists.txt
+++ b/hicn-light/src/hicn/core/test/CMakeLists.txt
@@ -4,6 +4,8 @@ include(BuildMacros)
list(APPEND TESTS
test-msgbuf_pool
+ test-connection_table
+ test-listener_table
)
foreach(test ${TESTS})
diff --git a/hicn-light/src/hicn/core/test/test-connection_table.cc b/hicn-light/src/hicn/core/test/test-connection_table.cc
new file mode 100644
index 000000000..b4dd53eef
--- /dev/null
+++ b/hicn-light/src/hicn/core/test/test-connection_table.cc
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2020 Cisco and/or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <gtest/gtest.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <unistd.h>
+#include <netinet/in.h>
+
+extern "C" {
+#define WITH_TESTS
+#include <hicn/core/connection_table.h>
+}
+
+class ConnectionTableTest : public ::testing::Test {
+protected:
+ ConnectionTableTest() {
+ conn_table = connection_table_create();
+ }
+ virtual ~ConnectionTableTest() {
+ connection_table_free(conn_table);
+ }
+
+ connection_table_t *conn_table;
+};
+
+TEST_F(ConnectionTableTest, Create)
+{
+ /* Check connection_table allocation */
+ EXPECT_NE(conn_table, nullptr);
+
+ /* Check connection_table size */
+ size_t conn_table_size = connection_table_len(conn_table);
+ EXPECT_EQ(conn_table_size, (size_t) 0);
+}
+
+TEST_F(ConnectionTableTest, AddConnection)
+{
+ address_pair_t pair = {
+ .local = _ADDRESS4_LOCALHOST(1),
+ .remote = _ADDRESS4_LOCALHOST(2)
+ };
+ connection_t * connection;
+
+ connection_table_allocate(conn_table, connection, &pair, "listener_name_test");
+ size_t conn_table_size = connection_table_len(conn_table);
+ EXPECT_EQ(conn_table_size, (size_t) 1);
+ EXPECT_NE(connection, nullptr);
+
+ khiter_t k = kh_get_ct_name(conn_table->id_by_name, "listener_name_test");
+ EXPECT_NE(k, kh_end(conn_table->id_by_name));
+ k = kh_get_ct_pair(conn_table->id_by_pair, &pair);
+ EXPECT_NE(k, kh_end(conn_table->id_by_pair));
+}
+
+int main(int argc, char **argv)
+{
+ ::testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}
diff --git a/hicn-light/src/hicn/core/test/test-listener_table.cc b/hicn-light/src/hicn/core/test/test-listener_table.cc
new file mode 100644
index 000000000..a480a4a91
--- /dev/null
+++ b/hicn-light/src/hicn/core/test/test-listener_table.cc
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2020 Cisco and/or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <gtest/gtest.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <unistd.h>
+#include <netinet/in.h>
+
+extern "C" {
+#define WITH_TESTS
+#include <hicn/core/listener_table.h>
+}
+
+class ListenerTableTest : public ::testing::Test {
+protected:
+ ListenerTableTest() {
+ listener_table = listener_table_create();
+ }
+ virtual ~ListenerTableTest() {
+ listener_table_free(listener_table);
+ }
+
+ listener_table_t *listener_table;
+};
+
+TEST_F(ListenerTableTest, Create)
+{
+ /* Check listener_table allocation */
+ EXPECT_NE(listener_table, nullptr);
+
+ /* Check listener_table size */
+ size_t listener_table_size = listener_table_len(listener_table);
+ EXPECT_EQ(listener_table_size, (size_t) 0);
+}
+
+TEST_F(ListenerTableTest, AddListener)
+{
+ listener_key_t key = {
+ .address = _ADDRESS4_LOCALHOST(1),
+ .type = FACE_TYPE_UDP
+ };
+ listener_t *listener;
+
+ listener_table_allocate(listener_table, listener, &key, "listener_name_test");
+ size_t listener_table_size = listener_table_len(listener_table);
+ EXPECT_EQ(listener_table_size, (size_t) 1);
+ EXPECT_NE(listener, nullptr);
+
+ khiter_t k = kh_get_lt_name(listener_table->id_by_name, "listener_name_test");
+ EXPECT_NE(k, kh_end(listener_table->id_by_name));
+ k = kh_get_lt_key(listener_table->id_by_key, &key);
+ EXPECT_NE(k, kh_end(listener_table->id_by_key));
+}
+
+int main(int argc, char **argv)
+{
+ ::testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}