test_utils.cc 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467
  1. // Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC")
  2. //
  3. // Permission to use, copy, modify, and/or distribute this software for any
  4. // purpose with or without fee is hereby granted, provided that the above
  5. // copyright notice and this permission notice appear in all copies.
  6. //
  7. // THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
  8. // REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
  9. // AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
  10. // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  11. // LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
  12. // OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  13. // PERFORMANCE OF THIS SOFTWARE.
  14. #include "test_utils.h"
  15. #include <asiolink/io_address.h>
  16. #include <gtest/gtest.h>
  17. #include <sstream>
  18. using namespace std;
  19. using namespace isc::asiolink;
  20. namespace isc {
  21. namespace dhcp {
  22. namespace test {
  23. // IPv4 and IPv6 addresses used in the tests
  24. const char* ADDRESS4[] = {
  25. "192.0.2.0", "192.0.2.1", "192.0.2.2", "192.0.2.3",
  26. "192.0.2.4", "192.0.2.5", "192.0.2.6", "192.0.2.7",
  27. NULL
  28. };
  29. const char* ADDRESS6[] = {
  30. "2001:db8::0", "2001:db8::1", "2001:db8::2", "2001:db8::3",
  31. "2001:db8::4", "2001:db8::5", "2001:db8::6", "2001:db8::7",
  32. NULL
  33. };
  34. void
  35. detailCompareLease(const Lease4Ptr& first, const Lease4Ptr& second) {
  36. // Compare address strings. Comparison of address objects is not used, as
  37. // odd things happen when they are different: the EXPECT_EQ macro appears to
  38. // call the operator uint32_t() function, which causes an exception to be
  39. // thrown for IPv6 addresses.
  40. EXPECT_EQ(first->addr_.toText(), second->addr_.toText());
  41. EXPECT_TRUE(first->hwaddr_ == second->hwaddr_);
  42. if (first->client_id_ && second->client_id_) {
  43. EXPECT_TRUE(*first->client_id_ == *second->client_id_);
  44. } else {
  45. if (first->client_id_ && !second->client_id_) {
  46. ADD_FAILURE() << "Client-id present in first lease ("
  47. << first->client_id_->getClientId().size()
  48. << " bytes), but missing in second.";
  49. }
  50. if (!first->client_id_ && second->client_id_) {
  51. ADD_FAILURE() << "Client-id missing in first lease, but present in second ("
  52. << second->client_id_->getClientId().size()
  53. << " bytes).";
  54. }
  55. // else here would mean that both leases do not have client_id_
  56. // which makes them equal in that regard. It is ok.
  57. }
  58. EXPECT_EQ(first->valid_lft_, second->valid_lft_);
  59. EXPECT_EQ(first->cltt_, second->cltt_);
  60. EXPECT_EQ(first->subnet_id_, second->subnet_id_);
  61. EXPECT_EQ(first->fqdn_fwd_, second->fqdn_fwd_);
  62. EXPECT_EQ(first->fqdn_rev_, second->fqdn_rev_);
  63. EXPECT_EQ(first->hostname_, second->hostname_);
  64. }
  65. void
  66. detailCompareLease(const Lease6Ptr& first, const Lease6Ptr& second) {
  67. EXPECT_EQ(first->type_, second->type_);
  68. // Compare address strings. Comparison of address objects is not used, as
  69. // odd things happen when they are different: the EXPECT_EQ macro appears to
  70. // call the operator uint32_t() function, which causes an exception to be
  71. // thrown for IPv6 addresses.
  72. EXPECT_EQ(first->addr_.toText(), second->addr_.toText());
  73. EXPECT_EQ(first->prefixlen_, second->prefixlen_);
  74. EXPECT_EQ(first->iaid_, second->iaid_);
  75. ASSERT_TRUE(first->duid_);
  76. ASSERT_TRUE(second->duid_);
  77. EXPECT_TRUE(*first->duid_ == *second->duid_);
  78. EXPECT_EQ(first->preferred_lft_, second->preferred_lft_);
  79. EXPECT_EQ(first->valid_lft_, second->valid_lft_);
  80. EXPECT_EQ(first->cltt_, second->cltt_);
  81. EXPECT_EQ(first->subnet_id_, second->subnet_id_);
  82. EXPECT_EQ(first->fqdn_fwd_, second->fqdn_fwd_);
  83. EXPECT_EQ(first->fqdn_rev_, second->fqdn_rev_);
  84. EXPECT_EQ(first->hostname_, second->hostname_);
  85. }
  86. GenericLeaseMgrTest::GenericLeaseMgrTest()
  87. :lmptr_(NULL) {
  88. // Initialize address strings and IOAddresses
  89. for (int i = 0; ADDRESS4[i] != NULL; ++i) {
  90. string addr(ADDRESS4[i]);
  91. straddress4_.push_back(addr);
  92. IOAddress ioaddr(addr);
  93. ioaddress4_.push_back(ioaddr);
  94. }
  95. for (int i = 0; ADDRESS6[i] != NULL; ++i) {
  96. string addr(ADDRESS6[i]);
  97. straddress6_.push_back(addr);
  98. IOAddress ioaddr(addr);
  99. ioaddress6_.push_back(ioaddr);
  100. /// Let's create different lease types
  101. leasetype6_.push_back(static_cast<Lease6::LeaseType>(i%3));
  102. }
  103. }
  104. /// @brief Initialize Lease4 Fields
  105. ///
  106. /// Returns a pointer to a Lease4 structure. Different values are put into
  107. /// the lease according to the address passed.
  108. ///
  109. /// This is just a convenience function for the test methods.
  110. ///
  111. /// @param address Address to use for the initialization
  112. ///
  113. /// @return Lease4Ptr. This will not point to anything if the
  114. /// initialization failed (e.g. unknown address).
  115. Lease4Ptr
  116. GenericLeaseMgrTest::initializeLease4(std::string address) {
  117. Lease4Ptr lease(new Lease4());
  118. // Set the address of the lease
  119. lease->addr_ = IOAddress(address);
  120. // Initialize unused fields.
  121. lease->ext_ = 0; // Not saved
  122. lease->t1_ = 0; // Not saved
  123. lease->t2_ = 0; // Not saved
  124. lease->fixed_ = false; // Unused
  125. lease->comments_ = std::string(""); // Unused
  126. // Set other parameters. For historical reasons, address 0 is not used.
  127. if (address == straddress4_[0]) {
  128. lease->hwaddr_ = vector<uint8_t>(6, 0x08);
  129. lease->client_id_ = ClientIdPtr(new ClientId(vector<uint8_t>(8, 0x42)));
  130. lease->valid_lft_ = 8677;
  131. lease->cltt_ = 168256;
  132. lease->subnet_id_ = 23;
  133. lease->fqdn_rev_ = true;
  134. lease->fqdn_fwd_ = false;
  135. lease->hostname_ = "myhost.example.com.";
  136. } else if (address == straddress4_[1]) {
  137. lease->hwaddr_ = vector<uint8_t>(6, 0x19);
  138. lease->client_id_ = ClientIdPtr(
  139. new ClientId(vector<uint8_t>(8, 0x53)));
  140. lease->valid_lft_ = 3677;
  141. lease->cltt_ = 123456;
  142. lease->subnet_id_ = 73;
  143. lease->fqdn_rev_ = true;
  144. lease->fqdn_fwd_ = true;
  145. lease->hostname_ = "myhost.example.com.";
  146. } else if (address == straddress4_[2]) {
  147. lease->hwaddr_ = vector<uint8_t>(6, 0x2a);
  148. lease->client_id_ = ClientIdPtr(new ClientId(vector<uint8_t>(8, 0x64)));
  149. lease->valid_lft_ = 5412;
  150. lease->cltt_ = 234567;
  151. lease->subnet_id_ = 73; // Same as lease 1
  152. lease->fqdn_rev_ = false;
  153. lease->fqdn_fwd_ = false;
  154. lease->hostname_ = "";
  155. } else if (address == straddress4_[3]) {
  156. lease->hwaddr_ = vector<uint8_t>(6, 0x19); // Same as lease 1
  157. lease->client_id_ = ClientIdPtr(
  158. new ClientId(vector<uint8_t>(8, 0x75)));
  159. // The times used in the next tests are deliberately restricted - we
  160. // should be able to cope with valid lifetimes up to 0xffffffff.
  161. // However, this will lead to overflows.
  162. // @TODO: test overflow conditions when code has been fixed
  163. lease->valid_lft_ = 7000;
  164. lease->cltt_ = 234567;
  165. lease->subnet_id_ = 37;
  166. lease->fqdn_rev_ = true;
  167. lease->fqdn_fwd_ = true;
  168. lease->hostname_ = "otherhost.example.com.";
  169. } else if (address == straddress4_[4]) {
  170. lease->hwaddr_ = vector<uint8_t>(6, 0x4c);
  171. // Same ClientId as straddr4_[1]
  172. lease->client_id_ = ClientIdPtr(
  173. new ClientId(vector<uint8_t>(8, 0x53))); // Same as lease 1
  174. lease->valid_lft_ = 7736;
  175. lease->cltt_ = 222456;
  176. lease->subnet_id_ = 85;
  177. lease->fqdn_rev_ = true;
  178. lease->fqdn_fwd_ = true;
  179. lease->hostname_ = "otherhost.example.com.";
  180. } else if (address == straddress4_[5]) {
  181. lease->hwaddr_ = vector<uint8_t>(6, 0x19); // Same as lease 1
  182. // Same ClientId and IAID as straddress4_1
  183. lease->client_id_ = ClientIdPtr(
  184. new ClientId(vector<uint8_t>(8, 0x53))); // Same as lease 1
  185. lease->valid_lft_ = 7832;
  186. lease->cltt_ = 227476;
  187. lease->subnet_id_ = 175;
  188. lease->fqdn_rev_ = false;
  189. lease->fqdn_fwd_ = false;
  190. lease->hostname_ = "otherhost.example.com.";
  191. } else if (address == straddress4_[6]) {
  192. lease->hwaddr_ = vector<uint8_t>(6, 0x6e);
  193. // Same ClientId as straddress4_1
  194. lease->client_id_ = ClientIdPtr(
  195. new ClientId(vector<uint8_t>(8, 0x53))); // Same as lease 1
  196. lease->valid_lft_ = 1832;
  197. lease->cltt_ = 627476;
  198. lease->subnet_id_ = 112;
  199. lease->fqdn_rev_ = false;
  200. lease->fqdn_fwd_ = true;
  201. lease->hostname_ = "myhost.example.com.";
  202. } else if (address == straddress4_[7]) {
  203. lease->hwaddr_ = vector<uint8_t>(); // Empty
  204. lease->client_id_ = ClientIdPtr(); // Empty
  205. lease->valid_lft_ = 7975;
  206. lease->cltt_ = 213876;
  207. lease->subnet_id_ = 19;
  208. lease->fqdn_rev_ = true;
  209. lease->fqdn_fwd_ = true;
  210. lease->hostname_ = "myhost.example.com.";
  211. } else {
  212. // Unknown address, return an empty pointer.
  213. lease.reset();
  214. }
  215. return (lease);
  216. }
  217. /// @brief Initialize Lease6 Fields
  218. ///
  219. /// Returns a pointer to a Lease6 structure. Different values are put into
  220. /// the lease according to the address passed.
  221. ///
  222. /// This is just a convenience function for the test methods.
  223. ///
  224. /// @param address Address to use for the initialization
  225. ///
  226. /// @return Lease6Ptr. This will not point to anything if the initialization
  227. /// failed (e.g. unknown address).
  228. Lease6Ptr
  229. GenericLeaseMgrTest::initializeLease6(std::string address) {
  230. Lease6Ptr lease(new Lease6());
  231. // Set the address of the lease
  232. lease->addr_ = IOAddress(address);
  233. // Initialize unused fields.
  234. lease->t1_ = 0; // Not saved
  235. lease->t2_ = 0; // Not saved
  236. lease->fixed_ = false; // Unused
  237. lease->comments_ = std::string(""); // Unused
  238. // Set other parameters. For historical reasons, address 0 is not used.
  239. if (address == straddress6_[0]) {
  240. lease->type_ = leasetype6_[0];
  241. lease->prefixlen_ = 4;
  242. lease->iaid_ = 142;
  243. lease->duid_ = DuidPtr(new DUID(vector<uint8_t>(8, 0x77)));
  244. lease->preferred_lft_ = 900;
  245. lease->valid_lft_ = 8677;
  246. lease->cltt_ = 168256;
  247. lease->subnet_id_ = 23;
  248. lease->fqdn_fwd_ = true;
  249. lease->fqdn_rev_ = true;
  250. lease->hostname_ = "myhost.example.com.";
  251. } else if (address == straddress6_[1]) {
  252. lease->type_ = leasetype6_[1];
  253. lease->prefixlen_ = 0;
  254. lease->iaid_ = 42;
  255. lease->duid_ = DuidPtr(new DUID(vector<uint8_t>(8, 0x42)));
  256. lease->preferred_lft_ = 3600;
  257. lease->valid_lft_ = 3677;
  258. lease->cltt_ = 123456;
  259. lease->subnet_id_ = 73;
  260. lease->fqdn_fwd_ = false;
  261. lease->fqdn_rev_ = true;
  262. lease->hostname_ = "myhost.example.com.";
  263. } else if (address == straddress6_[2]) {
  264. lease->type_ = leasetype6_[2];
  265. lease->prefixlen_ = 7;
  266. lease->iaid_ = 89;
  267. lease->duid_ = DuidPtr(new DUID(vector<uint8_t>(8, 0x3a)));
  268. lease->preferred_lft_ = 1800;
  269. lease->valid_lft_ = 5412;
  270. lease->cltt_ = 234567;
  271. lease->subnet_id_ = 73; // Same as lease 1
  272. lease->fqdn_fwd_ = false;
  273. lease->fqdn_rev_ = false;
  274. lease->hostname_ = "myhost.example.com.";
  275. } else if (address == straddress6_[3]) {
  276. lease->type_ = leasetype6_[3];
  277. lease->prefixlen_ = 28;
  278. lease->iaid_ = 0xfffffffe;
  279. vector<uint8_t> duid;
  280. for (uint8_t i = 31; i < 126; ++i) {
  281. duid.push_back(i);
  282. }
  283. lease->duid_ = DuidPtr(new DUID(duid));
  284. // The times used in the next tests are deliberately restricted - we
  285. // should be able to cope with valid lifetimes up to 0xffffffff.
  286. // However, this will lead to overflows.
  287. // @TODO: test overflow conditions when code has been fixed
  288. lease->preferred_lft_ = 7200;
  289. lease->valid_lft_ = 7000;
  290. lease->cltt_ = 234567;
  291. lease->subnet_id_ = 37;
  292. lease->fqdn_fwd_ = true;
  293. lease->fqdn_rev_ = false;
  294. lease->hostname_ = "myhost.example.com.";
  295. } else if (address == straddress6_[4]) {
  296. // Same DUID and IAID as straddress6_1
  297. lease->type_ = leasetype6_[4];
  298. lease->prefixlen_ = 15;
  299. lease->iaid_ = 42;
  300. lease->duid_ = DuidPtr(new DUID(vector<uint8_t>(8, 0x42)));
  301. lease->preferred_lft_ = 4800;
  302. lease->valid_lft_ = 7736;
  303. lease->cltt_ = 222456;
  304. lease->subnet_id_ = 671;
  305. lease->fqdn_fwd_ = true;
  306. lease->fqdn_rev_ = true;
  307. lease->hostname_ = "otherhost.example.com.";
  308. } else if (address == straddress6_[5]) {
  309. // Same DUID and IAID as straddress6_1
  310. lease->type_ = leasetype6_[5];
  311. lease->prefixlen_ = 24;
  312. lease->iaid_ = 42; // Same as lease 4
  313. lease->duid_ = DuidPtr(new DUID(vector<uint8_t>(8, 0x42)));
  314. // Same as lease 4
  315. lease->preferred_lft_ = 5400;
  316. lease->valid_lft_ = 7832;
  317. lease->cltt_ = 227476;
  318. lease->subnet_id_ = 175;
  319. lease->fqdn_fwd_ = false;
  320. lease->fqdn_rev_ = true;
  321. lease->hostname_ = "hostname.example.com.";
  322. } else if (address == straddress6_[6]) {
  323. // Same DUID as straddress6_1
  324. lease->type_ = leasetype6_[6];
  325. lease->prefixlen_ = 24;
  326. lease->iaid_ = 93;
  327. lease->duid_ = DuidPtr(new DUID(vector<uint8_t>(8, 0x42)));
  328. // Same as lease 4
  329. lease->preferred_lft_ = 5400;
  330. lease->valid_lft_ = 1832;
  331. lease->cltt_ = 627476;
  332. lease->subnet_id_ = 112;
  333. lease->fqdn_fwd_ = false;
  334. lease->fqdn_rev_ = true;
  335. lease->hostname_ = "hostname.example.com.";
  336. } else if (address == straddress6_[7]) {
  337. // Same IAID as straddress6_1
  338. lease->type_ = leasetype6_[7];
  339. lease->prefixlen_ = 24;
  340. lease->iaid_ = 42;
  341. lease->duid_ = DuidPtr(new DUID(vector<uint8_t>(8, 0xe5)));
  342. lease->preferred_lft_ = 5600;
  343. lease->valid_lft_ = 7975;
  344. lease->cltt_ = 213876;
  345. lease->subnet_id_ = 19;
  346. lease->fqdn_fwd_ = false;
  347. lease->fqdn_rev_ = true;
  348. lease->hostname_ = "hostname.example.com.";
  349. } else {
  350. // Unknown address, return an empty pointer.
  351. lease.reset();
  352. }
  353. return (lease);
  354. }
  355. /// @brief Check Leases present and different
  356. ///
  357. /// Checks a vector of lease pointers and ensures that all the leases
  358. /// they point to are present and different. If not, a GTest assertion
  359. /// will fail.
  360. ///
  361. /// @param leases Vector of pointers to leases
  362. template <typename T>
  363. void GenericLeaseMgrTest::checkLeasesDifferent(const std::vector<T>& leases) const {
  364. // Check they were created
  365. for (int i = 0; i < leases.size(); ++i) {
  366. ASSERT_TRUE(leases[i]);
  367. }
  368. // Check they are different
  369. for (int i = 0; i < (leases.size() - 1); ++i) {
  370. for (int j = (i + 1); j < leases.size(); ++j) {
  371. stringstream s;
  372. s << "Comparing leases " << i << " & " << j << " for equality";
  373. SCOPED_TRACE(s.str());
  374. EXPECT_TRUE(*leases[i] != *leases[j]);
  375. }
  376. }
  377. }
  378. /// @brief Creates leases for the test
  379. ///
  380. /// Creates all leases for the test and checks that they are different.
  381. ///
  382. /// @return vector<Lease4Ptr> Vector of pointers to leases
  383. vector<Lease4Ptr>
  384. GenericLeaseMgrTest::createLeases4() {
  385. // Create leases for each address
  386. vector<Lease4Ptr> leases;
  387. for (int i = 0; i < straddress4_.size(); ++i) {
  388. leases.push_back(initializeLease4(straddress4_[i]));
  389. }
  390. EXPECT_EQ(8, leases.size());
  391. // Check all were created and that they are different.
  392. checkLeasesDifferent(leases);
  393. return (leases);
  394. }
  395. /// @brief Creates leases for the test
  396. ///
  397. /// Creates all leases for the test and checks that they are different.
  398. ///
  399. /// @return vector<Lease6Ptr> Vector of pointers to leases
  400. vector<Lease6Ptr>
  401. GenericLeaseMgrTest::createLeases6() {
  402. // Create leases for each address
  403. vector<Lease6Ptr> leases;
  404. for (int i = 0; i < straddress6_.size(); ++i) {
  405. leases.push_back(initializeLease6(straddress6_[i]));
  406. }
  407. EXPECT_EQ(8, leases.size());
  408. // Check all were created and that they are different.
  409. checkLeasesDifferent(leases);
  410. return (leases);
  411. }
  412. };
  413. };
  414. };