generic_lease_mgr_unittest.cc 60 KB

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