diff options
Diffstat (limited to 'src/hooks/dhcp/run_script/tests/run_script_unittests.cc')
-rw-r--r-- | src/hooks/dhcp/run_script/tests/run_script_unittests.cc | 1035 |
1 files changed, 1035 insertions, 0 deletions
diff --git a/src/hooks/dhcp/run_script/tests/run_script_unittests.cc b/src/hooks/dhcp/run_script/tests/run_script_unittests.cc new file mode 100644 index 0000000..46d9c8d --- /dev/null +++ b/src/hooks/dhcp/run_script/tests/run_script_unittests.cc @@ -0,0 +1,1035 @@ +// Copyright (C) 2021 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#include <config.h> + +#include <run_script.h> + +#include <asiolink/io_address.h> +#include <asiolink/io_service.h> +#include <cc/data.h> +#include <dhcp/dhcp6.h> +#include <dhcp/option.h> +#include <dhcp/option_custom.h> +#include <dhcp/option_int.h> +#include <hooks/callout_manager.h> +#include <hooks/hooks.h> +#include <hooks/hooks_manager.h> + +#include <cstdio> +#include <fstream> + +#include <gtest/gtest.h> + +using namespace isc::run_script; + +using namespace isc::asiolink; +using namespace isc::data; +using namespace isc::dhcp; +using namespace isc::hooks; +using namespace isc::util; +using namespace std; + +extern "C" { +extern int lease4_renew(CalloutHandle& handle); +extern int lease4_expire(CalloutHandle& handle); +extern int lease4_recover(CalloutHandle& handle); +extern int leases4_committed(CalloutHandle& handle); +extern int lease4_release(CalloutHandle& handle); +extern int lease4_decline(CalloutHandle& handle); +extern int lease6_renew(CalloutHandle& handle); +extern int lease6_rebind(CalloutHandle& handle); +extern int lease6_expire(CalloutHandle& handle); +extern int lease6_recover(CalloutHandle& handle); +extern int leases6_committed(CalloutHandle& handle); +extern int lease6_release(CalloutHandle& handle); +extern int lease6_decline(CalloutHandle& handle); +} + +namespace isc { +namespace run_script { + +extern RunScriptImplPtr impl; + +} // namespace run_script +} // namespace isc + +namespace { + +/// @brief This function joins all received environment variables and adds a +/// newline after each one so that a simple compare can be done in the test. +/// +/// @param vars The list of environment variables to join. +/// @return The joined environment. +string +join(const ProcessEnvVars& vars) { + string result; + for (auto var : vars) { + result += var + "\n"; + } + return (result); +} + +/// @brief Generate a valid HWAddr. +/// +/// @return The generated HWAddr. +HWAddrPtr +generateHWAddr() { + return (HWAddrPtr(new HWAddr({0, 1, 2 ,3}, HTYPE_ETHER))); +} + +/// @brief Generate a valid DUID. +/// +/// @return The generated DUID. +ClientIdPtr +generateDUID() { + return (ClientIdPtr(new ClientId({0, 1, 2, 3, 4, 5, 6}))); +} + +/// @brief Generate a valid Option. +/// +/// @param universe The option universe (V4 or V6). +/// @param code The Option code to use. +/// @return The generated Option. +OptionPtr +generateOption(Option::Universe universe, uint16_t code, OptionBuffer& data) { + OptionDefinitionPtr def = LibDHCP::getOptionDef(universe == Option::V4 ? + DHCP4_OPTION_SPACE : DHCP6_OPTION_SPACE, + code); + if (def) { + return (OptionCustomPtr(new OptionCustom(*def, universe, data))); + } + + return (OptionPtr()); +} + +/// @brief Generate a valid Option6IA. +/// +/// @return The generated Option6IA. +Option6IAPtr +generateOptionIA() { + OptionBuffer buf; + buf.resize(12); + buf[0] = 0xa1; // iaid + buf[1] = 0xa2; + buf[2] = 0xa3; + buf[3] = 0xa4; + buf[4] = 0x81; // T1 + buf[5] = 0x02; + buf[6] = 0x03; + buf[7] = 0x04; + buf[8] = 0x84; // T2 + buf[9] = 0x03; + buf[10] = 0x02; + buf[11] = 0x01; + + return (Option6IAPtr(new Option6IA(D6O_IA_NA, buf.begin(), buf.end()))); +} + +/// @brief Generate a valid Subnet4. +/// +/// @return The generated Subnet4. +Subnet4Ptr +generateSubnet4() { + return (Subnet4Ptr(new Subnet4(IOAddress("182.168.0.1"), 2, 3, 4, 5, 6))); +} + +/// @brief Generate a valid Subnet6. +/// +/// @return The generated Subnet6. +Subnet6Ptr +generateSubnet6() { + return (Subnet6Ptr(new Subnet6(IOAddress("2003:db8::1"), 2, 3, 4, 5, 6, 7))); +} + +/// @brief Generate a valid Lease4. +/// +/// @return The generated Lease4. +Lease4Ptr +generateLease4() { + HWAddrPtr hwaddr = generateHWAddr(); + ClientIdPtr clientid = generateDUID(); + + Lease4Ptr lease4(new Lease4(IOAddress("192.168.0.1"), hwaddr, clientid, + 2, 3, 4, false, false, "test.hostname")); + + return(lease4); +} + +/// @brief Generate a valid Lease6. +/// +/// @return The generated Lease6. +Lease6Ptr +generateLease6() { + HWAddrPtr hwaddr = generateHWAddr(); + DuidPtr duid = generateDUID(); + + Lease6Ptr lease6(new Lease6(Lease::TYPE_NA, IOAddress("2003:db8::1"), duid, + 2, 3, 4, 5, false, false, "test.hostname", + hwaddr)); + + lease6->cltt_ = 7; + + return (lease6); +} + +/// @brief Generate a Pkt4 with all parameters set. +/// +/// @return The generated Pkt4. +Pkt4Ptr +generatePkt4() { + // A dummy MAC address, padded with 0s + const uint8_t dummyChaddr[16] = {0, 1, 2, 3, 4, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }; + + // Let's use some creative test content here (128 chars + \0) + const uint8_t dummyFile[] = "Lorem ipsum dolor sit amet, consectetur " + "adipiscing elit. Proin mollis placerat metus, at " + "lacinia orci ornare vitae. Mauris amet."; + + // Yet another type of test content (64 chars + \0) + const uint8_t dummySname[] = "Lorem ipsum dolor sit amet, consectetur " + "adipiscing elit posuere."; + + // That is only part of the header. It contains all "short" fields, + // larger fields are constructed separately. + uint8_t hdr[] = { + 1, 6, 6, 13, // op, htype, hlen, hops, + 0x12, 0x34, 0x56, 0x78, // transaction-id + 0, 42, 0x80, 0x00, // 42 secs, BROADCAST flags + 192, 0, 2, 1, // ciaddr + 1, 2, 3, 4, // yiaddr + 192, 0, 2, 255, // siaddr + 192, 0, 2, 50, // giaddr + }; + + // Initialize the vector with the header fields defined above. + vector<uint8_t> buf(hdr, hdr + sizeof(hdr)); + + // Append the large header fields. + copy(dummyChaddr, dummyChaddr + Pkt4::MAX_CHADDR_LEN, back_inserter(buf)); + copy(dummySname, dummySname + Pkt4::MAX_SNAME_LEN, back_inserter(buf)); + copy(dummyFile, dummyFile + Pkt4::MAX_FILE_LEN, back_inserter(buf)); + + // Should now have all the header, so check. The "static_cast" is used + // to get round an odd bug whereby the linker appears not to find the + // definition of DHCPV4_PKT_HDR_LEN if it appears within an EXPECT_EQ(). + EXPECT_EQ(static_cast<size_t>(Pkt4::DHCPV4_PKT_HDR_LEN), buf.size()); + + // Add magic cookie + buf.push_back(0x63); + buf.push_back(0x82); + buf.push_back(0x53); + buf.push_back(0x63); + + // Add message type DISCOVER + buf.push_back(static_cast<uint8_t>(DHO_DHCP_MESSAGE_TYPE)); + buf.push_back(1); // length (just one byte) + buf.push_back(static_cast<uint8_t>(DHCPDISCOVER)); + + Pkt4Ptr pkt4(new Pkt4(&buf[0], buf.size())); + + pkt4->setIface("eth1"); + pkt4->setIndex(2); + + pkt4->setHWAddr(generateHWAddr()); + pkt4->setLocalHWAddr(generateHWAddr()); + pkt4->setRemoteHWAddr(generateHWAddr()); + + OptionDefinitionPtr rai_def = LibDHCP::getOptionDef(DHCP4_OPTION_SPACE, + DHO_DHCP_AGENT_OPTIONS); + + OptionCustomPtr rai(new OptionCustom(*rai_def, Option::V4)); + + uint8_t circuit_id[] = { 0x68, 0x6f, 0x77, 0x64, 0x79 }; + OptionPtr circuit_id_opt(new Option(Option::V4, RAI_OPTION_AGENT_CIRCUIT_ID, + OptionBuffer(circuit_id, + circuit_id + sizeof(circuit_id)))); + rai->addOption(circuit_id_opt); + + uint8_t subscriber_id[] = { 0x1a, 0x2b, 0x3c, 0x4d, 0x5e, 0x6f }; + OptionPtr subscriber_id_opt(new Option(Option::V4, RAI_OPTION_SUBSCRIBER_ID, + OptionBuffer(subscriber_id, + subscriber_id + sizeof(subscriber_id)))); + rai->addOption(subscriber_id_opt); + + uint8_t remote_id[] = { 0x87, 0xf6, 0x79, 0x77, 0xef }; + OptionPtr remote_id_opt(new Option(Option::V4, RAI_OPTION_REMOTE_ID, + OptionBuffer(remote_id, + remote_id + sizeof(remote_id)))); + rai->addOption(remote_id_opt); + + pkt4->addOption(rai); + + return (pkt4); +} + +/// @brief Generate a Pkt6 with all parameters set. +/// +/// @return The generated Pkt6. +Pkt6Ptr +generatePkt6() { + // That is only part of the header. It contains all "short" fields, + // larger fields are constructed separately. + uint8_t data[98]; + data[0] = 1; + data[1] = 1; data[2] = 2; data[3] = 3; data[4] = 0; + data[5] = 1; data[6] = 0; data[7] = 14; data[8] = 0; + data[9] = 1; data[10] = 0; data[11] = 1; data[12] = 21; + data[13] = 158; data[14] = 60; data[15] = 22; data[16] = 0; + data[17] = 30; data[18] = 140; data[19] = 155; data[20] = 115; + data[21] = 73; data[22] = 0; data[23] = 3; data[24] = 0; + data[25] = 40; data[26] = 0; data[27] = 0; data[28] = 0; + data[29] = 1; data[30] = 255; data[31] = 255; data[32] = 255; + data[33] = 255; data[34] = 255; data[35] = 255; data[36] = 255; + data[37] = 255; data[38] = 0; data[39] = 5; data[40] = 0; + data[41] = 24; data[42] = 32; data[43] = 1; data[44] = 13; + data[45] = 184; data[46] = 0; data[47] = 1; data[48] = 0; + data[49] = 0; data[50] = 0; data[51] = 0; data[52] = 0; + data[53] = 0; data[54] = 0; data[55] = 0; data[56] = 18; + data[57] = 52; data[58] = 255; data[59] = 255; data[60] = 255; + data[61] = 255; data[62] = 255; data[63] = 255; data[64] = 255; + data[65] = 255; data[66] = 0; data[67] = 23; data[68] = 0; + data[69] = 16; data[70] = 32; data[71] = 1; data[72] = 13; + data[73] = 184; data[74] = 0; data[75] = 1; data[76] = 0; + data[77] = 0; data[78] = 0; data[79] = 0; data[80] = 0; + data[81] = 0; data[82] = 0; data[83] = 0; data[84] = 221; + data[85] = 221; data[86] = 0; data[87] = 8; data[88] = 0; + data[89] = 2; data[90] = 0; data[91] = 100; data[92] = 0; + data[93] = 6; data[94] = 0; data[95] = 2; data[96] = 0; + data[97] = 23; + + Pkt6Ptr pkt6(new Pkt6(data, sizeof(data))); + + pkt6->setRemotePort(546); + pkt6->setRemoteAddr(IOAddress("fe80::21e:8cff:fe9b:7349")); + pkt6->setLocalPort(0); + pkt6->setLocalAddr(IOAddress("ff02::1:2")); + + pkt6->setIface("eth1"); + pkt6->setIndex(2); + + pkt6->setRemoteHWAddr(generateHWAddr()); + pkt6->addOption(OptionPtr(new Option(Option::V6, D6O_CLIENTID, + generateDUID()->getDuid()))); + + return (pkt6); +} + +/// @brief Tests the RunScript setName and getName functions. +TEST(RunScript, testSetNameGetName) { + RunScriptImpl script; + string script_name = "test"; + ASSERT_NO_THROW(script.setName(script_name)); + EXPECT_EQ(script_name, script.getName()); +} + +/// @brief Tests the RunScript setSync and getSync functions. +TEST(RunScript, testSetSyncGetSync) { + RunScriptImpl script; + bool sync = true; + ASSERT_NO_THROW(script.setSync(sync)); + EXPECT_EQ(sync, script.getSync()); +} + +/// @brief Tests the extractBoolean method works as expected. +TEST(RunScript, extractBoolean) { + ProcessEnvVars vars; + bool flag = false; + RunScriptImpl::extractBoolean(vars, flag, "FALSE_PREFIX", "_FALSE_SUFFIX"); + ASSERT_EQ(1, vars.size()); + string expected = "FALSE_PREFIX_FALSE_SUFFIX=false\n"; + EXPECT_EQ(expected, join(vars)); + flag = true; + RunScriptImpl::extractBoolean(vars, flag, "TRUE_PREFIX", "_TRUE_SUFFIX"); + ASSERT_EQ(2, vars.size()); + expected = "FALSE_PREFIX_FALSE_SUFFIX=false\n" + "TRUE_PREFIX_TRUE_SUFFIX=true\n"; + EXPECT_EQ(expected, join(vars)); +} + +/// @brief Tests the extractInteger method works as expected. +TEST(RunScript, extractInteger) { + ProcessEnvVars vars; + uint64_t value = 0; + RunScriptImpl::extractInteger(vars, value, "ZERO_PREFIX", "_ZERO_SUFFIX"); + ASSERT_EQ(1, vars.size()); + string expected = "ZERO_PREFIX_ZERO_SUFFIX=0\n"; + EXPECT_EQ(expected, join(vars)); + value = 1; + RunScriptImpl::extractInteger(vars, value, "ONE_PREFIX", "_ONE_SUFFIX"); + ASSERT_EQ(2, vars.size()); + expected = "ZERO_PREFIX_ZERO_SUFFIX=0\n" + "ONE_PREFIX_ONE_SUFFIX=1\n"; + EXPECT_EQ(expected, join(vars)); + value = 1000; + RunScriptImpl::extractInteger(vars, value, "THOUSAND_PREFIX", "_THOUSAND_SUFFIX"); + ASSERT_EQ(3, vars.size()); + expected = "ZERO_PREFIX_ZERO_SUFFIX=0\n" + "ONE_PREFIX_ONE_SUFFIX=1\n" + "THOUSAND_PREFIX_THOUSAND_SUFFIX=1000\n"; + EXPECT_EQ(expected, join(vars)); +} + +/// @brief Tests the extractString method works as expected. +TEST(RunScript, extractString) { + ProcessEnvVars vars; + string value = ""; + RunScriptImpl::extractString(vars, value, "EMPTY_PREFIX", "_EMPTY_SUFFIX"); + ASSERT_EQ(1, vars.size()); + string expected = "EMPTY_PREFIX_EMPTY_SUFFIX=\n"; + EXPECT_EQ(expected, join(vars)); + value = "SOMETHING"; + RunScriptImpl::extractString(vars, value, "NON_EMPTY_PREFIX", "_NON_EMPTY_SUFFIX"); + ASSERT_EQ(2, vars.size()); + expected = "EMPTY_PREFIX_EMPTY_SUFFIX=\n" + "NON_EMPTY_PREFIX_NON_EMPTY_SUFFIX=SOMETHING\n"; + EXPECT_EQ(expected, join(vars)); +} + +/// @brief Tests the extractHWAddr method works as expected. +TEST(RunScript, extractHWAddr) { + ProcessEnvVars vars; + HWAddrPtr hwaddr; + RunScriptImpl::extractHWAddr(vars, hwaddr, "HWADDR_PREFIX", "_HWADDR_SUFFIX"); + ASSERT_EQ(2, vars.size()); + string expected = "HWADDR_PREFIX_HWADDR_SUFFIX=\n" + "HWADDR_PREFIX_TYPE_HWADDR_SUFFIX=\n"; + EXPECT_EQ(expected, join(vars)); + vars.clear(); + hwaddr = generateHWAddr(); + RunScriptImpl::extractHWAddr(vars, hwaddr, "HWADDR_PREFIX", "_HWADDR_SUFFIX"); + ASSERT_EQ(2, vars.size()); + expected = "HWADDR_PREFIX_HWADDR_SUFFIX=00:01:02:03\n" + "HWADDR_PREFIX_TYPE_HWADDR_SUFFIX=1\n"; + EXPECT_EQ(expected, join(vars)); +} + +/// @brief Tests the extractDUID method works as expected. +TEST(RunScript, extractDUID) { + ProcessEnvVars vars; + DuidPtr duid; + RunScriptImpl::extractDUID(vars, duid, "DUID_PREFIX", "_DUID_SUFFIX"); + ASSERT_EQ(1, vars.size()); + string expected = "DUID_PREFIX_DUID_SUFFIX=\n"; + EXPECT_EQ(expected, join(vars)); + vars.clear(); + duid = generateDUID(); + RunScriptImpl::extractDUID(vars, duid, "DUID_PREFIX", "_DUID_SUFFIX"); + ASSERT_EQ(1, vars.size()); + expected = "DUID_PREFIX_DUID_SUFFIX=00:01:02:03:04:05:06\n"; + EXPECT_EQ(expected, join(vars)); +} + +/// @brief Tests the extractOption method works as expected. +TEST(RunScript, extractOption) { + ProcessEnvVars vars; + OptionPtr option; + RunScriptImpl::extractOption(vars, option, "OPTION_PREFIX", "_OPTION_SUFFIX"); + ASSERT_EQ(0, vars.size()); + OptionBuffer buffer = { 0xca, 0xfe, 0xba, 0xbe }; + option = generateOption(Option::V4, DHO_USER_CLASS, buffer); + RunScriptImpl::extractOption(vars, option, "OPTION_PREFIX", "_OPTION_SUFFIX"); + ASSERT_EQ(1, vars.size()); + string expected = "OPTION_PREFIX_OPTION_77_OPTION_SUFFIX=0xCAFEBABE\n"; + EXPECT_EQ(expected, join(vars)); +} + +/// @brief Tests the extractSubOption method works as expected. +TEST(RunScript, extractSubOption) { + ProcessEnvVars vars; + OptionPtr option; + RunScriptImpl::extractOption(vars, option, "OPTION_SUBOPTION_PREFIX", "_OPTION_SUBOPTION_SUFFIX"); + ASSERT_EQ(0, vars.size()); + OptionBuffer data; + option = generateOption(Option::V4, DHO_DHCP_AGENT_OPTIONS, data); + uint8_t subscriber_id[] = { 0x1a, 0x2b, 0x3c, 0x4d, 0x5e, 0x6f }; + OptionPtr subscriber_id_opt(new Option(Option::V4, RAI_OPTION_SUBSCRIBER_ID, + OptionBuffer(subscriber_id, + subscriber_id + sizeof(subscriber_id)))); + option->addOption(subscriber_id_opt); + RunScriptImpl::extractSubOption(vars, option, RAI_OPTION_SUBSCRIBER_ID, "OPTION_SUBOPTION_PREFIX", "_OPTION_SUBOPTION_SUFFIX"); + ASSERT_EQ(1, vars.size()); + string expected = "OPTION_SUBOPTION_PREFIX_OPTION_82_SUB_OPTION_6_OPTION_SUBOPTION_SUFFIX=0x1A2B3C4D5E6F\n"; + EXPECT_EQ(expected, join(vars)); +} + +/// @brief Tests the extractOptionIA method works as expected. +TEST(RunScript, extractOptionIA) { + ProcessEnvVars vars; + Option6IAPtr optionia; + RunScriptImpl::extractOptionIA(vars, optionia, "OPTIONIA_PREFIX", "_OPTIONIA_SUFFIX"); + ASSERT_EQ(4, vars.size()); + string expected = "OPTIONIA_PREFIX_IAID_OPTIONIA_SUFFIX=\n" + "OPTIONIA_PREFIX_IA_TYPE_OPTIONIA_SUFFIX=\n" + "OPTIONIA_PREFIX_IA_T1_OPTIONIA_SUFFIX=\n" + "OPTIONIA_PREFIX_IA_T2_OPTIONIA_SUFFIX=\n"; + EXPECT_EQ(expected, join(vars)); + vars.clear(); + optionia = generateOptionIA(); + RunScriptImpl::extractOptionIA(vars, optionia, "OPTIONIA_PREFIX", "_OPTIONIA_SUFFIX"); + ASSERT_EQ(4, vars.size()); + expected = "OPTIONIA_PREFIX_IAID_OPTIONIA_SUFFIX=2711790500\n" + "OPTIONIA_PREFIX_IA_TYPE_OPTIONIA_SUFFIX=3\n" + "OPTIONIA_PREFIX_IA_T1_OPTIONIA_SUFFIX=2164392708\n" + "OPTIONIA_PREFIX_IA_T2_OPTIONIA_SUFFIX=2214789633\n"; + EXPECT_EQ(expected, join(vars)); +} + +/// @brief Tests the extractSubnet4 method works as expected. +TEST(RunScript, extractSubnet4) { + ProcessEnvVars vars; + Subnet4Ptr subnet4; + RunScriptImpl::extractSubnet4(vars, subnet4, "SUBNET4_PREFIX", "_SUBNET4_SUFFIX"); + ASSERT_EQ(4, vars.size()); + string expected = "SUBNET4_PREFIX_ID_SUBNET4_SUFFIX=\n" + "SUBNET4_PREFIX_NAME_SUBNET4_SUFFIX=\n" + "SUBNET4_PREFIX_PREFIX_SUBNET4_SUFFIX=\n" + "SUBNET4_PREFIX_PREFIX_LEN_SUBNET4_SUFFIX=\n"; + EXPECT_EQ(expected, join(vars)); + vars.clear(); + subnet4 = generateSubnet4(); + RunScriptImpl::extractSubnet4(vars, subnet4, "SUBNET4_PREFIX", "_SUBNET4_SUFFIX"); + ASSERT_EQ(4, vars.size()); + expected = "SUBNET4_PREFIX_ID_SUBNET4_SUFFIX=6\n" + "SUBNET4_PREFIX_NAME_SUBNET4_SUFFIX=182.168.0.1/2\n" + "SUBNET4_PREFIX_PREFIX_SUBNET4_SUFFIX=182.168.0.1\n" + "SUBNET4_PREFIX_PREFIX_LEN_SUBNET4_SUFFIX=2\n"; + EXPECT_EQ(expected, join(vars)); +} + +/// @brief Tests the extractSubnet6 method works as expected. +TEST(RunScript, extractSubnet6) { + ProcessEnvVars vars; + Subnet6Ptr subnet6; + RunScriptImpl::extractSubnet6(vars, subnet6, "SUBNET6_PREFIX", "_SUBNET6_SUFFIX"); + ASSERT_EQ(4, vars.size()); + string expected = "SUBNET6_PREFIX_ID_SUBNET6_SUFFIX=\n" + "SUBNET6_PREFIX_NAME_SUBNET6_SUFFIX=\n" + "SUBNET6_PREFIX_PREFIX_SUBNET6_SUFFIX=\n" + "SUBNET6_PREFIX_PREFIX_LEN_SUBNET6_SUFFIX=\n"; + EXPECT_EQ(expected, join(vars)); + vars.clear(); + subnet6 = generateSubnet6(); + RunScriptImpl::extractSubnet6(vars, subnet6, "SUBNET6_PREFIX", "_SUBNET6_SUFFIX"); + ASSERT_EQ(4, vars.size()); + expected = "SUBNET6_PREFIX_ID_SUBNET6_SUFFIX=7\n" + "SUBNET6_PREFIX_NAME_SUBNET6_SUFFIX=2003:db8::1/2\n" + "SUBNET6_PREFIX_PREFIX_SUBNET6_SUFFIX=2003:db8::1\n" + "SUBNET6_PREFIX_PREFIX_LEN_SUBNET6_SUFFIX=2\n"; + EXPECT_EQ(expected, join(vars)); +} + +/// @brief Tests the extractLease4 method works as expected. +TEST(RunScript, extractLease4) { + ProcessEnvVars vars; + Lease4Ptr lease4; + RunScriptImpl::extractLease4(vars, lease4, "LEASE4_PREFIX", "_LEASE4_SUFFIX"); + ASSERT_EQ(9, vars.size()); + string expected = "LEASE4_PREFIX_ADDRESS_LEASE4_SUFFIX=\n" + "LEASE4_PREFIX_CLTT_LEASE4_SUFFIX=\n" + "LEASE4_PREFIX_HOSTNAME_LEASE4_SUFFIX=\n" + "LEASE4_PREFIX_HWADDR_LEASE4_SUFFIX=\n" + "LEASE4_PREFIX_HWADDR_TYPE_LEASE4_SUFFIX=\n" + "LEASE4_PREFIX_STATE_LEASE4_SUFFIX=\n" + "LEASE4_PREFIX_SUBNET_ID_LEASE4_SUFFIX=\n" + "LEASE4_PREFIX_VALID_LIFETIME_LEASE4_SUFFIX=\n" + "LEASE4_PREFIX_CLIENT_ID_LEASE4_SUFFIX=\n"; + EXPECT_EQ(expected, join(vars)); + vars.clear(); + lease4 = generateLease4(); + RunScriptImpl::extractLease4(vars, lease4, "LEASE4_PREFIX", "_LEASE4_SUFFIX"); + ASSERT_EQ(9, vars.size()); + expected = "LEASE4_PREFIX_ADDRESS_LEASE4_SUFFIX=192.168.0.1\n" + "LEASE4_PREFIX_CLTT_LEASE4_SUFFIX=3\n" + "LEASE4_PREFIX_HOSTNAME_LEASE4_SUFFIX=test.hostname\n" + "LEASE4_PREFIX_HWADDR_LEASE4_SUFFIX=00:01:02:03\n" + "LEASE4_PREFIX_HWADDR_TYPE_LEASE4_SUFFIX=1\n" + "LEASE4_PREFIX_STATE_LEASE4_SUFFIX=default\n" + "LEASE4_PREFIX_SUBNET_ID_LEASE4_SUFFIX=4\n" + "LEASE4_PREFIX_VALID_LIFETIME_LEASE4_SUFFIX=2\n" + "LEASE4_PREFIX_CLIENT_ID_LEASE4_SUFFIX=00:01:02:03:04:05:06\n"; + EXPECT_EQ(expected, join(vars)); +} + +/// @brief Tests the extractLease6 method works as expected. +TEST(RunScript, extractLease6) { + ProcessEnvVars vars; + Lease6Ptr lease6; + RunScriptImpl::extractLease6(vars, lease6, "LEASE6_PREFIX", "_LEASE6_SUFFIX"); + ASSERT_EQ(13, vars.size()); + string expected = "LEASE6_PREFIX_ADDRESS_LEASE6_SUFFIX=\n" + "LEASE6_PREFIX_CLTT_LEASE6_SUFFIX=\n" + "LEASE6_PREFIX_HOSTNAME_LEASE6_SUFFIX=\n" + "LEASE6_PREFIX_HWADDR_LEASE6_SUFFIX=\n" + "LEASE6_PREFIX_HWADDR_TYPE_LEASE6_SUFFIX=\n" + "LEASE6_PREFIX_STATE_LEASE6_SUFFIX=\n" + "LEASE6_PREFIX_SUBNET_ID_LEASE6_SUFFIX=\n" + "LEASE6_PREFIX_VALID_LIFETIME_LEASE6_SUFFIX=\n" + "LEASE6_PREFIX_DUID_LEASE6_SUFFIX=\n" + "LEASE6_PREFIX_IAID_LEASE6_SUFFIX=\n" + "LEASE6_PREFIX_PREFERRED_LIFETIME_LEASE6_SUFFIX=\n" + "LEASE6_PREFIX_PREFIX_LEN_LEASE6_SUFFIX=\n" + "LEASE6_PREFIX_TYPE_LEASE6_SUFFIX=\n"; + EXPECT_EQ(expected, join(vars)); + vars.clear(); + lease6 = generateLease6(); + RunScriptImpl::extractLease6(vars, lease6, "LEASE6_PREFIX", "_LEASE6_SUFFIX"); + ASSERT_EQ(13, vars.size()); + expected = "LEASE6_PREFIX_ADDRESS_LEASE6_SUFFIX=2003:db8::1\n" + "LEASE6_PREFIX_CLTT_LEASE6_SUFFIX=7\n" + "LEASE6_PREFIX_HOSTNAME_LEASE6_SUFFIX=test.hostname\n" + "LEASE6_PREFIX_HWADDR_LEASE6_SUFFIX=00:01:02:03\n" + "LEASE6_PREFIX_HWADDR_TYPE_LEASE6_SUFFIX=1\n" + "LEASE6_PREFIX_STATE_LEASE6_SUFFIX=default\n" + "LEASE6_PREFIX_SUBNET_ID_LEASE6_SUFFIX=5\n" + "LEASE6_PREFIX_VALID_LIFETIME_LEASE6_SUFFIX=4\n" + "LEASE6_PREFIX_DUID_LEASE6_SUFFIX=00:01:02:03:04:05:06\n" + "LEASE6_PREFIX_IAID_LEASE6_SUFFIX=2\n" + "LEASE6_PREFIX_PREFERRED_LIFETIME_LEASE6_SUFFIX=3\n" + "LEASE6_PREFIX_PREFIX_LEN_LEASE6_SUFFIX=128\n" + "LEASE6_PREFIX_TYPE_LEASE6_SUFFIX=IA_NA\n"; + EXPECT_EQ(expected, join(vars)); +} + +/// @brief Tests the extractLeases4 method works as expected. +TEST(RunScript, extractLeases4) { + ProcessEnvVars vars; + Lease4CollectionPtr leases4; + RunScriptImpl::extractLeases4(vars, leases4, "LEASES4_PREFIX", "_LEASES4_SUFFIX"); + ASSERT_EQ(1, vars.size()); + string expected = "LEASES4_PREFIX_SIZE_LEASES4_SUFFIX=0\n"; + EXPECT_EQ(expected, join(vars)); + vars.clear(); + leases4.reset(new Lease4Collection()); + leases4->push_back(generateLease4()); + leases4->push_back(generateLease4()); + RunScriptImpl::extractLeases4(vars, leases4, "LEASES4_PREFIX", "_LEASES4_SUFFIX"); + ASSERT_EQ(19, vars.size()); + expected = "LEASES4_PREFIX_SIZE_LEASES4_SUFFIX=2\n" + "LEASES4_PREFIX_AT0_ADDRESS_LEASES4_SUFFIX=192.168.0.1\n" + "LEASES4_PREFIX_AT0_CLTT_LEASES4_SUFFIX=3\n" + "LEASES4_PREFIX_AT0_HOSTNAME_LEASES4_SUFFIX=test.hostname\n" + "LEASES4_PREFIX_AT0_HWADDR_LEASES4_SUFFIX=00:01:02:03\n" + "LEASES4_PREFIX_AT0_HWADDR_TYPE_LEASES4_SUFFIX=1\n" + "LEASES4_PREFIX_AT0_STATE_LEASES4_SUFFIX=default\n" + "LEASES4_PREFIX_AT0_SUBNET_ID_LEASES4_SUFFIX=4\n" + "LEASES4_PREFIX_AT0_VALID_LIFETIME_LEASES4_SUFFIX=2\n" + "LEASES4_PREFIX_AT0_CLIENT_ID_LEASES4_SUFFIX=00:01:02:03:04:05:06\n" + "LEASES4_PREFIX_AT1_ADDRESS_LEASES4_SUFFIX=192.168.0.1\n" + "LEASES4_PREFIX_AT1_CLTT_LEASES4_SUFFIX=3\n" + "LEASES4_PREFIX_AT1_HOSTNAME_LEASES4_SUFFIX=test.hostname\n" + "LEASES4_PREFIX_AT1_HWADDR_LEASES4_SUFFIX=00:01:02:03\n" + "LEASES4_PREFIX_AT1_HWADDR_TYPE_LEASES4_SUFFIX=1\n" + "LEASES4_PREFIX_AT1_STATE_LEASES4_SUFFIX=default\n" + "LEASES4_PREFIX_AT1_SUBNET_ID_LEASES4_SUFFIX=4\n" + "LEASES4_PREFIX_AT1_VALID_LIFETIME_LEASES4_SUFFIX=2\n" + "LEASES4_PREFIX_AT1_CLIENT_ID_LEASES4_SUFFIX=00:01:02:03:04:05:06\n"; + EXPECT_EQ(expected, join(vars)); +} + +/// @brief Tests the extractLeases6 method works as expected. +TEST(RunScript, extractLeases6) { + ProcessEnvVars vars; + Lease6CollectionPtr leases6; + RunScriptImpl::extractLeases6(vars, leases6, "LEASES6_PREFIX", "_LEASES6_SUFFIX"); + ASSERT_EQ(1, vars.size()); + string expected = "LEASES6_PREFIX_SIZE_LEASES6_SUFFIX=0\n"; + EXPECT_EQ(expected, join(vars)); + vars.clear(); + leases6.reset(new Lease6Collection()); + leases6->push_back(generateLease6()); + leases6->push_back(generateLease6()); + RunScriptImpl::extractLeases6(vars, leases6, "LEASES6_PREFIX", "_LEASES6_SUFFIX"); + ASSERT_EQ(27, vars.size()); + expected = "LEASES6_PREFIX_SIZE_LEASES6_SUFFIX=2\n" + "LEASES6_PREFIX_AT0_ADDRESS_LEASES6_SUFFIX=2003:db8::1\n" + "LEASES6_PREFIX_AT0_CLTT_LEASES6_SUFFIX=7\n" + "LEASES6_PREFIX_AT0_HOSTNAME_LEASES6_SUFFIX=test.hostname\n" + "LEASES6_PREFIX_AT0_HWADDR_LEASES6_SUFFIX=00:01:02:03\n" + "LEASES6_PREFIX_AT0_HWADDR_TYPE_LEASES6_SUFFIX=1\n" + "LEASES6_PREFIX_AT0_STATE_LEASES6_SUFFIX=default\n" + "LEASES6_PREFIX_AT0_SUBNET_ID_LEASES6_SUFFIX=5\n" + "LEASES6_PREFIX_AT0_VALID_LIFETIME_LEASES6_SUFFIX=4\n" + "LEASES6_PREFIX_AT0_DUID_LEASES6_SUFFIX=00:01:02:03:04:05:06\n" + "LEASES6_PREFIX_AT0_IAID_LEASES6_SUFFIX=2\n" + "LEASES6_PREFIX_AT0_PREFERRED_LIFETIME_LEASES6_SUFFIX=3\n" + "LEASES6_PREFIX_AT0_PREFIX_LEN_LEASES6_SUFFIX=128\n" + "LEASES6_PREFIX_AT0_TYPE_LEASES6_SUFFIX=IA_NA\n" + "LEASES6_PREFIX_AT1_ADDRESS_LEASES6_SUFFIX=2003:db8::1\n" + "LEASES6_PREFIX_AT1_CLTT_LEASES6_SUFFIX=7\n" + "LEASES6_PREFIX_AT1_HOSTNAME_LEASES6_SUFFIX=test.hostname\n" + "LEASES6_PREFIX_AT1_HWADDR_LEASES6_SUFFIX=00:01:02:03\n" + "LEASES6_PREFIX_AT1_HWADDR_TYPE_LEASES6_SUFFIX=1\n" + "LEASES6_PREFIX_AT1_STATE_LEASES6_SUFFIX=default\n" + "LEASES6_PREFIX_AT1_SUBNET_ID_LEASES6_SUFFIX=5\n" + "LEASES6_PREFIX_AT1_VALID_LIFETIME_LEASES6_SUFFIX=4\n" + "LEASES6_PREFIX_AT1_DUID_LEASES6_SUFFIX=00:01:02:03:04:05:06\n" + "LEASES6_PREFIX_AT1_IAID_LEASES6_SUFFIX=2\n" + "LEASES6_PREFIX_AT1_PREFERRED_LIFETIME_LEASES6_SUFFIX=3\n" + "LEASES6_PREFIX_AT1_PREFIX_LEN_LEASES6_SUFFIX=128\n" + "LEASES6_PREFIX_AT1_TYPE_LEASES6_SUFFIX=IA_NA\n"; + EXPECT_EQ(expected, join(vars)); +} + +/// @brief Tests the extractPkt4 method works as expected. +TEST(RunScript, extractPkt4) { + ProcessEnvVars vars; + Pkt4Ptr pkt4; + RunScriptImpl::extractPkt4(vars, pkt4, "PKT4_PREFIX", "_PKT4_SUFFIX"); + ASSERT_EQ(22, vars.size()); + string expected = "PKT4_PREFIX_TYPE_PKT4_SUFFIX=\n" + "PKT4_PREFIX_TXID_PKT4_SUFFIX=\n" + "PKT4_PREFIX_LOCAL_ADDR_PKT4_SUFFIX=\n" + "PKT4_PREFIX_LOCAL_PORT_PKT4_SUFFIX=\n" + "PKT4_PREFIX_REMOTE_ADDR_PKT4_SUFFIX=\n" + "PKT4_PREFIX_REMOTE_PORT_PKT4_SUFFIX=\n" + "PKT4_PREFIX_IFACE_INDEX_PKT4_SUFFIX=\n" + "PKT4_PREFIX_IFACE_NAME_PKT4_SUFFIX=\n" + "PKT4_PREFIX_HOPS_PKT4_SUFFIX=\n" + "PKT4_PREFIX_SECS_PKT4_SUFFIX=\n" + "PKT4_PREFIX_FLAGS_PKT4_SUFFIX=\n" + "PKT4_PREFIX_CIADDR_PKT4_SUFFIX=\n" + "PKT4_PREFIX_SIADDR_PKT4_SUFFIX=\n" + "PKT4_PREFIX_YIADDR_PKT4_SUFFIX=\n" + "PKT4_PREFIX_GIADDR_PKT4_SUFFIX=\n" + "PKT4_PREFIX_RELAYED_PKT4_SUFFIX=\n" + "PKT4_PREFIX_HWADDR_PKT4_SUFFIX=\n" + "PKT4_PREFIX_HWADDR_TYPE_PKT4_SUFFIX=\n" + "PKT4_PREFIX_LOCAL_HWADDR_PKT4_SUFFIX=\n" + "PKT4_PREFIX_LOCAL_HWADDR_TYPE_PKT4_SUFFIX=\n" + "PKT4_PREFIX_REMOTE_HWADDR_PKT4_SUFFIX=\n" + "PKT4_PREFIX_REMOTE_HWADDR_TYPE_PKT4_SUFFIX=\n"; + EXPECT_EQ(expected, join(vars)); + vars.clear(); + pkt4 = generatePkt4(); + RunScriptImpl::extractPkt4(vars, pkt4, "PKT4_PREFIX", "_PKT4_SUFFIX"); + ASSERT_EQ(25, vars.size()); + expected = "PKT4_PREFIX_TYPE_PKT4_SUFFIX=UNKNOWN\n" + "PKT4_PREFIX_TXID_PKT4_SUFFIX=0\n" + "PKT4_PREFIX_LOCAL_ADDR_PKT4_SUFFIX=0.0.0.0\n" + "PKT4_PREFIX_LOCAL_PORT_PKT4_SUFFIX=67\n" + "PKT4_PREFIX_REMOTE_ADDR_PKT4_SUFFIX=0.0.0.0\n" + "PKT4_PREFIX_REMOTE_PORT_PKT4_SUFFIX=68\n" + "PKT4_PREFIX_IFACE_INDEX_PKT4_SUFFIX=2\n" + "PKT4_PREFIX_IFACE_NAME_PKT4_SUFFIX=eth1\n" + "PKT4_PREFIX_HOPS_PKT4_SUFFIX=0\n" + "PKT4_PREFIX_SECS_PKT4_SUFFIX=0\n" + "PKT4_PREFIX_FLAGS_PKT4_SUFFIX=0\n" + "PKT4_PREFIX_CIADDR_PKT4_SUFFIX=0.0.0.0\n" + "PKT4_PREFIX_SIADDR_PKT4_SUFFIX=0.0.0.0\n" + "PKT4_PREFIX_YIADDR_PKT4_SUFFIX=0.0.0.0\n" + "PKT4_PREFIX_GIADDR_PKT4_SUFFIX=0.0.0.0\n" + "PKT4_PREFIX_RELAYED_PKT4_SUFFIX=false\n" + "PKT4_PREFIX_HWADDR_PKT4_SUFFIX=00:01:02:03\n" + "PKT4_PREFIX_HWADDR_TYPE_PKT4_SUFFIX=1\n" + "PKT4_PREFIX_LOCAL_HWADDR_PKT4_SUFFIX=00:01:02:03\n" + "PKT4_PREFIX_LOCAL_HWADDR_TYPE_PKT4_SUFFIX=1\n" + "PKT4_PREFIX_REMOTE_HWADDR_PKT4_SUFFIX=00:01:02:03\n" + "PKT4_PREFIX_REMOTE_HWADDR_TYPE_PKT4_SUFFIX=1\n" + "PKT4_PREFIX_OPTION_82_PKT4_SUFFIX=0x0105686F776479020587F67977EF06061A2B3C4D5E6F\n" + "PKT4_PREFIX_OPTION_82_SUB_OPTION_1_PKT4_SUFFIX=0x686F776479\n" + "PKT4_PREFIX_OPTION_82_SUB_OPTION_2_PKT4_SUFFIX=0x87F67977EF\n"; + EXPECT_EQ(expected, join(vars)); +} + +/// @brief Tests the extractPkt6 method works as expected. +TEST(RunScript, extractPkt6) { + ProcessEnvVars vars; + Pkt6Ptr pkt6; + RunScriptImpl::extractPkt6(vars, pkt6, "PKT6_PREFIX", "_PKT6_SUFFIX"); + ASSERT_EQ(12, vars.size()); + string expected = "PKT6_PREFIX_TYPE_PKT6_SUFFIX=\n" + "PKT6_PREFIX_TXID_PKT6_SUFFIX=\n" + "PKT6_PREFIX_LOCAL_ADDR_PKT6_SUFFIX=\n" + "PKT6_PREFIX_LOCAL_PORT_PKT6_SUFFIX=\n" + "PKT6_PREFIX_REMOTE_ADDR_PKT6_SUFFIX=\n" + "PKT6_PREFIX_REMOTE_PORT_PKT6_SUFFIX=\n" + "PKT6_PREFIX_IFACE_INDEX_PKT6_SUFFIX=\n" + "PKT6_PREFIX_IFACE_NAME_PKT6_SUFFIX=\n" + "PKT6_PREFIX_REMOTE_HWADDR_PKT6_SUFFIX=\n" + "PKT6_PREFIX_REMOTE_HWADDR_TYPE_PKT6_SUFFIX=\n" + "PKT6_PREFIX_PROTO_PKT6_SUFFIX=\n" + "PKT6_PREFIX_CLIENT_ID_PKT6_SUFFIX=\n"; + EXPECT_EQ(expected, join(vars)); + vars.clear(); + pkt6 = generatePkt6(); + RunScriptImpl::extractPkt6(vars, pkt6, "PKT6_PREFIX", "_PKT6_SUFFIX"); + ASSERT_EQ(12, vars.size()); + expected = "PKT6_PREFIX_TYPE_PKT6_SUFFIX=UNKNOWN\n" + "PKT6_PREFIX_TXID_PKT6_SUFFIX=0\n" + "PKT6_PREFIX_LOCAL_ADDR_PKT6_SUFFIX=ff02::1:2\n" + "PKT6_PREFIX_LOCAL_PORT_PKT6_SUFFIX=0\n" + "PKT6_PREFIX_REMOTE_ADDR_PKT6_SUFFIX=fe80::21e:8cff:fe9b:7349\n" + "PKT6_PREFIX_REMOTE_PORT_PKT6_SUFFIX=546\n" + "PKT6_PREFIX_IFACE_INDEX_PKT6_SUFFIX=2\n" + "PKT6_PREFIX_IFACE_NAME_PKT6_SUFFIX=eth1\n" + "PKT6_PREFIX_REMOTE_HWADDR_PKT6_SUFFIX=00:01:02:03\n" + "PKT6_PREFIX_REMOTE_HWADDR_TYPE_PKT6_SUFFIX=1\n" + "PKT6_PREFIX_PROTO_PKT6_SUFFIX=UDP\n" + "PKT6_PREFIX_CLIENT_ID_PKT6_SUFFIX=00:01:02:03:04:05:06\n"; + EXPECT_EQ(expected, join(vars)); +} + +class RunScriptTest : public ::testing::Test { +public: + + /// @brief Constructor. + RunScriptTest() : + co_manager_(new CalloutManager(1)), io_service_(new IOService()) { + RunScriptImpl::setIOService(io_service_); + clearLogFile(); + } + + /// @brief Destructor. + ~RunScriptTest() { + RunScriptImpl::setIOService(IOServicePtr()); + clearLogFile(); + } + + /// @brief Clear the test file if it exists. + void clearLogFile() { + ::remove(TEST_LOG_FILE); + } + + void checkScriptResult() { + ifstream test_log; + vector<string> extracted_lines; + time_t now(time(NULL)); + while (true) { + test_log.open(TEST_LOG_FILE); + if (!test_log.fail()) { + string line; + while (getline(test_log, line)) { + extracted_lines.push_back(line) ; + } + test_log.close(); + break; + } + ASSERT_LT(time(NULL), now + 3) << "timeout"; + usleep(100000); + } + ASSERT_EQ(join(extracted_lines), "SUCCESS\n"); + } + + /// @brief Fetches the callout manager instance. + boost::shared_ptr<CalloutManager>getCalloutManager() { + return (co_manager_); + } + +private: + /// @brief Callout manager accessed by this CalloutHandle. + boost::shared_ptr<CalloutManager> co_manager_; + + /// @brief IOService instance to process IO. + isc::asiolink::IOServicePtr io_service_; +}; + +TEST_F(RunScriptTest, lease4Renew) { + impl.reset(new RunScriptImpl()); + impl->setName(RUN_SCRIPT_TEST_SH); + CalloutHandle handle(getCalloutManager()); + Pkt4Ptr pkt4 = generatePkt4(); + handle.setArgument("query4", pkt4); + Subnet4Ptr subnet4 = generateSubnet4(); + handle.setArgument("subnet4", subnet4); + ClientIdPtr clientid = generateDUID(); + handle.setArgument("clientid", clientid); + HWAddrPtr hwaddr = generateHWAddr(); + handle.setArgument("hwaddr", hwaddr); + Lease4Ptr lease4 = generateLease4(); + handle.setArgument("lease4", lease4); + int ret; + ASSERT_NO_THROW(ret = lease4_renew(handle)); + EXPECT_EQ(0, ret); + checkScriptResult(); +} + +TEST_F(RunScriptTest, lease4Expire) { + impl.reset(new RunScriptImpl()); + impl->setName(RUN_SCRIPT_TEST_SH); + CalloutHandle handle(getCalloutManager()); + Lease4Ptr lease4 = generateLease4(); + handle.setArgument("lease4", lease4); + bool remove_lease = true; + handle.setArgument("remove_lease", remove_lease); + int ret; + ASSERT_NO_THROW(ret = lease4_expire(handle)); + EXPECT_EQ(0, ret); + checkScriptResult(); +} + +TEST_F(RunScriptTest, lease4Recover) { + impl.reset(new RunScriptImpl()); + impl->setName(RUN_SCRIPT_TEST_SH); + CalloutHandle handle(getCalloutManager()); + Lease4Ptr lease4 = generateLease4(); + handle.setArgument("lease4", lease4); + int ret; + ASSERT_NO_THROW(ret = lease4_recover(handle)); + EXPECT_EQ(0, ret); + checkScriptResult(); +} + +TEST_F(RunScriptTest, lease4Committed) { + impl.reset(new RunScriptImpl()); + impl->setName(RUN_SCRIPT_TEST_SH); + CalloutHandle handle(getCalloutManager()); + Pkt4Ptr pkt4 = generatePkt4(); + handle.setArgument("query4", pkt4); + Lease4CollectionPtr leases4; + leases4.reset(new Lease4Collection()); + leases4->push_back(Lease4Ptr()); + leases4->push_back(generateLease4()); + handle.setArgument("leases4", leases4); + Lease4CollectionPtr deleted_leases4; + deleted_leases4.reset(new Lease4Collection()); + deleted_leases4->push_back(generateLease4()); + deleted_leases4->push_back(Lease4Ptr()); + handle.setArgument("deleted_leases4", deleted_leases4); + int ret; + ASSERT_NO_THROW(ret = leases4_committed(handle)); + EXPECT_EQ(0, ret); + checkScriptResult(); +} + +TEST_F(RunScriptTest, lease4Release) { + impl.reset(new RunScriptImpl()); + impl->setName(RUN_SCRIPT_TEST_SH); + CalloutHandle handle(getCalloutManager()); + Pkt4Ptr pkt4 = generatePkt4(); + handle.setArgument("query4", pkt4); + Lease4Ptr lease4 = generateLease4(); + handle.setArgument("lease4", lease4); + int ret; + ASSERT_NO_THROW(ret = lease4_release(handle)); + EXPECT_EQ(0, ret); + checkScriptResult(); +} + +TEST_F(RunScriptTest, lease4Decline) { + impl.reset(new RunScriptImpl()); + impl->setName(RUN_SCRIPT_TEST_SH); + CalloutHandle handle(getCalloutManager()); + Pkt4Ptr pkt4 = generatePkt4(); + handle.setArgument("query4", pkt4); + Lease4Ptr lease4 = generateLease4(); + handle.setArgument("lease4", lease4); + int ret; + ASSERT_NO_THROW(ret = lease4_decline(handle)); + EXPECT_EQ(0, ret); + checkScriptResult(); +} + +TEST_F(RunScriptTest, lease6Renew) { + impl.reset(new RunScriptImpl()); + impl->setName(RUN_SCRIPT_TEST_SH); + CalloutHandle handle(getCalloutManager()); + Pkt6Ptr pkt6 = generatePkt6(); + handle.setArgument("query6", pkt6); + Lease6Ptr lease6 = generateLease6(); + handle.setArgument("lease6", lease6); + Option6IAPtr option6IA = generateOptionIA(); + handle.setArgument("ia_na", option6IA); + int ret; + ASSERT_NO_THROW(ret = lease6_renew(handle)); + EXPECT_EQ(0, ret); + checkScriptResult(); +} + +TEST_F(RunScriptTest, lease6Rebind) { + impl.reset(new RunScriptImpl()); + impl->setName(RUN_SCRIPT_TEST_SH); + CalloutHandle handle(getCalloutManager()); + Pkt6Ptr pkt6 = generatePkt6(); + handle.setArgument("query6", pkt6); + Lease6Ptr lease6 = generateLease6(); + handle.setArgument("lease6", lease6); + Option6IAPtr option6IA = generateOptionIA(); + handle.setArgument("ia_na", option6IA); + int ret; + ASSERT_NO_THROW(ret = lease6_rebind(handle)); + EXPECT_EQ(0, ret); + checkScriptResult(); +} + +TEST_F(RunScriptTest, lease6Expire) { + impl.reset(new RunScriptImpl()); + impl->setName(RUN_SCRIPT_TEST_SH); + CalloutHandle handle(getCalloutManager()); + Lease6Ptr lease6 = generateLease6(); + handle.setArgument("lease6", lease6); + bool remove_lease = true; + handle.setArgument("remove_lease", remove_lease); + int ret; + ASSERT_NO_THROW(ret = lease6_expire(handle)); + EXPECT_EQ(0, ret); + checkScriptResult(); +} + +TEST_F(RunScriptTest, lease6Recover) { + impl.reset(new RunScriptImpl()); + impl->setName(RUN_SCRIPT_TEST_SH); + CalloutHandle handle(getCalloutManager()); + Lease6Ptr lease6 = generateLease6(); + handle.setArgument("lease6", lease6); + int ret; + ASSERT_NO_THROW(ret = lease6_recover(handle)); + EXPECT_EQ(0, ret); + checkScriptResult(); +} + +TEST_F(RunScriptTest, lease6Committed) { + impl.reset(new RunScriptImpl()); + impl->setName(RUN_SCRIPT_TEST_SH); + CalloutHandle handle(getCalloutManager()); + Pkt6Ptr pkt6 = generatePkt6(); + handle.setArgument("query6", pkt6); + Lease6CollectionPtr leases6; + leases6.reset(new Lease6Collection()); + leases6->push_back(Lease6Ptr()); + leases6->push_back(generateLease6()); + handle.setArgument("leases6", leases6); + Lease6CollectionPtr deleted_leases6; + deleted_leases6.reset(new Lease6Collection()); + deleted_leases6->push_back(generateLease6()); + deleted_leases6->push_back(Lease6Ptr()); + handle.setArgument("deleted_leases6", deleted_leases6); + int ret; + ASSERT_NO_THROW(ret = leases6_committed(handle)); + EXPECT_EQ(0, ret); + checkScriptResult(); +} + +TEST_F(RunScriptTest, lease6Release) { + impl.reset(new RunScriptImpl()); + impl->setName(RUN_SCRIPT_TEST_SH); + CalloutHandle handle(getCalloutManager()); + Pkt6Ptr pkt6 = generatePkt6(); + handle.setArgument("query6", pkt6); + Lease6Ptr lease6 = generateLease6(); + handle.setArgument("lease6", lease6); + int ret; + ASSERT_NO_THROW(ret = lease6_release(handle)); + EXPECT_EQ(0, ret); + checkScriptResult(); +} + +TEST_F(RunScriptTest, lease6Decline) { + impl.reset(new RunScriptImpl()); + impl->setName(RUN_SCRIPT_TEST_SH); + CalloutHandle handle(getCalloutManager()); + Pkt6Ptr pkt6 = generatePkt6(); + handle.setArgument("query6", pkt6); + Lease6Ptr lease6 = generateLease6(); + handle.setArgument("lease6", lease6); + int ret; + ASSERT_NO_THROW(ret = lease6_decline(handle)); + EXPECT_EQ(0, ret); + checkScriptResult(); +} + +} // end of anonymous namespace |