generic_lease_mgr_unittest.cc 88 KB

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