File: | home/fedora/workspace/kea-dev/clang-static-analyzer/src/lib/dhcpsrv/testutils/test_utils.cc |
Warning: | line 124, column 13 An undefined value may be read from 'errno' |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | // Copyright (C) 2012-2024 Internet Systems Consortium, Inc. ("ISC") | |||
2 | // | |||
3 | // This Source Code Form is subject to the terms of the Mozilla Public | |||
4 | // License, v. 2.0. If a copy of the MPL was not distributed with this | |||
5 | // file, You can obtain one at http://mozilla.org/MPL/2.0/. | |||
6 | ||||
7 | #include <config.h> | |||
8 | ||||
9 | #include <asiolink/io_address.h> | |||
10 | #include <dhcpsrv/testutils/test_utils.h> | |||
11 | #include <testutils/gtest_utils.h> | |||
12 | ||||
13 | #include <gtest/gtest.h> | |||
14 | #include <sys/stat.h> | |||
15 | #include <sys/types.h> | |||
16 | #include <unistd.h> | |||
17 | ||||
18 | using namespace std; | |||
19 | using namespace isc::asiolink; | |||
20 | ||||
21 | namespace isc { | |||
22 | namespace dhcp { | |||
23 | namespace test { | |||
24 | ||||
25 | void | |||
26 | detailCompareLease(const Lease4Ptr& first, const Lease4Ptr& second) { | |||
27 | // Compare address strings. Comparison of address objects is not used, as | |||
28 | // odd things happen when they are different: the EXPECT_EQ macro appears to | |||
29 | // call the operator uint32_t() function, which causes an exception to be | |||
30 | // thrown for IPv6 addresses. | |||
31 | ASSERT_TRUE(first)switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar_ = ::testing::AssertionResult(first)) ; else return ::testing::internal::AssertHelper(::testing::TestPartResult:: kFatalFailure, "test_utils.cc", 31, ::testing::internal::GetBoolAssertionFailureMessage ( gtest_ar_, "first", "false", "true") .c_str()) = ::testing:: Message(); | |||
32 | ASSERT_TRUE(second)switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar_ = ::testing::AssertionResult(second)) ; else return ::testing::internal::AssertHelper(::testing::TestPartResult:: kFatalFailure, "test_utils.cc", 32, ::testing::internal::GetBoolAssertionFailureMessage ( gtest_ar_, "second", "false", "true") .c_str()) = ::testing ::Message(); | |||
33 | EXPECT_EQ(first->addr_, second->addr_)switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar = (::testing::internal::EqHelper::Compare("first->addr_" , "second->addr_", first->addr_, second->addr_))) ; else ::testing::internal::AssertHelper(::testing::TestPartResult:: kNonFatalFailure, "test_utils.cc", 33, gtest_ar.failure_message ()) = ::testing::Message(); | |||
34 | ||||
35 | // We need to compare the actual HWAddr objects, not pointers | |||
36 | EXPECT_TRUE(*first->hwaddr_ == *second->hwaddr_)switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar_ = ::testing::AssertionResult(*first->hwaddr_ == *second->hwaddr_)) ; else ::testing::internal::AssertHelper (::testing::TestPartResult::kNonFatalFailure, "test_utils.cc" , 36, ::testing::internal::GetBoolAssertionFailureMessage( gtest_ar_ , "*first->hwaddr_ == *second->hwaddr_", "false", "true" ) .c_str()) = ::testing::Message(); | |||
37 | ||||
38 | if (first->client_id_ && second->client_id_) { | |||
39 | EXPECT_TRUE(*first->client_id_ == *second->client_id_)switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar_ = ::testing::AssertionResult(*first->client_id_ == *second->client_id_)) ; else ::testing::internal::AssertHelper (::testing::TestPartResult::kNonFatalFailure, "test_utils.cc" , 39, ::testing::internal::GetBoolAssertionFailureMessage( gtest_ar_ , "*first->client_id_ == *second->client_id_", "false", "true") .c_str()) = ::testing::Message(); | |||
40 | } else { | |||
41 | if (first->client_id_ && !second->client_id_) { | |||
42 | ||||
43 | ADD_FAILURE()::testing::internal::AssertHelper(::testing::TestPartResult:: kNonFatalFailure, "test_utils.cc", 43, "Failed") = ::testing:: Message() << "Client-id present in first lease (" | |||
44 | << first->client_id_->getClientId().size() | |||
45 | << " bytes), but missing in second."; | |||
46 | } | |||
47 | if (!first->client_id_ && second->client_id_) { | |||
48 | ADD_FAILURE()::testing::internal::AssertHelper(::testing::TestPartResult:: kNonFatalFailure, "test_utils.cc", 48, "Failed") = ::testing:: Message() << "Client-id missing in first lease, but present in second (" | |||
49 | << second->client_id_->getClientId().size() | |||
50 | << " bytes)."; | |||
51 | } | |||
52 | // else here would mean that both leases do not have client_id_ | |||
53 | // which makes them equal in that regard. It is ok. | |||
54 | } | |||
55 | ||||
56 | // Since the initial time values were set, one second could have ticked, | |||
57 | // so allow one second of margin error. | |||
58 | EXPECT_NEAR(first->valid_lft_, second->valid_lft_, 1)switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar = (::testing::internal::DoubleNearPredFormat("first->valid_lft_" , "second->valid_lft_", "1", first->valid_lft_, second-> valid_lft_, 1))) ; else ::testing::internal::AssertHelper(::testing ::TestPartResult::kNonFatalFailure, "test_utils.cc", 58, gtest_ar .failure_message()) = ::testing::Message(); | |||
59 | EXPECT_NEAR(first->cltt_, second->cltt_, 1)switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar = (::testing::internal::DoubleNearPredFormat("first->cltt_" , "second->cltt_", "1", first->cltt_, second->cltt_, 1))) ; else ::testing::internal::AssertHelper(::testing::TestPartResult ::kNonFatalFailure, "test_utils.cc", 59, gtest_ar.failure_message ()) = ::testing::Message(); | |||
60 | ||||
61 | EXPECT_EQ(first->subnet_id_, second->subnet_id_)switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar = (::testing::internal::EqHelper::Compare("first->subnet_id_" , "second->subnet_id_", first->subnet_id_, second->subnet_id_ ))) ; else ::testing::internal::AssertHelper(::testing::TestPartResult ::kNonFatalFailure, "test_utils.cc", 61, gtest_ar.failure_message ()) = ::testing::Message(); | |||
62 | EXPECT_EQ(first->pool_id_, second->pool_id_)switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar = (::testing::internal::EqHelper::Compare("first->pool_id_" , "second->pool_id_", first->pool_id_, second->pool_id_ ))) ; else ::testing::internal::AssertHelper(::testing::TestPartResult ::kNonFatalFailure, "test_utils.cc", 62, gtest_ar.failure_message ()) = ::testing::Message(); | |||
63 | EXPECT_EQ(first->fqdn_fwd_, second->fqdn_fwd_)switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar = (::testing::internal::EqHelper::Compare("first->fqdn_fwd_" , "second->fqdn_fwd_", first->fqdn_fwd_, second->fqdn_fwd_ ))) ; else ::testing::internal::AssertHelper(::testing::TestPartResult ::kNonFatalFailure, "test_utils.cc", 63, gtest_ar.failure_message ()) = ::testing::Message(); | |||
64 | EXPECT_EQ(first->fqdn_rev_, second->fqdn_rev_)switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar = (::testing::internal::EqHelper::Compare("first->fqdn_rev_" , "second->fqdn_rev_", first->fqdn_rev_, second->fqdn_rev_ ))) ; else ::testing::internal::AssertHelper(::testing::TestPartResult ::kNonFatalFailure, "test_utils.cc", 64, gtest_ar.failure_message ()) = ::testing::Message(); | |||
65 | EXPECT_EQ(first->hostname_, second->hostname_)switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar = (::testing::internal::EqHelper::Compare("first->hostname_" , "second->hostname_", first->hostname_, second->hostname_ ))) ; else ::testing::internal::AssertHelper(::testing::TestPartResult ::kNonFatalFailure, "test_utils.cc", 65, gtest_ar.failure_message ()) = ::testing::Message(); | |||
66 | if (first->getContext()) { | |||
67 | EXPECT_TRUE(second->getContext())switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar_ = ::testing::AssertionResult(second->getContext ())) ; else ::testing::internal::AssertHelper(::testing::TestPartResult ::kNonFatalFailure, "test_utils.cc", 67, ::testing::internal:: GetBoolAssertionFailureMessage( gtest_ar_, "second->getContext()" , "false", "true") .c_str()) = ::testing::Message(); | |||
68 | if (second->getContext()) { | |||
69 | EXPECT_EQ(first->getContext()->str(), second->getContext()->str())switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar = (::testing::internal::EqHelper::Compare("first->getContext()->str()" , "second->getContext()->str()", first->getContext() ->str(), second->getContext()->str()))) ; else ::testing ::internal::AssertHelper(::testing::TestPartResult::kNonFatalFailure , "test_utils.cc", 69, gtest_ar.failure_message()) = ::testing ::Message(); | |||
70 | } | |||
71 | } else { | |||
72 | EXPECT_FALSE(second->getContext())switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar_ = ::testing::AssertionResult(!(second->getContext ()))) ; else ::testing::internal::AssertHelper(::testing::TestPartResult ::kNonFatalFailure, "test_utils.cc", 72, ::testing::internal:: GetBoolAssertionFailureMessage( gtest_ar_, "second->getContext()" , "true", "false") .c_str()) = ::testing::Message(); | |||
73 | } | |||
74 | } | |||
75 | ||||
76 | void | |||
77 | detailCompareLease(const Lease6Ptr& first, const Lease6Ptr& second) { | |||
78 | ASSERT_TRUE(first)switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar_ = ::testing::AssertionResult(first)) ; else return ::testing::internal::AssertHelper(::testing::TestPartResult:: kFatalFailure, "test_utils.cc", 78, ::testing::internal::GetBoolAssertionFailureMessage ( gtest_ar_, "first", "false", "true") .c_str()) = ::testing:: Message(); | |||
79 | ASSERT_TRUE(second)switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar_ = ::testing::AssertionResult(second)) ; else return ::testing::internal::AssertHelper(::testing::TestPartResult:: kFatalFailure, "test_utils.cc", 79, ::testing::internal::GetBoolAssertionFailureMessage ( gtest_ar_, "second", "false", "true") .c_str()) = ::testing ::Message(); | |||
80 | EXPECT_EQ(first->type_, second->type_)switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar = (::testing::internal::EqHelper::Compare("first->type_" , "second->type_", first->type_, second->type_))) ; else ::testing::internal::AssertHelper(::testing::TestPartResult:: kNonFatalFailure, "test_utils.cc", 80, gtest_ar.failure_message ()) = ::testing::Message(); | |||
81 | ||||
82 | // Compare address strings. Comparison of address objects is not used, as | |||
83 | // odd things happen when they are different: the EXPECT_EQ macro appears to | |||
84 | // call the operator uint32_t() function, which causes an exception to be | |||
85 | // thrown for IPv6 addresses. | |||
86 | EXPECT_EQ(first->addr_, second->addr_)switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar = (::testing::internal::EqHelper::Compare("first->addr_" , "second->addr_", first->addr_, second->addr_))) ; else ::testing::internal::AssertHelper(::testing::TestPartResult:: kNonFatalFailure, "test_utils.cc", 86, gtest_ar.failure_message ()) = ::testing::Message(); | |||
87 | EXPECT_EQ(first->prefixlen_, second->prefixlen_)switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar = (::testing::internal::EqHelper::Compare("first->prefixlen_" , "second->prefixlen_", first->prefixlen_, second->prefixlen_ ))) ; else ::testing::internal::AssertHelper(::testing::TestPartResult ::kNonFatalFailure, "test_utils.cc", 87, gtest_ar.failure_message ()) = ::testing::Message(); | |||
88 | EXPECT_EQ(first->iaid_, second->iaid_)switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar = (::testing::internal::EqHelper::Compare("first->iaid_" , "second->iaid_", first->iaid_, second->iaid_))) ; else ::testing::internal::AssertHelper(::testing::TestPartResult:: kNonFatalFailure, "test_utils.cc", 88, gtest_ar.failure_message ()) = ::testing::Message(); | |||
89 | ASSERT_TRUE(first->duid_)switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar_ = ::testing::AssertionResult(first->duid_)) ; else return ::testing::internal::AssertHelper(::testing::TestPartResult ::kFatalFailure, "test_utils.cc", 89, ::testing::internal::GetBoolAssertionFailureMessage ( gtest_ar_, "first->duid_", "false", "true") .c_str()) = :: testing::Message(); | |||
90 | ASSERT_TRUE(second->duid_)switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar_ = ::testing::AssertionResult(second->duid_)) ; else return ::testing::internal::AssertHelper(::testing::TestPartResult ::kFatalFailure, "test_utils.cc", 90, ::testing::internal::GetBoolAssertionFailureMessage ( gtest_ar_, "second->duid_", "false", "true") .c_str()) = ::testing::Message(); | |||
91 | EXPECT_TRUE(*first->duid_ == *second->duid_)switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar_ = ::testing::AssertionResult(*first->duid_ == * second->duid_)) ; else ::testing::internal::AssertHelper(:: testing::TestPartResult::kNonFatalFailure, "test_utils.cc", 91 , ::testing::internal::GetBoolAssertionFailureMessage( gtest_ar_ , "*first->duid_ == *second->duid_", "false", "true") . c_str()) = ::testing::Message(); | |||
92 | ||||
93 | // Since the initial time values were set, one second could have ticked, | |||
94 | // so allow one second of margin error. | |||
95 | EXPECT_NEAR(first->preferred_lft_, second->preferred_lft_, 1)switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar = (::testing::internal::DoubleNearPredFormat("first->preferred_lft_" , "second->preferred_lft_", "1", first->preferred_lft_, second->preferred_lft_, 1))) ; else ::testing::internal:: AssertHelper(::testing::TestPartResult::kNonFatalFailure, "test_utils.cc" , 95, gtest_ar.failure_message()) = ::testing::Message(); | |||
96 | EXPECT_NEAR(first->valid_lft_, second->valid_lft_, 1)switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar = (::testing::internal::DoubleNearPredFormat("first->valid_lft_" , "second->valid_lft_", "1", first->valid_lft_, second-> valid_lft_, 1))) ; else ::testing::internal::AssertHelper(::testing ::TestPartResult::kNonFatalFailure, "test_utils.cc", 96, gtest_ar .failure_message()) = ::testing::Message(); | |||
97 | EXPECT_NEAR(first->cltt_, second->cltt_, 1)switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar = (::testing::internal::DoubleNearPredFormat("first->cltt_" , "second->cltt_", "1", first->cltt_, second->cltt_, 1))) ; else ::testing::internal::AssertHelper(::testing::TestPartResult ::kNonFatalFailure, "test_utils.cc", 97, gtest_ar.failure_message ()) = ::testing::Message(); | |||
98 | ||||
99 | EXPECT_EQ(first->subnet_id_, second->subnet_id_)switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar = (::testing::internal::EqHelper::Compare("first->subnet_id_" , "second->subnet_id_", first->subnet_id_, second->subnet_id_ ))) ; else ::testing::internal::AssertHelper(::testing::TestPartResult ::kNonFatalFailure, "test_utils.cc", 99, gtest_ar.failure_message ()) = ::testing::Message(); | |||
100 | EXPECT_EQ(first->pool_id_, second->pool_id_)switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar = (::testing::internal::EqHelper::Compare("first->pool_id_" , "second->pool_id_", first->pool_id_, second->pool_id_ ))) ; else ::testing::internal::AssertHelper(::testing::TestPartResult ::kNonFatalFailure, "test_utils.cc", 100, gtest_ar.failure_message ()) = ::testing::Message(); | |||
101 | EXPECT_EQ(first->fqdn_fwd_, second->fqdn_fwd_)switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar = (::testing::internal::EqHelper::Compare("first->fqdn_fwd_" , "second->fqdn_fwd_", first->fqdn_fwd_, second->fqdn_fwd_ ))) ; else ::testing::internal::AssertHelper(::testing::TestPartResult ::kNonFatalFailure, "test_utils.cc", 101, gtest_ar.failure_message ()) = ::testing::Message(); | |||
102 | EXPECT_EQ(first->fqdn_rev_, second->fqdn_rev_)switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar = (::testing::internal::EqHelper::Compare("first->fqdn_rev_" , "second->fqdn_rev_", first->fqdn_rev_, second->fqdn_rev_ ))) ; else ::testing::internal::AssertHelper(::testing::TestPartResult ::kNonFatalFailure, "test_utils.cc", 102, gtest_ar.failure_message ()) = ::testing::Message(); | |||
103 | EXPECT_EQ(first->hostname_, second->hostname_)switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar = (::testing::internal::EqHelper::Compare("first->hostname_" , "second->hostname_", first->hostname_, second->hostname_ ))) ; else ::testing::internal::AssertHelper(::testing::TestPartResult ::kNonFatalFailure, "test_utils.cc", 103, gtest_ar.failure_message ()) = ::testing::Message(); | |||
104 | if (first->getContext()) { | |||
105 | EXPECT_TRUE(second->getContext())switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar_ = ::testing::AssertionResult(second->getContext ())) ; else ::testing::internal::AssertHelper(::testing::TestPartResult ::kNonFatalFailure, "test_utils.cc", 105, ::testing::internal ::GetBoolAssertionFailureMessage( gtest_ar_, "second->getContext()" , "false", "true") .c_str()) = ::testing::Message(); | |||
106 | if (second->getContext()) { | |||
107 | EXPECT_EQ(first->getContext()->str(), second->getContext()->str())switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar = (::testing::internal::EqHelper::Compare("first->getContext()->str()" , "second->getContext()->str()", first->getContext() ->str(), second->getContext()->str()))) ; else ::testing ::internal::AssertHelper(::testing::TestPartResult::kNonFatalFailure , "test_utils.cc", 107, gtest_ar.failure_message()) = ::testing ::Message(); | |||
108 | } | |||
109 | } else { | |||
110 | EXPECT_FALSE(second->getContext())switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar_ = ::testing::AssertionResult(!(second->getContext ()))) ; else ::testing::internal::AssertHelper(::testing::TestPartResult ::kNonFatalFailure, "test_utils.cc", 110, ::testing::internal ::GetBoolAssertionFailureMessage( gtest_ar_, "second->getContext()" , "true", "false") .c_str()) = ::testing::Message(); | |||
111 | } | |||
112 | } | |||
113 | ||||
114 | int findLastSocketFd() { | |||
115 | int max_fd_number = getdtablesize(); | |||
116 | int last_socket = -1; | |||
117 | struct stat stats; | |||
118 | ||||
119 | // Iterate over the open fds | |||
120 | for (int fd = 0; fd <= max_fd_number; fd++ ) { | |||
| ||||
121 | errno(*__errno_location ()) = 0; | |||
122 | fstat(fd, &stats); | |||
123 | ||||
124 | if (errno(*__errno_location ()) == EBADF9 ) { | |||
| ||||
125 | // Skip any that aren't open | |||
126 | continue; | |||
127 | } | |||
128 | ||||
129 | // it's a socket, remember it | |||
130 | if (S_ISSOCK(stats.st_mode)((((stats.st_mode)) & 0170000) == (0140000))) { | |||
131 | last_socket = fd; | |||
132 | } | |||
133 | } | |||
134 | ||||
135 | return (last_socket); | |||
136 | } | |||
137 | ||||
138 | FillFdHoles::FillFdHoles(int limit) : fds_() { | |||
139 | if (limit <= 0) { | |||
140 | return; | |||
141 | } | |||
142 | for (;;) { | |||
143 | int fd = open("/dev/null", O_RDWR02, 0); | |||
144 | if (fd == -1) { | |||
145 | return; | |||
146 | } | |||
147 | if (fd < limit) { | |||
148 | fds_.push_front(fd); | |||
149 | } else { | |||
150 | static_cast<void>(close(fd)); | |||
151 | return; | |||
152 | } | |||
153 | } | |||
154 | } | |||
155 | ||||
156 | FillFdHoles::~FillFdHoles() { | |||
157 | while (!fds_.empty()) { | |||
158 | static_cast<void>(close(fds_.back())); | |||
159 | fds_.pop_back(); | |||
160 | } | |||
161 | } | |||
162 | ||||
163 | } // namespace test | |||
164 | } // namespace dhcp | |||
165 | } // namespace isc |