generic_lease_mgr_unittest.cc 89 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399
  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->t1_ = 0; // Not saved
  71. lease->t2_ = 0; // Not saved
  72. // Set other parameters. For historical reasons, address 0 is not used.
  73. if (address == straddress4_[0]) {
  74. lease->hwaddr_.reset(new HWAddr(vector<uint8_t>(6, 0x08), HTYPE_ETHER));
  75. lease->client_id_ = ClientIdPtr(new ClientId(vector<uint8_t>(8, 0x42)));
  76. lease->valid_lft_ = 8677;
  77. lease->cltt_ = 168256;
  78. lease->subnet_id_ = 23;
  79. lease->fqdn_rev_ = true;
  80. lease->fqdn_fwd_ = false;
  81. lease->hostname_ = "myhost.example.com.";
  82. } else if (address == straddress4_[1]) {
  83. lease->hwaddr_.reset(new HWAddr(vector<uint8_t>(6, 0x19), HTYPE_ETHER));
  84. lease->client_id_ = ClientIdPtr(
  85. new ClientId(vector<uint8_t>(8, 0x53)));
  86. lease->valid_lft_ = 3677;
  87. lease->cltt_ = 123456;
  88. lease->subnet_id_ = 73;
  89. lease->fqdn_rev_ = true;
  90. lease->fqdn_fwd_ = true;
  91. lease->hostname_ = "myhost.example.com.";
  92. } else if (address == straddress4_[2]) {
  93. lease->hwaddr_.reset(new HWAddr(vector<uint8_t>(6, 0x2a), HTYPE_ETHER));
  94. lease->client_id_ = ClientIdPtr(new ClientId(vector<uint8_t>(8, 0x64)));
  95. lease->valid_lft_ = 5412;
  96. lease->cltt_ = 234567;
  97. lease->subnet_id_ = 73; // Same as lease 1
  98. lease->fqdn_rev_ = false;
  99. lease->fqdn_fwd_ = false;
  100. lease->hostname_ = "";
  101. } else if (address == straddress4_[3]) {
  102. // Hardware address same as lease 1.
  103. lease->hwaddr_.reset(new HWAddr(vector<uint8_t>(6, 0x19), HTYPE_ETHER));
  104. lease->client_id_ = ClientIdPtr(
  105. new ClientId(vector<uint8_t>(8, 0x75)));
  106. // The times used in the next tests are deliberately restricted - we
  107. // should be able to cope with valid lifetimes up to 0xffffffff.
  108. // However, this will lead to overflows.
  109. // @TODO: test overflow conditions when code has been fixed
  110. lease->valid_lft_ = 7000;
  111. lease->cltt_ = 234567;
  112. lease->subnet_id_ = 37;
  113. lease->fqdn_rev_ = true;
  114. lease->fqdn_fwd_ = true;
  115. lease->hostname_ = "otherhost.example.com.";
  116. } else if (address == straddress4_[4]) {
  117. lease->hwaddr_.reset(new HWAddr(vector<uint8_t>(6, 0x4c), HTYPE_ETHER));
  118. // Same ClientId as straddr4_[1]
  119. lease->client_id_ = ClientIdPtr(
  120. new ClientId(vector<uint8_t>(8, 0x53))); // Same as lease 1
  121. lease->valid_lft_ = 7736;
  122. lease->cltt_ = 222456;
  123. lease->subnet_id_ = 85;
  124. lease->fqdn_rev_ = true;
  125. lease->fqdn_fwd_ = true;
  126. lease->hostname_ = "otherhost.example.com.";
  127. } else if (address == straddress4_[5]) {
  128. // Same as lease 1
  129. lease->hwaddr_.reset(new HWAddr(vector<uint8_t>(6, 0x19), HTYPE_ETHER));
  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_.reset(new HWAddr(vector<uint8_t>(6, 0x6e), HTYPE_ETHER));
  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_.reset(new HWAddr(vector<uint8_t>(), HTYPE_ETHER)); // 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. // Set other parameters. For historical reasons, address 0 is not used.
  174. if (address == straddress6_[0]) {
  175. lease->type_ = leasetype6_[0];
  176. lease->prefixlen_ = 4;
  177. lease->iaid_ = 142;
  178. lease->duid_ = DuidPtr(new DUID(vector<uint8_t>(8, 0x77)));
  179. lease->preferred_lft_ = 900;
  180. lease->valid_lft_ = 8677;
  181. lease->cltt_ = 168256;
  182. lease->subnet_id_ = 23;
  183. lease->fqdn_fwd_ = true;
  184. lease->fqdn_rev_ = true;
  185. lease->hostname_ = "myhost.example.com.";
  186. } else if (address == straddress6_[1]) {
  187. lease->type_ = leasetype6_[1];
  188. lease->prefixlen_ = 0;
  189. lease->iaid_ = 42;
  190. lease->duid_ = DuidPtr(new DUID(vector<uint8_t>(8, 0x42)));
  191. lease->preferred_lft_ = 3600;
  192. lease->valid_lft_ = 3677;
  193. lease->cltt_ = 123456;
  194. lease->subnet_id_ = 73;
  195. lease->fqdn_fwd_ = false;
  196. lease->fqdn_rev_ = true;
  197. lease->hostname_ = "myhost.example.com.";
  198. } else if (address == straddress6_[2]) {
  199. lease->type_ = leasetype6_[2];
  200. lease->prefixlen_ = 7;
  201. lease->iaid_ = 89;
  202. lease->duid_ = DuidPtr(new DUID(vector<uint8_t>(8, 0x3a)));
  203. lease->preferred_lft_ = 1800;
  204. lease->valid_lft_ = 5412;
  205. lease->cltt_ = 234567;
  206. lease->subnet_id_ = 73; // Same as lease 1
  207. lease->fqdn_fwd_ = false;
  208. lease->fqdn_rev_ = false;
  209. lease->hostname_ = "myhost.example.com.";
  210. } else if (address == straddress6_[3]) {
  211. lease->type_ = leasetype6_[3];
  212. lease->prefixlen_ = 28;
  213. lease->iaid_ = 0xfffffffe;
  214. vector<uint8_t> duid;
  215. for (uint8_t i = 31; i < 126; ++i) {
  216. duid.push_back(i);
  217. }
  218. lease->duid_ = DuidPtr(new DUID(duid));
  219. // The times used in the next tests are deliberately restricted - we
  220. // should be able to cope with valid lifetimes up to 0xffffffff.
  221. // However, this will lead to overflows.
  222. // @TODO: test overflow conditions when code has been fixed
  223. lease->preferred_lft_ = 7200;
  224. lease->valid_lft_ = 7000;
  225. lease->cltt_ = 234567;
  226. lease->subnet_id_ = 37;
  227. lease->fqdn_fwd_ = true;
  228. lease->fqdn_rev_ = false;
  229. lease->hostname_ = "myhost.example.com.";
  230. } else if (address == straddress6_[4]) {
  231. // Same DUID and IAID as straddress6_1
  232. lease->type_ = leasetype6_[4];
  233. lease->prefixlen_ = 15;
  234. lease->iaid_ = 42;
  235. lease->duid_ = DuidPtr(new DUID(vector<uint8_t>(8, 0x42)));
  236. lease->preferred_lft_ = 4800;
  237. lease->valid_lft_ = 7736;
  238. lease->cltt_ = 222456;
  239. lease->subnet_id_ = 671;
  240. lease->fqdn_fwd_ = true;
  241. lease->fqdn_rev_ = true;
  242. lease->hostname_ = "otherhost.example.com.";
  243. } else if (address == straddress6_[5]) {
  244. // Same DUID and IAID as straddress6_1
  245. lease->type_ = leasetype6_[5];
  246. lease->prefixlen_ = 24;
  247. lease->iaid_ = 42; // Same as lease 4
  248. lease->duid_ = DuidPtr(new DUID(vector<uint8_t>(8, 0x42)));
  249. // Same as lease 4
  250. lease->preferred_lft_ = 5400;
  251. lease->valid_lft_ = 7832;
  252. lease->cltt_ = 227476;
  253. lease->subnet_id_ = 175;
  254. lease->fqdn_fwd_ = false;
  255. lease->fqdn_rev_ = true;
  256. lease->hostname_ = "hostname.example.com.";
  257. } else if (address == straddress6_[6]) {
  258. // Same DUID as straddress6_1
  259. lease->type_ = leasetype6_[6];
  260. lease->prefixlen_ = 24;
  261. lease->iaid_ = 93;
  262. lease->duid_ = DuidPtr(new DUID(vector<uint8_t>(8, 0x42)));
  263. // Same as lease 4
  264. lease->preferred_lft_ = 5400;
  265. lease->valid_lft_ = 1832;
  266. lease->cltt_ = 627476;
  267. lease->subnet_id_ = 112;
  268. lease->fqdn_fwd_ = false;
  269. lease->fqdn_rev_ = true;
  270. lease->hostname_ = "hostname.example.com.";
  271. } else if (address == straddress6_[7]) {
  272. // Same IAID as straddress6_1
  273. lease->type_ = leasetype6_[7];
  274. lease->prefixlen_ = 24;
  275. lease->iaid_ = 42;
  276. lease->duid_ = DuidPtr(new DUID(vector<uint8_t>(8, 0xe5)));
  277. lease->preferred_lft_ = 5600;
  278. lease->valid_lft_ = 7975;
  279. lease->cltt_ = 213876;
  280. lease->subnet_id_ = 19;
  281. lease->fqdn_fwd_ = false;
  282. lease->fqdn_rev_ = true;
  283. lease->hostname_ = "hostname.example.com.";
  284. } else {
  285. // Unknown address, return an empty pointer.
  286. lease.reset();
  287. }
  288. return (lease);
  289. }
  290. template <typename T>
  291. void GenericLeaseMgrTest::checkLeasesDifferent(const std::vector<T>& leases) const {
  292. // Check they were created
  293. for (size_t i = 0; i < leases.size(); ++i) {
  294. ASSERT_TRUE(leases[i]);
  295. }
  296. // Check they are different
  297. for (size_t i = 0; i < (leases.size() - 1); ++i) {
  298. for (size_t j = (i + 1); j < leases.size(); ++j) {
  299. stringstream s;
  300. s << "Comparing leases " << i << " & " << j << " for equality";
  301. SCOPED_TRACE(s.str());
  302. EXPECT_TRUE(*leases[i] != *leases[j]);
  303. }
  304. }
  305. }
  306. vector<Lease4Ptr>
  307. GenericLeaseMgrTest::createLeases4() {
  308. // Create leases for each address
  309. vector<Lease4Ptr> leases;
  310. for (size_t i = 0; i < straddress4_.size(); ++i) {
  311. leases.push_back(initializeLease4(straddress4_[i]));
  312. }
  313. EXPECT_EQ(8, leases.size());
  314. // Check all were created and that they are different.
  315. checkLeasesDifferent(leases);
  316. return (leases);
  317. }
  318. vector<Lease6Ptr>
  319. GenericLeaseMgrTest::createLeases6() {
  320. // Create leases for each address
  321. vector<Lease6Ptr> leases;
  322. for (size_t i = 0; i < straddress6_.size(); ++i) {
  323. leases.push_back(initializeLease6(straddress6_[i]));
  324. }
  325. EXPECT_EQ(8, leases.size());
  326. // Check all were created and that they are different.
  327. checkLeasesDifferent(leases);
  328. return (leases);
  329. }
  330. void
  331. GenericLeaseMgrTest::testGetLease4ClientId() {
  332. // Let's initialize a specific lease ...
  333. Lease4Ptr lease = initializeLease4(straddress4_[1]);
  334. EXPECT_TRUE(lmptr_->addLease(lease));
  335. Lease4Collection returned = lmptr_->getLease4(*lease->client_id_);
  336. ASSERT_EQ(1, returned.size());
  337. // We should retrieve our lease...
  338. detailCompareLease(lease, *returned.begin());
  339. lease = initializeLease4(straddress4_[2]);
  340. returned = lmptr_->getLease4(*lease->client_id_);
  341. ASSERT_EQ(0, returned.size());
  342. }
  343. void
  344. GenericLeaseMgrTest::testGetLease4NullClientId() {
  345. // Let's initialize a specific lease ... But this time
  346. // We keep its client id for further lookup and
  347. // We clearly 'reset' it ...
  348. Lease4Ptr leaseA = initializeLease4(straddress4_[4]);
  349. ClientIdPtr client_id = leaseA->client_id_;
  350. leaseA->client_id_ = ClientIdPtr();
  351. ASSERT_TRUE(lmptr_->addLease(leaseA));
  352. Lease4Collection returned = lmptr_->getLease4(*client_id);
  353. // Shouldn't have our previous lease ...
  354. ASSERT_TRUE(returned.empty());
  355. // Add another lease with the non-NULL client id, and make sure that the
  356. // lookup will not break due to existence of both leases with non-NULL and
  357. // NULL client ids.
  358. Lease4Ptr leaseB = initializeLease4(straddress4_[0]);
  359. // Shouldn't throw any null pointer exception
  360. ASSERT_TRUE(lmptr_->addLease(leaseB));
  361. // Try to get the lease.
  362. returned = lmptr_->getLease4(*client_id);
  363. ASSERT_TRUE(returned.empty());
  364. // Let's make it more interesting and add another lease with NULL client id.
  365. Lease4Ptr leaseC = initializeLease4(straddress4_[5]);
  366. leaseC->client_id_.reset();
  367. ASSERT_TRUE(lmptr_->addLease(leaseC));
  368. returned = lmptr_->getLease4(*client_id);
  369. ASSERT_TRUE(returned.empty());
  370. // But getting the lease with non-NULL client id should be successful.
  371. returned = lmptr_->getLease4(*leaseB->client_id_);
  372. ASSERT_EQ(1, returned.size());
  373. }
  374. void
  375. GenericLeaseMgrTest::testLease4NullClientId() {
  376. // Get the leases to be used for the test.
  377. vector<Lease4Ptr> leases = createLeases4();
  378. // Let's clear client-id pointers
  379. leases[1]->client_id_ = ClientIdPtr();
  380. leases[2]->client_id_ = ClientIdPtr();
  381. leases[3]->client_id_ = ClientIdPtr();
  382. // Start the tests. Add three leases to the database, read them back and
  383. // check they are what we think they are.
  384. EXPECT_TRUE(lmptr_->addLease(leases[1]));
  385. EXPECT_TRUE(lmptr_->addLease(leases[2]));
  386. EXPECT_TRUE(lmptr_->addLease(leases[3]));
  387. lmptr_->commit();
  388. // Reopen the database to ensure that they actually got stored.
  389. reopen();
  390. Lease4Ptr l_returned = lmptr_->getLease4(ioaddress4_[1]);
  391. ASSERT_TRUE(l_returned);
  392. detailCompareLease(leases[1], l_returned);
  393. l_returned = lmptr_->getLease4(ioaddress4_[2]);
  394. ASSERT_TRUE(l_returned);
  395. detailCompareLease(leases[2], l_returned);
  396. l_returned = lmptr_->getLease4(ioaddress4_[3]);
  397. ASSERT_TRUE(l_returned);
  398. detailCompareLease(leases[3], l_returned);
  399. // Check that we can't add a second lease with the same address
  400. EXPECT_FALSE(lmptr_->addLease(leases[1]));
  401. // Check that we can get the lease by HWAddr
  402. HWAddr tmp(*leases[2]->hwaddr_);
  403. Lease4Collection returned = lmptr_->getLease4(tmp);
  404. ASSERT_EQ(1, returned.size());
  405. detailCompareLease(leases[2], *returned.begin());
  406. l_returned = lmptr_->getLease4(tmp, leases[2]->subnet_id_);
  407. ASSERT_TRUE(l_returned);
  408. detailCompareLease(leases[2], l_returned);
  409. // Check that we can update the lease
  410. // Modify some fields in lease 1 (not the address) and update it.
  411. ++leases[1]->subnet_id_;
  412. leases[1]->valid_lft_ *= 2;
  413. lmptr_->updateLease4(leases[1]);
  414. // ... and check that the lease is indeed updated
  415. l_returned = lmptr_->getLease4(ioaddress4_[1]);
  416. ASSERT_TRUE(l_returned);
  417. detailCompareLease(leases[1], l_returned);
  418. // Delete a lease, check that it's gone, and that we can't delete it
  419. // a second time.
  420. EXPECT_TRUE(lmptr_->deleteLease(ioaddress4_[1]));
  421. l_returned = lmptr_->getLease4(ioaddress4_[1]);
  422. EXPECT_FALSE(l_returned);
  423. EXPECT_FALSE(lmptr_->deleteLease(ioaddress4_[1]));
  424. // Check that the second address is still there.
  425. l_returned = lmptr_->getLease4(ioaddress4_[2]);
  426. ASSERT_TRUE(l_returned);
  427. detailCompareLease(leases[2], l_returned);
  428. }
  429. void
  430. GenericLeaseMgrTest::testGetLease4HWAddr1() {
  431. // Let's initialize two different leases 4 and just add the first ...
  432. Lease4Ptr leaseA = initializeLease4(straddress4_[5]);
  433. HWAddr hwaddrA(*leaseA->hwaddr_);
  434. HWAddr hwaddrB(vector<uint8_t>(6, 0x80), HTYPE_ETHER);
  435. EXPECT_TRUE(lmptr_->addLease(leaseA));
  436. // we should not have a lease, with this MAC Addr
  437. Lease4Collection returned = lmptr_->getLease4(hwaddrB);
  438. ASSERT_EQ(0, returned.size());
  439. // But with this one
  440. returned = lmptr_->getLease4(hwaddrA);
  441. ASSERT_EQ(1, returned.size());
  442. }
  443. void
  444. GenericLeaseMgrTest::testGetLease4HWAddr2() {
  445. // Get the leases to be used for the test and add to the database
  446. vector<Lease4Ptr> leases = createLeases4();
  447. for (size_t i = 0; i < leases.size(); ++i) {
  448. EXPECT_TRUE(lmptr_->addLease(leases[i]));
  449. }
  450. // Get the leases matching the hardware address of lease 1
  451. /// @todo: Simply use HWAddr directly once 2589 is implemented
  452. HWAddr tmp(*leases[1]->hwaddr_);
  453. Lease4Collection returned = lmptr_->getLease4(tmp);
  454. // Should be three leases, matching leases[1], [3] and [5].
  455. ASSERT_EQ(3, returned.size());
  456. // Easiest way to check is to look at the addresses.
  457. vector<string> addresses;
  458. for (Lease4Collection::const_iterator i = returned.begin();
  459. i != returned.end(); ++i) {
  460. addresses.push_back((*i)->addr_.toText());
  461. }
  462. sort(addresses.begin(), addresses.end());
  463. EXPECT_EQ(straddress4_[1], addresses[0]);
  464. EXPECT_EQ(straddress4_[3], addresses[1]);
  465. EXPECT_EQ(straddress4_[5], addresses[2]);
  466. // Repeat test with just one expected match
  467. returned = lmptr_->getLease4(*leases[2]->hwaddr_);
  468. ASSERT_EQ(1, returned.size());
  469. detailCompareLease(leases[2], *returned.begin());
  470. // Check that an empty vector is valid
  471. EXPECT_TRUE(leases[7]->hwaddr_->hwaddr_.empty());
  472. returned = lmptr_->getLease4(*leases[7]->hwaddr_);
  473. ASSERT_EQ(1, returned.size());
  474. detailCompareLease(leases[7], *returned.begin());
  475. // Try to get something with invalid hardware address
  476. vector<uint8_t> invalid(6, 0);
  477. returned = lmptr_->getLease4(invalid);
  478. EXPECT_EQ(0, returned.size());
  479. }
  480. void
  481. GenericLeaseMgrTest::testGetLease4ClientIdHWAddrSubnetId() {
  482. Lease4Ptr leaseA = initializeLease4(straddress4_[4]);
  483. Lease4Ptr leaseB = initializeLease4(straddress4_[5]);
  484. Lease4Ptr leaseC = initializeLease4(straddress4_[6]);
  485. // Set NULL client id for one of the leases. This is to make sure that such
  486. // a lease may coexist with other leases with non NULL client id.
  487. leaseC->client_id_.reset();
  488. HWAddr hwaddrA(*leaseA->hwaddr_);
  489. HWAddr hwaddrB(*leaseB->hwaddr_);
  490. HWAddr hwaddrC(*leaseC->hwaddr_);
  491. EXPECT_TRUE(lmptr_->addLease(leaseA));
  492. EXPECT_TRUE(lmptr_->addLease(leaseB));
  493. EXPECT_TRUE(lmptr_->addLease(leaseC));
  494. // First case we should retrieve our lease
  495. Lease4Ptr lease = lmptr_->getLease4(*leaseA->client_id_, hwaddrA, leaseA->subnet_id_);
  496. detailCompareLease(lease, leaseA);
  497. // Retrieve the other lease.
  498. lease = lmptr_->getLease4(*leaseB->client_id_, hwaddrB, leaseB->subnet_id_);
  499. detailCompareLease(lease, leaseB);
  500. // The last lease has NULL client id so we will use a different getLease4 function
  501. // which doesn't require client id (just a hwaddr and subnet id).
  502. lease = lmptr_->getLease4(hwaddrC, leaseC->subnet_id_);
  503. detailCompareLease(lease, leaseC);
  504. // An attempt to retrieve the lease with non matching lease parameters should
  505. // result in NULL pointer being returned.
  506. lease = lmptr_->getLease4(*leaseA->client_id_, hwaddrB, leaseA->subnet_id_);
  507. EXPECT_FALSE(lease);
  508. lease = lmptr_->getLease4(*leaseA->client_id_, hwaddrA, leaseB->subnet_id_);
  509. EXPECT_FALSE(lease);
  510. }
  511. void
  512. GenericLeaseMgrTest::testAddGetDelete6(bool check_t1_t2) {
  513. IOAddress addr("2001:db8:1::456");
  514. uint8_t llt[] = {0, 1, 2, 3, 4, 5, 6, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf};
  515. DuidPtr duid(new DUID(llt, sizeof(llt)));
  516. uint32_t iaid = 7; // just a number
  517. SubnetID subnet_id = 8; // just another number
  518. Lease6Ptr lease(new Lease6(Lease::TYPE_NA, addr, duid, iaid, 100, 200, 50,
  519. 80, subnet_id));
  520. EXPECT_TRUE(lmptr_->addLease(lease));
  521. // should not be allowed to add a second lease with the same address
  522. EXPECT_FALSE(lmptr_->addLease(lease));
  523. Lease6Ptr x = lmptr_->getLease6(Lease::TYPE_NA,
  524. IOAddress("2001:db8:1::234"));
  525. EXPECT_EQ(Lease6Ptr(), x);
  526. x = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::456"));
  527. ASSERT_TRUE(x);
  528. EXPECT_EQ(x->addr_, addr);
  529. EXPECT_TRUE(*x->duid_ == *duid);
  530. EXPECT_EQ(x->iaid_, iaid);
  531. EXPECT_EQ(x->subnet_id_, subnet_id);
  532. // These are not important from lease management perspective, but
  533. // let's check them anyway.
  534. EXPECT_EQ(Lease::TYPE_NA, x->type_);
  535. EXPECT_EQ(100, x->preferred_lft_);
  536. EXPECT_EQ(200, x->valid_lft_);
  537. if (check_t1_t2) {
  538. // Backend supports T1,T2 storage: check the values
  539. EXPECT_EQ(50, x->t1_);
  540. EXPECT_EQ(80, x->t2_);
  541. } else {
  542. // Backend does not support storing, check that it returns 0s.
  543. EXPECT_EQ(0, x->t1_);
  544. EXPECT_EQ(0, x->t2_);
  545. }
  546. // Test getLease6(duid, iaid, subnet_id) - positive case
  547. Lease6Ptr y = lmptr_->getLease6(Lease::TYPE_NA, *duid, iaid, subnet_id);
  548. ASSERT_TRUE(y);
  549. EXPECT_TRUE(*y->duid_ == *duid);
  550. EXPECT_EQ(y->iaid_, iaid);
  551. EXPECT_EQ(y->addr_, addr);
  552. // Test getLease6(duid, iaid, subnet_id) - wrong iaid
  553. uint32_t invalid_iaid = 9; // no such iaid
  554. y = lmptr_->getLease6(Lease::TYPE_NA, *duid, invalid_iaid, subnet_id);
  555. EXPECT_FALSE(y);
  556. uint32_t invalid_subnet_id = 999;
  557. y = lmptr_->getLease6(Lease::TYPE_NA, *duid, iaid, invalid_subnet_id);
  558. EXPECT_FALSE(y);
  559. // truncated duid
  560. DuidPtr invalid_duid(new DUID(llt, sizeof(llt) - 1));
  561. y = lmptr_->getLease6(Lease::TYPE_NA, *invalid_duid, iaid, subnet_id);
  562. EXPECT_FALSE(y);
  563. // should return false - there's no such address
  564. EXPECT_FALSE(lmptr_->deleteLease(IOAddress("2001:db8:1::789")));
  565. // this one should succeed
  566. EXPECT_TRUE(lmptr_->deleteLease(IOAddress("2001:db8:1::456")));
  567. // after the lease is deleted, it should really be gone
  568. x = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::456"));
  569. EXPECT_FALSE(x);
  570. // Reopen the lease storage to make sure that lease is gone from the
  571. // persistent storage.
  572. reopen(V6);
  573. x = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::456"));
  574. EXPECT_FALSE(x);
  575. }
  576. void
  577. GenericLeaseMgrTest::testMaxDate4() {
  578. // Get the leases to be used for the test.
  579. vector<Lease4Ptr> leases = createLeases4();
  580. Lease4Ptr lease = leases[1];
  581. // Set valid_lft_ to 1 day, cllt_ to max time. This should make expire
  582. // time too large to store.
  583. lease->valid_lft_ = 24*60*60;
  584. lease->cltt_ = LeaseMgr::MAX_DB_TIME;
  585. // Insert should throw.
  586. ASSERT_THROW(lmptr_->addLease(leases[1]), DbOperationError);
  587. // Set valid_lft_ to 0, which should make expire time small enough to
  588. // store and try again.
  589. lease->valid_lft_ = 0;
  590. EXPECT_TRUE(lmptr_->addLease(leases[1]));
  591. Lease4Ptr l_returned = lmptr_->getLease4(ioaddress4_[1]);
  592. ASSERT_TRUE(l_returned);
  593. detailCompareLease(leases[1], l_returned);
  594. }
  595. void
  596. GenericLeaseMgrTest::testBasicLease4() {
  597. // Get the leases to be used for the test.
  598. vector<Lease4Ptr> leases = createLeases4();
  599. // Start the tests. Add three leases to the database, read them back and
  600. // check they are what we think they are.
  601. EXPECT_TRUE(lmptr_->addLease(leases[1]));
  602. EXPECT_TRUE(lmptr_->addLease(leases[2]));
  603. EXPECT_TRUE(lmptr_->addLease(leases[3]));
  604. lmptr_->commit();
  605. // Reopen the database to ensure that they actually got stored.
  606. reopen(V4);
  607. Lease4Ptr l_returned = lmptr_->getLease4(ioaddress4_[1]);
  608. ASSERT_TRUE(l_returned);
  609. detailCompareLease(leases[1], l_returned);
  610. l_returned = lmptr_->getLease4(ioaddress4_[2]);
  611. ASSERT_TRUE(l_returned);
  612. detailCompareLease(leases[2], l_returned);
  613. l_returned = lmptr_->getLease4(ioaddress4_[3]);
  614. ASSERT_TRUE(l_returned);
  615. detailCompareLease(leases[3], l_returned);
  616. // Check that we can't add a second lease with the same address
  617. EXPECT_FALSE(lmptr_->addLease(leases[1]));
  618. // Delete a lease, check that it's gone, and that we can't delete it
  619. // a second time.
  620. EXPECT_TRUE(lmptr_->deleteLease(ioaddress4_[1]));
  621. l_returned = lmptr_->getLease4(ioaddress4_[1]);
  622. EXPECT_FALSE(l_returned);
  623. EXPECT_FALSE(lmptr_->deleteLease(ioaddress4_[1]));
  624. // Check that the second address is still there.
  625. l_returned = lmptr_->getLease4(ioaddress4_[2]);
  626. ASSERT_TRUE(l_returned);
  627. detailCompareLease(leases[2], l_returned);
  628. reopen(V4);
  629. // The deleted lease should be still gone after we re-read leases from
  630. // persistent storage.
  631. l_returned = lmptr_->getLease4(ioaddress4_[1]);
  632. EXPECT_FALSE(l_returned);
  633. l_returned = lmptr_->getLease4(ioaddress4_[2]);
  634. ASSERT_TRUE(l_returned);
  635. detailCompareLease(leases[2], l_returned);
  636. l_returned = lmptr_->getLease4(ioaddress4_[3]);
  637. ASSERT_TRUE(l_returned);
  638. detailCompareLease(leases[3], l_returned);
  639. // Update some FQDN data, so as we can check that update in
  640. // persistent storage works as expected.
  641. leases[2]->hostname_ = "memfile.example.com.";
  642. leases[2]->fqdn_rev_ = true;
  643. ASSERT_NO_THROW(lmptr_->updateLease4(leases[2]));
  644. reopen(V4);
  645. // The lease should be now updated in the storage.
  646. l_returned = lmptr_->getLease4(ioaddress4_[2]);
  647. ASSERT_TRUE(l_returned);
  648. detailCompareLease(leases[2], l_returned);
  649. l_returned = lmptr_->getLease4(ioaddress4_[3]);
  650. ASSERT_TRUE(l_returned);
  651. detailCompareLease(leases[3], l_returned);
  652. }
  653. void
  654. GenericLeaseMgrTest::testBasicLease6() {
  655. // Get the leases to be used for the test.
  656. vector<Lease6Ptr> leases = createLeases6();
  657. // Start the tests. Add three leases to the database, read them back and
  658. // check they are what we think they are.
  659. EXPECT_TRUE(lmptr_->addLease(leases[1]));
  660. EXPECT_TRUE(lmptr_->addLease(leases[2]));
  661. EXPECT_TRUE(lmptr_->addLease(leases[3]));
  662. lmptr_->commit();
  663. // Reopen the database to ensure that they actually got stored.
  664. reopen(V6);
  665. Lease6Ptr l_returned = lmptr_->getLease6(leasetype6_[1], ioaddress6_[1]);
  666. ASSERT_TRUE(l_returned);
  667. detailCompareLease(leases[1], l_returned);
  668. l_returned = lmptr_->getLease6(leasetype6_[2], ioaddress6_[2]);
  669. ASSERT_TRUE(l_returned);
  670. detailCompareLease(leases[2], l_returned);
  671. l_returned = lmptr_->getLease6(leasetype6_[3], ioaddress6_[3]);
  672. ASSERT_TRUE(l_returned);
  673. detailCompareLease(leases[3], l_returned);
  674. // Check that we can't add a second lease with the same address
  675. EXPECT_FALSE(lmptr_->addLease(leases[1]));
  676. // Delete a lease, check that it's gone, and that we can't delete it
  677. // a second time.
  678. EXPECT_TRUE(lmptr_->deleteLease(ioaddress6_[1]));
  679. l_returned = lmptr_->getLease6(leasetype6_[1], ioaddress6_[1]);
  680. EXPECT_FALSE(l_returned);
  681. EXPECT_FALSE(lmptr_->deleteLease(ioaddress6_[1]));
  682. // Check that the second address is still there.
  683. l_returned = lmptr_->getLease6(leasetype6_[2], ioaddress6_[2]);
  684. ASSERT_TRUE(l_returned);
  685. detailCompareLease(leases[2], l_returned);
  686. reopen(V6);
  687. // The deleted lease should be still gone after we re-read leases from
  688. // persistent storage.
  689. l_returned = lmptr_->getLease6(leasetype6_[1], ioaddress6_[1]);
  690. EXPECT_FALSE(l_returned);
  691. // Check that the second address is still there.
  692. l_returned = lmptr_->getLease6(leasetype6_[2], ioaddress6_[2]);
  693. ASSERT_TRUE(l_returned);
  694. detailCompareLease(leases[2], l_returned);
  695. // Update some FQDN data, so as we can check that update in
  696. // persistent storage works as expected.
  697. leases[2]->hostname_ = "memfile.example.com.";
  698. leases[2]->fqdn_rev_ = true;
  699. ASSERT_NO_THROW(lmptr_->updateLease6(leases[2]));
  700. reopen(V6);
  701. // The lease should be now updated in the storage.
  702. l_returned = lmptr_->getLease6(leasetype6_[2], ioaddress6_[2]);
  703. ASSERT_TRUE(l_returned);
  704. detailCompareLease(leases[2], l_returned);
  705. }
  706. void
  707. GenericLeaseMgrTest::testMaxDate6() {
  708. // Get the leases to be used for the test.
  709. vector<Lease6Ptr> leases = createLeases6();
  710. Lease6Ptr lease = leases[1];
  711. // Set valid_lft_ to 1 day, cllt_ to max time. This should make expire
  712. // time too large to store.
  713. lease->valid_lft_ = 24*60*60;
  714. lease->cltt_ = LeaseMgr::MAX_DB_TIME;
  715. // Insert should throw.
  716. ASSERT_THROW(lmptr_->addLease(leases[1]), DbOperationError);
  717. // Set valid_lft_ to 0, which should make expire time small enough to
  718. // store and try again.
  719. lease->valid_lft_ = 0;
  720. EXPECT_TRUE(lmptr_->addLease(leases[1]));
  721. Lease6Ptr l_returned = lmptr_->getLease6(leasetype6_[1], ioaddress6_[1]);
  722. ASSERT_TRUE(l_returned);
  723. detailCompareLease(leases[1], l_returned);
  724. }
  725. // Checks whether a MAC address can be stored and retrieved together with
  726. // a lease.
  727. void
  728. GenericLeaseMgrTest::testLease6MAC() {
  729. // Get the leases to be used for the test.
  730. vector<Lease6Ptr> leases = createLeases6();
  731. HWAddrPtr hwaddr1(new HWAddr(vector<uint8_t>(6, 11), HTYPE_ETHER));
  732. HWAddrPtr hwaddr2(new HWAddr(vector<uint8_t>(6, 22), HTYPE_ETHER));
  733. leases[1]->hwaddr_ = hwaddr1; // Add hardware address to leases 1 and 2
  734. leases[2]->hwaddr_ = hwaddr2;
  735. leases[3]->hwaddr_ = HWAddrPtr(); // No hardware address for the third one
  736. // Start the tests. Add three leases to the database, read them back and
  737. // check they are what we think they are.
  738. EXPECT_TRUE(lmptr_->addLease(leases[1]));
  739. EXPECT_TRUE(lmptr_->addLease(leases[2]));
  740. EXPECT_TRUE(lmptr_->addLease(leases[3]));
  741. lmptr_->commit();
  742. // Reopen the database to ensure that they actually got stored.
  743. reopen(V6);
  744. // First lease should have a hardware address in it
  745. Lease6Ptr stored1 = lmptr_->getLease6(leasetype6_[1], ioaddress6_[1]);
  746. ASSERT_TRUE(stored1);
  747. ASSERT_TRUE(stored1->hwaddr_);
  748. EXPECT_TRUE(*hwaddr1 == *stored1->hwaddr_);
  749. // Second lease should have a hardware address in it
  750. Lease6Ptr stored2 = lmptr_->getLease6(leasetype6_[2], ioaddress6_[2]);
  751. ASSERT_TRUE(stored2);
  752. ASSERT_TRUE(stored2->hwaddr_);
  753. EXPECT_TRUE(*hwaddr2 == *stored2->hwaddr_);
  754. // Third lease should NOT have any hardware address.
  755. Lease6Ptr stored3 = lmptr_->getLease6(leasetype6_[3], ioaddress6_[3]);
  756. ASSERT_TRUE(stored3);
  757. EXPECT_FALSE(stored3->hwaddr_);
  758. }
  759. // Checks whether a hardware address type can be stored and retrieved.
  760. void
  761. GenericLeaseMgrTest::testLease6HWTypeAndSource() {
  762. // Get the leases to be used for the test.
  763. vector<Lease6Ptr> leases = createLeases6();
  764. HWAddrPtr hwaddr1(new HWAddr(vector<uint8_t>(6, 11), 123));
  765. HWAddrPtr hwaddr2(new HWAddr(vector<uint8_t>(6, 22), 456));
  766. // Those should use defines from Pkt::HWADDR_SOURCE_*, but let's
  767. // test an uncommon value (and 0 which means unknown).
  768. hwaddr1->source_ = 123456u;
  769. hwaddr2->source_ = 0;
  770. leases[1]->hwaddr_ = hwaddr1; // Add hardware address to leases 1 and 2
  771. leases[2]->hwaddr_ = hwaddr2;
  772. leases[3]->hwaddr_ = HWAddrPtr(); // No hardware address for the third one
  773. // Start the tests. Add three leases to the database, read them back and
  774. // check they are what we think they are.
  775. EXPECT_TRUE(lmptr_->addLease(leases[1]));
  776. EXPECT_TRUE(lmptr_->addLease(leases[2]));
  777. EXPECT_TRUE(lmptr_->addLease(leases[3]));
  778. lmptr_->commit();
  779. // Reopen the database to ensure that they actually got stored.
  780. reopen(V6);
  781. // First lease should have a hardware address in it
  782. Lease6Ptr stored1 = lmptr_->getLease6(leasetype6_[1], ioaddress6_[1]);
  783. ASSERT_TRUE(stored1);
  784. ASSERT_TRUE(stored1->hwaddr_);
  785. EXPECT_EQ(123, stored1->hwaddr_->htype_);
  786. EXPECT_EQ(123456, stored1->hwaddr_->source_);
  787. // Second lease should have a hardware address in it
  788. Lease6Ptr stored2 = lmptr_->getLease6(leasetype6_[2], ioaddress6_[2]);
  789. ASSERT_TRUE(stored2);
  790. ASSERT_TRUE(stored2->hwaddr_);
  791. EXPECT_EQ(456, stored2->hwaddr_->htype_);
  792. EXPECT_EQ(0, stored2->hwaddr_->source_);
  793. // Third lease should NOT have any hardware address.
  794. Lease6Ptr stored3 = lmptr_->getLease6(leasetype6_[3], ioaddress6_[3]);
  795. ASSERT_TRUE(stored3);
  796. EXPECT_FALSE(stored3->hwaddr_);
  797. }
  798. void
  799. GenericLeaseMgrTest::testLease4InvalidHostname() {
  800. // Get the leases to be used for the test.
  801. vector<Lease4Ptr> leases = createLeases4();
  802. // Create a dummy hostname, consisting of 255 characters.
  803. leases[1]->hostname_.assign(255, 'a');
  804. ASSERT_TRUE(lmptr_->addLease(leases[1]));
  805. // The new lease must be in the database.
  806. Lease4Ptr l_returned = lmptr_->getLease4(ioaddress4_[1]);
  807. detailCompareLease(leases[1], l_returned);
  808. // Let's delete the lease, so as we can try to add it again with
  809. // invalid hostname.
  810. EXPECT_TRUE(lmptr_->deleteLease(ioaddress4_[1]));
  811. // Create a hostname with 256 characters. It should not be accepted.
  812. leases[1]->hostname_.assign(256, 'a');
  813. EXPECT_THROW(lmptr_->addLease(leases[1]), DbOperationError);
  814. }
  815. /// @brief Verify that too long hostname for Lease6 is not accepted.
  816. void
  817. GenericLeaseMgrTest::testLease6InvalidHostname() {
  818. // Get the leases to be used for the test.
  819. vector<Lease6Ptr> leases = createLeases6();
  820. // Create a dummy hostname, consisting of 255 characters.
  821. leases[1]->hostname_.assign(255, 'a');
  822. ASSERT_TRUE(lmptr_->addLease(leases[1]));
  823. // The new lease must be in the database.
  824. Lease6Ptr l_returned = lmptr_->getLease6(leasetype6_[1], ioaddress6_[1]);
  825. detailCompareLease(leases[1], l_returned);
  826. // Let's delete the lease, so as we can try to add it again with
  827. // invalid hostname.
  828. EXPECT_TRUE(lmptr_->deleteLease(ioaddress6_[1]));
  829. // Create a hostname with 256 characters. It should not be accepted.
  830. leases[1]->hostname_.assign(256, 'a');
  831. EXPECT_THROW(lmptr_->addLease(leases[1]), DbOperationError);
  832. }
  833. void
  834. GenericLeaseMgrTest::testGetLease4HWAddrSize() {
  835. // Create leases, although we need only one.
  836. vector<Lease4Ptr> leases = createLeases4();
  837. // Now add leases with increasing hardware address size.
  838. for (uint8_t i = 0; i <= HWAddr::MAX_HWADDR_LEN; ++i) {
  839. leases[1]->hwaddr_->hwaddr_.resize(i, i);
  840. EXPECT_TRUE(lmptr_->addLease(leases[1]));
  841. /// @todo: Simply use HWAddr directly once 2589 is implemented
  842. Lease4Collection returned =
  843. lmptr_->getLease4(*leases[1]->hwaddr_);
  844. ASSERT_EQ(1, returned.size());
  845. detailCompareLease(leases[1], *returned.begin());
  846. (void) lmptr_->deleteLease(leases[1]->addr_);
  847. }
  848. // Database should not let us add one that is too big
  849. // (The 42 is a random value put in each byte of the address.)
  850. leases[1]->hwaddr_->hwaddr_.resize(HWAddr::MAX_HWADDR_LEN + 100, 42);
  851. EXPECT_THROW(lmptr_->addLease(leases[1]), isc::dhcp::DbOperationError);
  852. }
  853. void
  854. GenericLeaseMgrTest::testGetLease4HWAddrSubnetId() {
  855. // Get the leases to be used for the test and add to the database
  856. vector<Lease4Ptr> leases = createLeases4();
  857. for (size_t i = 0; i < leases.size(); ++i) {
  858. EXPECT_TRUE(lmptr_->addLease(leases[i]));
  859. }
  860. // Get the leases matching the hardware address of lease 1 and
  861. // subnet ID of lease 1. Result should be a single lease - lease 1.
  862. /// @todo: Simply use HWAddr directly once 2589 is implemented
  863. Lease4Ptr returned = lmptr_->getLease4(*leases[1]->hwaddr_,
  864. leases[1]->subnet_id_);
  865. ASSERT_TRUE(returned);
  866. detailCompareLease(leases[1], returned);
  867. // Try for a match to the hardware address of lease 1 and the wrong
  868. // subnet ID.
  869. /// @todo: Simply use HWAddr directly once 2589 is implemented
  870. returned = lmptr_->getLease4(*leases[1]->hwaddr_, leases[1]->subnet_id_ + 1);
  871. EXPECT_FALSE(returned);
  872. // Try for a match to the subnet ID of lease 1 (and lease 4) but
  873. // the wrong hardware address.
  874. vector<uint8_t> invalid_hwaddr(15, 0x77);
  875. /// @todo: Simply use HWAddr directly once 2589 is implemented
  876. returned = lmptr_->getLease4(HWAddr(invalid_hwaddr, HTYPE_ETHER),
  877. leases[1]->subnet_id_);
  878. EXPECT_FALSE(returned);
  879. // Try for a match to an unknown hardware address and an unknown
  880. // subnet ID.
  881. /// @todo: Simply use HWAddr directly once 2589 is implemented
  882. returned = lmptr_->getLease4(HWAddr(invalid_hwaddr, HTYPE_ETHER),
  883. leases[1]->subnet_id_ + 1);
  884. EXPECT_FALSE(returned);
  885. // Add a second lease with the same values as the first and check that
  886. // an attempt to access the database by these parameters throws a
  887. // "multiple records" exception. (We expect there to be only one record
  888. // with that combination, so getting them via getLeaseX() (as opposed
  889. // to getLeaseXCollection() should throw an exception.)
  890. EXPECT_TRUE(lmptr_->deleteLease(leases[2]->addr_));
  891. leases[1]->addr_ = leases[2]->addr_;
  892. EXPECT_TRUE(lmptr_->addLease(leases[1]));
  893. /// @todo: Simply use HWAddr directly once 2589 is implemented
  894. EXPECT_THROW(returned = lmptr_->getLease4(*leases[1]->hwaddr_,
  895. leases[1]->subnet_id_),
  896. isc::dhcp::MultipleRecords);
  897. }
  898. void
  899. GenericLeaseMgrTest::testGetLease4HWAddrSubnetIdSize() {
  900. // Create leases, although we need only one.
  901. vector<Lease4Ptr> leases = createLeases4();
  902. // Now add leases with increasing hardware address size and check
  903. // that they can be retrieved.
  904. for (uint8_t i = 0; i <= HWAddr::MAX_HWADDR_LEN; ++i) {
  905. leases[1]->hwaddr_->hwaddr_.resize(i, i);
  906. EXPECT_TRUE(lmptr_->addLease(leases[1]));
  907. /// @todo: Simply use HWAddr directly once 2589 is implemented
  908. Lease4Ptr returned = lmptr_->getLease4(*leases[1]->hwaddr_,
  909. leases[1]->subnet_id_);
  910. ASSERT_TRUE(returned);
  911. detailCompareLease(leases[1], returned);
  912. (void) lmptr_->deleteLease(leases[1]->addr_);
  913. }
  914. // Database should not let us add one that is too big
  915. // (The 42 is a random value put in each byte of the address.)
  916. leases[1]->hwaddr_->hwaddr_.resize(HWAddr::MAX_HWADDR_LEN + 100, 42);
  917. EXPECT_THROW(lmptr_->addLease(leases[1]), isc::dhcp::DbOperationError);
  918. }
  919. void
  920. GenericLeaseMgrTest::testGetLease4ClientId2() {
  921. // Get the leases to be used for the test and add to the database
  922. vector<Lease4Ptr> leases = createLeases4();
  923. for (size_t i = 0; i < leases.size(); ++i) {
  924. EXPECT_TRUE(lmptr_->addLease(leases[i]));
  925. }
  926. // Get the leases matching the Client ID address of lease 1
  927. Lease4Collection returned = lmptr_->getLease4(*leases[1]->client_id_);
  928. // Should be four leases, matching leases[1], [4], [5] and [6].
  929. ASSERT_EQ(4, returned.size());
  930. // Easiest way to check is to look at the addresses.
  931. vector<string> addresses;
  932. for (Lease4Collection::const_iterator i = returned.begin();
  933. i != returned.end(); ++i) {
  934. addresses.push_back((*i)->addr_.toText());
  935. }
  936. sort(addresses.begin(), addresses.end());
  937. EXPECT_EQ(straddress4_[1], addresses[0]);
  938. EXPECT_EQ(straddress4_[4], addresses[1]);
  939. EXPECT_EQ(straddress4_[5], addresses[2]);
  940. EXPECT_EQ(straddress4_[6], addresses[3]);
  941. // Repeat test with just one expected match
  942. returned = lmptr_->getLease4(*leases[3]->client_id_);
  943. ASSERT_EQ(1, returned.size());
  944. detailCompareLease(leases[3], *returned.begin());
  945. // Check that client-id is NULL
  946. EXPECT_FALSE(leases[7]->client_id_);
  947. HWAddr tmp(*leases[7]->hwaddr_);
  948. returned = lmptr_->getLease4(tmp);
  949. ASSERT_EQ(1, returned.size());
  950. detailCompareLease(leases[7], *returned.begin());
  951. // Try to get something with invalid client ID
  952. const uint8_t invalid_data[] = {0, 0, 0};
  953. ClientId invalid(invalid_data, sizeof(invalid_data));
  954. returned = lmptr_->getLease4(invalid);
  955. EXPECT_EQ(0, returned.size());
  956. }
  957. void
  958. GenericLeaseMgrTest::testGetLease4ClientIdSize() {
  959. // Create leases, although we need only one.
  960. vector<Lease4Ptr> leases = createLeases4();
  961. // Now add leases with increasing Client ID size can be retrieved.
  962. // For speed, go from 0 to 128 is steps of 16.
  963. // Intermediate client_id_max is to overcome problem if
  964. // ClientId::MAX_CLIENT_ID_LEN is used in an EXPECT_EQ.
  965. int client_id_max = ClientId::MAX_CLIENT_ID_LEN;
  966. EXPECT_EQ(128, client_id_max);
  967. int client_id_min = ClientId::MIN_CLIENT_ID_LEN;
  968. EXPECT_EQ(2, client_id_min); // See RFC2132, section 9.14
  969. for (uint8_t i = client_id_min; i <= client_id_max; i += 16) {
  970. vector<uint8_t> clientid_vec(i, i);
  971. leases[1]->client_id_.reset(new ClientId(clientid_vec));
  972. EXPECT_TRUE(lmptr_->addLease(leases[1]));
  973. Lease4Collection returned = lmptr_->getLease4(*leases[1]->client_id_);
  974. ASSERT_TRUE(returned.size() == 1);
  975. detailCompareLease(leases[1], *returned.begin());
  976. (void) lmptr_->deleteLease(leases[1]->addr_);
  977. }
  978. // Don't bother to check client IDs longer than the maximum -
  979. // these cannot be constructed, and that limitation is tested
  980. // in the DUID/Client ID unit tests.
  981. }
  982. void
  983. GenericLeaseMgrTest::testGetLease4ClientIdSubnetId() {
  984. // Get the leases to be used for the test and add to the database
  985. vector<Lease4Ptr> leases = createLeases4();
  986. for (size_t i = 0; i < leases.size(); ++i) {
  987. EXPECT_TRUE(lmptr_->addLease(leases[i]));
  988. }
  989. // Get the leases matching the client ID of lease 1 and
  990. // subnet ID of lease 1. Result should be a single lease - lease 1.
  991. Lease4Ptr returned = lmptr_->getLease4(*leases[1]->client_id_,
  992. leases[1]->subnet_id_);
  993. ASSERT_TRUE(returned);
  994. detailCompareLease(leases[1], returned);
  995. // Try for a match to the client ID of lease 1 and the wrong
  996. // subnet ID.
  997. returned = lmptr_->getLease4(*leases[1]->client_id_,
  998. leases[1]->subnet_id_ + 1);
  999. EXPECT_FALSE(returned);
  1000. // Try for a match to the subnet ID of lease 1 (and lease 4) but
  1001. // the wrong client ID
  1002. const uint8_t invalid_data[] = {0, 0, 0};
  1003. ClientId invalid(invalid_data, sizeof(invalid_data));
  1004. returned = lmptr_->getLease4(invalid, leases[1]->subnet_id_);
  1005. EXPECT_FALSE(returned);
  1006. // Try for a match to an unknown hardware address and an unknown
  1007. // subnet ID.
  1008. returned = lmptr_->getLease4(invalid, leases[1]->subnet_id_ + 1);
  1009. EXPECT_FALSE(returned);
  1010. }
  1011. void
  1012. GenericLeaseMgrTest::testGetLeases6DuidIaid() {
  1013. // Get the leases to be used for the test.
  1014. vector<Lease6Ptr> leases = createLeases6();
  1015. ASSERT_LE(6, leases.size()); // Expect to access leases 0 through 5
  1016. // Add them to the database
  1017. for (size_t i = 0; i < leases.size(); ++i) {
  1018. EXPECT_TRUE(lmptr_->addLease(leases[i]));
  1019. }
  1020. // Get the leases matching the DUID and IAID of lease[1].
  1021. Lease6Collection returned = lmptr_->getLeases6(leasetype6_[1],
  1022. *leases[1]->duid_,
  1023. leases[1]->iaid_);
  1024. // Should be two leases, matching leases[1] and [4].
  1025. ASSERT_EQ(2, returned.size());
  1026. // Easiest way to check is to look at the addresses.
  1027. vector<string> addresses;
  1028. for (Lease6Collection::const_iterator i = returned.begin();
  1029. i != returned.end(); ++i) {
  1030. addresses.push_back((*i)->addr_.toText());
  1031. }
  1032. sort(addresses.begin(), addresses.end());
  1033. EXPECT_EQ(straddress6_[1], addresses[0]);
  1034. EXPECT_EQ(straddress6_[4], addresses[1]);
  1035. // Check that nothing is returned when either the IAID or DUID match
  1036. // nothing.
  1037. returned = lmptr_->getLeases6(leasetype6_[1], *leases[1]->duid_,
  1038. leases[1]->iaid_ + 1);
  1039. EXPECT_EQ(0, returned.size());
  1040. // Alter the leases[1] DUID to match nothing in the database.
  1041. vector<uint8_t> duid_vector = leases[1]->duid_->getDuid();
  1042. ++duid_vector[0];
  1043. DUID new_duid(duid_vector);
  1044. returned = lmptr_->getLeases6(leasetype6_[1], new_duid, leases[1]->iaid_);
  1045. EXPECT_EQ(0, returned.size());
  1046. }
  1047. void
  1048. GenericLeaseMgrTest::testGetLeases6DuidSize() {
  1049. // Create leases, although we need only one.
  1050. vector<Lease6Ptr> leases = createLeases6();
  1051. // Now add leases with increasing DUID size can be retrieved.
  1052. // For speed, go from 0 to 128 is steps of 16.
  1053. int duid_max = DUID::MAX_DUID_LEN;
  1054. EXPECT_EQ(128, duid_max);
  1055. int duid_min = DUID::MIN_DUID_LEN;
  1056. EXPECT_EQ(1, duid_min);
  1057. for (uint8_t i = duid_min; i <= duid_max; i += 16) {
  1058. vector<uint8_t> duid_vec(i, i);
  1059. leases[1]->duid_.reset(new DUID(duid_vec));
  1060. EXPECT_TRUE(lmptr_->addLease(leases[1]));
  1061. Lease6Collection returned = lmptr_->getLeases6(leasetype6_[1],
  1062. *leases[1]->duid_,
  1063. leases[1]->iaid_);
  1064. ASSERT_EQ(1, returned.size());
  1065. detailCompareLease(leases[1], *returned.begin());
  1066. (void) lmptr_->deleteLease(leases[1]->addr_);
  1067. }
  1068. // Don't bother to check DUIDs longer than the maximum - these cannot be
  1069. // constructed, and that limitation is tested in the DUID/Client ID unit
  1070. // tests.
  1071. }
  1072. void
  1073. GenericLeaseMgrTest::testLease6LeaseTypeCheck() {
  1074. Lease6Ptr empty_lease(new Lease6());
  1075. DuidPtr duid(new DUID(vector<uint8_t>(8, 0x77)));
  1076. // Initialize unused fields.
  1077. empty_lease->t1_ = 0; // Not saved
  1078. empty_lease->t2_ = 0; // Not saved
  1079. empty_lease->iaid_ = 142;
  1080. empty_lease->duid_ = DuidPtr(new DUID(*duid));
  1081. empty_lease->subnet_id_ = 23;
  1082. empty_lease->preferred_lft_ = 100;
  1083. empty_lease->valid_lft_ = 100;
  1084. empty_lease->cltt_ = 100;
  1085. empty_lease->fqdn_fwd_ = true;
  1086. empty_lease->fqdn_rev_ = true;
  1087. empty_lease->hostname_ = "myhost.example.com.";
  1088. empty_lease->prefixlen_ = 4;
  1089. // Make Two leases per lease type, all with the same DUID, IAID but
  1090. // alternate the subnet_ids.
  1091. vector<Lease6Ptr> leases;
  1092. for (int i = 0; i < 6; ++i) {
  1093. Lease6Ptr lease(new Lease6(*empty_lease));
  1094. lease->type_ = leasetype6_[i / 2];
  1095. lease->addr_ = IOAddress(straddress6_[i]);
  1096. lease->subnet_id_ += (i % 2);
  1097. leases.push_back(lease);
  1098. EXPECT_TRUE(lmptr_->addLease(lease));
  1099. }
  1100. // Verify getting a single lease by type and address.
  1101. for (int i = 0; i < 6; ++i) {
  1102. // Look for exact match for each lease type.
  1103. Lease6Ptr returned = lmptr_->getLease6(leasetype6_[i / 2],
  1104. leases[i]->addr_);
  1105. // We should match one per lease type.
  1106. ASSERT_TRUE(returned);
  1107. EXPECT_TRUE(*returned == *leases[i]);
  1108. // Same address but wrong lease type, should not match.
  1109. returned = lmptr_->getLease6(leasetype6_[i / 2 + 1], leases[i]->addr_);
  1110. ASSERT_FALSE(returned);
  1111. }
  1112. // Verify getting a collection of leases by type, DUID, and IAID.
  1113. // Iterate over the lease types, asking for leases based on
  1114. // lease type, DUID, and IAID.
  1115. for (int i = 0; i < 3; ++i) {
  1116. Lease6Collection returned = lmptr_->getLeases6(leasetype6_[i],
  1117. *duid, 142);
  1118. // We should match two per lease type.
  1119. ASSERT_EQ(2, returned.size());
  1120. // Collection order returned is not guaranteed.
  1121. // Easiest way to check is to look at the addresses.
  1122. vector<string> addresses;
  1123. for (Lease6Collection::const_iterator it = returned.begin();
  1124. it != returned.end(); ++it) {
  1125. addresses.push_back((*it)->addr_.toText());
  1126. }
  1127. sort(addresses.begin(), addresses.end());
  1128. // Now verify that the lease addresses match.
  1129. EXPECT_EQ(addresses[0], leases[(i * 2)]->addr_.toText());
  1130. EXPECT_EQ(addresses[1], leases[(i * 2 + 1)]->addr_.toText());
  1131. }
  1132. // Verify getting a collection of leases by type, DUID, IAID, and subnet id.
  1133. // Iterate over the lease types, asking for leases based on
  1134. // lease type, DUID, IAID, and subnet_id.
  1135. for (int i = 0; i < 3; ++i) {
  1136. Lease6Collection returned = lmptr_->getLeases6(leasetype6_[i],
  1137. *duid, 142, 23);
  1138. // We should match one per lease type.
  1139. ASSERT_EQ(1, returned.size());
  1140. EXPECT_TRUE(*(returned[0]) == *leases[i * 2]);
  1141. }
  1142. // Verify getting a single lease by type, duid, iad, and subnet id.
  1143. for (int i = 0; i < 6; ++i) {
  1144. Lease6Ptr returned = lmptr_->getLease6(leasetype6_[i / 2],
  1145. *duid, 142, (23 + (i % 2)));
  1146. // We should match one per lease type.
  1147. ASSERT_TRUE(returned);
  1148. EXPECT_TRUE(*returned == *leases[i]);
  1149. }
  1150. }
  1151. void
  1152. GenericLeaseMgrTest::testGetLease6DuidIaidSubnetId() {
  1153. // Get the leases to be used for the test and add them to the database.
  1154. vector<Lease6Ptr> leases = createLeases6();
  1155. for (size_t i = 0; i < leases.size(); ++i) {
  1156. EXPECT_TRUE(lmptr_->addLease(leases[i]));
  1157. }
  1158. // Get the leases matching the DUID and IAID of lease[1].
  1159. Lease6Ptr returned = lmptr_->getLease6(leasetype6_[1], *leases[1]->duid_,
  1160. leases[1]->iaid_,
  1161. leases[1]->subnet_id_);
  1162. ASSERT_TRUE(returned);
  1163. EXPECT_TRUE(*returned == *leases[1]);
  1164. // Modify each of the three parameters (DUID, IAID, Subnet ID) and
  1165. // check that nothing is returned.
  1166. returned = lmptr_->getLease6(leasetype6_[1], *leases[1]->duid_,
  1167. leases[1]->iaid_ + 1, leases[1]->subnet_id_);
  1168. EXPECT_FALSE(returned);
  1169. returned = lmptr_->getLease6(leasetype6_[1], *leases[1]->duid_,
  1170. leases[1]->iaid_, leases[1]->subnet_id_ + 1);
  1171. EXPECT_FALSE(returned);
  1172. // Alter the leases[1] DUID to match nothing in the database.
  1173. vector<uint8_t> duid_vector = leases[1]->duid_->getDuid();
  1174. ++duid_vector[0];
  1175. DUID new_duid(duid_vector);
  1176. returned = lmptr_->getLease6(leasetype6_[1], new_duid, leases[1]->iaid_,
  1177. leases[1]->subnet_id_);
  1178. EXPECT_FALSE(returned);
  1179. }
  1180. /// @brief Checks that getLease6() works with different DUID sizes
  1181. void
  1182. GenericLeaseMgrTest::testGetLease6DuidIaidSubnetIdSize() {
  1183. // Create leases, although we need only one.
  1184. vector<Lease6Ptr> leases = createLeases6();
  1185. // Now add leases with increasing DUID size can be retrieved.
  1186. // For speed, go from 0 to 128 is steps of 16.
  1187. int duid_max = DUID::MAX_DUID_LEN;
  1188. EXPECT_EQ(128, duid_max);
  1189. int duid_min = DUID::MIN_DUID_LEN;
  1190. EXPECT_EQ(1, duid_min);
  1191. for (uint8_t i = duid_min; i <= duid_max; i += 16) {
  1192. vector<uint8_t> duid_vec(i, i);
  1193. leases[1]->duid_.reset(new DUID(duid_vec));
  1194. EXPECT_TRUE(lmptr_->addLease(leases[1]));
  1195. Lease6Ptr returned = lmptr_->getLease6(leasetype6_[1], *leases[1]->duid_,
  1196. leases[1]->iaid_,
  1197. leases[1]->subnet_id_);
  1198. ASSERT_TRUE(returned);
  1199. detailCompareLease(leases[1], returned);
  1200. (void) lmptr_->deleteLease(leases[1]->addr_);
  1201. }
  1202. // Don't bother to check DUIDs longer than the maximum - these cannot be
  1203. // constructed, and that limitation is tested in the DUID/Client ID unit
  1204. // tests.
  1205. }
  1206. void
  1207. GenericLeaseMgrTest::testUpdateLease4() {
  1208. // Get the leases to be used for the test and add them to the database.
  1209. vector<Lease4Ptr> leases = createLeases4();
  1210. for (size_t i = 0; i < leases.size(); ++i) {
  1211. EXPECT_TRUE(lmptr_->addLease(leases[i]));
  1212. }
  1213. // Modify some fields in lease 1 (not the address) and update it.
  1214. ++leases[1]->subnet_id_;
  1215. leases[1]->valid_lft_ *= 2;
  1216. leases[1]->hostname_ = "modified.hostname.";
  1217. leases[1]->fqdn_fwd_ = !leases[1]->fqdn_fwd_;
  1218. leases[1]->fqdn_rev_ = !leases[1]->fqdn_rev_;;
  1219. lmptr_->updateLease4(leases[1]);
  1220. // ... and check what is returned is what is expected.
  1221. Lease4Ptr l_returned = lmptr_->getLease4(ioaddress4_[1]);
  1222. ASSERT_TRUE(l_returned);
  1223. detailCompareLease(leases[1], l_returned);
  1224. // Alter the lease again and check.
  1225. ++leases[1]->subnet_id_;
  1226. leases[1]->cltt_ += 6;
  1227. lmptr_->updateLease4(leases[1]);
  1228. // Explicitly clear the returned pointer before getting new data to ensure
  1229. // that the new data is returned.
  1230. l_returned.reset();
  1231. l_returned = lmptr_->getLease4(ioaddress4_[1]);
  1232. ASSERT_TRUE(l_returned);
  1233. detailCompareLease(leases[1], l_returned);
  1234. // Check we can do an update without changing data.
  1235. lmptr_->updateLease4(leases[1]);
  1236. l_returned.reset();
  1237. l_returned = lmptr_->getLease4(ioaddress4_[1]);
  1238. ASSERT_TRUE(l_returned);
  1239. detailCompareLease(leases[1], l_returned);
  1240. // Try to update the lease with the too long hostname.
  1241. leases[1]->hostname_.assign(256, 'a');
  1242. EXPECT_THROW(lmptr_->updateLease4(leases[1]), isc::dhcp::DbOperationError);
  1243. // Try updating a lease not in the database.
  1244. lmptr_->deleteLease(ioaddress4_[2]);
  1245. EXPECT_THROW(lmptr_->updateLease4(leases[2]), isc::dhcp::NoSuchLease);
  1246. }
  1247. void
  1248. GenericLeaseMgrTest::testUpdateLease6() {
  1249. // Get the leases to be used for the test.
  1250. vector<Lease6Ptr> leases = createLeases6();
  1251. ASSERT_LE(3, leases.size()); // Expect to access leases 0 through 2
  1252. // Add a lease to the database and check that the lease is there.
  1253. EXPECT_TRUE(lmptr_->addLease(leases[1]));
  1254. lmptr_->commit();
  1255. Lease6Ptr l_returned = lmptr_->getLease6(leasetype6_[1], ioaddress6_[1]);
  1256. ASSERT_TRUE(l_returned);
  1257. detailCompareLease(leases[1], l_returned);
  1258. // Modify some fields in lease 1 (not the address) and update it.
  1259. ++leases[1]->iaid_;
  1260. leases[1]->type_ = Lease::TYPE_PD;
  1261. leases[1]->valid_lft_ *= 2;
  1262. leases[1]->hostname_ = "modified.hostname.v6.";
  1263. leases[1]->fqdn_fwd_ = !leases[1]->fqdn_fwd_;
  1264. leases[1]->fqdn_rev_ = !leases[1]->fqdn_rev_;;
  1265. lmptr_->updateLease6(leases[1]);
  1266. lmptr_->commit();
  1267. // ... and check what is returned is what is expected.
  1268. l_returned.reset();
  1269. l_returned = lmptr_->getLease6(Lease::TYPE_PD, ioaddress6_[1]);
  1270. ASSERT_TRUE(l_returned);
  1271. detailCompareLease(leases[1], l_returned);
  1272. // Alter the lease again and check.
  1273. ++leases[1]->iaid_;
  1274. leases[1]->type_ = Lease::TYPE_TA;
  1275. leases[1]->cltt_ += 6;
  1276. leases[1]->prefixlen_ = 93;
  1277. lmptr_->updateLease6(leases[1]);
  1278. l_returned.reset();
  1279. l_returned = lmptr_->getLease6(Lease::TYPE_TA, ioaddress6_[1]);
  1280. ASSERT_TRUE(l_returned);
  1281. detailCompareLease(leases[1], l_returned);
  1282. // Check we can do an update without changing data.
  1283. lmptr_->updateLease6(leases[1]);
  1284. l_returned.reset();
  1285. l_returned = lmptr_->getLease6(Lease::TYPE_TA, ioaddress6_[1]);
  1286. ASSERT_TRUE(l_returned);
  1287. detailCompareLease(leases[1], l_returned);
  1288. // Try to update the lease with the too long hostname.
  1289. leases[1]->hostname_.assign(256, 'a');
  1290. EXPECT_THROW(lmptr_->updateLease6(leases[1]), isc::dhcp::DbOperationError);
  1291. // Try updating a lease not in the database.
  1292. EXPECT_THROW(lmptr_->updateLease6(leases[2]), isc::dhcp::NoSuchLease);
  1293. }
  1294. void
  1295. GenericLeaseMgrTest::testRecreateLease4() {
  1296. // Create a lease.
  1297. std::vector<Lease4Ptr> leases = createLeases4();
  1298. // Copy the lease so as we can freely modify it.
  1299. Lease4Ptr lease(new Lease4(*leases[0]));
  1300. // Add a lease.
  1301. EXPECT_TRUE(lmptr_->addLease(lease));
  1302. lmptr_->commit();
  1303. // Check that the lease has been successfuly added.
  1304. Lease4Ptr l_returned = lmptr_->getLease4(ioaddress4_[0]);
  1305. ASSERT_TRUE(l_returned);
  1306. detailCompareLease(lease, l_returned);
  1307. // Delete a lease, check that it's gone.
  1308. EXPECT_TRUE(lmptr_->deleteLease(ioaddress4_[0]));
  1309. EXPECT_FALSE(lmptr_->getLease4(ioaddress4_[0]));
  1310. // Modify the copy of the lease. Increasing values or negating them ensures
  1311. // that they are really modified, because we will never get the same values.
  1312. ++lease->subnet_id_;
  1313. ++lease->valid_lft_;
  1314. lease->fqdn_fwd_ = !lease->fqdn_fwd_;
  1315. // Make sure that the lease has been really modified.
  1316. ASSERT_NE(*lease, *leases[0]);
  1317. // Add the updated lease.
  1318. EXPECT_TRUE(lmptr_->addLease(lease));
  1319. lmptr_->commit();
  1320. // Reopen the lease database, so as the lease is re-read.
  1321. reopen(V4);
  1322. // The lease in the database should be modified.
  1323. l_returned = lmptr_->getLease4(ioaddress4_[0]);
  1324. ASSERT_TRUE(l_returned);
  1325. detailCompareLease(lease, l_returned);
  1326. }
  1327. void
  1328. GenericLeaseMgrTest::testRecreateLease6() {
  1329. // Create a lease.
  1330. std::vector<Lease6Ptr> leases = createLeases6();
  1331. // Copy the lease so as we can freely modify it.
  1332. Lease6Ptr lease(new Lease6(*leases[0]));
  1333. // Add a lease.
  1334. EXPECT_TRUE(lmptr_->addLease(lease));
  1335. lmptr_->commit();
  1336. // Check that the lease has been successfuly added.
  1337. Lease6Ptr l_returned = lmptr_->getLease6(Lease::TYPE_NA, ioaddress6_[0]);
  1338. ASSERT_TRUE(l_returned);
  1339. detailCompareLease(lease, l_returned);
  1340. // Delete a lease, check that it's gone.
  1341. EXPECT_TRUE(lmptr_->deleteLease(ioaddress6_[0]));
  1342. EXPECT_FALSE(lmptr_->getLease6(Lease::TYPE_NA, ioaddress6_[0]));
  1343. // Modify the copy of the lease. Increasing values or negating them ensures
  1344. // that they are really modified, because we will never get the same values.
  1345. ++lease->subnet_id_;
  1346. ++lease->valid_lft_;
  1347. lease->fqdn_fwd_ = !lease->fqdn_fwd_;
  1348. // Make sure that the lease has been really modified.
  1349. ASSERT_NE(*lease, *leases[0]);
  1350. // Add the updated lease.
  1351. EXPECT_TRUE(lmptr_->addLease(lease));
  1352. lmptr_->commit();
  1353. // Reopen the lease database, so as the lease is re-read.
  1354. reopen(V6);
  1355. // The lease in the database should be modified.
  1356. l_returned = lmptr_->getLease6(Lease::TYPE_NA, ioaddress6_[0]);
  1357. ASSERT_TRUE(l_returned);
  1358. detailCompareLease(lease, l_returned);
  1359. }
  1360. void
  1361. GenericLeaseMgrTest::testNullDuid() {
  1362. // Create leases, although we need only one.
  1363. vector<Lease6Ptr> leases = createLeases6();
  1364. // Set DUID to empty pointer.
  1365. leases[1]->duid_.reset();
  1366. // Insert should throw.
  1367. ASSERT_THROW(lmptr_->addLease(leases[1]), DbOperationError);
  1368. }
  1369. void
  1370. GenericLeaseMgrTest::testVersion(int major, int minor) {
  1371. EXPECT_EQ(major, lmptr_->getVersion().first);
  1372. EXPECT_EQ(minor, lmptr_->getVersion().second);
  1373. }
  1374. void
  1375. GenericLeaseMgrTest::testGetExpiredLeases4() {
  1376. // Get the leases to be used for the test.
  1377. vector<Lease4Ptr> leases = createLeases4();
  1378. // Make sure we have at least 6 leases there.
  1379. ASSERT_GE(leases.size(), 6);
  1380. // Use the same current time for all leases.
  1381. time_t current_time = time(NULL);
  1382. // Add them to the database
  1383. for (size_t i = 0; i < leases.size(); ++i) {
  1384. // Mark every other lease as expired.
  1385. if (i % 2 == 0) {
  1386. // Set client last transmission time to the value older than the
  1387. // valid lifetime to make it expired. The expiration time also
  1388. // depends on the lease index, so as we can later check that the
  1389. // leases are ordered by the expiration time.
  1390. leases[i]->cltt_ = current_time - leases[i]->valid_lft_ - 10 - i;
  1391. } else {
  1392. // Set current time as cltt for remaining leases. These leases are
  1393. // not expired.
  1394. leases[i]->cltt_ = current_time;
  1395. }
  1396. ASSERT_TRUE(lmptr_->addLease(leases[i]));
  1397. }
  1398. // Retrieve at most 1000 expired leases.
  1399. Lease4Collection expired_leases;
  1400. ASSERT_NO_THROW(lmptr_->getExpiredLeases4(expired_leases, 1000));
  1401. // Leases with even indexes should be returned as expired.
  1402. ASSERT_EQ(static_cast<size_t>(leases.size() / 2), expired_leases.size());
  1403. // The expired leases should be returned from the most to least expired.
  1404. // This matches the reverse order to which they have been added.
  1405. for (Lease4Collection::reverse_iterator lease = expired_leases.rbegin();
  1406. lease != expired_leases.rend(); ++lease) {
  1407. int index = static_cast<int>(std::distance(expired_leases.rbegin(), lease));
  1408. // Multiple current index by two, because only leases with even indexes
  1409. // should have been returned.
  1410. ASSERT_LE(2 * index, leases.size());
  1411. EXPECT_EQ(leases[2 * index]->addr_, (*lease)->addr_);
  1412. }
  1413. // Update current time for the next test.
  1414. current_time = time(NULL);
  1415. // Also, remove expired leases collected during the previous test.
  1416. expired_leases.clear();
  1417. // This time let's reverse the expiration time and see if they will be returned
  1418. // in the correct order.
  1419. for (int i = 0; i < leases.size(); ++i) {
  1420. // Update the time of expired leases with even indexes.
  1421. if (i % 2 == 0) {
  1422. leases[i]->cltt_ = current_time - leases[i]->valid_lft_ - 1000 + i;
  1423. } else {
  1424. // Make sure remaining leases remain unexpired.
  1425. leases[i]->cltt_ = current_time + 100;
  1426. }
  1427. ASSERT_NO_THROW(lmptr_->updateLease4(leases[i]));
  1428. }
  1429. // Retrieve expired leases again. The limit of 0 means return all expired
  1430. // leases.
  1431. ASSERT_NO_THROW(lmptr_->getExpiredLeases4(expired_leases, 0));
  1432. // The same leases should be returned.
  1433. ASSERT_EQ(static_cast<size_t>(leases.size() / 2), expired_leases.size());
  1434. // This time leases should be returned in the non-reverse order.
  1435. for (Lease4Collection::iterator lease = expired_leases.begin();
  1436. lease != expired_leases.end(); ++lease) {
  1437. int index = static_cast<int>(std::distance(expired_leases.begin(), lease));
  1438. ASSERT_LE(2 * index, leases.size());
  1439. EXPECT_EQ(leases[2 * index]->addr_, (*lease)->addr_);
  1440. }
  1441. // Remember expired leases returned.
  1442. std::vector<Lease4Ptr> saved_expired_leases = expired_leases;
  1443. // Remove expired leases again.
  1444. expired_leases.clear();
  1445. // Limit the number of leases to be returned to 2.
  1446. ASSERT_NO_THROW(lmptr_->getExpiredLeases4(expired_leases, 2));
  1447. // Make sure we have exactly 2 leases returned.
  1448. ASSERT_EQ(2, expired_leases.size());
  1449. // Test that most expired leases have been returned.
  1450. for (Lease4Collection::iterator lease = expired_leases.begin();
  1451. lease != expired_leases.end(); ++lease) {
  1452. int index = static_cast<int>(std::distance(expired_leases.begin(), lease));
  1453. ASSERT_LE(2 * index, leases.size());
  1454. EXPECT_EQ(leases[2 * index]->addr_, (*lease)->addr_);
  1455. }
  1456. // Mark every other expired lease as reclaimed.
  1457. for (int i = 0; i < saved_expired_leases.size(); ++i) {
  1458. if (i % 2 != 0) {
  1459. saved_expired_leases[i]->state_ = Lease::STATE_EXPIRED_RECLAIMED;
  1460. }
  1461. ASSERT_NO_THROW(lmptr_->updateLease4(saved_expired_leases[i]));
  1462. }
  1463. expired_leases.clear();
  1464. // This the returned leases should exclude reclaimed ones. So the number
  1465. // of returned leases should be roughly half of the expired leases.
  1466. ASSERT_NO_THROW(lmptr_->getExpiredLeases4(expired_leases, 0));
  1467. ASSERT_EQ(static_cast<size_t>(saved_expired_leases.size() / 2),
  1468. expired_leases.size());
  1469. // Make sure that returned leases are those that are not reclaimed, i.e.
  1470. // those that have even index.
  1471. for (Lease4Collection::iterator lease = expired_leases.begin();
  1472. lease != expired_leases.end(); ++lease) {
  1473. int index = static_cast<int>(std::distance(expired_leases.begin(), lease));
  1474. EXPECT_EQ(saved_expired_leases[2 * index]->addr_, (*lease)->addr_);
  1475. }
  1476. }
  1477. void
  1478. GenericLeaseMgrTest::testGetExpiredLeases6() {
  1479. // Get the leases to be used for the test.
  1480. vector<Lease6Ptr> leases = createLeases6();
  1481. // Make sure we have at least 6 leases there.
  1482. ASSERT_GE(leases.size(), 6);
  1483. // Use the same current time for all leases.
  1484. time_t current_time = time(NULL);
  1485. // Add them to the database
  1486. for (size_t i = 0; i < leases.size(); ++i) {
  1487. // Mark every other lease as expired.
  1488. if (i % 2 == 0) {
  1489. // Set client last transmission time to the value older than the
  1490. // valid lifetime to make it expired. The expiration time also
  1491. // depends on the lease index, so as we can later check that the
  1492. // leases are ordered by the expiration time.
  1493. leases[i]->cltt_ = current_time - leases[i]->valid_lft_ - 10 - i;
  1494. } else {
  1495. // Set current time as cltt for remaining leases. These leases are
  1496. // not expired.
  1497. leases[i]->cltt_ = current_time;
  1498. }
  1499. ASSERT_TRUE(lmptr_->addLease(leases[i]));
  1500. }
  1501. // Retrieve at most 1000 expired leases.
  1502. Lease6Collection expired_leases;
  1503. ASSERT_NO_THROW(lmptr_->getExpiredLeases6(expired_leases, 1000));
  1504. // Leases with even indexes should be returned as expired.
  1505. ASSERT_EQ(static_cast<size_t>(leases.size() / 2), expired_leases.size());
  1506. // The expired leases should be returned from the most to least expired.
  1507. // This matches the reverse order to which they have been added.
  1508. for (Lease6Collection::reverse_iterator lease = expired_leases.rbegin();
  1509. lease != expired_leases.rend(); ++lease) {
  1510. int index = static_cast<int>(std::distance(expired_leases.rbegin(), lease));
  1511. // Multiple current index by two, because only leases with even indexes
  1512. // should have been returned.
  1513. EXPECT_EQ(leases[2 * index]->addr_, (*lease)->addr_);
  1514. }
  1515. // Update current time for the next test.
  1516. current_time = time(NULL);
  1517. // Also, remove expired leases collected during the previous test.
  1518. expired_leases.clear();
  1519. // This time let's reverse the expiration time and see if they will be returned
  1520. // in the correct order.
  1521. for (int i = 0; i < leases.size(); ++i) {
  1522. // Update the time of expired leases with even indexes.
  1523. if (i % 2 == 0) {
  1524. leases[i]->cltt_ = current_time - leases[i]->valid_lft_ - 1000 + i;
  1525. } else {
  1526. // Make sure remaining leases remain unexpired.
  1527. leases[i]->cltt_ = current_time + 100;
  1528. }
  1529. ASSERT_NO_THROW(lmptr_->updateLease6(leases[i]));
  1530. }
  1531. // Retrieve expired leases again. The limit of 0 means return all expired
  1532. // leases.
  1533. ASSERT_NO_THROW(lmptr_->getExpiredLeases6(expired_leases, 0));
  1534. // The same leases should be returned.
  1535. ASSERT_EQ(static_cast<size_t>(leases.size() / 2), expired_leases.size());
  1536. // This time leases should be returned in the non-reverse order.
  1537. for (Lease6Collection::iterator lease = expired_leases.begin();
  1538. lease != expired_leases.end(); ++lease) {
  1539. int index = static_cast<int>(std::distance(expired_leases.begin(), lease));
  1540. EXPECT_EQ(leases[2 * index]->addr_, (*lease)->addr_);
  1541. }
  1542. // Remember expired leases returned.
  1543. std::vector<Lease6Ptr> saved_expired_leases = expired_leases;
  1544. // Remove expired leases again.
  1545. expired_leases.clear();
  1546. // Limit the number of leases to be returned to 2.
  1547. ASSERT_NO_THROW(lmptr_->getExpiredLeases6(expired_leases, 2));
  1548. // Make sure we have exactly 2 leases returned.
  1549. ASSERT_EQ(2, expired_leases.size());
  1550. // Test that most expired leases have been returned.
  1551. for (Lease6Collection::iterator lease = expired_leases.begin();
  1552. lease != expired_leases.end(); ++lease) {
  1553. int index = static_cast<int>(std::distance(expired_leases.begin(), lease));
  1554. EXPECT_EQ(leases[2 * index]->addr_, (*lease)->addr_);
  1555. }
  1556. // Mark every other expired lease as reclaimed.
  1557. for (int i = 0; i < saved_expired_leases.size(); ++i) {
  1558. if (i % 2 != 0) {
  1559. saved_expired_leases[i]->state_ = Lease::STATE_EXPIRED_RECLAIMED;
  1560. }
  1561. ASSERT_NO_THROW(lmptr_->updateLease6(saved_expired_leases[i]));
  1562. }
  1563. expired_leases.clear();
  1564. // This the returned leases should exclude reclaimed ones. So the number
  1565. // of returned leases should be roughly half of the expired leases.
  1566. ASSERT_NO_THROW(lmptr_->getExpiredLeases6(expired_leases, 0));
  1567. ASSERT_EQ(static_cast<size_t>(saved_expired_leases.size() / 2),
  1568. expired_leases.size());
  1569. // Make sure that returned leases are those that are not reclaimed, i.e.
  1570. // those that have even index.
  1571. for (Lease6Collection::iterator lease = expired_leases.begin();
  1572. lease != expired_leases.end(); ++lease) {
  1573. int index = static_cast<int>(std::distance(expired_leases.begin(), lease));
  1574. EXPECT_EQ(saved_expired_leases[2 * index]->addr_, (*lease)->addr_);
  1575. }
  1576. }
  1577. void
  1578. GenericLeaseMgrTest::testDeleteExpiredReclaimedLeases4() {
  1579. // Get the leases to be used for the test.
  1580. vector<Lease4Ptr> leases = createLeases4();
  1581. // Make sure we have at least 6 leases there.
  1582. ASSERT_GE(leases.size(), 6);
  1583. time_t current_time = time(NULL);
  1584. // Add them to the database
  1585. for (size_t i = 0; i < leases.size(); ++i) {
  1586. // Mark every other lease as expired.
  1587. if (i % 2 == 0) {
  1588. // Set client last transmission time to the value older than the
  1589. // valid lifetime to make it expired. We also substract the value
  1590. // of 10, 20, 30, 40 etc, depending on the lease index. This
  1591. // simulates different expiration times for various leases.
  1592. leases[i]->cltt_ = current_time - leases[i]->valid_lft_ - i * 10;
  1593. // Set reclaimed state.
  1594. leases[i]->state_ = Lease::STATE_EXPIRED_RECLAIMED;
  1595. } else {
  1596. // Other leases are left as not expired - client last transmission
  1597. // time set to current time.
  1598. leases[i]->cltt_ = current_time;
  1599. }
  1600. ASSERT_TRUE(lmptr_->addLease(leases[i]));
  1601. }
  1602. // Keep reclaimed lease for 15 seconds after expiration.
  1603. const uint32_t lease_affinity_time = 15;
  1604. // Delete expired and reclaimed leases which have expired earlier than
  1605. // 15 seconds ago. This should affect leases with index 2, 3, 4 etc.
  1606. uint64_t deleted_num;
  1607. uint64_t should_delete_num = 0;
  1608. ASSERT_NO_THROW(
  1609. deleted_num = lmptr_->deleteExpiredReclaimedLeases4(lease_affinity_time)
  1610. );
  1611. for (size_t i = 0; i < leases.size(); ++i) {
  1612. // Obtain lease from the server.
  1613. Lease4Ptr lease = lmptr_->getLease4(leases[i]->addr_);
  1614. // If the lease is reclaimed and the expiration time passed more than
  1615. // 15 seconds ago, the lease should have been deleted.
  1616. if (leases[i]->stateExpiredReclaimed() &&
  1617. ((leases[i]->getExpirationTime() + lease_affinity_time) < current_time)) {
  1618. EXPECT_FALSE(lease) << "The following lease should have been"
  1619. " deleted: " << leases[i]->toText();
  1620. ++should_delete_num;
  1621. } else {
  1622. // If the lease is not reclaimed or it has expired less than
  1623. // 15 seconds ago, the lease should still be there.
  1624. EXPECT_TRUE(lease) << "The following lease shouldn't have been"
  1625. " deleted: " << leases[i]->toText();
  1626. }
  1627. }
  1628. // Check that the number of leases deleted is correct.
  1629. EXPECT_EQ(deleted_num, should_delete_num);
  1630. // Make sure we can make another attempt, when there are no more leases
  1631. // to be deleted.
  1632. ASSERT_NO_THROW(
  1633. deleted_num = lmptr_->deleteExpiredReclaimedLeases4(lease_affinity_time)
  1634. );
  1635. // No lease should have been deleted.
  1636. EXPECT_EQ(0, deleted_num);
  1637. // Reopen the database. This to ensure that the leases have been deleted
  1638. // from the persistent storage.
  1639. reopen(V4);
  1640. for (size_t i = 0; i < leases.size(); ++i) {
  1641. /// @todo Leases with empty HW address are dropped by the memfile
  1642. /// backend. We will have to reevaluate if this is right behavior
  1643. /// of the backend when client identifier is present.
  1644. if (leases[i]->hwaddr_ && leases[i]->hwaddr_->hwaddr_.empty()) {
  1645. continue;
  1646. }
  1647. // Obtain lease from the server.
  1648. Lease4Ptr lease = lmptr_->getLease4(leases[i]->addr_);
  1649. // If the lease is reclaimed and the expiration time passed more than
  1650. // 15 seconds ago, the lease should have been deleted.
  1651. if (leases[i]->stateExpiredReclaimed() &&
  1652. ((leases[i]->getExpirationTime() + lease_affinity_time) < current_time)) {
  1653. EXPECT_FALSE(lease) << "The following lease should have been"
  1654. " deleted: " << leases[i]->toText();
  1655. } else {
  1656. // If the lease is not reclaimed or it has expired less than
  1657. // 15 seconds ago, the lease should still be there.
  1658. EXPECT_TRUE(lease) << "The following lease shouldn't have been"
  1659. " deleted: " << leases[i]->toText();
  1660. }
  1661. }
  1662. }
  1663. void
  1664. GenericLeaseMgrTest::testDeleteExpiredReclaimedLeases6() {
  1665. // Get the leases to be used for the test.
  1666. vector<Lease6Ptr> leases = createLeases6();
  1667. // Make sure we have at least 6 leases there.
  1668. ASSERT_GE(leases.size(), 6);
  1669. time_t current_time = time(NULL);
  1670. // Add them to the database
  1671. for (size_t i = 0; i < leases.size(); ++i) {
  1672. // Mark every other lease as expired.
  1673. if (i % 2 == 0) {
  1674. // Set client last transmission time to the value older than the
  1675. // valid lifetime to make it expired. We also substract the value
  1676. // of 10, 20, 30, 40 etc, depending on the lease index. This
  1677. // simulates different expiration times for various leases.
  1678. leases[i]->cltt_ = current_time - leases[i]->valid_lft_ - i * 10;
  1679. // Set reclaimed state.
  1680. leases[i]->state_ = Lease::STATE_EXPIRED_RECLAIMED;
  1681. } else {
  1682. // Other leases are left as not expired - client last transmission
  1683. // time set to current time.
  1684. leases[i]->cltt_ = current_time;
  1685. }
  1686. ASSERT_TRUE(lmptr_->addLease(leases[i]));
  1687. }
  1688. // Keep reclaimed lease for 15 seconds after expiration.
  1689. const uint32_t lease_affinity_time = 15;
  1690. // Delete expired and reclaimed leases which have expired earlier than
  1691. // 15 seconds ago. This should affect leases with index 2, 3, 4 etc.
  1692. uint64_t deleted_num;
  1693. uint64_t should_delete_num = 0;
  1694. ASSERT_NO_THROW(
  1695. deleted_num = lmptr_->deleteExpiredReclaimedLeases6(lease_affinity_time)
  1696. );
  1697. for (size_t i = 0; i < leases.size(); ++i) {
  1698. // Obtain lease from the server.
  1699. Lease6Ptr lease = lmptr_->getLease6(leases[i]->type_, leases[i]->addr_);
  1700. // If the lease is reclaimed and the expiration time passed more than
  1701. // 15 seconds ago, the lease should have been deleted.
  1702. if (leases[i]->stateExpiredReclaimed() &&
  1703. ((leases[i]->getExpirationTime() + lease_affinity_time) < current_time)) {
  1704. EXPECT_FALSE(lease) << "The following lease should have been"
  1705. " deleted: " << leases[i]->toText();
  1706. ++should_delete_num;
  1707. } else {
  1708. // If the lease is not reclaimed or it has expired less than
  1709. // 15 seconds ago, the lease should still be there.
  1710. EXPECT_TRUE(lease) << "The following lease shouldn't have been"
  1711. " deleted: " << leases[i]->toText();
  1712. }
  1713. }
  1714. // Check that the number of deleted leases is correct.
  1715. EXPECT_EQ(should_delete_num, deleted_num);
  1716. // Make sure we can make another attempt, when there are no more leases
  1717. // to be deleted.
  1718. ASSERT_NO_THROW(
  1719. deleted_num = lmptr_->deleteExpiredReclaimedLeases6(lease_affinity_time)
  1720. );
  1721. // No lease should have been deleted.
  1722. EXPECT_EQ(0, deleted_num);
  1723. // Reopen the database. This to ensure that the leases have been deleted
  1724. // from the persistent storage.
  1725. reopen(V6);
  1726. for (size_t i = 0; i < leases.size(); ++i) {
  1727. // Obtain lease from the server.
  1728. Lease6Ptr lease = lmptr_->getLease6(leases[i]->type_, leases[i]->addr_);
  1729. // If the lease is reclaimed and the expiration time passed more than
  1730. // 15 seconds ago, the lease should have been deleted.
  1731. if (leases[i]->stateExpiredReclaimed() &&
  1732. ((leases[i]->getExpirationTime() + lease_affinity_time) < current_time)) {
  1733. EXPECT_FALSE(lease) << "The following lease should have been"
  1734. " deleted: " << leases[i]->toText();
  1735. } else {
  1736. // If the lease is not reclaimed or it has expired less than
  1737. // 15 seconds ago, the lease should still be there.
  1738. EXPECT_TRUE(lease) << "The following lease shouldn't have been"
  1739. " deleted: " << leases[i]->toText();
  1740. }
  1741. }
  1742. }
  1743. void
  1744. GenericLeaseMgrTest::testGetDeclinedLeases4() {
  1745. // Get the leases to be used for the test.
  1746. vector<Lease4Ptr> leases = createLeases4();
  1747. // Make sure we have at least 8 leases there.
  1748. ASSERT_GE(leases.size(), 8);
  1749. // Use the same current time for all leases.
  1750. time_t current_time = time(NULL);
  1751. // Add them to the database
  1752. for (size_t i = 0; i < leases.size(); ++i) {
  1753. // Mark the first half of the leases as DECLINED
  1754. if (i < leases.size()/2) {
  1755. // Mark as declined with 1000 seconds of probation-period
  1756. leases[i]->decline(1000);
  1757. }
  1758. // Mark every second lease as expired.
  1759. if (i % 2 == 0) {
  1760. // Set client last transmission time to the value older than the
  1761. // valid lifetime to make it expired. The expiration time also
  1762. // depends on the lease index, so as we can later check that the
  1763. // leases are ordered by the expiration time.
  1764. leases[i]->cltt_ = current_time - leases[i]->valid_lft_ - 10 - i;
  1765. } else {
  1766. // Set current time as cltt for remaining leases. These leases are
  1767. // not expired.
  1768. leases[i]->cltt_ = current_time;
  1769. }
  1770. ASSERT_TRUE(lmptr_->addLease(leases[i]));
  1771. }
  1772. // The leases are:
  1773. // 0 - declined, expired
  1774. // 1 - declined, not expired
  1775. // 2 - declined, expired
  1776. // 3 - declined, not expired
  1777. // 4 - default, expired
  1778. // 5 - default, not expired
  1779. // 6 - default, expired
  1780. // 7 - default, not expired
  1781. // Retrieve at most 1000 expired leases.
  1782. Lease4Collection expired_leases;
  1783. ASSERT_NO_THROW(lmptr_->getExpiredLeases4(expired_leases, 1000));
  1784. // Leases with even indexes should be returned as expired. It shouldn't
  1785. // matter if the state is default or expired. The getExpiredLeases4 does
  1786. // not pay attention to state, just expiration timers.
  1787. ASSERT_EQ(static_cast<size_t>(leases.size() / 2), expired_leases.size());
  1788. unsigned int declined_state = 0;
  1789. unsigned int default_state = 0;
  1790. // The expired leases should be returned from the most to least expired.
  1791. // This matches the reverse order to which they have been added.
  1792. for (Lease4Collection::reverse_iterator lease = expired_leases.rbegin();
  1793. lease != expired_leases.rend(); ++lease) {
  1794. int index = static_cast<int>(std::distance(expired_leases.rbegin(), lease));
  1795. // Multiple current index by two, because only leases with even indexes
  1796. // should have been returned.
  1797. EXPECT_EQ(leases[2 * index]->addr_, (*lease)->addr_);
  1798. // Count leases in default and declined states
  1799. if ((*lease)->state_ == Lease::STATE_DEFAULT) {
  1800. default_state++;
  1801. } else if ((*lease)->state_ == Lease::STATE_DECLINED) {
  1802. declined_state++;
  1803. }
  1804. }
  1805. // LeaseMgr is supposed to return both default and declined leases
  1806. EXPECT_NE(0, declined_state);
  1807. EXPECT_NE(0, default_state);
  1808. // Update current time for the next test.
  1809. current_time = time(NULL);
  1810. // Also, remove expired leases collected during the previous test.
  1811. expired_leases.clear();
  1812. // This time let's reverse the expiration time and see if they will be returned
  1813. // in the correct order.
  1814. leases = createLeases4();
  1815. for (int i = 0; i < leases.size(); ++i) {
  1816. // Mark the second half of the leases as DECLINED
  1817. if (i >= leases.size()/2) {
  1818. // Mark as declined with 1000 seconds of probation-period
  1819. leases[i]->decline(1000);
  1820. }
  1821. // Update the time of expired leases with even indexes.
  1822. if (i % 2 == 0) {
  1823. leases[i]->cltt_ = current_time - leases[i]->valid_lft_ - 1000 + i;
  1824. } else {
  1825. // Make sure remaining leases remain unexpired.
  1826. leases[i]->cltt_ = current_time + 100;
  1827. }
  1828. ASSERT_NO_THROW(lmptr_->updateLease4(leases[i]));
  1829. }
  1830. // Retrieve expired leases again. The limit of 0 means return all expired
  1831. // leases.
  1832. ASSERT_NO_THROW(lmptr_->getExpiredLeases4(expired_leases, 0));
  1833. // The same leases should be returned.
  1834. ASSERT_EQ(static_cast<size_t>(leases.size() / 2), expired_leases.size());
  1835. // This time leases should be returned in the non-reverse order.
  1836. declined_state = 0;
  1837. default_state = 0;
  1838. for (Lease4Collection::iterator lease = expired_leases.begin();
  1839. lease != expired_leases.end(); ++lease) {
  1840. int index = static_cast<int>(std::distance(expired_leases.begin(), lease));
  1841. EXPECT_EQ(leases[2 * index]->addr_, (*lease)->addr_);
  1842. // Count leases in default and declined states
  1843. if ((*lease)->state_ == Lease::STATE_DEFAULT) {
  1844. default_state++;
  1845. } else if ((*lease)->state_ == Lease::STATE_DECLINED) {
  1846. declined_state++;
  1847. }
  1848. }
  1849. // Check that both declined and default state leases were returned.
  1850. EXPECT_NE(0, declined_state);
  1851. EXPECT_NE(0, default_state);
  1852. // Remember expired leases returned.
  1853. std::vector<Lease4Ptr> saved_expired_leases = expired_leases;
  1854. // Remove expired leases again.
  1855. expired_leases.clear();
  1856. // Limit the number of leases to be returned to 2.
  1857. ASSERT_NO_THROW(lmptr_->getExpiredLeases4(expired_leases, 2));
  1858. // Make sure we have exactly 2 leases returned.
  1859. ASSERT_EQ(2, expired_leases.size());
  1860. // Test that most expired leases have been returned.
  1861. for (Lease4Collection::iterator lease = expired_leases.begin();
  1862. lease != expired_leases.end(); ++lease) {
  1863. int index = static_cast<int>(std::distance(expired_leases.begin(), lease));
  1864. EXPECT_EQ(leases[2 * index]->addr_, (*lease)->addr_);
  1865. }
  1866. }
  1867. void
  1868. GenericLeaseMgrTest::testGetDeclinedLeases6() {
  1869. // Get the leases to be used for the test.
  1870. vector<Lease6Ptr> leases = createLeases6();
  1871. // Make sure we have at least 8 leases there.
  1872. ASSERT_GE(leases.size(), 8);
  1873. // Use the same current time for all leases.
  1874. time_t current_time = time(NULL);
  1875. // Add them to the database
  1876. for (size_t i = 0; i < leases.size(); ++i) {
  1877. // Mark the first half of the leases as DECLINED
  1878. if (i < leases.size()/2) {
  1879. // Mark as declined with 1000 seconds of probation-period
  1880. leases[i]->decline(1000);
  1881. }
  1882. // Mark every second lease as expired.
  1883. if (i % 2 == 0) {
  1884. // Set client last transmission time to the value older than the
  1885. // valid lifetime to make it expired. The expiration time also
  1886. // depends on the lease index, so as we can later check that the
  1887. // leases are ordered by the expiration time.
  1888. leases[i]->cltt_ = current_time - leases[i]->valid_lft_ - 10 - i;
  1889. } else {
  1890. // Set current time as cltt for remaining leases. These leases are
  1891. // not expired.
  1892. leases[i]->cltt_ = current_time;
  1893. }
  1894. ASSERT_TRUE(lmptr_->addLease(leases[i]));
  1895. }
  1896. // The leases are:
  1897. // 0 - declined, expired
  1898. // 1 - declined, not expired
  1899. // 2 - declined, expired
  1900. // 3 - declined, not expired
  1901. // 4 - default, expired
  1902. // 5 - default, not expired
  1903. // 6 - default, expired
  1904. // 7 - default, not expired
  1905. // Retrieve at most 1000 expired leases.
  1906. Lease6Collection expired_leases;
  1907. ASSERT_NO_THROW(lmptr_->getExpiredLeases6(expired_leases, 1000));
  1908. // Leases with even indexes should be returned as expired. It shouldn't
  1909. // matter if the state is default or expired. The getExpiredLeases4 does
  1910. // not pay attention to state, just expiration timers.
  1911. ASSERT_EQ(static_cast<size_t>(leases.size() / 2), expired_leases.size());
  1912. unsigned int declined_state = 0;
  1913. unsigned int default_state = 0;
  1914. // The expired leases should be returned from the most to least expired.
  1915. // This matches the reverse order to which they have been added.
  1916. for (Lease6Collection::reverse_iterator lease = expired_leases.rbegin();
  1917. lease != expired_leases.rend(); ++lease) {
  1918. int index = static_cast<int>(std::distance(expired_leases.rbegin(), lease));
  1919. // Multiple current index by two, because only leases with even indexes
  1920. // should have been returned.
  1921. EXPECT_EQ(leases[2 * index]->addr_, (*lease)->addr_);
  1922. // Count leases in default and declined states
  1923. if ((*lease)->state_ == Lease::STATE_DEFAULT) {
  1924. default_state++;
  1925. } else if ((*lease)->state_ == Lease::STATE_DECLINED) {
  1926. declined_state++;
  1927. }
  1928. }
  1929. // LeaseMgr is supposed to return both default and declined leases
  1930. EXPECT_NE(0, declined_state);
  1931. EXPECT_NE(0, default_state);
  1932. // Update current time for the next test.
  1933. current_time = time(NULL);
  1934. // Also, remove expired leases collected during the previous test.
  1935. expired_leases.clear();
  1936. // This time let's reverse the expiration time and see if they will be returned
  1937. // in the correct order.
  1938. leases = createLeases6();
  1939. for (int i = 0; i < leases.size(); ++i) {
  1940. // Mark the second half of the leases as DECLINED
  1941. if (i >= leases.size()/2) {
  1942. // Mark as declined with 1000 seconds of probation-period
  1943. leases[i]->decline(1000);
  1944. }
  1945. // Update the time of expired leases with even indexes.
  1946. if (i % 2 == 0) {
  1947. leases[i]->cltt_ = current_time - leases[i]->valid_lft_ - 1000 + i;
  1948. } else {
  1949. // Make sure remaining leases remain unexpired.
  1950. leases[i]->cltt_ = current_time + 100;
  1951. }
  1952. ASSERT_NO_THROW(lmptr_->updateLease6(leases[i]));
  1953. }
  1954. // Retrieve expired leases again. The limit of 0 means return all expired
  1955. // leases.
  1956. ASSERT_NO_THROW(lmptr_->getExpiredLeases6(expired_leases, 0));
  1957. // The same leases should be returned.
  1958. ASSERT_EQ(static_cast<size_t>(leases.size() / 2), expired_leases.size());
  1959. // This time leases should be returned in the non-reverse order.
  1960. declined_state = 0;
  1961. default_state = 0;
  1962. for (Lease6Collection::iterator lease = expired_leases.begin();
  1963. lease != expired_leases.end(); ++lease) {
  1964. int index = static_cast<int>(std::distance(expired_leases.begin(), lease));
  1965. EXPECT_EQ(leases[2 * index]->addr_, (*lease)->addr_);
  1966. // Count leases in default and declined states
  1967. if ((*lease)->state_ == Lease::STATE_DEFAULT) {
  1968. default_state++;
  1969. } else if ((*lease)->state_ == Lease::STATE_DECLINED) {
  1970. declined_state++;
  1971. }
  1972. }
  1973. // Check that both declined and default state leases were returned.
  1974. EXPECT_NE(0, declined_state);
  1975. EXPECT_NE(0, default_state);
  1976. // Remember expired leases returned.
  1977. std::vector<Lease6Ptr> saved_expired_leases = expired_leases;
  1978. // Remove expired leases again.
  1979. expired_leases.clear();
  1980. // Limit the number of leases to be returned to 2.
  1981. ASSERT_NO_THROW(lmptr_->getExpiredLeases6(expired_leases, 2));
  1982. // Make sure we have exactly 2 leases returned.
  1983. ASSERT_EQ(2, expired_leases.size());
  1984. // Test that most expired leases have been returned.
  1985. for (Lease6Collection::iterator lease = expired_leases.begin();
  1986. lease != expired_leases.end(); ++lease) {
  1987. int index = static_cast<int>(std::distance(expired_leases.begin(), lease));
  1988. EXPECT_EQ(leases[2 * index]->addr_, (*lease)->addr_);
  1989. }
  1990. }
  1991. }; // namespace test
  1992. }; // namespace dhcp
  1993. }; // namespace isc