summaryrefslogtreecommitdiff
path: root/test/client_id_tests/client_id_test_utility.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/client_id_tests/client_id_test_utility.cpp')
-rw-r--r--test/client_id_tests/client_id_test_utility.cpp210
1 files changed, 207 insertions, 3 deletions
diff --git a/test/client_id_tests/client_id_test_utility.cpp b/test/client_id_tests/client_id_test_utility.cpp
index 1512146..e7f9770 100644
--- a/test/client_id_tests/client_id_test_utility.cpp
+++ b/test/client_id_tests/client_id_test_utility.cpp
@@ -51,6 +51,7 @@ public:
}
protected:
virtual void SetUp() {
+ unlink(std::string("/dev/shm").append(utility::get_shm_name(configuration_)).c_str());
ASSERT_FALSE(file_exist(std::string("/dev/shm").append(utility::get_shm_name(configuration_))));
ASSERT_TRUE(static_cast<bool>(configuration_));
configuration_->load(APPLICATION_NAME_ROUTING_MANAGER);
@@ -340,8 +341,11 @@ TEST_F(client_id_utility_test,
TEST_F(client_id_utility_test, exhaust_client_id_range_sequential) {
std::vector<client_t> its_client_ids;
-
- const std::uint16_t max_possible_clients = static_cast<std::uint16_t>(~diagnosis_mask_);
+ std::uint16_t its_max_clients(0);
+ for (int var = 0; var < __builtin_popcount(static_cast<std::uint16_t>(~diagnosis_mask_)); ++var) {
+ its_max_clients = static_cast<std::uint16_t>(its_max_clients | (1 << var));
+ }
+ const std::uint16_t max_possible_clients = its_max_clients;
// -1 for the routing manager, -2 as two predefined client IDs are present
// in the json file which aren't assigned via autoconfiguration
const std::uint16_t max_allowed_clients = static_cast<std::uint16_t>(max_possible_clients - 3u);
@@ -352,6 +356,9 @@ TEST_F(client_id_utility_test, exhaust_client_id_range_sequential) {
APPLICATION_NAME_NOT_PREDEFINED, 0x0);
EXPECT_NE(ILLEGAL_CLIENT, its_client_id);
if (its_client_id != ILLEGAL_CLIENT) {
+ if (i > 0) {
+ EXPECT_LT(its_client_ids.back(), its_client_id);
+ }
its_client_ids.push_back(its_client_id);
} else {
ADD_FAILURE()<< "Received ILLEGAL_CLIENT "
@@ -402,7 +409,11 @@ TEST_F(client_id_utility_test, exhaust_client_id_range_fragmented) {
// -1 for the routing manager, -2 as two predefined client IDs are present
// in the json file which aren't assigned via autoconfiguration
- const std::uint16_t max_possible_clients = static_cast<std::uint16_t>(~diagnosis_mask_);
+ std::uint16_t its_max_clients(0);
+ for (int var = 0; var < __builtin_popcount(static_cast<std::uint16_t>(~diagnosis_mask_)); ++var) {
+ its_max_clients = static_cast<std::uint16_t>(its_max_clients | (1 << var));
+ }
+ const std::uint16_t max_possible_clients = its_max_clients;
const std::uint16_t max_allowed_clients = static_cast<std::uint16_t>(max_possible_clients - 3u);
// acquire maximum amount of client IDs
@@ -411,6 +422,9 @@ TEST_F(client_id_utility_test, exhaust_client_id_range_fragmented) {
APPLICATION_NAME_NOT_PREDEFINED, 0x0);
EXPECT_NE(ILLEGAL_CLIENT, its_client_id);
if (its_client_id != ILLEGAL_CLIENT) {
+ if (i > 0) {
+ EXPECT_LT(its_client_ids.back(), its_client_id);
+ }
its_client_ids.push_back(its_client_id);
} else {
ADD_FAILURE() << "Received ILLEGAL_CLIENT "
@@ -447,6 +461,9 @@ TEST_F(client_id_utility_test, exhaust_client_id_range_fragmented) {
APPLICATION_NAME_NOT_PREDEFINED, 0x0);
EXPECT_NE(ILLEGAL_CLIENT, its_client_id);
if (its_client_id != ILLEGAL_CLIENT) {
+ if (i > 0) {
+ EXPECT_LT(its_client_ids.back(), its_client_id);
+ }
its_client_ids.push_back(its_client_id);
} else {
ADD_FAILURE() << "Received ILLEGAL_CLIENT "
@@ -466,6 +483,193 @@ TEST_F(client_id_utility_test, exhaust_client_id_range_fragmented) {
}
}
+/*
+ * @test Check that the autoconfigured client IDs continue to increase even if
+ * some client IDs at the beginning of the range are already released again
+ */
+TEST_F(client_id_utility_test, exhaust_client_id_range_fragmented_extended) {
+ std::vector<client_t> its_client_ids;
+
+ // -1 for the routing manager, -2 as two predefined client IDs are present
+ // in the json file which aren't assigned via autoconfiguration
+ std::uint16_t its_max_clients(0);
+ for (int var = 0; var < __builtin_popcount(static_cast<std::uint16_t>(~diagnosis_mask_)); ++var) {
+ its_max_clients = static_cast<std::uint16_t>(its_max_clients | (1 << var));
+ }
+ const std::uint16_t max_possible_clients = its_max_clients;
+ const std::uint16_t intermediate_release = 3;
+ const std::uint16_t max_allowed_clients = static_cast<std::uint16_t>(max_possible_clients - 3u);
+
+
+ // acquire (almost) maximum amount of client IDs
+ for (std::uint16_t i = 0; i < max_allowed_clients - intermediate_release; i++) {
+ client_t its_client_id = utility::request_client_id(configuration_,
+ APPLICATION_NAME_NOT_PREDEFINED, 0x0);
+ EXPECT_NE(ILLEGAL_CLIENT, its_client_id);
+ if (its_client_id != ILLEGAL_CLIENT) {
+ if (i > 0) {
+ EXPECT_LT(its_client_ids.back(), its_client_id);
+ }
+ its_client_ids.push_back(its_client_id);
+ } else {
+ ADD_FAILURE() << "Received ILLEGAL_CLIENT "
+ << static_cast<std::uint32_t>(i);
+ }
+ }
+
+ // release the first intermediate_release client IDs again
+ std::vector<client_t> its_intermediate_released_client_ids;
+ for (size_t i = 0; i < intermediate_release; i++ ) {
+ its_intermediate_released_client_ids.push_back(its_client_ids[i]);
+ utility::release_client_id(its_client_ids[i]);
+ its_client_ids.erase(its_client_ids.begin() + i);
+ }
+
+ // acquire some more client IDs, these should be bigger than the already acquired
+ for (std::uint16_t i = 0; i < intermediate_release; i++) {
+ client_t its_client_id = utility::request_client_id(configuration_,
+ APPLICATION_NAME_NOT_PREDEFINED, 0x0);
+ EXPECT_NE(ILLEGAL_CLIENT, its_client_id);
+ if (its_client_id != ILLEGAL_CLIENT) {
+ EXPECT_LT(its_client_ids.back(), its_client_id);
+ its_client_ids.push_back(its_client_id);
+ } else {
+ ADD_FAILURE() << "Received ILLEGAL_CLIENT "
+ << static_cast<std::uint32_t>(i);
+ }
+ }
+
+ // check correct wrap around of client IDs
+ for (std::uint16_t i = 0; i < intermediate_release; i++) {
+ client_t its_client_id = utility::request_client_id(configuration_,
+ APPLICATION_NAME_NOT_PREDEFINED, 0x0);
+ EXPECT_NE(ILLEGAL_CLIENT, its_client_id);
+ if (its_client_id != ILLEGAL_CLIENT) {
+ if (i == 0) {
+ EXPECT_GT(its_client_ids.back(), its_client_id);
+ } else {
+ EXPECT_LT(its_client_ids.back(), its_client_id);
+ }
+ its_client_ids.push_back(its_client_id);
+ } else {
+ ADD_FAILURE() << "Received ILLEGAL_CLIENT "
+ << static_cast<std::uint32_t>(i);
+ }
+ }
+
+ // check limit is reached
+ client_t its_illegal_client_id = utility::request_client_id(configuration_,
+ APPLICATION_NAME_NOT_PREDEFINED, 0x0);
+ EXPECT_EQ(ILLEGAL_CLIENT, its_illegal_client_id);
+
+ // release every second requested client ID
+ std::vector<client_t> its_released_client_ids;
+ for (size_t i = 0; i < its_client_ids.size(); i++ ) {
+ if (i % 2) {
+ its_released_client_ids.push_back(its_client_ids[i]);
+ utility::release_client_id(its_client_ids[i]);
+ }
+ }
+ for (const client_t c : its_released_client_ids) {
+ for (auto it = its_client_ids.begin(); it != its_client_ids.end(); ) {
+ if (*it == c) {
+ it = its_client_ids.erase(it);
+ } else {
+ ++it;
+ }
+ }
+ }
+
+ // acquire client IDs up to the maximum allowed amount again
+ for (std::uint16_t i = 0; i < its_released_client_ids.size(); i++) {
+ client_t its_client_id = utility::request_client_id(configuration_,
+ APPLICATION_NAME_NOT_PREDEFINED, 0x0);
+ EXPECT_NE(ILLEGAL_CLIENT, its_client_id);
+ if (its_client_id != ILLEGAL_CLIENT) {
+ if (i > 0) {
+ EXPECT_LT(its_client_ids.back(), its_client_id);
+ }
+ its_client_ids.push_back(its_client_id);
+ } else {
+ ADD_FAILURE() << "Received ILLEGAL_CLIENT "
+ << static_cast<std::uint32_t>(i);
+ }
+ }
+
+ // check limit is reached
+ its_illegal_client_id = 0xFFFF;
+ its_illegal_client_id = utility::request_client_id(configuration_,
+ APPLICATION_NAME_NOT_PREDEFINED, 0x0);
+ EXPECT_EQ(ILLEGAL_CLIENT, its_illegal_client_id);
+
+ // release all
+ for (const client_t c : its_client_ids) {
+ utility::release_client_id(c);
+ }
+}
+
+TEST_F(client_id_utility_test, request_released_client_id_after_maximum_client_id_is_assigned) {
+ std::vector<client_t> its_client_ids;
+ std::uint16_t its_max_clients(0);
+ for (int var = 0; var < __builtin_popcount(static_cast<std::uint16_t>(~diagnosis_mask_)); ++var) {
+ its_max_clients = static_cast<std::uint16_t>(its_max_clients | (1 << var));
+ }
+ const std::uint16_t max_possible_clients = its_max_clients;
+ // -1 for the routing manager, -2 as two predefined client IDs are present
+ // in the json file which aren't assigned via autoconfiguration
+ const std::uint16_t max_allowed_clients = static_cast<std::uint16_t>(max_possible_clients - 3u);
+
+ // acquire (almost) maximum amount of client IDs
+ for (std::uint16_t i = 0; i < max_allowed_clients - 1; i++) {
+ client_t its_client_id = utility::request_client_id(configuration_,
+ APPLICATION_NAME_NOT_PREDEFINED, 0x0);
+ EXPECT_NE(ILLEGAL_CLIENT, its_client_id);
+ if (its_client_id != ILLEGAL_CLIENT) {
+ if (i > 0) {
+ EXPECT_LT(its_client_ids.back(), its_client_id);
+ }
+ its_client_ids.push_back(its_client_id);
+ } else {
+ ADD_FAILURE()<< "Received ILLEGAL_CLIENT "
+ << static_cast<std::uint32_t>(i);
+ }
+ }
+
+ // release a client ID
+ utility::release_client_id(its_client_ids[10]);
+
+ // requesting an ID should return the maximum possible ID
+ client_t its_max_client_id = utility::request_client_id(configuration_,
+ APPLICATION_NAME_NOT_PREDEFINED, 0x0);
+ EXPECT_NE(ILLEGAL_CLIENT, its_max_client_id);
+ its_client_ids.push_back(its_max_client_id);
+
+ // requesting an ID should work as we have released one before
+ client_t its_client_id = utility::request_client_id(configuration_,
+ APPLICATION_NAME_NOT_PREDEFINED, 0x0);
+ EXPECT_NE(ILLEGAL_CLIENT, its_client_id);
+ its_client_ids.push_back(its_client_id);
+
+ // requesting an ID should not work as all IDs are in use now
+ client_t its_illegal_client_id = utility::request_client_id(configuration_,
+ APPLICATION_NAME_NOT_PREDEFINED, 0x0);
+ EXPECT_EQ(ILLEGAL_CLIENT, its_illegal_client_id);
+
+ // release another ID
+ utility::release_client_id(its_client_ids[5]);
+
+ its_client_id = utility::request_client_id(configuration_,
+ APPLICATION_NAME_NOT_PREDEFINED, 0x0);
+ EXPECT_NE(ILLEGAL_CLIENT, its_client_id);
+ its_client_ids.push_back(its_client_id);
+
+ // release all
+ for (const client_t c : its_client_ids) {
+ utility::release_client_id(c);
+ }
+ its_client_ids.clear();
+}
+
#ifndef _WIN32
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);