openvz: Add simple test for openvzReadNetworkConf

Convert openvzLocateConfFile to a replaceable function pointer to
allow testing the config file parsing without rewriting the whole
OpenVZ config parsing to a more testable structure.
This commit is contained in:
Matthias Bolte 2011-05-31 14:58:58 +02:00
parent d173c12fe0
commit d6caacd1e4
4 changed files with 95 additions and 9 deletions

View File

@ -58,8 +58,10 @@
static char *openvzLocateConfDir(void); static char *openvzLocateConfDir(void);
static int openvzGetVPSUUID(int vpsid, char *uuidstr, size_t len); static int openvzGetVPSUUID(int vpsid, char *uuidstr, size_t len);
static int openvzLocateConfFile(int vpsid, char **conffile, const char *ext);
static int openvzAssignUUIDs(void); static int openvzAssignUUIDs(void);
static int openvzLocateConfFileDefault(int vpsid, char **conffile, const char *ext);
openvzLocateConfFileFunc openvzLocateConfFile = openvzLocateConfFileDefault;
int int
strtoI(const char *str) strtoI(const char *str)
@ -171,7 +173,7 @@ no_memory:
} }
static int int
openvzReadNetworkConf(virDomainDefPtr def, openvzReadNetworkConf(virDomainDefPtr def,
int veid) { int veid) {
int ret; int ret;
@ -802,10 +804,9 @@ cleanup:
/* Locate config file of container /* Locate config file of container
* return -1 - error * return -1 - error
* 0 - OK * 0 - OK */
*/
static int static int
openvzLocateConfFile(int vpsid, char **conffile, const char *ext) openvzLocateConfFileDefault(int vpsid, char **conffile, const char *ext)
{ {
char *confdir; char *confdir;
int ret = 0; int ret = 0;
@ -824,8 +825,8 @@ openvzLocateConfFile(int vpsid, char **conffile, const char *ext)
return ret; return ret;
} }
static char static char *
*openvzLocateConfDir(void) openvzLocateConfDir(void)
{ {
const char *conf_dir_list[] = {"/etc/vz/conf", "/usr/local/etc/conf", NULL}; const char *conf_dir_list[] = {"/etc/vz/conf", "/usr/local/etc/conf", NULL};
int i=0; int i=0;

View File

@ -53,6 +53,11 @@ struct openvz_driver {
int version; int version;
}; };
typedef int (*openvzLocateConfFileFunc)(int vpsid, char **conffile, const char *ext);
/* this allows the testsuite to replace the conf file locator function */
extern openvzLocateConfFileFunc openvzLocateConfFile;
int openvz_readline(int fd, char *ptr, int maxlen); int openvz_readline(int fd, char *ptr, int maxlen);
int openvzExtractVersion(struct openvz_driver *driver); int openvzExtractVersion(struct openvz_driver *driver);
int openvzReadVPSConfigParam(int vpsid, const char *param, char **value); int openvzReadVPSConfigParam(int vpsid, const char *param, char **value);
@ -66,5 +71,6 @@ int strtoI(const char *str);
int openvzSetDefinedUUID(int vpsid, unsigned char *uuid); int openvzSetDefinedUUID(int vpsid, unsigned char *uuid);
unsigned int openvzGetNodeCPUs(void); unsigned int openvzGetNodeCPUs(void);
int openvzGetVEID(const char *name); int openvzGetVEID(const char *name);
int openvzReadNetworkConf(virDomainDefPtr def, int veid);
#endif /* OPENVZ_CONF_H */ #endif /* OPENVZ_CONF_H */

View File

@ -12,6 +12,13 @@
# include "util.h" # include "util.h"
# include "openvz/openvz_conf.h" # include "openvz/openvz_conf.h"
static int
testLocateConfFile(int vpsid ATTRIBUTE_UNUSED, char **conffile,
const char *ext ATTRIBUTE_UNUSED)
{
return virAsprintf(conffile, "%s/openvzutilstest.conf", abs_srcdir);
}
struct testConfigParam { struct testConfigParam {
const char *param; const char *param;
const char *value; const char *value;
@ -61,11 +68,81 @@ cleanup:
return result; return result;
} }
static int
testReadNetworkConf(const void *data ATTRIBUTE_UNUSED)
{
int result = -1;
virDomainDefPtr def = NULL;
char *actual = NULL;
virErrorPtr err = NULL;
const char *expected =
"<domain type='openvz'>\n"
" <uuid>00000000-0000-0000-0000-000000000000</uuid>\n"
" <memory>0</memory>\n"
" <currentMemory>0</currentMemory>\n"
" <vcpu>0</vcpu>\n"
" <os>\n"
" <type>exe</type>\n"
" <init>/sbin/init</init>\n"
" </os>\n"
" <clock offset='utc'/>\n"
" <on_poweroff>destroy</on_poweroff>\n"
" <on_reboot>destroy</on_reboot>\n"
" <on_crash>destroy</on_crash>\n"
" <devices>\n"
" <interface type='ethernet'>\n"
" <mac address='00:00:00:00:00:00'/>\n"
" <ip address='194.44.18.88'/>\n"
" </interface>\n"
" <interface type='bridge'>\n"
" <mac address='00:18:51:c1:05:ee'/>\n"
" <target dev='veth105.10'/>\n"
" </interface>\n"
" </devices>\n"
"</domain>\n";
if (VIR_ALLOC(def) < 0 ||
!(def->os.type = strdup("exe")) ||
!(def->os.init = strdup("/sbin/init")))
goto cleanup;
def->virtType = VIR_DOMAIN_VIRT_OPENVZ;
if (openvzReadNetworkConf(def, 1) < 0) {
err = virGetLastError();
fprintf(stderr, "ERROR: %s\n", err != NULL ? err->message : "<unknown>");
goto cleanup;
}
actual = virDomainDefFormat(def, VIR_DOMAIN_XML_INACTIVE);
if (actual == NULL) {
err = virGetLastError();
fprintf(stderr, "ERROR: %s\n", err != NULL ? err->message : "<unknown>");
goto cleanup;
}
if (STRNEQ(expected, actual)) {
virtTestDifference(stderr, expected, actual);
goto cleanup;
}
result = 0;
cleanup:
VIR_FREE(actual);
virDomainDefFree(def);
return result;
}
static int static int
mymain(void) mymain(void)
{ {
int result = 0; int result = 0;
openvzLocateConfFile = testLocateConfFile;
# define DO_TEST(_name) \ # define DO_TEST(_name) \
do { \ do { \
if (virtTestRun("OpenVZ "#_name, 1, test##_name, \ if (virtTestRun("OpenVZ "#_name, 1, test##_name, \
@ -75,6 +152,7 @@ mymain(void)
} while (0) } while (0)
DO_TEST(ReadConfigParam); DO_TEST(ReadConfigParam);
DO_TEST(ReadNetworkConf);
return result == 0 ? EXIT_SUCCESS : EXIT_FAILURE; return result == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
} }

View File

@ -39,3 +39,4 @@ QUOTATIME=""
DISK_QUOTA=no DISK_QUOTA=no
OSTEMPLATE="rhel-5-lystor" OSTEMPLATE="rhel-5-lystor"
IP_ADDRESS="194.44.18.88" IP_ADDRESS="194.44.18.88"
NETIF="ifname=eth10,mac=00:18:51:C1:05:EE,host_ifname=veth105.10,host_mac=00:18:51:8F:D9:F3