1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879 |
- // Copyright (C) 2013-2015 Internet Systems Consortium, Inc. ("ISC")
- //
- // Permission to use, copy, modify, and/or distribute this software for any
- // purpose with or without fee is hereby granted, provided that the above
- // copyright notice and this permission notice appear in all copies.
- //
- // THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
- // REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- // AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
- // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- // LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
- // OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- // PERFORMANCE OF THIS SOFTWARE.
- #include <config.h>
- #include <asiolink/io_service.h>
- #include <d2/d2_cfg_mgr.h>
- #include <d2/d2_cfg_mgr.h>
- #include <d2/nc_remove.h>
- #include <dns/messagerenderer.h>
- #include <nc_test_utils.h>
- #include <boost/function.hpp>
- #include <boost/bind.hpp>
- #include <gtest/gtest.h>
- using namespace std;
- using namespace isc;
- using namespace isc::d2;
- namespace {
- /// @brief Test class derived from NameRemoveTransaction to provide visiblity
- // to protected methods.
- class NameRemoveStub : public NameRemoveTransaction {
- public:
- NameRemoveStub(asiolink::IOServicePtr& io_service,
- dhcp_ddns::NameChangeRequestPtr& ncr,
- DdnsDomainPtr& forward_domain,
- DdnsDomainPtr& reverse_domain,
- D2CfgMgrPtr& cfg_mgr)
- : NameRemoveTransaction(io_service, ncr, forward_domain,
- reverse_domain, cfg_mgr),
- simulate_send_exception_(false),
- simulate_build_request_exception_(false) {
- }
- virtual ~NameRemoveStub() {
- }
- /// @brief Simulates sending update requests to the DNS server
- ///
- /// This method simulates the initiation of an asynchronous send of
- /// a DNS update request. It overrides the actual sendUpdate method in
- /// the base class, thus avoiding an actual send, yet still increments
- /// the update attempt count and posts a next event of NOP_EVT.
- ///
- /// It will also simulate an exception-based failure of sendUpdate, if
- /// the simulate_send_exception_ flag is true.
- ///
- /// @param comment Parameter is unused, but present in base class method
- ///
- virtual void sendUpdate(const std::string& /* comment */) {
- if (simulate_send_exception_) {
- // Make the flag a one-shot by resetting it.
- simulate_send_exception_ = false;
- // Transition to failed.
- transition(PROCESS_TRANS_FAILED_ST, UPDATE_FAILED_EVT);
- return;
- }
- // Update send attempt count and post a NOP_EVT.
- setUpdateAttempts(getUpdateAttempts() + 1);
- postNextEvent(StateModel::NOP_EVT);
- }
- /// @brief Prepares the initial D2UpdateMessage
- ///
- /// This method overrides the NameChangeTransactio implementation to
- /// provide the ability to simulate an exception throw in the build
- /// request logic.
- /// If the one-shot flag, simulate_build_request_exception_ is true,
- /// this method will throw an exception, otherwise it will invoke the
- /// base class method, providing normal functionality.
- ///
- /// For parameter description see the NameChangeTransaction implementation.
- virtual D2UpdateMessagePtr prepNewRequest(DdnsDomainPtr domain) {
- if (simulate_build_request_exception_) {
- simulate_build_request_exception_ = false;
- isc_throw (NameRemoveTransactionError,
- "Simulated build requests exception");
- }
- return (NameChangeTransaction::prepNewRequest(domain));
- }
- /// @brief Simulates receiving a response
- ///
- /// This method simulates the completion of a DNSClient send. This allows
- /// the state handler logic devoted to dealing with IO completion to be
- /// fully exercised without requiring any actual IO. The two primary
- /// pieces of information gleaned from IO completion are the DNSClient
- /// status which indicates whether or not the IO exchange was successful
- /// and the rcode, which indicates the server's reaction to the request.
- ///
- /// This method updates the transaction's DNS status value to that of the
- /// given parameter, and then constructs and DNS update response message
- /// with the given rcode value. To complete the simulation it then posts
- /// a next event of IO_COMPLETED_EVT.
- ///
- /// @param status simulated DNSClient status
- /// @param rcode simulated server response code
- void fakeResponse(const DNSClient::Status& status,
- const dns::Rcode& rcode) {
- // Set the DNS update status. This is normally set in
- // DNSClient IO completion handler.
- setDnsUpdateStatus(status);
- // Construct an empty message with the given Rcode.
- D2UpdateMessagePtr msg(new D2UpdateMessage(D2UpdateMessage::OUTBOUND));
- msg->setRcode(rcode);
- // Set the update response to the message.
- setDnsUpdateResponse(msg);
- // Post the IO completion event.
- postNextEvent(NameChangeTransaction::IO_COMPLETED_EVT);
- }
- /// @brief Selects the first forward server.
- /// Some state handlers require a server to have been selected.
- /// This selects a server without going through the state
- /// transition(s) to do so.
- bool selectFwdServer() {
- if (getForwardDomain()) {
- initServerSelection(getForwardDomain());
- selectNextServer();
- return (getCurrentServer().get() != 0);
- }
- return (false);
- }
- /// @brief Selects the first reverse server.
- /// Some state handlers require a server to have been selected.
- /// This selects a server without going through the state
- /// transition(s) to do so.
- bool selectRevServer() {
- if (getReverseDomain()) {
- initServerSelection(getReverseDomain());
- selectNextServer();
- return (getCurrentServer().get() != 0);
- }
- return (false);
- }
- /// @brief One-shot flag which will simulate sendUpdate failure if true.
- bool simulate_send_exception_;
- /// @brief One-shot flag which will simulate an exception when sendUpdate
- /// failure if true.
- bool simulate_build_request_exception_;
- using StateModel::postNextEvent;
- using StateModel::setState;
- using StateModel::initDictionaries;
- using NameRemoveTransaction::defineEvents;
- using NameRemoveTransaction::verifyEvents;
- using NameRemoveTransaction::defineStates;
- using NameRemoveTransaction::verifyStates;
- using NameRemoveTransaction::readyHandler;
- using NameRemoveTransaction::selectingFwdServerHandler;
- using NameRemoveTransaction::getCurrentServer;
- using NameRemoveTransaction::removingFwdAddrsHandler;
- using NameRemoveTransaction::setDnsUpdateStatus;
- using NameRemoveTransaction::removingFwdRRsHandler;
- using NameRemoveTransaction::selectingRevServerHandler;
- using NameRemoveTransaction::removingRevPtrsHandler;
- using NameRemoveTransaction::processRemoveOkHandler;
- using NameRemoveTransaction::processRemoveFailedHandler;
- using NameRemoveTransaction::buildRemoveFwdAddressRequest;
- using NameRemoveTransaction::buildRemoveFwdRRsRequest;
- using NameRemoveTransaction::buildRemoveRevPtrsRequest;
- };
- typedef boost::shared_ptr<NameRemoveStub> NameRemoveStubPtr;
- /// @brief Test fixture for testing NameRemoveTransaction
- ///
- /// Note this class uses NameRemoveStub class to exercise non-public
- /// aspects of NameRemoveTransaction.
- class NameRemoveTransactionTest : public TransactionTest {
- public:
- NameRemoveTransactionTest() {
- }
- virtual ~NameRemoveTransactionTest() {
- }
- /// @brief Creates a transaction which requests an IPv4 DNS update.
- ///
- /// The transaction is constructed around a predefined (i.e. "canned")
- /// IPv4 NameChangeRequest. The request has both forward and reverse DNS
- /// changes requested. Based upon the change mask, the transaction
- /// will have either the forward, reverse, or both domains populated.
- ///
- /// @param change_mask determines which change directions are requested
- NameRemoveStubPtr makeTransaction4(int change_mask) {
- // Creates IPv4 remove request, forward, and reverse domains.
- setupForIPv4Transaction(dhcp_ddns::CHG_REMOVE, change_mask);
- // Now create the test transaction as would occur in update manager.
- return (NameRemoveStubPtr(new NameRemoveStub(io_service_, ncr_,
- forward_domain_,
- reverse_domain_,
- cfg_mgr_)));
- }
- /// @brief Creates a transaction which requests an IPv6 DNS update.
- ///
- /// The transaction is constructed around a predefined (i.e. "canned")
- /// IPv6 NameChangeRequest. The request has both forward and reverse DNS
- /// changes requested. Based upon the change mask, the transaction
- /// will have either the forward, reverse, or both domains populated.
- ///
- /// @param change_mask determines which change directions are requested
- NameRemoveStubPtr makeTransaction6(int change_mask) {
- // Creates IPv6 remove request, forward, and reverse domains.
- setupForIPv6Transaction(dhcp_ddns::CHG_REMOVE, change_mask);
- // Now create the test transaction as would occur in update manager.
- return (NameRemoveStubPtr(new NameRemoveStub(io_service_, ncr_,
- forward_domain_,
- reverse_domain_,
- cfg_mgr_)));
- }
- /// @brief Create a test transaction at a known point in the state model.
- ///
- /// Method prepares a new test transaction and sets its state and next
- /// event values to those given. This makes the transaction appear to
- /// be at that point in the state model without having to transition it
- /// through prerequisite states. It also provides the ability to set
- /// which change directions are requested: forward change only, reverse
- /// change only, or both.
- ///
- /// @param state value to set as the current state
- /// @param event value to post as the next event
- /// @param change_mask determines which change directions are requested
- /// @param family selects between an IPv4 (AF_INET) and IPv6 (AF_INET6)
- /// transaction.
- NameRemoveStubPtr prepHandlerTest(unsigned int state, unsigned int event,
- unsigned int change_mask
- = FWD_AND_REV_CHG,
- short family = AF_INET) {
- NameRemoveStubPtr name_remove = (family == AF_INET ?
- makeTransaction4(change_mask) :
- makeTransaction6(change_mask));
- name_remove->initDictionaries();
- name_remove->postNextEvent(event);
- name_remove->setState(state);
- return (name_remove);
- }
- };
- /// @brief Tests NameRemoveTransaction construction.
- /// This test verifies that:
- /// 1. Construction with invalid type of request
- /// 2. Valid construction functions properly
- TEST(NameRemoveTransaction, construction) {
- asiolink::IOServicePtr io_service(new isc::asiolink::IOService());
- D2CfgMgrPtr cfg_mgr(new D2CfgMgr());
- const char* msg_str =
- "{"
- " \"change_type\" : 0 , "
- " \"forward_change\" : true , "
- " \"reverse_change\" : true , "
- " \"fqdn\" : \"example.com.\" , "
- " \"ip_address\" : \"192.168.2.1\" , "
- " \"dhcid\" : \"0102030405060708\" , "
- " \"lease_expires_on\" : \"20130121132405\" , "
- " \"lease_length\" : 1300 "
- "}";
- dhcp_ddns::NameChangeRequestPtr ncr;
- DnsServerInfoStoragePtr servers;
- DdnsDomainPtr forward_domain;
- DdnsDomainPtr reverse_domain;
- DdnsDomainPtr empty_domain;
- ASSERT_NO_THROW(ncr = dhcp_ddns::NameChangeRequest::fromJSON(msg_str));
- ASSERT_NO_THROW(forward_domain.reset(new DdnsDomain("*", servers)));
- ASSERT_NO_THROW(reverse_domain.reset(new DdnsDomain("*", servers)));
- // Verify that construction with wrong change type fails.
- EXPECT_THROW(NameRemoveTransaction(io_service, ncr,
- forward_domain, reverse_domain, cfg_mgr),
- NameRemoveTransactionError);
- // Verify that a valid construction attempt works.
- ncr->setChangeType(isc::dhcp_ddns::CHG_REMOVE);
- EXPECT_NO_THROW(NameRemoveTransaction(io_service, ncr,
- forward_domain, reverse_domain,
- cfg_mgr));
- }
- /// @brief Tests event and state dictionary construction and verification.
- TEST_F(NameRemoveTransactionTest, dictionaryCheck) {
- NameRemoveStubPtr name_remove;
- ASSERT_NO_THROW(name_remove = makeTransaction4(FWD_AND_REV_CHG));
- // Verify that the event and state dictionary validation fails prior
- // dictionary construction.
- ASSERT_THROW(name_remove->verifyEvents(), StateModelError);
- ASSERT_THROW(name_remove->verifyStates(), StateModelError);
- // Construct both dictionaries.
- ASSERT_NO_THROW(name_remove->defineEvents());
- ASSERT_NO_THROW(name_remove->defineStates());
- // Verify both event and state dictionaries now pass validation.
- ASSERT_NO_THROW(name_remove->verifyEvents());
- ASSERT_NO_THROW(name_remove->verifyStates());
- }
- /// @brief Tests construction of a DNS update request for removing forward
- /// DNS address RRs.
- TEST_F(NameRemoveTransactionTest, buildRemoveFwdAddressRequest) {
- // Create a IPv4 forward add transaction.
- // Verify the request builds without error.
- // and then verify the request contents.
- NameRemoveStubPtr name_remove;
- ASSERT_NO_THROW(name_remove = makeTransaction4(FORWARD_CHG));
- ASSERT_NO_THROW(name_remove->buildRemoveFwdAddressRequest());
- checkRemoveFwdAddressRequest(*name_remove);
- // Create a IPv6 forward add transaction.
- // Verify the request builds without error.
- // and then verify the request contents.
- ASSERT_NO_THROW(name_remove = makeTransaction6(FORWARD_CHG));
- ASSERT_NO_THROW(name_remove->buildRemoveFwdAddressRequest());
- checkRemoveFwdAddressRequest(*name_remove);
- }
- /// @brief Tests construction of a DNS update request for removing forward
- /// dns RR entries.
- TEST_F(NameRemoveTransactionTest, buildRemoveFwdRRsRequest) {
- // Create a IPv4 forward replace transaction.
- // Verify the request builds without error.
- // and then verify the request contents.
- NameRemoveStubPtr name_remove;
- ASSERT_NO_THROW(name_remove = makeTransaction4(FORWARD_CHG));
- ASSERT_NO_THROW(name_remove->buildRemoveFwdRRsRequest());
- checkRemoveFwdRRsRequest(*name_remove);
- // Create a IPv6 forward replace transaction.
- // Verify the request builds without error.
- // and then verify the request contents.
- ASSERT_NO_THROW(name_remove = makeTransaction6(FORWARD_CHG));
- ASSERT_NO_THROW(name_remove->buildRemoveFwdRRsRequest());
- checkRemoveFwdRRsRequest(*name_remove);
- }
- /// @brief Tests the construction of a DNS update request for removing a
- /// reverse dns entry.
- TEST_F(NameRemoveTransactionTest, buildRemoveRevPtrsRequest) {
- // Create a IPv4 reverse replace transaction.
- // Verify the request builds without error.
- // and then verify the request contents.
- NameRemoveStubPtr name_remove;
- ASSERT_NO_THROW(name_remove = makeTransaction4(REVERSE_CHG));
- ASSERT_NO_THROW(name_remove->buildRemoveRevPtrsRequest());
- checkRemoveRevPtrsRequest(*name_remove);
- // Create a IPv6 reverse replace transaction.
- // Verify the request builds without error.
- // and then verify the request contents.
- ASSERT_NO_THROW(name_remove = makeTransaction6(REVERSE_CHG));
- ASSERT_NO_THROW(name_remove->buildRemoveRevPtrsRequest());
- checkRemoveRevPtrsRequest(*name_remove);
- }
- // Tests the readyHandler functionality.
- // It verifies behavior for the following scenarios:
- //
- // 1. Posted event is START_EVT and request includes only a forward change
- // 2. Posted event is START_EVT and request includes both a forward and a
- // reverse change
- // 3. Posted event is START_EVT and request includes only a reverse change
- // 4. Posted event is invalid
- //
- TEST_F(NameRemoveTransactionTest, readyHandler) {
- NameRemoveStubPtr name_remove;
- // Create a transaction which includes only a forward change.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameChangeTransaction::READY_ST,
- StateModel::START_EVT, FORWARD_CHG));
- // Run readyHandler.
- EXPECT_NO_THROW(name_remove->readyHandler());
- // Verify that a request requiring only a forward change, transitions to
- // selecting a forward server.
- EXPECT_EQ(NameChangeTransaction::SELECTING_FWD_SERVER_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::SELECT_SERVER_EVT,
- name_remove->getNextEvent());
- // Create a transaction which includes both a forward and a reverse change.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameChangeTransaction::READY_ST,
- StateModel::START_EVT, FWD_AND_REV_CHG));
- // Run readyHandler.
- EXPECT_NO_THROW(name_remove->readyHandler());
- // Verify that a request requiring both forward and reverse, starts with
- // the forward change by transitioning to selecting a forward server.
- EXPECT_EQ(NameChangeTransaction::SELECTING_FWD_SERVER_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::SELECT_SERVER_EVT,
- name_remove->getNextEvent());
- // Create and prep a reverse only transaction.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameChangeTransaction::READY_ST,
- StateModel::START_EVT, REVERSE_CHG));
- // Run readyHandler.
- EXPECT_NO_THROW(name_remove->readyHandler());
- // Verify that a request requiring only a reverse change, transitions to
- // selecting a reverse server.
- EXPECT_EQ(NameChangeTransaction::SELECTING_REV_SERVER_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::SELECT_SERVER_EVT,
- name_remove->getNextEvent());
- // Create and prep transaction, poised to run the handler but with an
- // invalid event.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameChangeTransaction::READY_ST,
- StateModel::NOP_EVT));
- // Running the readyHandler should throw.
- EXPECT_THROW(name_remove->readyHandler(), NameRemoveTransactionError);
- }
- // Tests the selectingFwdServerHandler functionality.
- // It verifies behavior for the following scenarios:
- //
- // 1. Posted event is SELECT_SERVER_EVT
- // 2. Posted event is SERVER_IO_ERROR_EVT
- // 3. Posted event is invalid
- //
- TEST_F(NameRemoveTransactionTest, selectingFwdServerHandler) {
- NameRemoveStubPtr name_remove;
- // Create and prep a transaction, poised to run the handler.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameChangeTransaction::
- SELECTING_FWD_SERVER_ST,
- NameChangeTransaction::SELECT_SERVER_EVT));
- // Call selectingFwdServerHandler enough times to select all of the
- // servers in it's current domain. The first time, it will be with
- // next event of SELECT_SERVER_EVT. Thereafter it will be with a next
- // event of SERVER_IO_ERROR_EVT.
- int num_servers = name_remove->getForwardDomain()->getServers()->size();
- for (int i = 0; i < num_servers; ++i) {
- // Run selectingFwdServerHandler.
- ASSERT_NO_THROW(name_remove->selectingFwdServerHandler())
- << " num_servers: " << num_servers
- << " selections: " << i;
- // Verify that a server was selected.
- ASSERT_TRUE(name_remove->getCurrentServer())
- << " num_servers: " << num_servers << " selections: " << i;
- // Verify that we transitioned correctly.
- ASSERT_EQ(NameRemoveTransaction::REMOVING_FWD_ADDRS_ST,
- name_remove->getCurrState())
- << " num_servers: " << num_servers << " selections: " << i;
- ASSERT_EQ(NameChangeTransaction::SERVER_SELECTED_EVT,
- name_remove->getNextEvent())
- << " num_servers: " << num_servers << " selections: " << i;
- // Post a server IO error event. This simulates an IO error occuring
- // and a need to select the new server.
- ASSERT_NO_THROW(name_remove->postNextEvent(NameChangeTransaction::
- SERVER_IO_ERROR_EVT))
- << " num_servers: " << num_servers
- << " selections: " << i;
- }
- // We should have exhausted the list of servers. Processing another
- // SERVER_IO_ERROR_EVT should transition us to failure.
- EXPECT_NO_THROW(name_remove->selectingFwdServerHandler());
- EXPECT_EQ(NameChangeTransaction::PROCESS_TRANS_FAILED_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::NO_MORE_SERVERS_EVT,
- name_remove->getNextEvent());
- // Create and prep transaction, poised to run the handler but with an
- // invalid event.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameChangeTransaction::
- SELECTING_FWD_SERVER_ST,
- StateModel::NOP_EVT));
- // Running the handler should throw.
- EXPECT_THROW(name_remove->selectingFwdServerHandler(),
- NameRemoveTransactionError);
- }
- // ************************ addingFwdAddrHandler Tests *****************
- // Tests that removingFwdAddrsHandler rejects invalid events.
- TEST_F(NameRemoveTransactionTest, removingFwdAddrsHandler_InvalidEvent) {
- NameRemoveStubPtr name_remove;
- // Create and prep a transaction, poised to run the handler but with
- // an invalid event.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameRemoveTransaction::
- REMOVING_FWD_ADDRS_ST,
- StateModel::NOP_EVT));
- // Running the handler should throw.
- EXPECT_THROW(name_remove->removingFwdAddrsHandler(),
- NameRemoveTransactionError);
- }
- // Tests addingFwdAddrsHandler with the following scenario:
- //
- // The request includes only a forward change.
- // Initial posted event is SERVER_SELECTED_EVT.
- // The update request is sent without error.
- // A server response is received which indicates successful update
- //
- TEST_F(NameRemoveTransactionTest, removingFwdAddrsHandler_FwdOnlyOK) {
- NameRemoveStubPtr name_remove;
- // Create and prep a transaction, poised to run the handler.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameRemoveTransaction::
- REMOVING_FWD_ADDRS_ST,
- NameChangeTransaction::
- SERVER_SELECTED_EVT, FORWARD_CHG));
- // Should not be an update message yet.
- D2UpdateMessagePtr update_msg = name_remove->getDnsUpdateRequest();
- ASSERT_FALSE(update_msg);
- // At this point completion flags should be false.
- EXPECT_FALSE(name_remove->getForwardChangeCompleted());
- EXPECT_FALSE(name_remove->getReverseChangeCompleted());
- // Run removingFwdAddrsHandler to construct and send the request.
- EXPECT_NO_THROW(name_remove->removingFwdAddrsHandler());
- // Verify that an update message was constructed properly.
- checkRemoveFwdAddressRequest(*name_remove);
- // Verify that we are still in this state and next event is NOP_EVT.
- // This indicates we "sent" the message and are waiting for IO completion.
- EXPECT_EQ(NameRemoveTransaction::REMOVING_FWD_ADDRS_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::NOP_EVT,
- name_remove->getNextEvent());
- // Simulate receiving a successful update response.
- name_remove->fakeResponse(DNSClient::SUCCESS, dns::Rcode::NOERROR());
- // Run removingFwdAddrsHandler again to process the response.
- EXPECT_NO_THROW(name_remove->removingFwdAddrsHandler());
- // Completion flags should both still be false, as we are only partly
- // done with forward updates.
- EXPECT_FALSE(name_remove->getForwardChangeCompleted());
- EXPECT_FALSE(name_remove->getReverseChangeCompleted());
- // Since we succeeded, we should now attempt to remove any remaining
- // forward RRs.
- // Verify that we transitioned correctly.
- EXPECT_EQ(NameRemoveTransaction::REMOVING_FWD_RRS_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameRemoveTransaction::UPDATE_OK_EVT,
- name_remove->getNextEvent());
- }
- // Tests addingFwdAddrsHandler with the following scenario:
- //
- // The request includes only a forward change.
- // Initial posted event is SERVER_SELECTED_EVT.
- // The update request is sent without error.
- // A server response is received which indicates FQDN is not in use.
- //
- TEST_F(NameRemoveTransactionTest, removingFwdAddrsHandler_FqdnNotInUse) {
- NameRemoveStubPtr name_remove;
- // Create and prep a transaction, poised to run the handler.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameRemoveTransaction::
- REMOVING_FWD_ADDRS_ST,
- NameChangeTransaction::
- SERVER_SELECTED_EVT, FORWARD_CHG));
- // Run removingFwdAddrsHandler to construct and send the request.
- EXPECT_NO_THROW(name_remove->removingFwdAddrsHandler());
- // Simulate receiving a RRSET does not exist.
- name_remove->fakeResponse(DNSClient::SUCCESS, dns::Rcode::NXRRSET());
- // Run removingFwdAddrsHandler again to process the response.
- EXPECT_NO_THROW(name_remove->removingFwdAddrsHandler());
- // Completion flags should both still be false, as we are only partly
- // done with forward updates.
- EXPECT_FALSE(name_remove->getForwardChangeCompleted());
- EXPECT_FALSE(name_remove->getReverseChangeCompleted());
- // There was no address RR to remove, but we will still make sure there
- // are no other RRs for this FQDN.
- // Verify that we transitioned correctly.
- EXPECT_EQ(NameRemoveTransaction::REMOVING_FWD_RRS_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameRemoveTransaction::UPDATE_OK_EVT,
- name_remove->getNextEvent());
- }
- // Tests removingFwdAddrsHandler with the following scenario:
- //
- // The request includes a forward and reverse change.
- // Initial posted event is SERVER_SELECTED_EVT.
- // The update request is sent without error.
- // A server response is received which indicates the update was rejected.
- //
- TEST_F(NameRemoveTransactionTest, removingFwdAddrsHandler_OtherRcode) {
- NameRemoveStubPtr name_remove;
- // Create and prep a transaction, poised to run the handler.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameRemoveTransaction::
- REMOVING_FWD_ADDRS_ST,
- NameChangeTransaction::
- SERVER_SELECTED_EVT));
- // Select a server to satisfy log statements.
- ASSERT_TRUE(name_remove->selectFwdServer());
- // Run removingFwdAddrsHandler to construct and send the request.
- EXPECT_NO_THROW(name_remove->removingFwdAddrsHandler());
- // Simulate receiving server rejection response. Per RFC, anything other
- // than no error or FQDN not in use is failure. Arbitrarily choosing
- // refused.
- name_remove->fakeResponse(DNSClient::SUCCESS, dns::Rcode::REFUSED());
- // Run removingFwdAddrsHandler again to process the response.
- EXPECT_NO_THROW(name_remove->removingFwdAddrsHandler());
- // Completion flags should still be false.
- EXPECT_FALSE(name_remove->getForwardChangeCompleted());
- EXPECT_FALSE(name_remove->getReverseChangeCompleted());
- // We should have failed the transaction. Verify that we transitioned
- // correctly.
- EXPECT_EQ(NameChangeTransaction::PROCESS_TRANS_FAILED_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::UPDATE_FAILED_EVT,
- name_remove->getNextEvent());
- }
- // Tests removingFwdAddrsHandler with the following scenario:
- //
- // The request includes a forward and reverse change.
- // Initial posted event is SERVER_SELECTED_EVT.
- // The update request send times out MAX_UPDATE_TRIES_PER_SERVER times.
- //
- TEST_F(NameRemoveTransactionTest, removingFwdAddrsHandler_Timeout) {
- NameRemoveStubPtr name_remove;
- // Create and prep a transaction, poised to run the handler.
- // The log message issued when this test succeeds, displays the
- // selected server, so we need to select a server before running this
- // test.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameRemoveTransaction::
- REMOVING_FWD_ADDRS_ST,
- NameChangeTransaction::
- SERVER_SELECTED_EVT));
- // Select a server to satisfy log statements.
- ASSERT_TRUE(name_remove->selectFwdServer());
- // Verify that we can make maximum number of update attempts permitted
- // and then transition to selecting a new server.
- int max_tries = NameChangeTransaction::MAX_UPDATE_TRIES_PER_SERVER;
- for (int i = 1; i <= max_tries; ++i) {
- const D2UpdateMessagePtr prev_msg = name_remove->getDnsUpdateRequest();
- // Run removingFwdAddrsHandler to send the request.
- EXPECT_NO_THROW(name_remove->removingFwdAddrsHandler());
- const D2UpdateMessagePtr curr_msg = name_remove->getDnsUpdateRequest();
- if (i == 1) {
- // First time around we should build the message.
- EXPECT_FALSE(prev_msg);
- EXPECT_TRUE(curr_msg);
- } else {
- // Subsequent passes should reuse the request. We are only
- // looking to check that we have not replaced the pointer value
- // with a new pointer. This tests the on_entry() logic which
- // clears the request ONLY upon initial entry into the state.
- EXPECT_TRUE(prev_msg == curr_msg);
- }
- // Simulate a server IO timeout.
- name_remove->setDnsUpdateStatus(DNSClient::TIMEOUT);
- name_remove->postNextEvent(NameChangeTransaction::IO_COMPLETED_EVT);
- // Run removingFwdAddrsHandler again to process the response.
- EXPECT_NO_THROW(name_remove->removingFwdAddrsHandler());
- // Completion flags should be false.
- EXPECT_FALSE(name_remove->getForwardChangeCompleted());
- EXPECT_FALSE(name_remove->getReverseChangeCompleted());
- if (i < max_tries) {
- // We should be ready to try again.
- EXPECT_EQ(NameRemoveTransaction::REMOVING_FWD_ADDRS_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::SERVER_SELECTED_EVT,
- name_remove->getNextEvent());
- } else {
- // Server retries should be exhausted, time for a new server.
- EXPECT_EQ(NameRemoveTransaction::SELECTING_FWD_SERVER_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::SERVER_IO_ERROR_EVT,
- name_remove->getNextEvent());
- }
- }
- }
- // Tests removingFwdAddrsHandler with the following scenario:
- //
- // The request includes a forward and reverse change.
- // Initial posted event is SERVER_SELECTED_EVT.
- // The update request is sent but a corrupt response is received, this occurs
- // MAX_UPDATE_TRIES_PER_SERVER times.
- //
- TEST_F(NameRemoveTransactionTest, removingFwdAddrsHandler_InvalidResponse) {
- NameRemoveStubPtr name_remove;
- // Create and prep a transaction, poised to run the handler.
- // The log message issued when this test succeeds, displays the
- // selected server, so we need to select a server before running this
- // test.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameRemoveTransaction::
- REMOVING_FWD_ADDRS_ST,
- NameChangeTransaction::
- SERVER_SELECTED_EVT));
- // Select a server to satisfy log statements.
- ASSERT_TRUE(name_remove->selectFwdServer());
- // Verify that we can make maximum number of update attempts permitted
- // and then transition to selecting a new server.
- int max_tries = NameChangeTransaction::MAX_UPDATE_TRIES_PER_SERVER;
- for (int i = 1; i <= max_tries; ++i) {
- // Run removingFwdAddrsHandler to construct send the request.
- EXPECT_NO_THROW(name_remove->removingFwdAddrsHandler());
- // Simulate a corrupt server response.
- name_remove->setDnsUpdateStatus(DNSClient::INVALID_RESPONSE);
- name_remove->postNextEvent(NameChangeTransaction::IO_COMPLETED_EVT);
- // Run removingFwdAddrsHandler again to process the response.
- EXPECT_NO_THROW(name_remove->removingFwdAddrsHandler());
- // Completion flags should be false.
- EXPECT_FALSE(name_remove->getForwardChangeCompleted());
- EXPECT_FALSE(name_remove->getReverseChangeCompleted());
- if (i < max_tries) {
- // We should be ready to try again.
- EXPECT_EQ(NameRemoveTransaction::REMOVING_FWD_ADDRS_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::SERVER_SELECTED_EVT,
- name_remove->getNextEvent());
- } else {
- // Server retries should be exhausted, time for a new server.
- EXPECT_EQ(NameRemoveTransaction::SELECTING_FWD_SERVER_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::SERVER_IO_ERROR_EVT,
- name_remove->getNextEvent());
- }
- }
- }
- // ************************ removingFwdRRsHandler Tests *****************
- // Tests that removingFwdRRsHandler rejects invalid events.
- TEST_F(NameRemoveTransactionTest, removingFwdRRsHandler_InvalidEvent) {
- NameRemoveStubPtr name_remove;
- // Create and prep a transaction, poised to run the handler but with
- // an invalid event.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameRemoveTransaction::
- REMOVING_FWD_RRS_ST,
- StateModel::NOP_EVT));
- // Running the handler should throw.
- EXPECT_THROW(name_remove->removingFwdRRsHandler(),
- NameRemoveTransactionError);
- }
- // Tests removingFwdRRsHandler with the following scenario:
- //
- // The request includes only a forward change.
- // Initial posted event is UPDATE_OK_EVT.
- // The update request is sent without error.
- // A server response is received which indicates successful update.
- //
- TEST_F(NameRemoveTransactionTest, removingFwdRRsHandler_FwdOnlyOK) {
- NameRemoveStubPtr name_remove;
- // Create and prep a transaction, poised to run the handler.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameRemoveTransaction::
- REMOVING_FWD_ADDRS_ST,
- NameChangeTransaction::
- UPDATE_OK_EVT, FORWARD_CHG));
- // Should not be an update message yet.
- D2UpdateMessagePtr update_msg = name_remove->getDnsUpdateRequest();
- ASSERT_FALSE(update_msg);
- // At this point completion flags should be false.
- EXPECT_FALSE(name_remove->getForwardChangeCompleted());
- EXPECT_FALSE(name_remove->getReverseChangeCompleted());
- // Run removingFwdRRsHandler to construct and send the request.
- EXPECT_NO_THROW(name_remove->removingFwdRRsHandler());
- // Verify that an update message was constructed properly.
- checkRemoveFwdRRsRequest(*name_remove);
- // Verify that we are still in this state and next event is NOP_EVT.
- // This indicates we "sent" the message and are waiting for IO completion.
- EXPECT_EQ(NameRemoveTransaction::REMOVING_FWD_ADDRS_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::NOP_EVT,
- name_remove->getNextEvent());
- // Simulate receiving a successful update response.
- name_remove->fakeResponse(DNSClient::SUCCESS, dns::Rcode::NOERROR());
- // Run removingFwdRRsHandler again to process the response.
- EXPECT_NO_THROW(name_remove->removingFwdRRsHandler());
- // Forward completion should be true, reverse should be false.
- EXPECT_TRUE(name_remove->getForwardChangeCompleted());
- EXPECT_FALSE(name_remove->getReverseChangeCompleted());
- // Since it is a forward only change, we should be done.
- // Verify that we transitioned correctly.
- EXPECT_EQ(NameChangeTransaction::PROCESS_TRANS_OK_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::UPDATE_OK_EVT,
- name_remove->getNextEvent());
- }
- // Tests removingFwdRRsHandler with the following scenario:
- //
- // The request includes only a forward change.
- // Initial posted event is SERVER_SELECTED_EVT.
- // The update request is sent without error.
- // A server response is received which indicates successful update.
- //
- TEST_F(NameRemoveTransactionTest, removingFwdRRsHandler_FwdOnlyOK2) {
- NameRemoveStubPtr name_remove;
- // Create and prep a transaction, poised to run the handler.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameRemoveTransaction::
- REMOVING_FWD_ADDRS_ST,
- NameChangeTransaction::
- SERVER_SELECTED_EVT, FORWARD_CHG));
- // Run removingFwdRRsHandler to construct and send the request.
- EXPECT_NO_THROW(name_remove->removingFwdRRsHandler());
- // Simulate receiving a successful update response.
- name_remove->fakeResponse(DNSClient::SUCCESS, dns::Rcode::NOERROR());
- // Run removingFwdRRsHandler again to process the response.
- EXPECT_NO_THROW(name_remove->removingFwdRRsHandler());
- // Forward completion should be true, reverse should be false.
- EXPECT_TRUE(name_remove->getForwardChangeCompleted());
- EXPECT_FALSE(name_remove->getReverseChangeCompleted());
- // Since it is a forward only change, we should be done.
- // Verify that we transitioned correctly.
- EXPECT_EQ(NameChangeTransaction::PROCESS_TRANS_OK_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::UPDATE_OK_EVT,
- name_remove->getNextEvent());
- }
- // Tests removingFwdRRsHandler with the following scenario:
- //
- // The request includes a forward and reverse change.
- // Initial posted event is UPDATE_OK_EVT.
- // The update request is sent without error.
- // A server response is received which indicates successful update.
- //
- TEST_F(NameRemoveTransactionTest, removingFwdRRsHandler_FwdAndRevOK) {
- NameRemoveStubPtr name_remove;
- // Create and prep a transaction, poised to run the handler.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameRemoveTransaction::
- REMOVING_FWD_ADDRS_ST,
- NameChangeTransaction::
- UPDATE_OK_EVT, FWD_AND_REV_CHG));
- // Run removingFwdRRsHandler to construct and send the request.
- EXPECT_NO_THROW(name_remove->removingFwdRRsHandler());
- // Simulate receiving a successful update response.
- name_remove->fakeResponse(DNSClient::SUCCESS, dns::Rcode::NOERROR());
- // Run removingFwdRRsHandler again to process the response.
- EXPECT_NO_THROW(name_remove->removingFwdRRsHandler());
- // Forward change completion should be true, reverse flag should be false.
- EXPECT_TRUE(name_remove->getForwardChangeCompleted());
- EXPECT_FALSE(name_remove->getReverseChangeCompleted());
- // Since the request also includes a reverse change we should
- // be poised to start it. Verify that we transitioned correctly.
- EXPECT_EQ(NameChangeTransaction::SELECTING_REV_SERVER_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::SELECT_SERVER_EVT,
- name_remove->getNextEvent());
- }
- // Tests removingFwdAddrsHandler with the following scenario:
- //
- // The request includes a forward and reverse change.
- // Initial posted event is UPDATE_OK_EVT.
- // The update request is sent without error.
- // A server response is received which indicates the FQDN is NOT in use.
- //
- TEST_F(NameRemoveTransactionTest, removingFwdRRsHandler_FqdnNotInUse) {
- NameRemoveStubPtr name_remove;
- // Create and prep a transaction, poised to run the handler.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameRemoveTransaction::
- REMOVING_FWD_ADDRS_ST,
- NameChangeTransaction::
- UPDATE_OK_EVT, FORWARD_CHG));
- // Run removingFwdRRsHandler to construct and send the request.
- EXPECT_NO_THROW(name_remove->removingFwdRRsHandler());
- // Simulate receiving a RRSET does not exist response.
- name_remove->fakeResponse(DNSClient::SUCCESS, dns::Rcode::NXRRSET());
- // Run removingFwdRRsHandler again to process the response.
- EXPECT_NO_THROW(name_remove->removingFwdRRsHandler());
- // Forwad completion flag should be true, reverse should still be false.
- EXPECT_TRUE(name_remove->getForwardChangeCompleted());
- EXPECT_FALSE(name_remove->getReverseChangeCompleted());
- // The FQDN is no longer in use, RFC is unclear about this,
- // but we will treat this as success.
- // Since it is a forward only change, we should be done.
- // Verify that we transitioned correctly.
- EXPECT_EQ(NameChangeTransaction::PROCESS_TRANS_OK_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::UPDATE_OK_EVT,
- name_remove->getNextEvent());
- }
- // Tests removingFwdRRsHandler with the following scenario:
- //
- // The request includes a forward and reverse change.
- // The update request is sent without error.
- // A server response is received which indicates the update was rejected.
- //
- TEST_F(NameRemoveTransactionTest, removingFwdRRsHandler_OtherRcode) {
- NameRemoveStubPtr name_remove;
- // Create the transaction.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameRemoveTransaction::
- REMOVING_FWD_ADDRS_ST,
- NameChangeTransaction::
- UPDATE_OK_EVT, FWD_AND_REV_CHG));
- // Select a server to satisfy log statements.
- ASSERT_TRUE(name_remove->selectFwdServer());
- // Run removingFwdRRsHandler to construct and send the request.
- EXPECT_NO_THROW(name_remove->removingFwdRRsHandler());
- // Simulate receiving server rejection response. Per RFC, anything other
- // than no error is failure (we are also treating FQDN not in use is
- // success). Arbitrarily choosing refused.
- name_remove->fakeResponse(DNSClient::SUCCESS, dns::Rcode::REFUSED());
- // Run removingFwdRRsHandler again to process the response.
- EXPECT_NO_THROW(name_remove->removingFwdRRsHandler());
- // Completion flags should still be false.
- EXPECT_FALSE(name_remove->getForwardChangeCompleted());
- EXPECT_FALSE(name_remove->getReverseChangeCompleted());
- // We should have failed the transaction. Verifiy that we transitioned
- // correctly.
- EXPECT_EQ(NameChangeTransaction::PROCESS_TRANS_FAILED_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::UPDATE_FAILED_EVT,
- name_remove->getNextEvent());
- }
- // Tests removingFwdRRsHandler with the following scenario:
- //
- // The request includes a forward and reverse change.
- // Initial posted event is UPDATE_OK_EVT.
- // The update request send times out MAX_UPDATE_TRIES_PER_SERVER times.
- //
- TEST_F(NameRemoveTransactionTest, removingFwdRRsHandler_Timeout) {
- NameRemoveStubPtr name_remove;
- // Create the transaction.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameRemoveTransaction::
- REMOVING_FWD_RRS_ST,
- NameChangeTransaction::
- UPDATE_OK_EVT, FWD_AND_REV_CHG));
- // Select a server to satisfy log statements.
- ASSERT_TRUE(name_remove->selectFwdServer());
- // Verify that we can make maximum number of update attempts permitted
- // and then transition to selecting a new server.
- int max_tries = NameChangeTransaction::MAX_UPDATE_TRIES_PER_SERVER;
- for (int i = 1; i <= max_tries; ++i) {
- const D2UpdateMessagePtr prev_msg = name_remove->getDnsUpdateRequest();
- // Run removingFwdRRsHandler to send the request.
- EXPECT_NO_THROW(name_remove->removingFwdRRsHandler());
- const D2UpdateMessagePtr curr_msg = name_remove->getDnsUpdateRequest();
- if (i == 1) {
- // First time around we should build the message.
- EXPECT_FALSE(prev_msg);
- EXPECT_TRUE(curr_msg);
- } else {
- // Subsequent passes should reuse the request. We are only
- // looking to check that we have not replaced the pointer value
- // with a new pointer. This tests the on_entry() logic which
- // clears the request ONLY upon initial entry into the state.
- EXPECT_TRUE(prev_msg == curr_msg);
- }
- // Simulate a server IO timeout.
- name_remove->setDnsUpdateStatus(DNSClient::TIMEOUT);
- name_remove->postNextEvent(NameChangeTransaction::IO_COMPLETED_EVT);
- // Run removingFwdRRsHandler again to process the response.
- EXPECT_NO_THROW(name_remove->removingFwdRRsHandler());
- // Completion flags should be false.
- EXPECT_FALSE(name_remove->getForwardChangeCompleted());
- EXPECT_FALSE(name_remove->getReverseChangeCompleted());
- if (i < max_tries) {
- // We should be ready to try again.
- EXPECT_EQ(NameRemoveTransaction::REMOVING_FWD_RRS_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::SERVER_SELECTED_EVT,
- name_remove->getNextEvent());
- } else {
- // Server retries should be exhausted.
- // We should abandon the transaction.
- EXPECT_EQ(NameChangeTransaction::PROCESS_TRANS_FAILED_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::SERVER_IO_ERROR_EVT,
- name_remove->getNextEvent());
- }
- }
- }
- // Tests removingFwdRRsHandler with the following scenario:
- //
- // The request includes a forward and reverse change.
- // Initial posted event is UPDATE_OK_EVT.
- // The update request is sent but a corrupt response is received, this occurs
- // MAX_UPDATE_TRIES_PER_SERVER times.
- //
- TEST_F(NameRemoveTransactionTest, removingFwdRRsHandler_InvalidResponse) {
- NameRemoveStubPtr name_remove;
- // Create the transaction.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameRemoveTransaction::
- REMOVING_FWD_RRS_ST,
- NameChangeTransaction::
- UPDATE_OK_EVT, FWD_AND_REV_CHG));
- // Select a server to satisfy log statements.
- ASSERT_TRUE(name_remove->selectFwdServer());
- // Verify that we can make maximum number of update attempts permitted
- // and then transition to selecting a new server.
- int max_tries = NameChangeTransaction::MAX_UPDATE_TRIES_PER_SERVER;
- for (int i = 1; i <= max_tries; ++i) {
- const D2UpdateMessagePtr prev_msg = name_remove->getDnsUpdateRequest();
- // Run removingFwdRRsHandler to send the request.
- EXPECT_NO_THROW(name_remove->removingFwdRRsHandler());
- const D2UpdateMessagePtr curr_msg = name_remove->getDnsUpdateRequest();
- if (i == 1) {
- // First time around we should build the message.
- EXPECT_FALSE(prev_msg);
- EXPECT_TRUE(curr_msg);
- } else {
- // Subsequent passes should reuse the request. We are only
- // looking to check that we have not replaced the pointer value
- // with a new pointer. This tests the on_entry() logic which
- // clears the request ONLY upon initial entry into the state.
- EXPECT_TRUE(prev_msg == curr_msg);
- }
- // Simulate a corrupt server response.
- name_remove->setDnsUpdateStatus(DNSClient::INVALID_RESPONSE);
- name_remove->postNextEvent(NameChangeTransaction::IO_COMPLETED_EVT);
- // Run removingFwdRRsHandler again to process the response.
- EXPECT_NO_THROW(name_remove->removingFwdRRsHandler());
- // Completion flags should be false.
- EXPECT_FALSE(name_remove->getForwardChangeCompleted());
- EXPECT_FALSE(name_remove->getReverseChangeCompleted());
- if (i < max_tries) {
- // We should be ready to try again.
- EXPECT_EQ(NameRemoveTransaction::REMOVING_FWD_RRS_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::SERVER_SELECTED_EVT,
- name_remove->getNextEvent());
- } else {
- // Server retries should be exhausted.
- // We should abandon the transaction.
- EXPECT_EQ(NameChangeTransaction::PROCESS_TRANS_FAILED_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::SERVER_IO_ERROR_EVT,
- name_remove->getNextEvent());
- }
- }
- }
- // Tests the selectingRevServerHandler functionality.
- // It verifies behavior for the following scenarios:
- //
- // 1. Posted event is SELECT_SERVER_EVT
- // 2. Posted event is SERVER_IO_ERROR_EVT
- // 3. Posted event is invalid
- //
- TEST_F(NameRemoveTransactionTest, selectingRevServerHandler) {
- NameRemoveStubPtr name_remove;
- // Create and prep a transaction, poised to run the handler.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameChangeTransaction::
- SELECTING_REV_SERVER_ST,
- NameChangeTransaction::SELECT_SERVER_EVT));
- // Call selectingRevServerHandler enough times to select all of the
- // servers in it's current domain. The first time, it will be with
- // next event of SELECT_SERVER_EVT. Thereafter it will be with a next
- // event of SERVER_IO_ERROR_EVT.
- int num_servers = name_remove->getReverseDomain()->getServers()->size();
- for (int i = 0; i < num_servers; ++i) {
- // Run selectingRevServerHandler.
- ASSERT_NO_THROW(name_remove->selectingRevServerHandler())
- << " num_servers: " << num_servers
- << " selections: " << i;
- // Verify that a server was selected.
- ASSERT_TRUE(name_remove->getCurrentServer())
- << " num_servers: " << num_servers
- << " selections: " << i;
- // Verify that we transitioned correctly.
- ASSERT_EQ(NameRemoveTransaction::REMOVING_REV_PTRS_ST,
- name_remove->getCurrState())
- << " num_servers: " << num_servers << " selections: " << i;
- ASSERT_EQ(NameChangeTransaction::SERVER_SELECTED_EVT,
- name_remove->getNextEvent())
- << " num_servers: " << num_servers << " selections: " << i;
- // Post a server IO error event. This simulates an IO error occuring
- // and a need to select the new server.
- ASSERT_NO_THROW(name_remove->postNextEvent(NameChangeTransaction::
- SERVER_IO_ERROR_EVT))
- << " num_servers: " << num_servers
- << " selections: " << i;
- }
- // We should have exhausted the list of servers. Processing another
- // SERVER_IO_ERROR_EVT should transition us to failure.
- EXPECT_NO_THROW(name_remove->selectingRevServerHandler());
- EXPECT_EQ(NameChangeTransaction::PROCESS_TRANS_FAILED_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::NO_MORE_SERVERS_EVT,
- name_remove->getNextEvent());
- // Create and prep transaction, poised to run the handler but with an
- // invalid event.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameChangeTransaction::
- SELECTING_REV_SERVER_ST,
- StateModel::NOP_EVT));
- // Running the handler should throw.
- EXPECT_THROW(name_remove->selectingRevServerHandler(),
- NameRemoveTransactionError);
- }
- //************************** removingRevPtrsHandler tests *****************
- // Tests that removingRevPtrsHandler rejects invalid events.
- TEST_F(NameRemoveTransactionTest, removingRevPtrsHandler_InvalidEvent) {
- NameRemoveStubPtr name_remove;
- // Create and prep a transaction, poised to run the handler but with
- // an invalid event.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameRemoveTransaction::
- REMOVING_REV_PTRS_ST,
- StateModel::NOP_EVT));
- // Running the handler should throw.
- EXPECT_THROW(name_remove->removingRevPtrsHandler(),
- NameRemoveTransactionError);
- }
- // Tests removingRevPtrsHandler with the following scenario:
- //
- // The request includes only a reverse change.
- // Initial posted event is SERVER_SELECTED_EVT.
- // The update request is sent without error.
- // A server response is received which indicates successful update.
- //
- TEST_F(NameRemoveTransactionTest, removingRevPtrsHandler_RevOnlyOK) {
- NameRemoveStubPtr name_remove;
- // Create and prep a transaction, poised to run the handler.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameRemoveTransaction::
- REMOVING_REV_PTRS_ST,
- NameChangeTransaction::
- SERVER_SELECTED_EVT, REVERSE_CHG));
- // Should not be an update message yet.
- D2UpdateMessagePtr update_msg = name_remove->getDnsUpdateRequest();
- ASSERT_FALSE(update_msg);
- // At this point completion flags should be false.
- EXPECT_FALSE(name_remove->getForwardChangeCompleted());
- EXPECT_FALSE(name_remove->getReverseChangeCompleted());
- // Run removingRevPtrsHandler to construct and send the request.
- EXPECT_NO_THROW(name_remove->removingRevPtrsHandler());
- // Verify that an update message was constructed properly.
- checkRemoveRevPtrsRequest(*name_remove);
- // Verify that we are still in this state and next event is NOP_EVT.
- // This indicates we "sent" the message and are waiting for IO completion.
- EXPECT_EQ(NameRemoveTransaction::REMOVING_REV_PTRS_ST,
- name_remove->getCurrState());
- EXPECT_EQ(StateModel::NOP_EVT,
- name_remove->getNextEvent());
- // Simulate receiving a successful update response.
- name_remove->fakeResponse(DNSClient::SUCCESS, dns::Rcode::NOERROR());
- // Run removingRevPtrsHandler again to process the response.
- EXPECT_NO_THROW(name_remove->removingRevPtrsHandler());
- // Forward completion should be false, reverse should be true.
- EXPECT_FALSE(name_remove->getForwardChangeCompleted());
- EXPECT_TRUE(name_remove->getReverseChangeCompleted());
- // Since it is a reverse change, we should be done.
- // Verify that we transitioned correctly.
- EXPECT_EQ(NameChangeTransaction::PROCESS_TRANS_OK_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::UPDATE_OK_EVT,
- name_remove->getNextEvent());
- }
- // Tests removingRevPtrsHandler with the following scenario:
- //
- // The request includes only a reverse change.
- // Initial posted event is SERVER_SELECTED_EVT.
- // The update request is sent without error.
- // A server response is received which indicates FQDN is NOT in use.
- //
- TEST_F(NameRemoveTransactionTest, removingRevPtrsHandler_FqdnNotInUse) {
- NameRemoveStubPtr name_remove;
- // Create and prep a transaction, poised to run the handler.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameRemoveTransaction::
- REMOVING_REV_PTRS_ST,
- NameChangeTransaction::
- SERVER_SELECTED_EVT, REVERSE_CHG));
- // Should not be an update message yet.
- D2UpdateMessagePtr update_msg = name_remove->getDnsUpdateRequest();
- ASSERT_FALSE(update_msg);
- // At this point completion flags should be false.
- EXPECT_FALSE(name_remove->getForwardChangeCompleted());
- EXPECT_FALSE(name_remove->getReverseChangeCompleted());
- // Run removingRevPtrsHandler to construct and send the request.
- EXPECT_NO_THROW(name_remove->removingRevPtrsHandler());
- // Verify that an update message was constructed properly.
- checkRemoveRevPtrsRequest(*name_remove);
- // Verify that we are still in this state and next event is NOP_EVT.
- // This indicates we "sent" the message and are waiting for IO completion.
- EXPECT_EQ(NameRemoveTransaction::REMOVING_REV_PTRS_ST,
- name_remove->getCurrState());
- EXPECT_EQ(StateModel::NOP_EVT,
- name_remove->getNextEvent());
- // Simulate receiving a RRSET does not exist.
- name_remove->fakeResponse(DNSClient::SUCCESS, dns::Rcode::NXRRSET());
- // Run removingRevPtrsHandler again to process the response.
- EXPECT_NO_THROW(name_remove->removingRevPtrsHandler());
- // Forward completion should be false, reverse should be true.
- EXPECT_FALSE(name_remove->getForwardChangeCompleted());
- EXPECT_TRUE(name_remove->getReverseChangeCompleted());
- // Since it is a reverse change, we should be done.
- // Verify that we transitioned correctly.
- EXPECT_EQ(NameChangeTransaction::PROCESS_TRANS_OK_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::UPDATE_OK_EVT,
- name_remove->getNextEvent());
- }
- // Tests removingRevPtrsHandler with the following scenario:
- //
- // The request includes only a reverse change.
- // Initial posted event is SERVER_SELECTED_EVT.
- // The update request is sent without error.
- // A server response is received which indicates the update was rejected.
- //
- TEST_F(NameRemoveTransactionTest, removingRevPtrsHandler_OtherRcode) {
- NameRemoveStubPtr name_remove;
- // Create the transaction.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameRemoveTransaction::
- REMOVING_REV_PTRS_ST,
- NameChangeTransaction::
- SERVER_SELECTED_EVT, REVERSE_CHG));
- // Select a server to satisfy log statements.
- ASSERT_TRUE(name_remove->selectRevServer());
- // Run removingRevPtrsHandler to construct and send the request.
- EXPECT_NO_THROW(name_remove->removingRevPtrsHandler());
- // Simulate receiving server rejection response. Per RFC, anything other
- // than no error is failure. Arbitrarily choosing refused.
- name_remove->fakeResponse(DNSClient::SUCCESS, dns::Rcode::REFUSED());
- // Run removingRevPtrsHandler again to process the response.
- EXPECT_NO_THROW(name_remove->removingRevPtrsHandler());
- // Completion flags should still be false.
- EXPECT_FALSE(name_remove->getForwardChangeCompleted());
- EXPECT_FALSE(name_remove->getReverseChangeCompleted());
- // We should have failed the transaction. Verify that we transitioned
- // correctly.
- EXPECT_EQ(NameChangeTransaction::PROCESS_TRANS_FAILED_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::UPDATE_FAILED_EVT,
- name_remove->getNextEvent());
- }
- // Tests removingRevPtrsHandler with the following scenario:
- //
- // The request includes only a reverse change.
- // Initial posted event is SERVER_SELECTED_EVT.
- // The update request send times out MAX_UPDATE_TRIES_PER_SERVER times.
- //
- TEST_F(NameRemoveTransactionTest, removingRevPtrsHandler_Timeout) {
- NameRemoveStubPtr name_remove;
- // Create the transaction.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameRemoveTransaction::
- REMOVING_REV_PTRS_ST,
- NameChangeTransaction::
- SERVER_SELECTED_EVT, REVERSE_CHG));
- // Select a server to satisfy log statements.
- ASSERT_TRUE(name_remove->selectRevServer());
- // Verify that we can make maximum number of update attempts permitted
- // and then transition to selecting a new server.
- int max_tries = NameChangeTransaction::MAX_UPDATE_TRIES_PER_SERVER;
- for (int i = 1; i <= max_tries; ++i) {
- const D2UpdateMessagePtr prev_msg = name_remove->getDnsUpdateRequest();
- // Run removingRevPtrsHandler to send the request.
- EXPECT_NO_THROW(name_remove->removingRevPtrsHandler());
- const D2UpdateMessagePtr curr_msg = name_remove->getDnsUpdateRequest();
- if (i == 1) {
- // First time around we should build the message.
- EXPECT_FALSE(prev_msg);
- EXPECT_TRUE(curr_msg);
- } else {
- // Subsequent passes should reuse the request. We are only
- // looking to check that we have not replaced the pointer value
- // with a new pointer. This tests the on_entry() logic which
- // clears the request ONLY upon initial entry into the state.
- EXPECT_TRUE(prev_msg == curr_msg);
- }
- // Simulate a server IO timeout.
- name_remove->setDnsUpdateStatus(DNSClient::TIMEOUT);
- name_remove->postNextEvent(NameChangeTransaction::IO_COMPLETED_EVT);
- // Run removingRevPtrsHandler again to process the response.
- EXPECT_NO_THROW(name_remove->removingRevPtrsHandler());
- // Completion flags should be false.
- EXPECT_FALSE(name_remove->getForwardChangeCompleted());
- EXPECT_FALSE(name_remove->getReverseChangeCompleted());
- if (i < max_tries) {
- // We should be ready to try again.
- EXPECT_EQ(NameRemoveTransaction::REMOVING_REV_PTRS_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::SERVER_SELECTED_EVT,
- name_remove->getNextEvent());
- } else {
- // Server retries should be exhausted, time for a new server.
- EXPECT_EQ(NameChangeTransaction::SELECTING_REV_SERVER_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::SERVER_IO_ERROR_EVT,
- name_remove->getNextEvent());
- }
- }
- }
- // Tests removingRevPtrsHandler with the following scenario:
- //
- // The request includes only a reverse change.
- // Initial posted event is SERVER_SELECTED_EVT.
- // The update request is sent but a corrupt response is received, this occurs
- // MAX_UPDATE_TRIES_PER_SERVER times.
- //
- TEST_F(NameRemoveTransactionTest, removingRevPtrsHandler_CorruptResponse) {
- NameRemoveStubPtr name_remove;
- // Create the transaction.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameRemoveTransaction::
- REMOVING_REV_PTRS_ST,
- NameChangeTransaction::
- SERVER_SELECTED_EVT, REVERSE_CHG));
- // Select a server to satisfy log statements.
- ASSERT_TRUE(name_remove->selectRevServer());
- // Verify that we can make maximum number of update attempts permitted
- // and then transition to selecting a new server.
- int max_tries = NameChangeTransaction::MAX_UPDATE_TRIES_PER_SERVER;
- for (int i = 1; i <= max_tries; ++i) {
- const D2UpdateMessagePtr prev_msg = name_remove->getDnsUpdateRequest();
- // Run removingRevPtrsHandler to send the request.
- EXPECT_NO_THROW(name_remove->removingRevPtrsHandler());
- const D2UpdateMessagePtr curr_msg = name_remove->getDnsUpdateRequest();
- if (i == 1) {
- // First time around we should build the message.
- EXPECT_FALSE(prev_msg);
- EXPECT_TRUE(curr_msg);
- } else {
- // Subsequent passes should reuse the request. We are only
- // looking to check that we have not replaced the pointer value
- // with a new pointer. This tests the on_entry() logic which
- // clears the request ONLY upon initial entry into the state.
- EXPECT_TRUE(prev_msg == curr_msg);
- }
- // Simulate a server corrupt response.
- name_remove->setDnsUpdateStatus(DNSClient::INVALID_RESPONSE);
- name_remove->postNextEvent(NameChangeTransaction::IO_COMPLETED_EVT);
- // Run removingRevPtrsHandler again to process the response.
- EXPECT_NO_THROW(name_remove->removingRevPtrsHandler());
- // Completion flags should be false.
- EXPECT_FALSE(name_remove->getForwardChangeCompleted());
- EXPECT_FALSE(name_remove->getReverseChangeCompleted());
- if (i < max_tries) {
- // We should be ready to try again.
- EXPECT_EQ(NameRemoveTransaction::REMOVING_REV_PTRS_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::SERVER_SELECTED_EVT,
- name_remove->getNextEvent());
- } else {
- // Server retries should be exhausted, time for a new server.
- EXPECT_EQ(NameChangeTransaction::SELECTING_REV_SERVER_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::SERVER_IO_ERROR_EVT,
- name_remove->getNextEvent());
- }
- }
- }
- // Tests the processRemoveOkHandler functionality.
- // It verifies behavior for the following scenarios:
- //
- // 1. Posted event is UPDATE_OK_EVT
- // 2. Posted event is invalid
- //
- TEST_F(NameRemoveTransactionTest, processRemoveOkHandler) {
- NameRemoveStubPtr name_remove;
- // Create and prep a transaction, poised to run the handler.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameChangeTransaction::PROCESS_TRANS_OK_ST,
- NameChangeTransaction::UPDATE_OK_EVT));
- // Run processRemoveOkHandler.
- EXPECT_NO_THROW(name_remove->processRemoveOkHandler());
- // Verify that a server was selected.
- EXPECT_EQ(dhcp_ddns::ST_COMPLETED, name_remove->getNcrStatus());
- // Verify that the model has ended.
- EXPECT_EQ(StateModel::END_ST, name_remove->getCurrState());
- EXPECT_EQ(StateModel::END_EVT, name_remove->getNextEvent());
- // Create and prep transaction, poised to run the handler but with an
- // invalid event.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameChangeTransaction::PROCESS_TRANS_OK_ST,
- StateModel::NOP_EVT));
- // Running the handler should throw.
- EXPECT_THROW(name_remove->processRemoveOkHandler(),
- NameRemoveTransactionError);
- }
- // Tests the processRemoveFailedHandler functionality.
- // It verifies behavior for the following scenarios:
- //
- // 1. Posted event is UPDATE_FAILED_EVT
- // 2. Posted event is invalid
- //
- TEST_F(NameRemoveTransactionTest, processRemoveFailedHandler) {
- NameRemoveStubPtr name_remove;
- // Create and prep a transaction, poised to run the handler.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameChangeTransaction::
- PROCESS_TRANS_FAILED_ST,
- NameChangeTransaction::UPDATE_FAILED_EVT));
- // Run processRemoveFailedHandler.
- EXPECT_NO_THROW(name_remove->processRemoveFailedHandler());
- // Verify that a server was selected.
- EXPECT_EQ(dhcp_ddns::ST_FAILED, name_remove->getNcrStatus());
- // Verify that the model has ended. (Remember, the transaction failed NOT
- // the model. The model should have ended normally.)
- EXPECT_EQ(StateModel::END_ST, name_remove->getCurrState());
- EXPECT_EQ(StateModel::END_EVT, name_remove->getNextEvent());
- // Create and prep transaction, poised to run the handler but with an
- // invalid event.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameChangeTransaction::
- PROCESS_TRANS_FAILED_ST,
- StateModel::NOP_EVT));
- // Running the handler should throw.
- EXPECT_THROW(name_remove->processRemoveFailedHandler(),
- NameRemoveTransactionError);
- }
- // Tests the processRemoveFailedHandler functionality.
- // It verifies behavior for posted event of NO_MORE_SERVERS_EVT.
- TEST_F(NameRemoveTransactionTest, processRemoveFailedHandler_NoMoreServers) {
- NameRemoveStubPtr name_remove;
- // Create and prep a transaction, poised to run the handler.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameChangeTransaction::
- PROCESS_TRANS_FAILED_ST,
- NameChangeTransaction::
- NO_MORE_SERVERS_EVT));
- // Run processRemoveFailedHandler.
- EXPECT_NO_THROW(name_remove->processRemoveFailedHandler());
- // Verify that a server was selected.
- EXPECT_EQ(dhcp_ddns::ST_FAILED, name_remove->getNcrStatus());
- // Verify that the model has ended. (Remember, the transaction failed NOT
- // the model. The model should have ended normally.)
- EXPECT_EQ(StateModel::END_ST, name_remove->getCurrState());
- EXPECT_EQ(StateModel::END_EVT, name_remove->getNextEvent());
- }
- // Tests the processRemoveFailedHandler functionality.
- // It verifies behavior for posted event of SERVER_IO_ERROR_EVT.
- TEST_F(NameRemoveTransactionTest, processRemoveFailedHandler_ServerIOError) {
- NameRemoveStubPtr name_remove;
- // Create and prep a transaction, poised to run the handler.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameChangeTransaction::
- PROCESS_TRANS_FAILED_ST,
- NameChangeTransaction::
- SERVER_IO_ERROR_EVT));
- // Run processRemoveFailedHandler.
- EXPECT_NO_THROW(name_remove->processRemoveFailedHandler());
- // Verify that a server was selected.
- EXPECT_EQ(dhcp_ddns::ST_FAILED, name_remove->getNcrStatus());
- // Verify that the model has ended. (Remember, the transaction failed NOT
- // the model. The model should have ended normally.)
- EXPECT_EQ(StateModel::END_ST, name_remove->getCurrState());
- EXPECT_EQ(StateModel::END_EVT, name_remove->getNextEvent());
- }
- // Tests removingFwdAddrsHandler with the following scenario:
- //
- // The request includes only a forward change.
- // Initial posted event is SERVER_SELECTED_EVT.
- // The send update request fails due to an unexpected exception.
- //
- TEST_F(NameRemoveTransactionTest, removingFwdAddrsHandler_sendUpdateException) {
- NameRemoveStubPtr name_remove;
- // Create and prep a transaction, poised to run the handler.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameRemoveTransaction::
- REMOVING_FWD_ADDRS_ST,
- NameChangeTransaction::
- SERVER_SELECTED_EVT, FORWARD_CHG));
- name_remove->simulate_send_exception_ = true;
- // Run removingFwdAddrsHandler to construct and send the request.
- EXPECT_NO_THROW(name_remove->removingFwdAddrsHandler());
- // Completion flags should be false.
- EXPECT_FALSE(name_remove->getForwardChangeCompleted());
- EXPECT_FALSE(name_remove->getReverseChangeCompleted());
- // Since IO exceptions should be gracefully handled, any that occur
- // are unanticipated, and deemed unrecoverable, so the transaction should
- // be transitioned to failure.
- EXPECT_EQ(NameChangeTransaction::PROCESS_TRANS_FAILED_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::UPDATE_FAILED_EVT,
- name_remove->getNextEvent());
- }
- // Tests removingFwdRRsHandler with the following scenario:
- //
- // The request includes only a forward change.
- // Initial posted event is SERVER_SELECTED_EVT.
- // The send update request fails due to an unexpected exception.
- //
- TEST_F(NameRemoveTransactionTest, removingFwdRRsHandler_SendUpdateException) {
- NameRemoveStubPtr name_remove;
- // Create and prep a transaction, poised to run the handler.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameRemoveTransaction::
- REMOVING_FWD_RRS_ST,
- NameChangeTransaction::
- SERVER_SELECTED_EVT, FORWARD_CHG));
- name_remove->simulate_send_exception_ = true;
- // Run removingFwdRRsHandler to construct and send the request.
- EXPECT_NO_THROW(name_remove->removingFwdRRsHandler());
- // Completion flags should be false.
- EXPECT_FALSE(name_remove->getForwardChangeCompleted());
- EXPECT_FALSE(name_remove->getReverseChangeCompleted());
- // Since IO exceptions should be gracefully handled, any that occur
- // are unanticipated, and deemed unrecoverable, so the transaction should
- // be transitioned to failure.
- EXPECT_EQ(NameChangeTransaction::PROCESS_TRANS_FAILED_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::UPDATE_FAILED_EVT,
- name_remove->getNextEvent());
- }
- // Tests removingRevPtrHandler with the following scenario:
- //
- // The request includes only a reverse change.
- // Initial posted event is SERVER_SELECTED_EVT.
- // The send update request fails due to an unexpected exception.
- //
- TEST_F(NameRemoveTransactionTest, removingRevPtrsHandler_SendUpdateException) {
- NameRemoveStubPtr name_remove;
- // Create and prep a transaction, poised to run the handler.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameRemoveTransaction::
- REMOVING_REV_PTRS_ST,
- NameChangeTransaction::
- SERVER_SELECTED_EVT, REVERSE_CHG));
- name_remove->simulate_send_exception_ = true;
- // Run removingRevPtrsHandler to construct and send the request.
- EXPECT_NO_THROW(name_remove->removingRevPtrsHandler());
- // Completion flags should be false.
- EXPECT_FALSE(name_remove->getForwardChangeCompleted());
- EXPECT_FALSE(name_remove->getReverseChangeCompleted());
- // Since IO exceptions should be gracefully handled, any that occur
- // are unanticipated, and deemed unrecoverable, so the transaction should
- // be transitioned to failure.
- EXPECT_EQ(NameChangeTransaction::PROCESS_TRANS_FAILED_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::UPDATE_FAILED_EVT,
- name_remove->getNextEvent());
- }
- // Tests removingFwdAddrsHandler with the following scenario:
- //
- // The request includes only a forward change.
- // Initial posted event is SERVER_SELECTED_EVT.
- // The request build fails due to an unexpected exception.
- //
- TEST_F(NameRemoveTransactionTest,
- removingFwdAddrsHandler_BuildRequestException) {
- NameRemoveStubPtr name_remove;
- // Create and prep a transaction, poised to run the handler.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameRemoveTransaction::
- REMOVING_FWD_ADDRS_ST,
- NameChangeTransaction::
- SERVER_SELECTED_EVT, FORWARD_CHG));
- // Set the one-shot exception simulation flag.
- name_remove->simulate_build_request_exception_ = true;
- // Run removingFwdAddrsHandler to construct and send the request.
- // This should fail with a build request throw which should be caught
- // in the state handler.
- ASSERT_NO_THROW(name_remove->removingFwdAddrsHandler());
- // Verify we did not attempt to send anything.
- EXPECT_EQ(0, name_remove->getUpdateAttempts());
- // Completion flags should be false.
- EXPECT_FALSE(name_remove->getForwardChangeCompleted());
- EXPECT_FALSE(name_remove->getReverseChangeCompleted());
- // Since IO exceptions should be gracefully handled, any that occur
- // are unanticipated, and deemed unrecoverable, so the transaction should
- // be transitioned to failure.
- EXPECT_EQ(NameChangeTransaction::PROCESS_TRANS_FAILED_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::UPDATE_FAILED_EVT,
- name_remove->getNextEvent());
- }
- // Tests removingFwdRRsHandler with the following scenario:
- //
- // The request includes only a forward change.
- // Initial posted event is SERVER_SELECTED_EVT.
- // The request build fails due to an unexpected exception.
- //
- TEST_F(NameRemoveTransactionTest,
- removingFwdRRsHandler_BuildRequestException) {
- NameRemoveStubPtr name_remove;
- // Create and prep a transaction, poised to run the handler.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameRemoveTransaction::
- REMOVING_FWD_RRS_ST,
- NameChangeTransaction::
- SERVER_SELECTED_EVT, FORWARD_CHG));
- // Set the one-shot exception simulation flag.
- name_remove->simulate_build_request_exception_ = true;
- // Run removingFwdRRsHandler to construct and send the request.
- // This should fail with a build request throw which should be caught
- // in the state handler.
- ASSERT_NO_THROW(name_remove->removingFwdRRsHandler());
- // Verify we did not attempt to send anything.
- EXPECT_EQ(0, name_remove->getUpdateAttempts());
- // Completion flags should be false.
- EXPECT_FALSE(name_remove->getForwardChangeCompleted());
- EXPECT_FALSE(name_remove->getReverseChangeCompleted());
- // Since IO exceptions should be gracefully handled, any that occur
- // are unanticipated, and deemed unrecoverable, so the transaction should
- // be transitioned to failure.
- EXPECT_EQ(NameChangeTransaction::PROCESS_TRANS_FAILED_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::UPDATE_FAILED_EVT,
- name_remove->getNextEvent());
- }
- // Tests removingRevPTRsHandler with the following scenario:
- //
- // The request includes only a forward change.
- // Initial posted event is SERVER_SELECTED_EVT.
- // The request build fails due to an unexpected exception.
- //
- TEST_F(NameRemoveTransactionTest,
- removingRevPTRsHandler_BuildRequestException) {
- NameRemoveStubPtr name_remove;
- // Create and prep a transaction, poised to run the handler.
- ASSERT_NO_THROW(name_remove =
- prepHandlerTest(NameRemoveTransaction::
- REMOVING_REV_PTRS_ST,
- NameChangeTransaction::
- SERVER_SELECTED_EVT, FORWARD_CHG));
- // Set the one-shot exception simulation flag.
- name_remove->simulate_build_request_exception_ = true;
- // Run removingRevPtrsHandler to construct and send the request.
- // This should fail with a build request throw which should be caught
- // in the state handler.
- ASSERT_NO_THROW(name_remove->removingRevPtrsHandler());
- // Verify we did not attempt to send anything.
- EXPECT_EQ(0, name_remove->getUpdateAttempts());
- // Completion flags should be false.
- EXPECT_FALSE(name_remove->getForwardChangeCompleted());
- EXPECT_FALSE(name_remove->getReverseChangeCompleted());
- // Since IO exceptions should be gracefully handled, any that occur
- // are unanticipated, and deemed unrecoverable, so the transaction should
- // be transitioned to failure.
- EXPECT_EQ(NameChangeTransaction::PROCESS_TRANS_FAILED_ST,
- name_remove->getCurrState());
- EXPECT_EQ(NameChangeTransaction::UPDATE_FAILED_EVT,
- name_remove->getNextEvent());
- }
- }
|