1
0
mirror of https://github.com/OpenNebula/one.git synced 2024-12-22 13:33:52 +03:00

feature #407: Added tests for from_xml methods

This commit is contained in:
Ruben S. Montero 2011-02-25 20:28:47 +01:00
parent d3828b30da
commit 13b93bcf83
5 changed files with 81 additions and 37 deletions

View File

@ -66,8 +66,10 @@ public:
* @param value to set * @param value to set
* @param xpath_expr of the xml element * @param xpath_expr of the xml element
* @param def default value if the element is not found * @param def default value if the element is not found
*
* @return -1 if default was set
*/ */
void xpath(string& value, const char * xpath_expr, const char * def); int xpath(string& value, const char * xpath_expr, const char * def);
/** /**
* Gets and sets a xpath attribute, if the attribute is not found a default * Gets and sets a xpath attribute, if the attribute is not found a default
@ -75,8 +77,10 @@ public:
* @param value to set * @param value to set
* @param xpath_expr of the xml element * @param xpath_expr of the xml element
* @param def default value if the element is not found * @param def default value if the element is not found
*
* @return -1 if default was set
*/ */
void xpath(int& value, const char * xpath_expr, const int& def); int xpath(int& value, const char * xpath_expr, const int& def);
/** /**
* Gets and sets a xpath attribute, if the attribute is not found a default * Gets and sets a xpath attribute, if the attribute is not found a default
@ -84,8 +88,10 @@ public:
* @param value to set * @param value to set
* @param xpath_expr of the xml element * @param xpath_expr of the xml element
* @param def default value if the element is not found * @param def default value if the element is not found
*
* @return -1 if default was set
*/ */
void xpath(time_t& value, const char * xpath_expr, const time_t& def); int xpath(time_t& value, const char * xpath_expr, const time_t& def);
/** /**
* Gets the value of an element from an xml string * Gets the value of an element from an xml string

View File

@ -224,39 +224,51 @@ string& Host::to_xml(string& xml) const
int Host::from_xml(const string& xml) int Host::from_xml(const string& xml)
{ {
vector<xmlNodePtr> content; vector<xmlNodePtr> content;
int int_state; int int_state;
int rc = 0;
// Initialize the internal XML object // Initialize the internal XML object
update_from_str(xml); update_from_str(xml);
xpath(oid, "/HOST/ID", -1); // Get class base attributes
xpath(hostname, "/HOST/NAME", "not_found"); rc += xpath(oid, "/HOST/ID", -1);
xpath(int_state, "/HOST/STATE", 0); rc += xpath(hostname, "/HOST/NAME", "not_found");
rc += xpath(int_state, "/HOST/STATE", 0);
rc += xpath(im_mad_name, "/HOST/IM_MAD", "not_found");
rc += xpath(vmm_mad_name, "/HOST/VM_MAD", "not_found");
rc += xpath(tm_mad_name, "/HOST/TM_MAD", "not_found");
rc += xpath(last_monitored, "/HOST/LAST_MON_TIME", 0);
rc += xpath(cluster, "/HOST/CLUSTER", "not_found");
state = static_cast<HostState>( int_state ); state = static_cast<HostState>( int_state );
xpath(im_mad_name, "/HOST/IM_MAD", "not_found"); if (rc != 0)
xpath(vmm_mad_name, "/HOST/VM_MAD", "not_found"); {
xpath(tm_mad_name, "/HOST/TM_MAD", "not_found"); return -1;
}
xpath(last_monitored, "/HOST/LAST_MON_TIME", 0);
xpath(cluster, "/HOST/CLUSTER", "not_found");
// Get associated classes
ObjectXML::get_nodes("/HOST/HOST_SHARE", content); ObjectXML::get_nodes("/HOST/HOST_SHARE", content);
if( content.size() < 1 ) if( content.size() < 1 )
{ {
return -1; return -1;
} }
host_share.from_xml_node( content[0] ); host_share.from_xml_node( content[0] );
content.clear(); content.clear();
ObjectXML::get_nodes("/HOST/TEMPLATE", content); ObjectXML::get_nodes("/HOST/TEMPLATE", content);
if( content.size() < 1 ) if( content.size() < 1 )
{ {
return -1; return -1;
} }
host_template.from_xml_node( content[0] ); host_template.from_xml_node( content[0] );
return 0; return 0;

View File

@ -324,35 +324,44 @@ int Image::from_xml(const string& xml)
int int_state; int int_state;
int int_type; int int_type;
int rc = 0;
// Initialize the internal XML object // Initialize the internal XML object
update_from_str(xml); update_from_str(xml);
// Get class base attributes
rc += xpath(oid, "/IMAGE/ID", -1);
rc += xpath(uid, "/IMAGE/UID", -1);
rc += xpath(user_name, "/IMAGE/USERNAME", "not_found");
rc += xpath(name, "/IMAGE/NAME", "not_found");
xpath(oid, "/IMAGE/ID", -1); rc += xpath(int_type, "/IMAGE/TYPE", 0);
xpath(uid, "/IMAGE/UID", -1); rc += xpath(public_img, "/IMAGE/PUBLIC", 0);
xpath(user_name,"/IMAGE/USERNAME", "not_found"); rc += xpath(persistent_img, "/IMAGE/PERSISTENT", 0);
xpath(name, "/IMAGE/NAME", "not_found"); rc += xpath(regtime, "/IMAGE/REGTIME", 0);
xpath(int_type, "/IMAGE/TYPE", 0); rc += xpath(source, "/IMAGE/SOURCE", "not_found");
type = static_cast<ImageType>(int_type); rc += xpath(int_state, "/IMAGE/STATE", 0);
rc += xpath(running_vms, "/IMAGE/RUNNING_VMS", -1);
xpath(public_img, "/IMAGE/PUBLIC", 0); if (rc != 0)
xpath(persistent_img, "/IMAGE/PERSISTENT", 0); {
xpath(regtime, "/IMAGE/REGTIME", 0); return -1;
xpath(source, "/IMAGE/SOURCE", "not_found"); }
xpath(int_state, "/IMAGE/STATE", 0); type = static_cast<ImageType>(int_type);
state = static_cast<ImageState>(int_state); state = static_cast<ImageState>(int_state);
xpath(running_vms, "/IMAGE/RUNNING_VMS", -1); // Get associated classes
ObjectXML::get_nodes("/IMAGE/TEMPLATE", content); ObjectXML::get_nodes("/IMAGE/TEMPLATE", content);
if( content.size() < 1 ) if( content.size() < 1 )
{ {
return -1; return -1;
} }
return image_template->from_xml_node(content[0]); image_template->from_xml_node(content[0]);
return 0;
} }
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */

