/* * Copyright (C) 2006 Registro.br. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * 1. Redistribution of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY REGISTRO.BR ``AS IS AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIE OF FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL REGISTRO.BR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /* $Id: BrDomainUpdateTest.cpp 900 2007-03-08 20:56:25Z eduardo $ */ #include #include #include "libepp_nicbr.H" #include "StrUtil.H" #include "BrDomainUpdateTest.H" #include "BrDomainUpdate.H" #include "FileUtil.H" #include "IoException.H" #include "XmlException.H" using std::auto_ptr; using std::cout; using std::endl; LIBEPP_NICBR_NS_USE CPPUNIT_TEST_SUITE_REGISTRATION(BrDomainUpdateTest); BrDomainUpdateTest::BrDomainUpdateTest() {} BrDomainUpdateTest::~BrDomainUpdateTest() {} void BrDomainUpdateTest::setUp() {} void BrDomainUpdateTest::tearDown() {} void BrDomainUpdateTest::set_xml_template_test() { set_xml_template_test(true); set_xml_template_test(false); } void BrDomainUpdateTest::set_xml_template_test(bool withDNSSECExtension) { string to_be_parsed = "" "" "" "" "" "$(name)$" "$(add)$" "$(rem)$" "" "" "$(ext_begin)$" "$(ds_ext)$" "$(br_ext)$" "$(ext_end)$" "$(clTRID)$" "" ""; string expected = "" "" "" "" "" "example.com.br" "" "" "" "ns2.example.com" "" "" "hkk" "" "" "" "" "ns1.example.com.br" "" "" "fan" "" "" "" ""; if (withDNSSECExtension) { expected += "" "" "" "12346" "3" "1" "38EC35D5B3A34B44C39B" "" "" "" "12345" "" "" "" "12345" "3" "1" "49FD46E6C4B45C55D4AC" "" "" ""; } expected += "" "123456" "" "" "" "" "" "" "ABC-12345" "" ""; BrDomainUpdate br_domain_update; BrDomainUpdateCmd* cmd = br_domain_update.get_command(); //parent info cmd->set_name("example.com.br"); struct NameServer ns; ns.name = "ns2.example.com"; cmd->insert_nameserver_add(ns); cmd->insert_contact_add("tech", "hkk"); ns.name = "ns1.example.com.br"; cmd->insert_nameserver_rem(ns); cmd->insert_contact_rem("tech", "fan"); if (withDNSSECExtension) { //DSInfo DSInfo ds; ds.set_key_tag(12346); ds.set_algo(3); ds.set_digest_type(1); ds.set_digest("38EC35D5B3A34B44C39B"); cmd->insert_ds_add(ds); cmd->insert_ds_rem(12345); ds.set_key_tag(12345); ds.set_digest("49FD46E6C4B45C55D4AC"); cmd->insert_ds_chg(ds); cmd->setUrgentFlag(true); } //BrDomain specific info cmd->set_ticketNumber(123456); struct ReleaseProcessFlags rpf; rpf.flag2 = 1; cmd->set_releaseProcessFlags(rpf); cmd->set_auto_renew(1); br_domain_update.get_command()->set_clTRID("ABC-12345"); br_domain_update.set_xml_template(to_be_parsed); CPPUNIT_ASSERT_EQUAL(expected, br_domain_update.get_xml()); //tests reset method cmd->reset(); //parent info CPPUNIT_ASSERT(cmd->get_name() == ""); CPPUNIT_ASSERT(cmd->get_nameserver_add().empty()); CPPUNIT_ASSERT(cmd->get_nameserver_rem().empty()); CPPUNIT_ASSERT(cmd->get_contact_add().empty()); CPPUNIT_ASSERT(cmd->get_contact_rem().empty()); CPPUNIT_ASSERT(cmd->get_status_add().empty()); CPPUNIT_ASSERT(cmd->get_status_rem().empty()); CPPUNIT_ASSERT(cmd->get_registrant() == ""); CPPUNIT_ASSERT(cmd->get_authInfo().get_pw() == ""); CPPUNIT_ASSERT(cmd->get_authInfo().get_roid() == ""); //BrDomainUpdateCmd specific info CPPUNIT_ASSERT_EQUAL(0, cmd->get_ticketNumber()); rpf = cmd->get_releaseProcessFlags(); CPPUNIT_ASSERT_EQUAL(-3, rpf.flag1 + rpf.flag2 + rpf.flag3 ); CPPUNIT_ASSERT_EQUAL(-1, cmd->get_auto_renew()); } void BrDomainUpdateTest::command_test() { BrDomainUpdate domain_update; BrDomainUpdateCmd *cmd = domain_update.get_command(); cmd->set_name("example.org"); struct NameServer ns; struct NSIPAddr ip; ns.name = "ns0.example.org"; cmd->insert_nameserver_add(ns); ns.name = "ns1.example.org"; cmd->insert_nameserver_add(ns); ns.name = "ns3.example.org"; ip.addr = "192.168.0.1"; ns.ips.insert(ip); cmd->insert_nameserver_add(ns); ns.name = "ns2.example.org"; cmd->insert_nameserver_rem(ns); cmd->insert_contact_add("tech", "XXX"); cmd->insert_contact_rem("admin", "ABC"); struct DomainUpdateCmd::Status st; st.s = "clientHold"; st.lang = "en"; st.msg = "Payment overdue."; cmd->insert_status_add(st); st.s = "clientUpdateProhibited"; st.lang = ""; st.msg = ""; cmd->insert_status_rem(st); cmd->set_registrant("registro.br"); AuthInfo authInfo; authInfo.set_pw("abc123"); cmd->set_authInfo(authInfo); //BrDomain specific info cmd->set_ticketNumber(123456); struct ReleaseProcessFlags rpf; rpf.flag1 = 1; cmd->set_releaseProcessFlags(rpf); cmd->set_auto_renew(1); bool exception_caught = false; try { string xml_template = FileUtil::read_file("../docs/templates/br_domain_update.xml"); domain_update.get_command()->set_clTRID("ABC-12345"); domain_update.set_xml_template(xml_template); DomParser parser; parser.enable_validation("../docs/schemas"); parser.parse_command(domain_update.get_xml()); } catch (const IoException &e) { exception_caught = true; printf("\nIO Exception: code [%d] message [%s]", e.get_code(), e.get_msg().c_str()); } catch (const XmlException &e) { exception_caught = true; printf("\nXml Exception: code [%d] message [%s] low level message [%s]\n", e.get_code(), e.get_msg().c_str(), e.get_low_level_msg().c_str()); cout << endl << domain_update.get_xml() << endl; } CPPUNIT_ASSERT(!exception_caught); } void BrDomainUpdateTest::response_test_case1_and_reset() { //tests response of a command WITH element //WARNING! Not testing brdomain:releaseProcessFlags string expected = "" "" "" "" "Command completed successfully" "" "" "" "123456" "" "" "CNPJ" "2006-03-01T22:00:00.0Z" "" "Cadastro Nacional da Pessoa Juridica" "" "" "" "" "" "" "ABC-12345" "54321-XYZ" "" "" ""; DomParser parser; parser.enable_validation("../docs/schemas"); BrDomainUpdate domain_update; BrDomainUpdateRsp* rsp = domain_update.get_response(); CPPUNIT_ASSERT_NO_THROW(domain_update.set_response(expected, &parser)); map results; map ::const_iterator r_it; results = rsp->get_result_list(); r_it = results.begin(); CPPUNIT_ASSERT(r_it != results.end()); CPPUNIT_ASSERT_EQUAL(Response::OK, r_it->first); string result_code = StrUtil::to_string("%d", (int)r_it->first); string response = "" "" "" "" "get_result_lang(); if (result_lang != "en") { response += " lang='" + result_lang + "'"; } response += ">" + r_it->second.msg + "" ""; // brdomain:update extension specific stuff response += "" "" "" + StrUtil::to_string("%d", rsp->get_ticketNumber()) + ""; response += ""; PENDING_CONTAINER doc_pendings = rsp->get_doc_pendings(); PENDING_CONTAINER::const_iterator doc_it; for (doc_it = doc_pendings.begin(); doc_it != doc_pendings.end(); doc_it++) { response += "" "" + (*doc_it).docType + "" "" + (*doc_it).limit + "" "" ""; } PENDING_CONTAINER dns_pendings = rsp->get_dns_pendings(); PENDING_CONTAINER::const_iterator dns_it; for (dns_it = dns_pendings.begin(); dns_it != dns_pendings.end(); dns_it++) { response += "" "" + (*dns_it).hostName + "" "" + (*dns_it).limit + "" ""; } struct PendingReleaseProc rel_pending = rsp->get_rel_pending(); if (rel_pending.status != "") { response += "" "" + rel_pending.limit + "" ""; } response += ""; response += "" "" "" "" + rsp->get_clTRID() + "" "" + rsp->get_svTRID() + "" "" "" ""; CPPUNIT_ASSERT_EQUAL(expected, response); //tests reset method rsp->reset(); //parent info CPPUNIT_ASSERT_EQUAL((string)"", rsp->get_clTRID()); CPPUNIT_ASSERT_EQUAL((string)"", rsp->get_svTRID()); results = rsp->get_result_list(); r_it = results.begin(); CPPUNIT_ASSERT(r_it == results.end()); //BrDomainUpdateRsp specific information CPPUNIT_ASSERT_EQUAL(0, rsp->get_ticketNumber()); CPPUNIT_ASSERT(rsp->get_doc_pendings().empty()); CPPUNIT_ASSERT(rsp->get_dns_pendings().empty()); CPPUNIT_ASSERT_EQUAL((string)"", rsp->get_rel_pending().status); CPPUNIT_ASSERT_EQUAL((string)"", rsp->get_rel_pending().limit); CPPUNIT_ASSERT(rsp->get_host_status().empty()); } void BrDomainUpdateTest::response_test_case2() { //tests brdomain:hostStatus - response of a command WITH NO // element string expected = "" "" "" "" "Data management policy violation" "" "" "ns2.example.com" "" "Query refused" "" "" "" "" "" "ns2.example.com" "Query refused" "" "" "billing" "dns" "" "" "" "" "ABC-12345" "54321-XYZ" "" "" ""; DomParser parser; parser.enable_validation("../docs/schemas"); BrDomainUpdate domain_update; BrDomainUpdateRsp* rsp = domain_update.get_response(); CPPUNIT_ASSERT_NO_THROW(domain_update.set_response(expected, &parser)); map results; map ::const_iterator r_it; results = rsp->get_result_list(); r_it = results.begin(); CPPUNIT_ASSERT(r_it != results.end()); CPPUNIT_ASSERT_EQUAL(Response::DATA_MGMT_POLICY_VIOLATION, r_it->first); list ext_values = r_it->second.ext_values; list ::const_iterator ev_it; ev_it = ext_values.begin(); string value = "ns2.example.com"; string xmlns = "xmlns:domain=\"urn:ietf:params:xml:ns:domain-1.0\""; string reason = "Query refused"; CPPUNIT_ASSERT(ev_it != ext_values.end()); CPPUNIT_ASSERT_EQUAL(value, ev_it->value); CPPUNIT_ASSERT_EQUAL(xmlns, ev_it->xmlns); CPPUNIT_ASSERT_EQUAL(reason, ev_it->reason); string result_code = StrUtil::to_string("%d", (int)r_it->first); string response = "" "" "" "" "get_result_lang(); if (result_lang != "en") { response += " lang='" + result_lang + "'"; } response += ">" + r_it->second.msg + "" "" "" "" + value + "" "" + reason + "" "" ""; // brdomain:update extension specific stuff response += "" ""; set host_status = rsp->get_host_status(); if (!host_status.empty()) { set::const_iterator it; for (it = host_status.begin(); it != host_status.end(); it++) { response += "" "" + (*it).host + "" "" + (*it).status + "" ""; } } string publicationFlag = rsp->get_publication_flag(); response += ""; set onhold_reasons = rsp->get_onhold_reasons(); set::const_iterator tkt_it; for (tkt_it = onhold_reasons.begin(); tkt_it != onhold_reasons.end(); tkt_it++) { response += "" + (*tkt_it) + ""; } response += "" "" "" "" "" + rsp->get_clTRID() + "" "" + rsp->get_svTRID() + "" "" "" ""; CPPUNIT_ASSERT_EQUAL(expected, response); //just to make sure host_status gets really empty (the other //attributes are tested in the previous method) rsp->reset(); CPPUNIT_ASSERT(rsp->get_host_status().empty()); CPPUNIT_ASSERT_EQUAL((string)"", rsp->get_publication_flag()); CPPUNIT_ASSERT_EQUAL(true, rsp->get_onhold_reasons().empty()); }