generic_lease_mgr_unittest.cc 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425
  1. // Copyright (C) 2014 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 <dhcpsrv/tests/generic_lease_mgr_unittest.h>
  15. #include <dhcpsrv/tests/test_utils.h>
  16. #include <asiolink/io_address.h>
  17. #include <gtest/gtest.h>
  18. #include <sstream>
  19. using namespace std;
  20. using namespace isc::asiolink;
  21. namespace isc {
  22. namespace dhcp {
  23. namespace test {
  24. // IPv4 and IPv6 addresses used in the tests
  25. const char* ADDRESS4[] = {
  26. "192.0.2.0", "192.0.2.1", "192.0.2.2", "192.0.2.3",
  27. "192.0.2.4", "192.0.2.5", "192.0.2.6", "192.0.2.7",
  28. NULL
  29. };
  30. const char* ADDRESS6[] = {
  31. "2001:db8::0", "2001:db8::1", "2001:db8::2", "2001:db8::3",
  32. "2001:db8::4", "2001:db8::5", "2001:db8::6", "2001:db8::7",
  33. NULL
  34. };
  35. // Lease types that correspond to ADDRESS6 leases
  36. static const Lease::Type LEASETYPE6[] = {
  37. Lease::TYPE_NA, Lease::TYPE_TA, Lease::TYPE_PD, Lease::TYPE_NA,
  38. Lease::TYPE_TA, Lease::TYPE_PD, Lease::TYPE_NA, Lease::TYPE_TA
  39. };
  40. GenericLeaseMgrTest::GenericLeaseMgrTest()
  41. : lmptr_(NULL) {
  42. // Initialize address strings and IOAddresses
  43. for (int i = 0; ADDRESS4[i] != NULL; ++i) {
  44. string addr(ADDRESS4[i]);
  45. straddress4_.push_back(addr);
  46. IOAddress ioaddr(addr);
  47. ioaddress4_.push_back(ioaddr);
  48. }
  49. for (int i = 0; ADDRESS6[i] != NULL; ++i) {
  50. string addr(ADDRESS6[i]);
  51. straddress6_.push_back(addr);
  52. IOAddress ioaddr(addr);
  53. ioaddress6_.push_back(ioaddr);
  54. /// Let's create different lease types. We use LEASETYPE6 values as
  55. /// a template
  56. leasetype6_.push_back(LEASETYPE6[i]);
  57. }
  58. }
  59. GenericLeaseMgrTest::~GenericLeaseMgrTest() {
  60. // Does nothing. The derived classes are expected to clean up, i.e.
  61. // remove the lmptr_ pointer.
  62. }
  63. Lease4Ptr
  64. GenericLeaseMgrTest::initializeLease4(std::string address) {
  65. Lease4Ptr lease(new Lease4());
  66. // Set the address of the lease
  67. lease->addr_ = IOAddress(address);
  68. // Initialize unused fields.
  69. lease->ext_ = 0; // Not saved
  70. lease->t1_ = 0; // Not saved
  71. lease->t2_ = 0; // Not saved
  72. lease->fixed_ = false; // Unused
  73. lease->comments_ = std::string(""); // Unused
  74. // Set other parameters. For historical reasons, address 0 is not used.
  75. if (address == straddress4_[0]) {
  76. lease->hwaddr_ = vector<uint8_t>(6, 0x08);
  77. lease->client_id_ = ClientIdPtr(new ClientId(vector<uint8_t>(8, 0x42)));
  78. lease->valid_lft_ = 8677;
  79. lease->cltt_ = 168256;
  80. lease->subnet_id_ = 23;
  81. lease->fqdn_rev_ = true;
  82. lease->fqdn_fwd_ = false;
  83. lease->hostname_ = "myhost.example.com.";
  84. } else if (address == straddress4_[1]) {
  85. lease->hwaddr_ = vector<uint8_t>(6, 0x19);
  86. lease->client_id_ = ClientIdPtr(
  87. new ClientId(vector<uint8_t>(8, 0x53)));
  88. lease->valid_lft_ = 3677;
  89. lease->cltt_ = 123456;
  90. lease->subnet_id_ = 73;
  91. lease->fqdn_rev_ = true;
  92. lease->fqdn_fwd_ = true;
  93. lease->hostname_ = "myhost.example.com.";
  94. } else if (address == straddress4_[2]) {
  95. lease->hwaddr_ = vector<uint8_t>(6, 0x2a);
  96. lease->client_id_ = ClientIdPtr(new ClientId(vector<uint8_t>(8, 0x64)));
  97. lease->valid_lft_ = 5412;
  98. lease->cltt_ = 234567;
  99. lease->subnet_id_ = 73; // Same as lease 1
  100. lease->fqdn_rev_ = false;
  101. lease->fqdn_fwd_ = false;
  102. lease->hostname_ = "";
  103. } else if (address == straddress4_[3]) {
  104. lease->hwaddr_ = vector<uint8_t>(6, 0x19); // Same as lease 1
  105. lease->client_id_ = ClientIdPtr(
  106. new ClientId(vector<uint8_t>(8, 0x75)));
  107. // The times used in the next tests are deliberately restricted - we
  108. // should be able to cope with valid lifetimes up to 0xffffffff.
  109. // However, this will lead to overflows.
  110. // @TODO: test overflow conditions when code has been fixed
  111. lease->valid_lft_ = 7000;
  112. lease->cltt_ = 234567;
  113. lease->subnet_id_ = 37;
  114. lease->fqdn_rev_ = true;
  115. lease->fqdn_fwd_ = true;
  116. lease->hostname_ = "otherhost.example.com.";
  117. } else if (address == straddress4_[4]) {
  118. lease->hwaddr_ = vector<uint8_t>(6, 0x4c);
  119. // Same ClientId as straddr4_[1]
  120. lease->client_id_ = ClientIdPtr(
  121. new ClientId(vector<uint8_t>(8, 0x53))); // Same as lease 1
  122. lease->valid_lft_ = 7736;
  123. lease->cltt_ = 222456;
  124. lease->subnet_id_ = 85;
  125. lease->fqdn_rev_ = true;
  126. lease->fqdn_fwd_ = true;
  127. lease->hostname_ = "otherhost.example.com.";
  128. } else if (address == straddress4_[5]) {
  129. lease->hwaddr_ = vector<uint8_t>(6, 0x19); // Same as lease 1
  130. // Same ClientId and IAID as straddress4_1
  131. lease->client_id_ = ClientIdPtr(
  132. new ClientId(vector<uint8_t>(8, 0x53))); // Same as lease 1
  133. lease->valid_lft_ = 7832;
  134. lease->cltt_ = 227476;
  135. lease->subnet_id_ = 175;
  136. lease->fqdn_rev_ = false;
  137. lease->fqdn_fwd_ = false;
  138. lease->hostname_ = "otherhost.example.com.";
  139. } else if (address == straddress4_[6]) {
  140. lease->hwaddr_ = vector<uint8_t>(6, 0x6e);
  141. // Same ClientId as straddress4_1
  142. lease->client_id_ = ClientIdPtr(
  143. new ClientId(vector<uint8_t>(8, 0x53))); // Same as lease 1
  144. lease->valid_lft_ = 1832;
  145. lease->cltt_ = 627476;
  146. lease->subnet_id_ = 112;
  147. lease->fqdn_rev_ = false;
  148. lease->fqdn_fwd_ = true;
  149. lease->hostname_ = "myhost.example.com.";
  150. } else if (address == straddress4_[7]) {
  151. lease->hwaddr_ = vector<uint8_t>(); // Empty
  152. lease->client_id_ = ClientIdPtr(); // Empty
  153. lease->valid_lft_ = 7975;
  154. lease->cltt_ = 213876;
  155. lease->subnet_id_ = 19;
  156. lease->fqdn_rev_ = true;
  157. lease->fqdn_fwd_ = true;
  158. lease->hostname_ = "myhost.example.com.";
  159. } else {
  160. // Unknown address, return an empty pointer.
  161. lease.reset();
  162. }
  163. return (lease);
  164. }
  165. Lease6Ptr
  166. GenericLeaseMgrTest::initializeLease6(std::string address) {
  167. Lease6Ptr lease(new Lease6());
  168. // Set the address of the lease
  169. lease->addr_ = IOAddress(address);
  170. // Initialize unused fields.
  171. lease->t1_ = 0; // Not saved
  172. lease->t2_ = 0; // Not saved
  173. lease->fixed_ = false; // Unused
  174. lease->comments_ = std::string(""); // Unused
  175. // Set other parameters. For historical reasons, address 0 is not used.
  176. if (address == straddress6_[0]) {
  177. lease->type_ = leasetype6_[0];
  178. lease->prefixlen_ = 4;
  179. lease->iaid_ = 142;
  180. lease->duid_ = DuidPtr(new DUID(vector<uint8_t>(8, 0x77)));
  181. lease->preferred_lft_ = 900;
  182. lease->valid_lft_ = 8677;
  183. lease->cltt_ = 168256;
  184. lease->subnet_id_ = 23;
  185. lease->fqdn_fwd_ = true;
  186. lease->fqdn_rev_ = true;
  187. lease->hostname_ = "myhost.example.com.";
  188. } else if (address == straddress6_[1]) {
  189. lease->type_ = leasetype6_[1];
  190. lease->prefixlen_ = 0;
  191. lease->iaid_ = 42;
  192. lease->duid_ = DuidPtr(new DUID(vector<uint8_t>(8, 0x42)));
  193. lease->preferred_lft_ = 3600;
  194. lease->valid_lft_ = 3677;
  195. lease->cltt_ = 123456;
  196. lease->subnet_id_ = 73;
  197. lease->fqdn_fwd_ = false;
  198. lease->fqdn_rev_ = true;
  199. lease->hostname_ = "myhost.example.com.";
  200. } else if (address == straddress6_[2]) {
  201. lease->type_ = leasetype6_[2];
  202. lease->prefixlen_ = 7;
  203. lease->iaid_ = 89;
  204. lease->duid_ = DuidPtr(new DUID(vector<uint8_t>(8, 0x3a)));
  205. lease->preferred_lft_ = 1800;
  206. lease->valid_lft_ = 5412;
  207. lease->cltt_ = 234567;
  208. lease->subnet_id_ = 73; // Same as lease 1
  209. lease->fqdn_fwd_ = false;
  210. lease->fqdn_rev_ = false;
  211. lease->hostname_ = "myhost.example.com.";
  212. } else if (address == straddress6_[3]) {
  213. lease->type_ = leasetype6_[3];
  214. lease->prefixlen_ = 28;
  215. lease->iaid_ = 0xfffffffe;
  216. vector<uint8_t> duid;
  217. for (uint8_t i = 31; i < 126; ++i) {
  218. duid.push_back(i);
  219. }
  220. lease->duid_ = DuidPtr(new DUID(duid));
  221. // The times used in the next tests are deliberately restricted - we
  222. // should be able to cope with valid lifetimes up to 0xffffffff.
  223. // However, this will lead to overflows.
  224. // @TODO: test overflow conditions when code has been fixed
  225. lease->preferred_lft_ = 7200;
  226. lease->valid_lft_ = 7000;
  227. lease->cltt_ = 234567;
  228. lease->subnet_id_ = 37;
  229. lease->fqdn_fwd_ = true;
  230. lease->fqdn_rev_ = false;
  231. lease->hostname_ = "myhost.example.com.";
  232. } else if (address == straddress6_[4]) {
  233. // Same DUID and IAID as straddress6_1
  234. lease->type_ = leasetype6_[4];
  235. lease->prefixlen_ = 15;
  236. lease->iaid_ = 42;
  237. lease->duid_ = DuidPtr(new DUID(vector<uint8_t>(8, 0x42)));
  238. lease->preferred_lft_ = 4800;
  239. lease->valid_lft_ = 7736;
  240. lease->cltt_ = 222456;
  241. lease->subnet_id_ = 671;
  242. lease->fqdn_fwd_ = true;
  243. lease->fqdn_rev_ = true;
  244. lease->hostname_ = "otherhost.example.com.";
  245. } else if (address == straddress6_[5]) {
  246. // Same DUID and IAID as straddress6_1
  247. lease->type_ = leasetype6_[5];
  248. lease->prefixlen_ = 24;
  249. lease->iaid_ = 42; // Same as lease 4
  250. lease->duid_ = DuidPtr(new DUID(vector<uint8_t>(8, 0x42)));
  251. // Same as lease 4
  252. lease->preferred_lft_ = 5400;
  253. lease->valid_lft_ = 7832;
  254. lease->cltt_ = 227476;
  255. lease->subnet_id_ = 175;
  256. lease->fqdn_fwd_ = false;
  257. lease->fqdn_rev_ = true;
  258. lease->hostname_ = "hostname.example.com.";
  259. } else if (address == straddress6_[6]) {
  260. // Same DUID as straddress6_1
  261. lease->type_ = leasetype6_[6];
  262. lease->prefixlen_ = 24;
  263. lease->iaid_ = 93;
  264. lease->duid_ = DuidPtr(new DUID(vector<uint8_t>(8, 0x42)));
  265. // Same as lease 4
  266. lease->preferred_lft_ = 5400;
  267. lease->valid_lft_ = 1832;
  268. lease->cltt_ = 627476;
  269. lease->subnet_id_ = 112;
  270. lease->fqdn_fwd_ = false;
  271. lease->fqdn_rev_ = true;
  272. lease->hostname_ = "hostname.example.com.";
  273. } else if (address == straddress6_[7]) {
  274. // Same IAID as straddress6_1
  275. lease->type_ = leasetype6_[7];
  276. lease->prefixlen_ = 24;
  277. lease->iaid_ = 42;
  278. lease->duid_ = DuidPtr(new DUID(vector<uint8_t>(8, 0xe5)));
  279. lease->preferred_lft_ = 5600;
  280. lease->valid_lft_ = 7975;
  281. lease->cltt_ = 213876;
  282. lease->subnet_id_ = 19;
  283. lease->fqdn_fwd_ = false;
  284. lease->fqdn_rev_ = true;
  285. lease->hostname_ = "hostname.example.com.";
  286. } else {
  287. // Unknown address, return an empty pointer.
  288. lease.reset();
  289. }
  290. return (lease);
  291. }
  292. template <typename T>
  293. void GenericLeaseMgrTest::checkLeasesDifferent(const std::vector<T>& leases) const {
  294. // Check they were created
  295. for (int i = 0; i < leases.size(); ++i) {
  296. ASSERT_TRUE(leases[i]);
  297. }
  298. // Check they are different
  299. for (int i = 0; i < (leases.size() - 1); ++i) {
  300. for (int j = (i + 1); j < leases.size(); ++j) {
  301. stringstream s;
  302. s << "Comparing leases " << i << " & " << j << " for equality";
  303. SCOPED_TRACE(s.str());
  304. EXPECT_TRUE(*leases[i] != *leases[j]);
  305. }
  306. }
  307. }
  308. vector<Lease4Ptr>
  309. GenericLeaseMgrTest::createLeases4() {
  310. // Create leases for each address
  311. vector<Lease4Ptr> leases;
  312. for (int i = 0; i < straddress4_.size(); ++i) {
  313. leases.push_back(initializeLease4(straddress4_[i]));
  314. }
  315. EXPECT_EQ(8, leases.size());
  316. // Check all were created and that they are different.
  317. checkLeasesDifferent(leases);
  318. return (leases);
  319. }
  320. vector<Lease6Ptr>
  321. GenericLeaseMgrTest::createLeases6() {
  322. // Create leases for each address
  323. vector<Lease6Ptr> leases;
  324. for (int i = 0; i < straddress6_.size(); ++i) {
  325. leases.push_back(initializeLease6(straddress6_[i]));
  326. }
  327. EXPECT_EQ(8, leases.size());
  328. // Check all were created and that they are different.
  329. checkLeasesDifferent(leases);
  330. return (leases);
  331. }
  332. void
  333. GenericLeaseMgrTest::testGetLease4ClientId() {
  334. // Let's initialize a specific lease ...
  335. Lease4Ptr lease = initializeLease4(straddress4_[1]);
  336. EXPECT_TRUE(lmptr_->addLease(lease));
  337. Lease4Collection returned = lmptr_->getLease4(*lease->client_id_);
  338. ASSERT_EQ(1, returned.size());
  339. // We should retrieve our lease...
  340. detailCompareLease(lease, *returned.begin());
  341. lease = initializeLease4(straddress4_[2]);
  342. returned = lmptr_->getLease4(*lease->client_id_);
  343. ASSERT_EQ(0, returned.size());
  344. }
  345. void
  346. GenericLeaseMgrTest::testGetLease4NullClientId() {
  347. // Let's initialize a specific lease ... But this time
  348. // We keep its client id for further lookup and
  349. // We clearly 'reset' it ...
  350. Lease4Ptr leaseA = initializeLease4(straddress4_[4]);
  351. ClientIdPtr client_id = leaseA->client_id_;
  352. leaseA->client_id_ = ClientIdPtr();
  353. ASSERT_TRUE(lmptr_->addLease(leaseA));
  354. Lease4Collection returned = lmptr_->getLease4(*client_id);
  355. // Shouldn't have our previous lease ...
  356. ASSERT_TRUE(returned.empty());
  357. // Add another lease with the non-NULL client id, and make sure that the
  358. // lookup will not break due to existence of both leases with non-NULL and
  359. // NULL client ids.
  360. Lease4Ptr leaseB = initializeLease4(straddress4_[0]);
  361. // Shouldn't throw any null pointer exception
  362. ASSERT_TRUE(lmptr_->addLease(leaseB));
  363. // Try to get the lease.
  364. returned = lmptr_->getLease4(*client_id);
  365. ASSERT_TRUE(returned.empty());
  366. // Let's make it more interesting and add another lease with NULL client id.
  367. Lease4Ptr leaseC = initializeLease4(straddress4_[5]);
  368. leaseC->client_id_.reset();
  369. ASSERT_TRUE(lmptr_->addLease(leaseC));
  370. returned = lmptr_->getLease4(*client_id);
  371. ASSERT_TRUE(returned.empty());
  372. // But getting the lease with non-NULL client id should be successful.
  373. returned = lmptr_->getLease4(*leaseB->client_id_);
  374. ASSERT_EQ(1, returned.size());
  375. }
  376. void
  377. GenericLeaseMgrTest::testLease4NullClientId() {
  378. // Get the leases to be used for the test.
  379. vector<Lease4Ptr> leases = createLeases4();
  380. // Let's clear client-id pointers
  381. leases[1]->client_id_ = ClientIdPtr();
  382. leases[2]->client_id_ = ClientIdPtr();
  383. leases[3]->client_id_ = ClientIdPtr();
  384. // Start the tests. Add three leases to the database, read them back and
  385. // check they are what we think they are.
  386. EXPECT_TRUE(lmptr_->addLease(leases[1]));
  387. EXPECT_TRUE(lmptr_->addLease(leases[2]));
  388. EXPECT_TRUE(lmptr_->addLease(leases[3]));
  389. lmptr_->commit();
  390. // Reopen the database to ensure that they actually got stored.
  391. reopen();
  392. Lease4Ptr l_returned = lmptr_->getLease4(ioaddress4_[1]);
  393. ASSERT_TRUE(l_returned);
  394. detailCompareLease(leases[1], l_returned);
  395. l_returned = lmptr_->getLease4(ioaddress4_[2]);
  396. ASSERT_TRUE(l_returned);
  397. detailCompareLease(leases[2], l_returned);
  398. l_returned = lmptr_->getLease4(ioaddress4_[3]);
  399. ASSERT_TRUE(l_returned);
  400. detailCompareLease(leases[3], l_returned);
  401. // Check that we can't add a second lease with the same address
  402. EXPECT_FALSE(lmptr_->addLease(leases[1]));
  403. // Check that we can get the lease by HWAddr
  404. HWAddr tmp(leases[2]->hwaddr_, HTYPE_ETHER);
  405. Lease4Collection returned = lmptr_->getLease4(tmp);
  406. ASSERT_EQ(1, returned.size());
  407. detailCompareLease(leases[2], *returned.begin());
  408. l_returned = lmptr_->getLease4(tmp, leases[2]->subnet_id_);
  409. ASSERT_TRUE(l_returned);
  410. detailCompareLease(leases[2], l_returned);
  411. // Check that we can update the lease
  412. // Modify some fields in lease 1 (not the address) and update it.
  413. ++leases[1]->subnet_id_;
  414. leases[1]->valid_lft_ *= 2;
  415. lmptr_->updateLease4(leases[1]);
  416. // ... and check that the lease is indeed updated
  417. l_returned = lmptr_->getLease4(ioaddress4_[1]);
  418. ASSERT_TRUE(l_returned);
  419. detailCompareLease(leases[1], l_returned);
  420. // Delete a lease, check that it's gone, and that we can't delete it
  421. // a second time.
  422. EXPECT_TRUE(lmptr_->deleteLease(ioaddress4_[1]));
  423. l_returned = lmptr_->getLease4(ioaddress4_[1]);
  424. EXPECT_FALSE(l_returned);
  425. EXPECT_FALSE(lmptr_->deleteLease(ioaddress4_[1]));
  426. // Check that the second address is still there.
  427. l_returned = lmptr_->getLease4(ioaddress4_[2]);
  428. ASSERT_TRUE(l_returned);
  429. detailCompareLease(leases[2], l_returned);
  430. }
  431. void
  432. GenericLeaseMgrTest::testGetLease4HWAddr1() {
  433. // Let's initialize two different leases 4 and just add the first ...
  434. Lease4Ptr leaseA = initializeLease4(straddress4_[5]);
  435. HWAddr hwaddrA(leaseA->hwaddr_, HTYPE_ETHER);
  436. HWAddr hwaddrB(vector<uint8_t>(6, 0x80), HTYPE_ETHER);
  437. EXPECT_TRUE(lmptr_->addLease(leaseA));
  438. // we should not have a lease, with this MAC Addr
  439. Lease4Collection returned = lmptr_->getLease4(hwaddrB);
  440. ASSERT_EQ(0, returned.size());
  441. // But with this one
  442. returned = lmptr_->getLease4(hwaddrA);
  443. ASSERT_EQ(1, returned.size());
  444. }
  445. void
  446. GenericLeaseMgrTest::testGetLease4HWAddr2() {
  447. // Get the leases to be used for the test and add to the database
  448. vector<Lease4Ptr> leases = createLeases4();
  449. for (int i = 0; i < leases.size(); ++i) {
  450. EXPECT_TRUE(lmptr_->addLease(leases[i]));
  451. }
  452. // Get the leases matching the hardware address of lease 1
  453. /// @todo: Simply use HWAddr directly once 2589 is implemented
  454. HWAddr tmp(leases[1]->hwaddr_, HTYPE_ETHER);
  455. Lease4Collection returned = lmptr_->getLease4(tmp);
  456. // Should be three leases, matching leases[1], [3] and [5].
  457. ASSERT_EQ(3, returned.size());
  458. // Easiest way to check is to look at the addresses.
  459. vector<string> addresses;
  460. for (Lease4Collection::const_iterator i = returned.begin();
  461. i != returned.end(); ++i) {
  462. addresses.push_back((*i)->addr_.toText());
  463. }
  464. sort(addresses.begin(), addresses.end());
  465. EXPECT_EQ(straddress4_[1], addresses[0]);
  466. EXPECT_EQ(straddress4_[3], addresses[1]);
  467. EXPECT_EQ(straddress4_[5], addresses[2]);
  468. // Repeat test with just one expected match
  469. /// @todo: Simply use HWAddr directly once 2589 is implemented
  470. returned = lmptr_->getLease4(HWAddr(leases[2]->hwaddr_, HTYPE_ETHER));
  471. ASSERT_EQ(1, returned.size());
  472. detailCompareLease(leases[2], *returned.begin());
  473. // Check that an empty vector is valid
  474. EXPECT_TRUE(leases[7]->hwaddr_.empty());
  475. /// @todo: Simply use HWAddr directly once 2589 is implemented
  476. returned = lmptr_->getLease4(HWAddr(leases[7]->hwaddr_, HTYPE_ETHER));
  477. ASSERT_EQ(1, returned.size());
  478. detailCompareLease(leases[7], *returned.begin());
  479. // Try to get something with invalid hardware address
  480. vector<uint8_t> invalid(6, 0);
  481. returned = lmptr_->getLease4(invalid);
  482. EXPECT_EQ(0, returned.size());
  483. }
  484. void
  485. GenericLeaseMgrTest::testGetLease4ClientIdHWAddrSubnetId() {
  486. Lease4Ptr leaseA = initializeLease4(straddress4_[4]);
  487. Lease4Ptr leaseB = initializeLease4(straddress4_[5]);
  488. Lease4Ptr leaseC = initializeLease4(straddress4_[6]);
  489. // Set NULL client id for one of the leases. This is to make sure that such
  490. // a lease may coexist with other leases with non NULL client id.
  491. leaseC->client_id_.reset();
  492. HWAddr hwaddrA(leaseA->hwaddr_, HTYPE_ETHER);
  493. HWAddr hwaddrB(leaseB->hwaddr_, HTYPE_ETHER);
  494. HWAddr hwaddrC(leaseC->hwaddr_, HTYPE_ETHER);
  495. EXPECT_TRUE(lmptr_->addLease(leaseA));
  496. EXPECT_TRUE(lmptr_->addLease(leaseB));
  497. EXPECT_TRUE(lmptr_->addLease(leaseC));
  498. // First case we should retrieve our lease
  499. Lease4Ptr lease = lmptr_->getLease4(*leaseA->client_id_, hwaddrA, leaseA->subnet_id_);
  500. detailCompareLease(lease, leaseA);
  501. // Retrieve the other lease.
  502. lease = lmptr_->getLease4(*leaseB->client_id_, hwaddrB, leaseB->subnet_id_);
  503. detailCompareLease(lease, leaseB);
  504. // The last lease has NULL client id so we will use a different getLease4 function
  505. // which doesn't require client id (just a hwaddr and subnet id).
  506. lease = lmptr_->getLease4(hwaddrC, leaseC->subnet_id_);
  507. detailCompareLease(lease, leaseC);
  508. // An attempt to retrieve the lease with non matching lease parameters should
  509. // result in NULL pointer being returned.
  510. lease = lmptr_->getLease4(*leaseA->client_id_, hwaddrB, leaseA->subnet_id_);
  511. EXPECT_FALSE(lease);
  512. lease = lmptr_->getLease4(*leaseA->client_id_, hwaddrA, leaseB->subnet_id_);
  513. EXPECT_FALSE(lease);
  514. }
  515. void
  516. GenericLeaseMgrTest::testAddGetDelete6(bool check_t1_t2) {
  517. IOAddress addr("2001:db8:1::456");
  518. uint8_t llt[] = {0, 1, 2, 3, 4, 5, 6, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf};
  519. DuidPtr duid(new DUID(llt, sizeof(llt)));
  520. uint32_t iaid = 7; // just a number
  521. SubnetID subnet_id = 8; // just another number
  522. Lease6Ptr lease(new Lease6(Lease::TYPE_NA, addr, duid, iaid, 100, 200, 50,
  523. 80, subnet_id));
  524. EXPECT_TRUE(lmptr_->addLease(lease));
  525. // should not be allowed to add a second lease with the same address
  526. EXPECT_FALSE(lmptr_->addLease(lease));
  527. Lease6Ptr x = lmptr_->getLease6(Lease::TYPE_NA,
  528. IOAddress("2001:db8:1::234"));
  529. EXPECT_EQ(Lease6Ptr(), x);
  530. x = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::456"));
  531. ASSERT_TRUE(x);
  532. EXPECT_EQ(x->addr_, addr);
  533. EXPECT_TRUE(*x->duid_ == *duid);
  534. EXPECT_EQ(x->iaid_, iaid);
  535. EXPECT_EQ(x->subnet_id_, subnet_id);
  536. // These are not important from lease management perspective, but
  537. // let's check them anyway.
  538. EXPECT_EQ(Lease::TYPE_NA, x->type_);
  539. EXPECT_EQ(100, x->preferred_lft_);
  540. EXPECT_EQ(200, x->valid_lft_);
  541. if (check_t1_t2) {
  542. // Backend supports T1,T2 storage: check the values
  543. EXPECT_EQ(50, x->t1_);
  544. EXPECT_EQ(80, x->t2_);
  545. } else {
  546. // Backend does not support storing, check that it returns 0s.
  547. EXPECT_EQ(0, x->t1_);
  548. EXPECT_EQ(0, x->t2_);
  549. }
  550. // Test getLease6(duid, iaid, subnet_id) - positive case
  551. Lease6Ptr y = lmptr_->getLease6(Lease::TYPE_NA, *duid, iaid, subnet_id);
  552. ASSERT_TRUE(y);
  553. EXPECT_TRUE(*y->duid_ == *duid);
  554. EXPECT_EQ(y->iaid_, iaid);
  555. EXPECT_EQ(y->addr_, addr);
  556. // Test getLease6(duid, iaid, subnet_id) - wrong iaid
  557. uint32_t invalid_iaid = 9; // no such iaid
  558. y = lmptr_->getLease6(Lease::TYPE_NA, *duid, invalid_iaid, subnet_id);
  559. EXPECT_FALSE(y);
  560. uint32_t invalid_subnet_id = 999;
  561. y = lmptr_->getLease6(Lease::TYPE_NA, *duid, iaid, invalid_subnet_id);
  562. EXPECT_FALSE(y);
  563. // truncated duid
  564. DuidPtr invalid_duid(new DUID(llt, sizeof(llt) - 1));
  565. y = lmptr_->getLease6(Lease::TYPE_NA, *invalid_duid, iaid, subnet_id);
  566. EXPECT_FALSE(y);
  567. // should return false - there's no such address
  568. EXPECT_FALSE(lmptr_->deleteLease(IOAddress("2001:db8:1::789")));
  569. // this one should succeed
  570. EXPECT_TRUE(lmptr_->deleteLease(IOAddress("2001:db8:1::456")));
  571. // after the lease is deleted, it should really be gone
  572. x = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::456"));
  573. EXPECT_EQ(Lease6Ptr(), x);
  574. }
  575. void
  576. GenericLeaseMgrTest::testBasicLease4() {
  577. // Get the leases to be used for the test.
  578. vector<Lease4Ptr> leases = createLeases4();
  579. // Start the tests. Add three leases to the database, read them back and
  580. // check they are what we think they are.
  581. EXPECT_TRUE(lmptr_->addLease(leases[1]));
  582. EXPECT_TRUE(lmptr_->addLease(leases[2]));
  583. EXPECT_TRUE(lmptr_->addLease(leases[3]));
  584. lmptr_->commit();
  585. // Reopen the database to ensure that they actually got stored.
  586. reopen();
  587. Lease4Ptr l_returned = lmptr_->getLease4(ioaddress4_[1]);
  588. ASSERT_TRUE(l_returned);
  589. detailCompareLease(leases[1], l_returned);
  590. l_returned = lmptr_->getLease4(ioaddress4_[2]);
  591. ASSERT_TRUE(l_returned);
  592. detailCompareLease(leases[2], l_returned);
  593. l_returned = lmptr_->getLease4(ioaddress4_[3]);
  594. ASSERT_TRUE(l_returned);
  595. detailCompareLease(leases[3], l_returned);
  596. // Check that we can't add a second lease with the same address
  597. EXPECT_FALSE(lmptr_->addLease(leases[1]));
  598. // Delete a lease, check that it's gone, and that we can't delete it
  599. // a second time.
  600. EXPECT_TRUE(lmptr_->deleteLease(ioaddress4_[1]));
  601. l_returned = lmptr_->getLease4(ioaddress4_[1]);
  602. EXPECT_FALSE(l_returned);
  603. EXPECT_FALSE(lmptr_->deleteLease(ioaddress4_[1]));
  604. // Check that the second address is still there.
  605. l_returned = lmptr_->getLease4(ioaddress4_[2]);
  606. ASSERT_TRUE(l_returned);
  607. detailCompareLease(leases[2], l_returned);
  608. reopen();
  609. // The deleted lease should be still gone after we re-read leases from
  610. // persistent storage.
  611. l_returned = lmptr_->getLease4(ioaddress4_[1]);
  612. EXPECT_FALSE(l_returned);
  613. l_returned = lmptr_->getLease4(ioaddress4_[2]);
  614. ASSERT_TRUE(l_returned);
  615. detailCompareLease(leases[2], l_returned);
  616. l_returned = lmptr_->getLease4(ioaddress4_[3]);
  617. ASSERT_TRUE(l_returned);
  618. detailCompareLease(leases[3], l_returned);
  619. // Update some FQDN data, so as we can check that update in
  620. // persistent storage works as expected.
  621. leases[2]->hostname_ = "memfile.example.com.";
  622. leases[2]->fqdn_rev_ = true;
  623. ASSERT_NO_THROW(lmptr_->updateLease4(leases[2]));
  624. reopen();
  625. // The lease should be now updated in the storage.
  626. l_returned = lmptr_->getLease4(ioaddress4_[2]);
  627. ASSERT_TRUE(l_returned);
  628. detailCompareLease(leases[2], l_returned);
  629. l_returned = lmptr_->getLease4(ioaddress4_[3]);
  630. ASSERT_TRUE(l_returned);
  631. detailCompareLease(leases[3], l_returned);
  632. }
  633. void
  634. GenericLeaseMgrTest::testBasicLease6() {
  635. // Get the leases to be used for the test.
  636. vector<Lease6Ptr> leases = createLeases6();
  637. // Start the tests. Add three leases to the database, read them back and
  638. // check they are what we think they are.
  639. EXPECT_TRUE(lmptr_->addLease(leases[1]));
  640. EXPECT_TRUE(lmptr_->addLease(leases[2]));
  641. EXPECT_TRUE(lmptr_->addLease(leases[3]));
  642. lmptr_->commit();
  643. // Reopen the database to ensure that they actually got stored.
  644. reopen();
  645. Lease6Ptr l_returned = lmptr_->getLease6(leasetype6_[1], ioaddress6_[1]);
  646. ASSERT_TRUE(l_returned);
  647. detailCompareLease(leases[1], l_returned);
  648. l_returned = lmptr_->getLease6(leasetype6_[2], ioaddress6_[2]);
  649. ASSERT_TRUE(l_returned);
  650. detailCompareLease(leases[2], l_returned);
  651. l_returned = lmptr_->getLease6(leasetype6_[3], ioaddress6_[3]);
  652. ASSERT_TRUE(l_returned);
  653. detailCompareLease(leases[3], l_returned);
  654. // Check that we can't add a second lease with the same address
  655. EXPECT_FALSE(lmptr_->addLease(leases[1]));
  656. // Delete a lease, check that it's gone, and that we can't delete it
  657. // a second time.
  658. EXPECT_TRUE(lmptr_->deleteLease(ioaddress6_[1]));
  659. l_returned = lmptr_->getLease6(leasetype6_[1], ioaddress6_[1]);
  660. EXPECT_FALSE(l_returned);
  661. EXPECT_FALSE(lmptr_->deleteLease(ioaddress6_[1]));
  662. // Check that the second address is still there.
  663. l_returned = lmptr_->getLease6(leasetype6_[2], ioaddress6_[2]);
  664. ASSERT_TRUE(l_returned);
  665. detailCompareLease(leases[2], l_returned);
  666. reopen();
  667. // The deleted lease should be still gone after we re-read leases from
  668. // persistent storage.
  669. l_returned = lmptr_->getLease6(leasetype6_[1], ioaddress6_[1]);
  670. EXPECT_FALSE(l_returned);
  671. // Check that the second address is still there.
  672. l_returned = lmptr_->getLease6(leasetype6_[2], ioaddress6_[2]);
  673. ASSERT_TRUE(l_returned);
  674. detailCompareLease(leases[2], l_returned);
  675. // Update some FQDN data, so as we can check that update in
  676. // persistent storage works as expected.
  677. leases[2]->hostname_ = "memfile.example.com.";
  678. leases[2]->fqdn_rev_ = true;
  679. ASSERT_NO_THROW(lmptr_->updateLease6(leases[2]));
  680. reopen();
  681. // The lease should be now updated in the storage.
  682. l_returned = lmptr_->getLease6(leasetype6_[2], ioaddress6_[2]);
  683. ASSERT_TRUE(l_returned);
  684. detailCompareLease(leases[2], l_returned);
  685. }
  686. void
  687. GenericLeaseMgrTest::testLease4InvalidHostname() {
  688. // Get the leases to be used for the test.
  689. vector<Lease4Ptr> leases = createLeases4();
  690. // Create a dummy hostname, consisting of 255 characters.
  691. leases[1]->hostname_.assign(255, 'a');
  692. ASSERT_TRUE(lmptr_->addLease(leases[1]));
  693. // The new lease must be in the database.
  694. Lease4Ptr l_returned = lmptr_->getLease4(ioaddress4_[1]);
  695. detailCompareLease(leases[1], l_returned);
  696. // Let's delete the lease, so as we can try to add it again with
  697. // invalid hostname.
  698. EXPECT_TRUE(lmptr_->deleteLease(ioaddress4_[1]));
  699. // Create a hostname with 256 characters. It should not be accepted.
  700. leases[1]->hostname_.assign(256, 'a');
  701. EXPECT_THROW(lmptr_->addLease(leases[1]), DbOperationError);
  702. }
  703. /// @brief Verify that too long hostname for Lease6 is not accepted.
  704. void
  705. GenericLeaseMgrTest::testLease6InvalidHostname() {
  706. // Get the leases to be used for the test.
  707. vector<Lease6Ptr> leases = createLeases6();
  708. // Create a dummy hostname, consisting of 255 characters.
  709. leases[1]->hostname_.assign(255, 'a');
  710. ASSERT_TRUE(lmptr_->addLease(leases[1]));
  711. // The new lease must be in the database.
  712. Lease6Ptr l_returned = lmptr_->getLease6(leasetype6_[1], ioaddress6_[1]);
  713. detailCompareLease(leases[1], l_returned);
  714. // Let's delete the lease, so as we can try to add it again with
  715. // invalid hostname.
  716. EXPECT_TRUE(lmptr_->deleteLease(ioaddress6_[1]));
  717. // Create a hostname with 256 characters. It should not be accepted.
  718. leases[1]->hostname_.assign(256, 'a');
  719. EXPECT_THROW(lmptr_->addLease(leases[1]), DbOperationError);
  720. }
  721. void
  722. GenericLeaseMgrTest::testGetLease4HWAddrSize() {
  723. // Create leases, although we need only one.
  724. vector<Lease4Ptr> leases = createLeases4();
  725. // Now add leases with increasing hardware address size.
  726. for (uint8_t i = 0; i <= HWAddr::MAX_HWADDR_LEN; ++i) {
  727. leases[1]->hwaddr_.resize(i, i);
  728. EXPECT_TRUE(lmptr_->addLease(leases[1]));
  729. /// @todo: Simply use HWAddr directly once 2589 is implemented
  730. Lease4Collection returned =
  731. lmptr_->getLease4(HWAddr(leases[1]->hwaddr_, HTYPE_ETHER));
  732. ASSERT_EQ(1, returned.size());
  733. detailCompareLease(leases[1], *returned.begin());
  734. (void) lmptr_->deleteLease(leases[1]->addr_);
  735. }
  736. // Database should not let us add one that is too big
  737. // (The 42 is a random value put in each byte of the address.)
  738. /// @todo: 2589 will make this test impossible
  739. leases[1]->hwaddr_.resize(HWAddr::MAX_HWADDR_LEN + 100, 42);
  740. EXPECT_THROW(lmptr_->addLease(leases[1]), isc::dhcp::DbOperationError);
  741. }
  742. void
  743. GenericLeaseMgrTest::testGetLease4HWAddrSubnetId() {
  744. // Get the leases to be used for the test and add to the database
  745. vector<Lease4Ptr> leases = createLeases4();
  746. for (int i = 0; i < leases.size(); ++i) {
  747. EXPECT_TRUE(lmptr_->addLease(leases[i]));
  748. }
  749. // Get the leases matching the hardware address of lease 1 and
  750. // subnet ID of lease 1. Result should be a single lease - lease 1.
  751. /// @todo: Simply use HWAddr directly once 2589 is implemented
  752. Lease4Ptr returned = lmptr_->getLease4(HWAddr(leases[1]->hwaddr_,
  753. HTYPE_ETHER), leases[1]->subnet_id_);
  754. ASSERT_TRUE(returned);
  755. detailCompareLease(leases[1], returned);
  756. // Try for a match to the hardware address of lease 1 and the wrong
  757. // subnet ID.
  758. /// @todo: Simply use HWAddr directly once 2589 is implemented
  759. returned = lmptr_->getLease4(HWAddr(leases[1]->hwaddr_, HTYPE_ETHER),
  760. leases[1]->subnet_id_ + 1);
  761. EXPECT_FALSE(returned);
  762. // Try for a match to the subnet ID of lease 1 (and lease 4) but
  763. // the wrong hardware address.
  764. vector<uint8_t> invalid_hwaddr(15, 0x77);
  765. /// @todo: Simply use HWAddr directly once 2589 is implemented
  766. returned = lmptr_->getLease4(HWAddr(invalid_hwaddr, HTYPE_ETHER),
  767. leases[1]->subnet_id_);
  768. EXPECT_FALSE(returned);
  769. // Try for a match to an unknown hardware address and an unknown
  770. // subnet ID.
  771. /// @todo: Simply use HWAddr directly once 2589 is implemented
  772. returned = lmptr_->getLease4(HWAddr(invalid_hwaddr, HTYPE_ETHER),
  773. leases[1]->subnet_id_ + 1);
  774. EXPECT_FALSE(returned);
  775. // Add a second lease with the same values as the first and check that
  776. // an attempt to access the database by these parameters throws a
  777. // "multiple records" exception. (We expect there to be only one record
  778. // with that combination, so getting them via getLeaseX() (as opposed
  779. // to getLeaseXCollection() should throw an exception.)
  780. EXPECT_TRUE(lmptr_->deleteLease(leases[2]->addr_));
  781. leases[1]->addr_ = leases[2]->addr_;
  782. EXPECT_TRUE(lmptr_->addLease(leases[1]));
  783. /// @todo: Simply use HWAddr directly once 2589 is implemented
  784. EXPECT_THROW(returned = lmptr_->getLease4(HWAddr(leases[1]->hwaddr_,
  785. HTYPE_ETHER),
  786. leases[1]->subnet_id_),
  787. isc::dhcp::MultipleRecords);
  788. }
  789. void
  790. GenericLeaseMgrTest::testGetLease4HWAddrSubnetIdSize() {
  791. // Create leases, although we need only one.
  792. vector<Lease4Ptr> leases = createLeases4();
  793. // Now add leases with increasing hardware address size and check
  794. // that they can be retrieved.
  795. for (uint8_t i = 0; i <= HWAddr::MAX_HWADDR_LEN; ++i) {
  796. leases[1]->hwaddr_.resize(i, i);
  797. EXPECT_TRUE(lmptr_->addLease(leases[1]));
  798. /// @todo: Simply use HWAddr directly once 2589 is implemented
  799. Lease4Ptr returned = lmptr_->getLease4(HWAddr(leases[1]->hwaddr_,
  800. HTYPE_ETHER),
  801. leases[1]->subnet_id_);
  802. ASSERT_TRUE(returned);
  803. detailCompareLease(leases[1], returned);
  804. (void) lmptr_->deleteLease(leases[1]->addr_);
  805. }
  806. // Database should not let us add one that is too big
  807. // (The 42 is a random value put in each byte of the address.)
  808. leases[1]->hwaddr_.resize(HWAddr::MAX_HWADDR_LEN + 100, 42);
  809. EXPECT_THROW(lmptr_->addLease(leases[1]), isc::dhcp::DbOperationError);
  810. }
  811. void
  812. GenericLeaseMgrTest::testGetLease4ClientId2() {
  813. // Get the leases to be used for the test and add to the database
  814. vector<Lease4Ptr> leases = createLeases4();
  815. for (int i = 0; i < leases.size(); ++i) {
  816. EXPECT_TRUE(lmptr_->addLease(leases[i]));
  817. }
  818. // Get the leases matching the Client ID address of lease 1
  819. Lease4Collection returned = lmptr_->getLease4(*leases[1]->client_id_);
  820. // Should be four leases, matching leases[1], [4], [5] and [6].
  821. ASSERT_EQ(4, returned.size());
  822. // Easiest way to check is to look at the addresses.
  823. vector<string> addresses;
  824. for (Lease4Collection::const_iterator i = returned.begin();
  825. i != returned.end(); ++i) {
  826. addresses.push_back((*i)->addr_.toText());
  827. }
  828. sort(addresses.begin(), addresses.end());
  829. EXPECT_EQ(straddress4_[1], addresses[0]);
  830. EXPECT_EQ(straddress4_[4], addresses[1]);
  831. EXPECT_EQ(straddress4_[5], addresses[2]);
  832. EXPECT_EQ(straddress4_[6], addresses[3]);
  833. // Repeat test with just one expected match
  834. returned = lmptr_->getLease4(*leases[3]->client_id_);
  835. ASSERT_EQ(1, returned.size());
  836. detailCompareLease(leases[3], *returned.begin());
  837. // Check that client-id is NULL
  838. EXPECT_FALSE(leases[7]->client_id_);
  839. HWAddr tmp(leases[7]->hwaddr_, HTYPE_ETHER);
  840. returned = lmptr_->getLease4(tmp);
  841. ASSERT_EQ(1, returned.size());
  842. detailCompareLease(leases[7], *returned.begin());
  843. // Try to get something with invalid client ID
  844. const uint8_t invalid_data[] = {0, 0, 0};
  845. ClientId invalid(invalid_data, sizeof(invalid_data));
  846. returned = lmptr_->getLease4(invalid);
  847. EXPECT_EQ(0, returned.size());
  848. }
  849. void
  850. GenericLeaseMgrTest::testGetLease4ClientIdSize() {
  851. // Create leases, although we need only one.
  852. vector<Lease4Ptr> leases = createLeases4();
  853. // Now add leases with increasing Client ID size can be retrieved.
  854. // For speed, go from 0 to 128 is steps of 16.
  855. // Intermediate client_id_max is to overcome problem if
  856. // ClientId::MAX_CLIENT_ID_LEN is used in an EXPECT_EQ.
  857. int client_id_max = ClientId::MAX_CLIENT_ID_LEN;
  858. EXPECT_EQ(128, client_id_max);
  859. int client_id_min = ClientId::MIN_CLIENT_ID_LEN;
  860. EXPECT_EQ(2, client_id_min); // See RFC2132, section 9.14
  861. for (uint8_t i = client_id_min; i <= client_id_max; i += 16) {
  862. vector<uint8_t> clientid_vec(i, i);
  863. leases[1]->client_id_.reset(new ClientId(clientid_vec));
  864. EXPECT_TRUE(lmptr_->addLease(leases[1]));
  865. Lease4Collection returned = lmptr_->getLease4(*leases[1]->client_id_);
  866. ASSERT_TRUE(returned.size() == 1);
  867. detailCompareLease(leases[1], *returned.begin());
  868. (void) lmptr_->deleteLease(leases[1]->addr_);
  869. }
  870. // Don't bother to check client IDs longer than the maximum -
  871. // these cannot be constructed, and that limitation is tested
  872. // in the DUID/Client ID unit tests.
  873. }
  874. void
  875. GenericLeaseMgrTest::testGetLease4ClientIdSubnetId() {
  876. // Get the leases to be used for the test and add to the database
  877. vector<Lease4Ptr> leases = createLeases4();
  878. for (int i = 0; i < leases.size(); ++i) {
  879. EXPECT_TRUE(lmptr_->addLease(leases[i]));
  880. }
  881. // Get the leases matching the client ID of lease 1 and
  882. // subnet ID of lease 1. Result should be a single lease - lease 1.
  883. Lease4Ptr returned = lmptr_->getLease4(*leases[1]->client_id_,
  884. leases[1]->subnet_id_);
  885. ASSERT_TRUE(returned);
  886. detailCompareLease(leases[1], returned);
  887. // Try for a match to the client ID of lease 1 and the wrong
  888. // subnet ID.
  889. returned = lmptr_->getLease4(*leases[1]->client_id_,
  890. leases[1]->subnet_id_ + 1);
  891. EXPECT_FALSE(returned);
  892. // Try for a match to the subnet ID of lease 1 (and lease 4) but
  893. // the wrong client ID
  894. const uint8_t invalid_data[] = {0, 0, 0};
  895. ClientId invalid(invalid_data, sizeof(invalid_data));
  896. returned = lmptr_->getLease4(invalid, leases[1]->subnet_id_);
  897. EXPECT_FALSE(returned);
  898. // Try for a match to an unknown hardware address and an unknown
  899. // subnet ID.
  900. returned = lmptr_->getLease4(invalid, leases[1]->subnet_id_ + 1);
  901. EXPECT_FALSE(returned);
  902. }
  903. void
  904. GenericLeaseMgrTest::testGetLeases6DuidIaid() {
  905. // Get the leases to be used for the test.
  906. vector<Lease6Ptr> leases = createLeases6();
  907. ASSERT_LE(6, leases.size()); // Expect to access leases 0 through 5
  908. // Add them to the database
  909. for (int i = 0; i < leases.size(); ++i) {
  910. EXPECT_TRUE(lmptr_->addLease(leases[i]));
  911. }
  912. // Get the leases matching the DUID and IAID of lease[1].
  913. Lease6Collection returned = lmptr_->getLeases6(leasetype6_[1],
  914. *leases[1]->duid_,
  915. leases[1]->iaid_);
  916. // Should be two leases, matching leases[1] and [4].
  917. ASSERT_EQ(2, returned.size());
  918. // Easiest way to check is to look at the addresses.
  919. vector<string> addresses;
  920. for (Lease6Collection::const_iterator i = returned.begin();
  921. i != returned.end(); ++i) {
  922. addresses.push_back((*i)->addr_.toText());
  923. }
  924. sort(addresses.begin(), addresses.end());
  925. EXPECT_EQ(straddress6_[1], addresses[0]);
  926. EXPECT_EQ(straddress6_[4], addresses[1]);
  927. // Check that nothing is returned when either the IAID or DUID match
  928. // nothing.
  929. returned = lmptr_->getLeases6(leasetype6_[1], *leases[1]->duid_,
  930. leases[1]->iaid_ + 1);
  931. EXPECT_EQ(0, returned.size());
  932. // Alter the leases[1] DUID to match nothing in the database.
  933. vector<uint8_t> duid_vector = leases[1]->duid_->getDuid();
  934. ++duid_vector[0];
  935. DUID new_duid(duid_vector);
  936. returned = lmptr_->getLeases6(leasetype6_[1], new_duid, leases[1]->iaid_);
  937. EXPECT_EQ(0, returned.size());
  938. }
  939. void
  940. GenericLeaseMgrTest::testGetLeases6DuidSize() {
  941. // Create leases, although we need only one.
  942. vector<Lease6Ptr> leases = createLeases6();
  943. // Now add leases with increasing DUID size can be retrieved.
  944. // For speed, go from 0 to 128 is steps of 16.
  945. int duid_max = DUID::MAX_DUID_LEN;
  946. EXPECT_EQ(128, duid_max);
  947. int duid_min = DUID::MIN_DUID_LEN;
  948. EXPECT_EQ(1, duid_min);
  949. for (uint8_t i = duid_min; i <= duid_max; i += 16) {
  950. vector<uint8_t> duid_vec(i, i);
  951. leases[1]->duid_.reset(new DUID(duid_vec));
  952. EXPECT_TRUE(lmptr_->addLease(leases[1]));
  953. Lease6Collection returned = lmptr_->getLeases6(leasetype6_[1],
  954. *leases[1]->duid_,
  955. leases[1]->iaid_);
  956. ASSERT_EQ(1, returned.size());
  957. detailCompareLease(leases[1], *returned.begin());
  958. (void) lmptr_->deleteLease(leases[1]->addr_);
  959. }
  960. // Don't bother to check DUIDs longer than the maximum - these cannot be
  961. // constructed, and that limitation is tested in the DUID/Client ID unit
  962. // tests.
  963. }
  964. void
  965. GenericLeaseMgrTest::testLease6LeaseTypeCheck() {
  966. Lease6Ptr empty_lease(new Lease6());
  967. DuidPtr duid(new DUID(vector<uint8_t>(8, 0x77)));
  968. // Initialize unused fields.
  969. empty_lease->t1_ = 0; // Not saved
  970. empty_lease->t2_ = 0; // Not saved
  971. empty_lease->fixed_ = false; // Unused
  972. empty_lease->comments_ = std::string(""); // Unused
  973. empty_lease->iaid_ = 142;
  974. empty_lease->duid_ = DuidPtr(new DUID(*duid));
  975. empty_lease->subnet_id_ = 23;
  976. empty_lease->preferred_lft_ = 100;
  977. empty_lease->valid_lft_ = 100;
  978. empty_lease->cltt_ = 100;
  979. empty_lease->fqdn_fwd_ = true;
  980. empty_lease->fqdn_rev_ = true;
  981. empty_lease->hostname_ = "myhost.example.com.";
  982. empty_lease->prefixlen_ = 4;
  983. // Make Two leases per lease type, all with the same DUID, IAID but
  984. // alternate the subnet_ids.
  985. vector<Lease6Ptr> leases;
  986. for (int i = 0; i < 6; ++i) {
  987. Lease6Ptr lease(new Lease6(*empty_lease));
  988. lease->type_ = leasetype6_[i / 2];
  989. lease->addr_ = IOAddress(straddress6_[i]);
  990. lease->subnet_id_ += (i % 2);
  991. leases.push_back(lease);
  992. EXPECT_TRUE(lmptr_->addLease(lease));
  993. }
  994. // Verify getting a single lease by type and address.
  995. for (int i = 0; i < 6; ++i) {
  996. // Look for exact match for each lease type.
  997. Lease6Ptr returned = lmptr_->getLease6(leasetype6_[i / 2],
  998. leases[i]->addr_);
  999. // We should match one per lease type.
  1000. ASSERT_TRUE(returned);
  1001. EXPECT_TRUE(*returned == *leases[i]);
  1002. // Same address but wrong lease type, should not match.
  1003. returned = lmptr_->getLease6(leasetype6_[i / 2 + 1], leases[i]->addr_);
  1004. ASSERT_FALSE(returned);
  1005. }
  1006. // Verify getting a collection of leases by type, DUID, and IAID.
  1007. // Iterate over the lease types, asking for leases based on
  1008. // lease type, DUID, and IAID.
  1009. for (int i = 0; i < 3; ++i) {
  1010. Lease6Collection returned = lmptr_->getLeases6(leasetype6_[i],
  1011. *duid, 142);
  1012. // We should match two per lease type.
  1013. ASSERT_EQ(2, returned.size());
  1014. // Collection order returned is not guaranteed.
  1015. // Easiest way to check is to look at the addresses.
  1016. vector<string> addresses;
  1017. for (Lease6Collection::const_iterator it = returned.begin();
  1018. it != returned.end(); ++it) {
  1019. addresses.push_back((*it)->addr_.toText());
  1020. }
  1021. sort(addresses.begin(), addresses.end());
  1022. // Now verify that the lease addresses match.
  1023. EXPECT_EQ(addresses[0], leases[(i * 2)]->addr_.toText());
  1024. EXPECT_EQ(addresses[1], leases[(i * 2 + 1)]->addr_.toText());
  1025. }
  1026. // Verify getting a collection of leases by type, DUID, IAID, and subnet id.
  1027. // Iterate over the lease types, asking for leases based on
  1028. // lease type, DUID, IAID, and subnet_id.
  1029. for (int i = 0; i < 3; ++i) {
  1030. Lease6Collection returned = lmptr_->getLeases6(leasetype6_[i],
  1031. *duid, 142, 23);
  1032. // We should match one per lease type.
  1033. ASSERT_EQ(1, returned.size());
  1034. EXPECT_TRUE(*(returned[0]) == *leases[i * 2]);
  1035. }
  1036. // Verify getting a single lease by type, duid, iad, and subnet id.
  1037. for (int i = 0; i < 6; ++i) {
  1038. Lease6Ptr returned = lmptr_->getLease6(leasetype6_[i / 2],
  1039. *duid, 142, (23 + (i % 2)));
  1040. // We should match one per lease type.
  1041. ASSERT_TRUE(returned);
  1042. EXPECT_TRUE(*returned == *leases[i]);
  1043. }
  1044. }
  1045. void
  1046. GenericLeaseMgrTest::testGetLease6DuidIaidSubnetId() {
  1047. // Get the leases to be used for the test and add them to the database.
  1048. vector<Lease6Ptr> leases = createLeases6();
  1049. for (int i = 0; i < leases.size(); ++i) {
  1050. EXPECT_TRUE(lmptr_->addLease(leases[i]));
  1051. }
  1052. // Get the leases matching the DUID and IAID of lease[1].
  1053. Lease6Ptr returned = lmptr_->getLease6(leasetype6_[1], *leases[1]->duid_,
  1054. leases[1]->iaid_,
  1055. leases[1]->subnet_id_);
  1056. ASSERT_TRUE(returned);
  1057. EXPECT_TRUE(*returned == *leases[1]);
  1058. // Modify each of the three parameters (DUID, IAID, Subnet ID) and
  1059. // check that nothing is returned.
  1060. returned = lmptr_->getLease6(leasetype6_[1], *leases[1]->duid_,
  1061. leases[1]->iaid_ + 1, leases[1]->subnet_id_);
  1062. EXPECT_FALSE(returned);
  1063. returned = lmptr_->getLease6(leasetype6_[1], *leases[1]->duid_,
  1064. leases[1]->iaid_, leases[1]->subnet_id_ + 1);
  1065. EXPECT_FALSE(returned);
  1066. // Alter the leases[1] DUID to match nothing in the database.
  1067. vector<uint8_t> duid_vector = leases[1]->duid_->getDuid();
  1068. ++duid_vector[0];
  1069. DUID new_duid(duid_vector);
  1070. returned = lmptr_->getLease6(leasetype6_[1], new_duid, leases[1]->iaid_,
  1071. leases[1]->subnet_id_);
  1072. EXPECT_FALSE(returned);
  1073. }
  1074. /// @brief Checks that getLease6() works with different DUID sizes
  1075. void
  1076. GenericLeaseMgrTest::testGetLease6DuidIaidSubnetIdSize() {
  1077. // Create leases, although we need only one.
  1078. vector<Lease6Ptr> leases = createLeases6();
  1079. // Now add leases with increasing DUID size can be retrieved.
  1080. // For speed, go from 0 to 128 is steps of 16.
  1081. int duid_max = DUID::MAX_DUID_LEN;
  1082. EXPECT_EQ(128, duid_max);
  1083. int duid_min = DUID::MIN_DUID_LEN;
  1084. EXPECT_EQ(1, duid_min);
  1085. for (uint8_t i = duid_min; i <= duid_max; i += 16) {
  1086. vector<uint8_t> duid_vec(i, i);
  1087. leases[1]->duid_.reset(new DUID(duid_vec));
  1088. EXPECT_TRUE(lmptr_->addLease(leases[1]));
  1089. Lease6Ptr returned = lmptr_->getLease6(leasetype6_[1], *leases[1]->duid_,
  1090. leases[1]->iaid_,
  1091. leases[1]->subnet_id_);
  1092. ASSERT_TRUE(returned);
  1093. detailCompareLease(leases[1], returned);
  1094. (void) lmptr_->deleteLease(leases[1]->addr_);
  1095. }
  1096. // Don't bother to check DUIDs longer than the maximum - these cannot be
  1097. // constructed, and that limitation is tested in the DUID/Client ID unit
  1098. // tests.
  1099. }
  1100. void
  1101. GenericLeaseMgrTest::testUpdateLease4() {
  1102. // Get the leases to be used for the test and add them to the database.
  1103. vector<Lease4Ptr> leases = createLeases4();
  1104. for (int i = 0; i < leases.size(); ++i) {
  1105. EXPECT_TRUE(lmptr_->addLease(leases[i]));
  1106. }
  1107. // Modify some fields in lease 1 (not the address) and update it.
  1108. ++leases[1]->subnet_id_;
  1109. leases[1]->valid_lft_ *= 2;
  1110. leases[1]->hostname_ = "modified.hostname.";
  1111. leases[1]->fqdn_fwd_ = !leases[1]->fqdn_fwd_;
  1112. leases[1]->fqdn_rev_ = !leases[1]->fqdn_rev_;;
  1113. lmptr_->updateLease4(leases[1]);
  1114. // ... and check what is returned is what is expected.
  1115. Lease4Ptr l_returned = lmptr_->getLease4(ioaddress4_[1]);
  1116. ASSERT_TRUE(l_returned);
  1117. detailCompareLease(leases[1], l_returned);
  1118. // Alter the lease again and check.
  1119. ++leases[1]->subnet_id_;
  1120. leases[1]->cltt_ += 6;
  1121. lmptr_->updateLease4(leases[1]);
  1122. // Explicitly clear the returned pointer before getting new data to ensure
  1123. // that the new data is returned.
  1124. l_returned.reset();
  1125. l_returned = lmptr_->getLease4(ioaddress4_[1]);
  1126. ASSERT_TRUE(l_returned);
  1127. detailCompareLease(leases[1], l_returned);
  1128. // Check we can do an update without changing data.
  1129. lmptr_->updateLease4(leases[1]);
  1130. l_returned.reset();
  1131. l_returned = lmptr_->getLease4(ioaddress4_[1]);
  1132. ASSERT_TRUE(l_returned);
  1133. detailCompareLease(leases[1], l_returned);
  1134. // Try to update the lease with the too long hostname.
  1135. leases[1]->hostname_.assign(256, 'a');
  1136. EXPECT_THROW(lmptr_->updateLease4(leases[1]), isc::dhcp::DbOperationError);
  1137. // Try updating a lease not in the database.
  1138. lmptr_->deleteLease(ioaddress4_[2]);
  1139. EXPECT_THROW(lmptr_->updateLease4(leases[2]), isc::dhcp::NoSuchLease);
  1140. }
  1141. void
  1142. GenericLeaseMgrTest::testUpdateLease6() {
  1143. // Get the leases to be used for the test.
  1144. vector<Lease6Ptr> leases = createLeases6();
  1145. ASSERT_LE(3, leases.size()); // Expect to access leases 0 through 2
  1146. // Add a lease to the database and check that the lease is there.
  1147. EXPECT_TRUE(lmptr_->addLease(leases[1]));
  1148. lmptr_->commit();
  1149. Lease6Ptr l_returned = lmptr_->getLease6(leasetype6_[1], ioaddress6_[1]);
  1150. ASSERT_TRUE(l_returned);
  1151. detailCompareLease(leases[1], l_returned);
  1152. // Modify some fields in lease 1 (not the address) and update it.
  1153. ++leases[1]->iaid_;
  1154. leases[1]->type_ = Lease::TYPE_PD;
  1155. leases[1]->valid_lft_ *= 2;
  1156. leases[1]->hostname_ = "modified.hostname.v6.";
  1157. leases[1]->fqdn_fwd_ = !leases[1]->fqdn_fwd_;
  1158. leases[1]->fqdn_rev_ = !leases[1]->fqdn_rev_;;
  1159. lmptr_->updateLease6(leases[1]);
  1160. lmptr_->commit();
  1161. // ... and check what is returned is what is expected.
  1162. l_returned.reset();
  1163. l_returned = lmptr_->getLease6(Lease::TYPE_PD, ioaddress6_[1]);
  1164. ASSERT_TRUE(l_returned);
  1165. detailCompareLease(leases[1], l_returned);
  1166. // Alter the lease again and check.
  1167. ++leases[1]->iaid_;
  1168. leases[1]->type_ = Lease::TYPE_TA;
  1169. leases[1]->cltt_ += 6;
  1170. leases[1]->prefixlen_ = 93;
  1171. lmptr_->updateLease6(leases[1]);
  1172. l_returned.reset();
  1173. l_returned = lmptr_->getLease6(Lease::TYPE_TA, ioaddress6_[1]);
  1174. ASSERT_TRUE(l_returned);
  1175. detailCompareLease(leases[1], l_returned);
  1176. // Check we can do an update without changing data.
  1177. lmptr_->updateLease6(leases[1]);
  1178. l_returned.reset();
  1179. l_returned = lmptr_->getLease6(Lease::TYPE_TA, ioaddress6_[1]);
  1180. ASSERT_TRUE(l_returned);
  1181. detailCompareLease(leases[1], l_returned);
  1182. // Try to update the lease with the too long hostname.
  1183. leases[1]->hostname_.assign(256, 'a');
  1184. EXPECT_THROW(lmptr_->updateLease6(leases[1]), isc::dhcp::DbOperationError);
  1185. // Try updating a lease not in the database.
  1186. EXPECT_THROW(lmptr_->updateLease6(leases[2]), isc::dhcp::NoSuchLease);
  1187. }
  1188. }; // namespace test
  1189. }; // namespace dhcp
  1190. }; // namespace isc