diff options
Diffstat (limited to 'hicn-light/src/hicn/core/test/test-listener_table.cc')
-rw-r--r-- | hicn-light/src/hicn/core/test/test-listener_table.cc | 193 |
1 files changed, 193 insertions, 0 deletions
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..34db546fc --- /dev/null +++ b/hicn-light/src/hicn/core/test/test-listener_table.cc @@ -0,0 +1,193 @@ +/* + * 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 <gmock/gmock.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> +} + +#define LISTENER_NAME "listener_name_test" +#define LISTENER_NAME_2 "listener_name_test_2" + +class ListenerTableTest : public ::testing::Test { +protected: + ListenerTableTest() { + listener_table = listener_table_create(); + } + virtual ~ListenerTableTest() { + listener_table_free(listener_table); + } + + listener_table_t *listener_table; + listener_t *listener; + listener_key_t key = { + .address = _ADDRESS4_LOCALHOST(1), + .type = FACE_TYPE_UDP + }; +}; + +TEST_F(ListenerTableTest, CreateTable) +{ + // 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) +{ + // Add listener to listener table + listener_table_allocate(listener_table, listener, &key, LISTENER_NAME); + size_t listener_table_size = listener_table_len(listener_table); + EXPECT_EQ(listener_table_size, (size_t) 1); + EXPECT_NE(listener, nullptr); + + // Get listener by name and by key + khiter_t k_name = kh_get_lt_name(listener_table->id_by_name, LISTENER_NAME); + EXPECT_NE(k_name, kh_end(listener_table->id_by_name)); + khiter_t k_key = kh_get_lt_key(listener_table->id_by_key, &key); + EXPECT_NE(k_key, kh_end(listener_table->id_by_key)); +} + +TEST_F(ListenerTableTest, GetListener) +{ + // Add listener to listener table + listener_table_allocate(listener_table, listener, &key, LISTENER_NAME); + size_t listener_table_size = listener_table_len(listener_table); + EXPECT_EQ(listener_table_size, (size_t) 1); + ASSERT_NE(listener, nullptr); + + // Get listener by name + listener_t *listener_retrieved = listener_table_get_by_name(listener_table, LISTENER_NAME); + ASSERT_NE(listener_retrieved, nullptr); + EXPECT_EQ(listener_retrieved, listener); + + // Get listener by key + listener_retrieved = listener_table_get_by_address(listener_table, key.type, &key.address); + ASSERT_NE(listener_retrieved, nullptr); + EXPECT_EQ(listener_retrieved, listener); +} + +TEST_F(ListenerTableTest, GetListenerWithIdOutOfRange) +{ + // Try to retrieve a listener with an index + // bigger than the current listener table size + ASSERT_DEATH({ + _listener_table_get_by_id(listener_table, ~0); + }, ".*Assertion.*"); +} + +TEST_F(ListenerTableTest, GetListenerWithInvalidId) +{ + // First listener inserted has always id equal to 0 + int non_valid_id = 5; + + listener_table_allocate(listener_table, listener, &key, LISTENER_NAME); + listener_t *listener_not_found = listener_table_get_by_id(listener_table, non_valid_id); + ASSERT_EQ(listener_not_found, nullptr); +} + +TEST_F(ListenerTableTest, GetListenerWithValidId) +{ + listener_table_allocate(listener_table, listener, &key, LISTENER_NAME); + int id = listener_table_get_listener_id(listener_table, listener); + listener_t *listener_found = listener_table_get_by_id(listener_table, id); + ASSERT_EQ(listener_found, listener); +} + +TEST_F(ListenerTableTest, RemoveListener) +{ + // Add listener (listerner name and key must be set) + listener_table_allocate(listener_table, listener, &key, LISTENER_NAME); + listener->name = (char*) LISTENER_NAME; + listener->key = key; + + // Remove listener + int id = listener_table_get_listener_id(listener_table, listener); + listener_table_remove_by_id(listener_table, id); + + // Check listener table size + size_t listener_table_size = listener_table_len(listener_table); + EXPECT_EQ(listener_table_size, (size_t) 0); + + // Check that previous listener is not valid anymore + listener_t *listener_not_found = listener_table_get_by_id(listener_table, id); + EXPECT_EQ(listener_not_found, nullptr); + listener_not_found = listener_table_get_by_name(listener_table, LISTENER_NAME); + EXPECT_EQ(listener_not_found, nullptr); + listener_not_found = listener_table_get_by_address(listener_table, key.type, &key.address); + EXPECT_EQ(listener_not_found, nullptr); +} + +TEST_F(ListenerTableTest, PrintTable) +{ + listener_table_allocate(listener_table, listener, &key, LISTENER_NAME); + + listener_t *listener_2; + listener_key_t key_2 = { + .address = _ADDRESS4_LOCALHOST(2), + .type = FACE_TYPE_TCP + }; + listener_table_allocate(listener_table, listener_2, &key_2, LISTENER_NAME_2); + + testing::internal::CaptureStdout(); + listener_table_print(listener_table); + std::string std_out = testing::internal::GetCapturedStdout(); + + ASSERT_NE(std_out, ""); + EXPECT_THAT(std_out, testing::HasSubstr(LISTENER_NAME)); + EXPECT_THAT(std_out, testing::HasSubstr(LISTENER_NAME_2)); +} + +TEST_F(ListenerTableTest, AddMultipleListeners) +{ + listener_table_allocate(listener_table, listener, &key, LISTENER_NAME); + + listener_t *listener_2; + listener_key_t key_2 = { + .address = _ADDRESS4_LOCALHOST(2), + .type = FACE_TYPE_TCP + }; + listener_table_allocate(listener_table, listener_2, &key_2, "listener_name_test_2"); + + // Check listener table size + size_t listener_table_size = listener_table_len(listener_table); + EXPECT_EQ(listener_table_size, (size_t) 2); + + listener_t *l1 = listener_table_get_by_name(listener_table, LISTENER_NAME); + ASSERT_NE(l1, nullptr); + listener_t *l2 = listener_table_get_by_name(listener_table, LISTENER_NAME_2); + ASSERT_NE(l2, nullptr); + EXPECT_NE(l1, l2); +} + +int main(int argc, char **argv) +{ + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} |