View File

@ -132,34 +132,40 @@ vector<string> ObjectXML::operator[] (const char * xpath_expr)
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
void ObjectXML::xpath(string& value, const char * xpath_expr, const char * def) int ObjectXML::xpath(string& value, const char * xpath_expr, const char * def)
{ {
vector<string> values; vector<string> values;
int rc = 0;
values = (*this)[xpath_expr]; values = (*this)[xpath_expr];
if ( values.empty() == true ) if ( values.empty() == true )
{ {
value = def; value = def;
rc = -1;
} }
else else
{ {
value = values[0]; value = values[0];
} }
return rc;
} }
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
void ObjectXML::xpath(int& value, const char * xpath_expr, const int& def) int ObjectXML::xpath(int& value, const char * xpath_expr, const int& def)
{ {
vector<string> values; vector<string> values;
int rc = 0;
values = (*this)[xpath_expr]; values = (*this)[xpath_expr];
if (values.empty() == true) if (values.empty() == true)
{ {
value = def; value = def;
rc = -1;
} }
else else
{ {
@ -172,20 +178,26 @@ void ObjectXML::xpath(int& value, const char * xpath_expr, const int& def)
if (iss.fail() == true) if (iss.fail() == true)
{ {
value = def; value = def;
rc = -1;
} }
} }
return rc;
} }
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
void ObjectXML::xpath(time_t& value, const char * xpath_expr, const time_t& def) int ObjectXML::xpath(time_t& value, const char * xpath_expr, const time_t& def)
{ {
int int_val; int int_val;
int int_def = static_cast<time_t>(def); int int_def = static_cast<time_t>(def);
int rc;
xpath(int_val, xpath_expr, int_def); rc = xpath(int_val, xpath_expr, int_def);
value = static_cast<time_t>(int_val); value = static_cast<time_t>(int_val);
return rc;
} }
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */

View File

@ -104,22 +104,27 @@ public:
int int_exists; int int_exists;
int int_no_exists; int int_no_exists;
int int_malformed; int int_malformed;
int rc;
obj.xpath(str_exists,"/VM_POOL/VM/HISTORY/HOSTNAME","default_host"); rc = obj.xpath(str_exists,"/VM_POOL/VM/HISTORY/HOSTNAME","default_host");
CPPUNIT_ASSERT(str_exists == "A_hostname"); CPPUNIT_ASSERT(str_exists == "A_hostname");
CPPUNIT_ASSERT(rc == 0);
rc = obj.xpath(str_no_exists,"/VM_POOL/NOT_AN_ELEMENT","default_host");
obj.xpath(str_no_exists,"/VM_POOL/NOT_AN_ELEMENT","default_host");
CPPUNIT_ASSERT(str_no_exists == "default_host"); CPPUNIT_ASSERT(str_no_exists == "default_host");
CPPUNIT_ASSERT(rc == -1);
obj.xpath(int_exists,"/VM_POOL/VM/STATE",35); rc = obj.xpath(int_exists,"/VM_POOL/VM/STATE",35);
CPPUNIT_ASSERT(int_exists == 1); CPPUNIT_ASSERT(int_exists == 1);
CPPUNIT_ASSERT(rc == 0);
obj.xpath(int_no_exists,"/VM_POOL/NOT_AN_ELEMENT",35); rc = obj.xpath(int_no_exists,"/VM_POOL/NOT_AN_ELEMENT",35);
CPPUNIT_ASSERT(int_no_exists == 35); CPPUNIT_ASSERT(int_no_exists == 35);
CPPUNIT_ASSERT(rc == -1);
obj.xpath(int_malformed,"/VM_POOL/VM/USERNAME",33); rc = obj.xpath(int_malformed,"/VM_POOL/VM/USERNAME",33);
CPPUNIT_ASSERT(int_malformed == 33); CPPUNIT_ASSERT(int_malformed == 33);
CPPUNIT_ASSERT(rc == -1);
} }
catch(runtime_error& re) catch(runtime_error& re)
{ {