test_utils.cc 17 KB

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