From 05bcac416bcddaf05bd0437bd27a19933502baf2 Mon Sep 17 00:00:00 2001 From: "Enrico Loparco (eloparco)" Date: Fri, 18 Jun 2021 14:32:44 +0200 Subject: [HICN-709] Fix bugs in listener and connection tables and add unit tests Signed-off-by: Enrico Loparco (eloparco) Change-Id: Idf86a3c6a1dd50d29c1a245a00352a553a5fdb42 --- hicn-light/src/hicn/config/configuration.c | 2 +- hicn-light/src/hicn/core/address.c | 4 ++ hicn-light/src/hicn/core/address.h | 10 ++- hicn-light/src/hicn/core/connection_table.h | 4 +- hicn-light/src/hicn/core/content_store.h | 4 +- hicn-light/src/hicn/core/listener_table.h | 6 +- hicn-light/src/hicn/core/pit.h | 4 +- hicn-light/src/hicn/core/test/CMakeLists.txt | 2 + .../src/hicn/core/test/test-connection_table.cc | 76 ++++++++++++++++++++++ .../src/hicn/core/test/test-listener_table.cc | 76 ++++++++++++++++++++++ 10 files changed, 177 insertions(+), 11 deletions(-) create mode 100644 hicn-light/src/hicn/core/test/test-connection_table.cc create mode 100644 hicn-light/src/hicn/core/test/test-listener_table.cc 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 + +#include +#include +#include +#include +#include +#include +#include + +extern "C" { +#define WITH_TESTS +#include +} + +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 + +#include +#include +#include +#include +#include +#include +#include + +extern "C" { +#define WITH_TESTS +#include +} + +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(); +} -- cgit 1.2.3-korg