Coverage report for src/test.c.gcov

        -:    0:Source:test.c
        -:    0:Graph:./libvirt_la-test.gcno
        -:    0:Data:./libvirt_la-test.gcda
        -:    0:Runs:1
        -:    0:Programs:1
        -:    1:/*
        -:    2: * test.c: A "mock" hypervisor for use by application unit tests
        -:    3: *
        -:    4: * Copyright (C) 2006 Red Hat, Inc.
        -:    5: *
        -:    6: * See COPYING.LIB for the License of this software
        -:    7: *
        -:    8: * Daniel Berrange <berrange@redhat.com>
        -:    9: */
        -:   10:
        -:   11:#include <stdio.h>
        -:   12:#include <string.h>
        -:   13:#include <sys/time.h>
        -:   14:#include <libxml/parser.h>
        -:   15:#include <libxml/tree.h>
        -:   16:#include <libxml/xpath.h>
        -:   17:#include <libxml/uri.h>
        -:   18:#include <fcntl.h>
        -:   19:#include <unistd.h>
        -:   20:
        -:   21:#include "internal.h"
        -:   22:#include "test.h"
        -:   23:#include "xml.h"
        -:   24:
        -:   25:static virDriver testDriver = {
        -:   26:  VIR_DRV_TEST,
        -:   27:  "Test",
        -:   28:  LIBVIR_VERSION_NUMBER,
        -:   29:  NULL, /* init */
        -:   30:  testOpen, /* open */
        -:   31:  testClose, /* close */
        -:   32:  NULL, /* type */
        -:   33:  testGetVersion, /* version */
        -:   34:  testNodeGetInfo, /* nodeGetInfo */
        -:   35:  testListDomains, /* listDomains */
        -:   36:  testNumOfDomains, /* numOfDomains */
        -:   37:  testDomainCreateLinux, /* domainCreateLinux */
        -:   38:  testLookupDomainByID, /* domainLookupByID */
        -:   39:  testLookupDomainByUUID, /* domainLookupByUUID */
        -:   40:  testLookupDomainByName, /* domainLookupByName */
        -:   41:  testPauseDomain, /* domainSuspend */
        -:   42:  testResumeDomain, /* domainResume */
        -:   43:  testShutdownDomain, /* domainShutdown */
        -:   44:  testRebootDomain, /* domainReboot */
        -:   45:  testDestroyDomain, /* domainDestroy */
        -:   46:  NULL, /* domainFree */
        -:   47:  NULL, /* domainGetName */
        -:   48:  NULL, /* domainGetID */
        -:   49:  NULL, /* domainGetUUID */
        -:   50:  NULL, /* domainGetOSType */
        -:   51:  testGetMaxMemory, /* domainGetMaxMemory */
        -:   52:  testSetMaxMemory, /* domainSetMaxMemory */
        -:   53:  testSetMemory, /* domainSetMemory */
        -:   54:  testGetDomainInfo, /* domainGetInfo */
        -:   55:  NULL, /* domainSave */
        -:   56:  NULL, /* domainRestore */
        -:   57:  testSetVcpus, /* domainSetVcpus */
        -:   58:  NULL, /* domainPinVcpu */
        -:   59:  NULL, /* domainGetVcpus */
        -:   60:  testDomainDumpXML, /* domainDumpXML */
        -:   61:};
        -:   62:
        -:   63:/* Amount of time it takes to shutdown */
        -:   64:#define SHUTDOWN_DURATION 15
        -:   65:
        -:   66:typedef struct _testDev {
        -:   67:  char name[20];
        -:   68:  virDeviceMode mode;
        -:   69:} testDev;
        -:   70:
        -:   71:#define MAX_DEVICES 10
        -:   72:
        -:   73:typedef struct _testDom {
        -:   74:  int active;
        -:   75:  char name[20];
        -:   76:  unsigned char uuid[16];
        -:   77:  virDomainKernel kernel;
        -:   78:  virDomainInfo info;
        -:   79:  time_t shutdownStartedAt;
        -:   80:  virDomainRestart onRestart; /* What to do at end of current shutdown procedure */
        -:   81:  virDomainRestart onReboot;
        -:   82:  virDomainRestart onPoweroff;
        -:   83:  virDomainRestart onCrash;
        -:   84:  int numDevices;
        -:   85:  testDev devices[MAX_DEVICES];
        -:   86:} testDom;
        -:   87:
        -:   88:#define MAX_DOMAINS 20
        -:   89:
        -:   90:typedef struct _testCon {
        -:   91:  int active;
        -:   92:  virNodeInfo nodeInfo;
        -:   93:  int numDomains;
        -:   94:  testDom domains[MAX_DOMAINS];
        -:   95:} testCon;
        -:   96:
        -:   97:#define MAX_CONNECTIONS 5
        -:   98:
        -:   99:typedef struct _testNode {
        -:  100:  int numConnections;
        -:  101:  testCon connections[MAX_CONNECTIONS];
        -:  102:} testNode;
        -:  103:
        -:  104:/* XXX, how about we stuff this in a SHM
        -:  105:   segment so multiple apps can run tests
        -:  106:   against the mock hypervisor concurrently.
        -:  107:   Would need a pthread process shared mutex
        -:  108:   too probably */
        -:  109:static testNode *node = NULL;
        -:  110:
        -:  111:static const virNodeInfo defaultNodeInfo = {
        -:  112:  "i686",
        -:  113:  1024*1024*3, /* 3 GB */
        -:  114:  16,
        -:  115:  1400,
        -:  116:  2,
        -:  117:  2,
        -:  118:  2,
        -:  119:  2,
        -:  120:};
        -:  121:
        -:  122:static void
        -:  123:testError(virConnectPtr con,
        -:  124:	  virDomainPtr dom,
        -:  125:	  virErrorNumber error,
        -:  126:	  const char *info)
function testError called 0 returned 0% blocks executed 0%
    #####:  127:{
        -:  128:  const char *errmsg;
        -:  129:
    #####:  130:  if (error == VIR_ERR_OK)
branch  0 never executed
branch  1 never executed
    #####:  131:    return;
        -:  132:
    #####:  133:  errmsg = __virErrorMsg(error, info);
call    0 never executed
    #####:  134:  __virRaiseError(con, dom, VIR_FROM_XEN, error, VIR_ERR_ERROR,
call    0 never executed
        -:  135:		  errmsg, info, NULL, 0, 0, errmsg, info, 0);
        -:  136:}
        -:  137:
function testRestartStringToFlag called 0 returned 0% blocks executed 0%
    #####:  138:static int testRestartStringToFlag(const char *str) {
    #####:  139:  if (!strcmp(str, "restart")) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
branch  6 never executed
branch  7 never executed
call    8 never executed
branch  9 never executed
branch 10 never executed
    #####:  140:    return VIR_DOMAIN_RESTART;
    #####:  141:  } else if (!strcmp(str, "destroy")) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
branch  6 never executed
branch  7 never executed
call    8 never executed
branch  9 never executed
branch 10 never executed
    #####:  142:    return VIR_DOMAIN_DESTROY;
    #####:  143:  } else if (!strcmp(str, "preserve")) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
branch  6 never executed
branch  7 never executed
call    8 never executed
branch  9 never executed
branch 10 never executed
    #####:  144:    return VIR_DOMAIN_PRESERVE;
    #####:  145:  } else if (!strcmp(str, "rename-restart")) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
branch  6 never executed
branch  7 never executed
call    8 never executed
branch  9 never executed
branch 10 never executed
    #####:  146:    return VIR_DOMAIN_RENAME_RESTART;
        -:  147:  } else {
    #####:  148:    return 0;
        -:  149:  }
        -:  150:}
        -:  151:
function testRestartFlagToString called 0 returned 0% blocks executed 0%
    #####:  152:static const char *testRestartFlagToString(int flag) {
    #####:  153:  switch (flag) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
        -:  154:  case VIR_DOMAIN_RESTART:
    #####:  155:    return "restart";
        -:  156:  case VIR_DOMAIN_DESTROY:
    #####:  157:    return "destroy";
        -:  158:  case VIR_DOMAIN_PRESERVE:
    #####:  159:    return "preserve";
        -:  160:  case VIR_DOMAIN_RENAME_RESTART:
    #####:  161:    return "rename-restart";
        -:  162:  }
    #####:  163:  return NULL;
        -:  164:}
        -:  165:
        -:  166:/**
        -:  167: * testRegister:
        -:  168: *
        -:  169: * Registers the test driver
        -:  170: */
        -:  171:void testRegister(void)
function testRegister called 0 returned 0% blocks executed 0%
    #####:  172:{
    #####:  173:  virRegisterDriver(&testDriver);
call    0 never executed
    #####:  174:}
        -:  175:
        -:  176:static int testLoadDomain(virConnectPtr conn,
        -:  177:			  int domid,
function testLoadDomain called 0 returned 0% blocks executed 0%
    #####:  178:			  xmlDocPtr xml) {
    #####:  179:  xmlNodePtr root = NULL;
    #####:  180:  xmlXPathContextPtr ctxt = NULL;
    #####:  181:  xmlXPathObjectPtr obj = NULL;
    #####:  182:  char *name = NULL;
        -:  183:  unsigned char rawuuid[16];
        -:  184:  char *dst_uuid;
        -:  185:  testCon *con;
        -:  186:  struct timeval tv;
        -:  187:  unsigned long memory;
        -:  188:  int nrVirtCpu;
        -:  189:  char *conv;
    #####:  190:  virDomainRestart onReboot = VIR_DOMAIN_RESTART;
    #####:  191:  virDomainRestart onPoweroff = VIR_DOMAIN_DESTROY;
    #####:  192:  virDomainRestart onCrash = VIR_DOMAIN_RENAME_RESTART;
        -:  193:
    #####:  194:  if (gettimeofday(&tv, NULL) < 0) {
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####:  195:    testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "cannot get timeofday");
call    0 never executed
    #####:  196:    return -1;
        -:  197:  }
        -:  198:
    #####:  199:  root = xmlDocGetRootElement(xml);
call    0 never executed
    #####:  200:  if ((root == NULL) || (!xmlStrEqual(root->name, BAD_CAST "domain"))) {
branch  0 never executed
branch  1 never executed
call    2 never executed
branch  3 never executed
branch  4 never executed
    #####:  201:    testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "malformed root element");
call    0 never executed
    #####:  202:    goto error;
        -:  203:  }
        -:  204:
    #####:  205:  ctxt = xmlXPathNewContext(xml);
call    0 never executed
    #####:  206:  if (ctxt == NULL) {
branch  0 never executed
branch  1 never executed
    #####:  207:    testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "cannot create xpath context");
call    0 never executed
    #####:  208:    goto error;
        -:  209:  }
        -:  210:
    #####:  211:  obj = xmlXPathEval(BAD_CAST "string(/domain/name[1])", ctxt);
call    0 never executed
    #####:  212:  if ((obj == NULL) || (obj->type != XPATH_STRING) ||
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
branch  6 never executed
branch  7 never executed
        -:  213:      (obj->stringval == NULL) || (obj->stringval[0] == 0)) {
    #####:  214:    testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "missing name element on domain");
call    0 never executed
    #####:  215:    goto error;
        -:  216:  }
    #####:  217:  name = strdup((const char *)obj->stringval);
call    0 never executed
    #####:  218:  xmlXPathFreeObject(obj);
call    0 never executed
        -:  219:
    #####:  220:  obj = xmlXPathEval(BAD_CAST "string(/domain/uuid[1])", ctxt);
call    0 never executed
    #####:  221:  if ((obj == NULL) || (obj->type != XPATH_STRING) ||
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
branch  6 never executed
branch  7 never executed
        -:  222:      (obj->stringval == NULL) || (obj->stringval[0] == 0)) {
    #####:  223:    testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "missing uuid element on domain");
call    0 never executed
    #####:  224:    goto error;
        -:  225:  }
    #####:  226:  dst_uuid = (char *) &rawuuid[0];
    #####:  227:  if (!(virParseUUID((char **)&dst_uuid, (const char *)obj->stringval))) {
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####:  228:    testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "malformed uuid data in domain");
call    0 never executed
    #####:  229:    goto error;
        -:  230:  }
    #####:  231:  xmlXPathFreeObject(obj);
call    0 never executed
        -:  232:
    #####:  233:  obj = xmlXPathEval(BAD_CAST "string(/domain/memory[1])", ctxt);
call    0 never executed
    #####:  234:  if ((obj == NULL) || (obj->type != XPATH_STRING) ||
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
branch  6 never executed
branch  7 never executed
        -:  235:      (obj->stringval == NULL) || (obj->stringval[0] == 0)) {
    #####:  236:    testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "missing memory element on domain");
call    0 never executed
    #####:  237:    goto error;
        -:  238:  }
    #####:  239:  memory = strtoll((const char*)obj->stringval, &conv, 10);
    #####:  240:  if (conv == (const char*)obj->stringval) {
branch  0 never executed
branch  1 never executed
    #####:  241:    testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "malformed memory value for domain");
call    0 never executed
    #####:  242:    goto error;
        -:  243:  }
    #####:  244:  xmlXPathFreeObject(obj);
call    0 never executed
        -:  245:
    #####:  246:  obj = xmlXPathEval(BAD_CAST "string(/domain/vcpu[1])", ctxt);
call    0 never executed
    #####:  247:  if ((obj == NULL) || (obj->type != XPATH_STRING) ||
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
branch  6 never executed
branch  7 never executed
        -:  248:      (obj->stringval == NULL) || (obj->stringval[0] == 0)) {
    #####:  249:    nrVirtCpu = 1;
        -:  250:  } else {
    #####:  251:    nrVirtCpu = strtoll((const char*)obj->stringval, &conv, 10);
    #####:  252:    if (conv == (const char*)obj->stringval) {
branch  0 never executed
branch  1 never executed
    #####:  253:      testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "malformed vcpus value for domain");
call    0 never executed
    #####:  254:      goto error;
        -:  255:    }
        -:  256:  }
    #####:  257:  if (obj)
branch  0 never executed
branch  1 never executed
    #####:  258:    xmlXPathFreeObject(obj);
call    0 never executed
        -:  259:
    #####:  260:  obj = xmlXPathEval(BAD_CAST "string(/domain/on_reboot[1])", ctxt);
call    0 never executed
    #####:  261:  if ((obj != NULL) && (obj->type == XPATH_STRING) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
branch  6 never executed
branch  7 never executed
        -:  262:      (obj->stringval != NULL) && (obj->stringval[0] != 0)) {
    #####:  263:    if (!(onReboot = testRestartStringToFlag((const char *)obj->stringval))) {
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####:  264:      testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "malformed on_reboot value for domain");
call    0 never executed
    #####:  265:      goto error;
        -:  266:    }
        -:  267:  }
    #####:  268:  if (obj)
branch  0 never executed
branch  1 never executed
    #####:  269:    xmlXPathFreeObject(obj);
call    0 never executed
        -:  270:
    #####:  271:  obj = xmlXPathEval(BAD_CAST "string(/domain/on_poweroff[1])", ctxt);
call    0 never executed
    #####:  272:  if ((obj != NULL) && (obj->type == XPATH_STRING) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
branch  6 never executed
branch  7 never executed
        -:  273:      (obj->stringval != NULL) && (obj->stringval[0] != 0)) {
    #####:  274:    if (!(onReboot = testRestartStringToFlag((const char *)obj->stringval))) {
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####:  275:      testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "malformed on_poweroff value for domain");
call    0 never executed
    #####:  276:      goto error;
        -:  277:    }
        -:  278:  }
    #####:  279:  if (obj)
branch  0 never executed
branch  1 never executed
    #####:  280:    xmlXPathFreeObject(obj);
call    0 never executed
        -:  281:
    #####:  282:  obj = xmlXPathEval(BAD_CAST "string(/domain/on_crash[1])", ctxt);
call    0 never executed
    #####:  283:  if ((obj != NULL) && (obj->type == XPATH_STRING) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
branch  6 never executed
branch  7 never executed
        -:  284:      (obj->stringval != NULL) && (obj->stringval[0] != 0)) {
    #####:  285:    if (!(onReboot = testRestartStringToFlag((const char *)obj->stringval))) {
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####:  286:      testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "malformed on_crash value for domain");
call    0 never executed
    #####:  287:      goto error;
        -:  288:    }
        -:  289:  }
    #####:  290:  if (obj)
branch  0 never executed
branch  1 never executed
    #####:  291:    xmlXPathFreeObject(obj);
call    0 never executed
        -:  292:
    #####:  293:  con = &node->connections[conn->handle];
        -:  294:
    #####:  295:  con->domains[domid].active = 1;
    #####:  296:  strncpy(con->domains[domid].name, name, sizeof(con->domains[domid].name));
call    0 never executed
    #####:  297:  free(name);
call    0 never executed
    #####:  298:  name = NULL;
        -:  299:
    #####:  300:  memmove(con->domains[domid].uuid, rawuuid, 16);
call    0 never executed
    #####:  301:  con->domains[domid].info.maxMem = memory;
    #####:  302:  con->domains[domid].info.memory = memory;
    #####:  303:  con->domains[domid].info.state = VIR_DOMAIN_RUNNING;
    #####:  304:  con->domains[domid].info.nrVirtCpu = nrVirtCpu;
    #####:  305:  con->domains[domid].info.cpuTime = ((tv.tv_sec * 1000ll * 1000ll  * 1000ll) + (tv.tv_usec * 1000ll));
        -:  306:
    #####:  307:  con->domains[domid].onReboot = onReboot;
    #####:  308:  con->domains[domid].onPoweroff = onPoweroff;
    #####:  309:  con->domains[domid].onCrash = onCrash;
        -:  310:
    #####:  311:  return 0;
        -:  312:
    #####:  313: error:
    #####:  314:  if (obj)
branch  0 never executed
branch  1 never executed
    #####:  315:    xmlXPathFreeObject(obj);
call    0 never executed
    #####:  316:  if (name)
branch  0 never executed
branch  1 never executed
    #####:  317:    free(name);
call    0 never executed
    #####:  318:  return -1;
        -:  319:}
        -:  320:
        -:  321:static int testLoadDomainFromDoc(virConnectPtr conn,
        -:  322:				 int domid,
function testLoadDomainFromDoc called 0 returned 0% blocks executed 0%
    #####:  323:				 const char *doc) {
        -:  324:  int ret;
        -:  325:  xmlDocPtr xml;
    #####:  326:  if (!(xml = xmlReadDoc(BAD_CAST doc, "domain.xml", NULL,
call    0 never executed
branch  1 never executed
branch  2 never executed
        -:  327:			 XML_PARSE_NOENT | XML_PARSE_NONET |
        -:  328:			 XML_PARSE_NOERROR | XML_PARSE_NOWARNING))) {
    #####:  329:    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "cannot parse domain definition");
call    0 never executed
    #####:  330:    return -1;
        -:  331:  }
        -:  332:
    #####:  333:  ret = testLoadDomain(conn, domid, xml);
call    0 never executed
        -:  334:
    #####:  335:  xmlFreeDoc(xml);
call    0 never executed
        -:  336:
    #####:  337:  return ret;
        -:  338:}
        -:  339:
        -:  340:static int testLoadDomainFromFile(virConnectPtr conn,
        -:  341:				  int domid,
function testLoadDomainFromFile called 0 returned 0% blocks executed 0%
    #####:  342:				  const char *file) {
        -:  343:  int ret, fd;
        -:  344:  xmlDocPtr xml;
        -:  345:
    #####:  346:  if ((fd = open(file, O_RDONLY)) < 0) {
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####:  347:    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "cannot load domain definition");
call    0 never executed
    #####:  348:    return -1;
        -:  349:  }
        -:  350:
    #####:  351:  if (!(xml = xmlReadFd(fd, file, NULL,
call    0 never executed
branch  1 never executed
branch  2 never executed
        -:  352:			XML_PARSE_NOENT | XML_PARSE_NONET |
        -:  353:			XML_PARSE_NOERROR | XML_PARSE_NOWARNING))) {
    #####:  354:    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "cannot parse domain definition");
call    0 never executed
    #####:  355:    close(fd);
call    0 never executed
    #####:  356:    return -1;
        -:  357:  }
    #####:  358:  close(fd);
call    0 never executed
        -:  359:
    #####:  360:  ret = testLoadDomain(conn, domid, xml);
call    0 never executed
        -:  361:
    #####:  362:  xmlFreeDoc(xml);
call    0 never executed
        -:  363:
    #####:  364:  return ret;
        -:  365:}
        -:  366:
        -:  367:
        -:  368:static int testOpenDefault(virConnectPtr conn,
function testOpenDefault called 0 returned 0% blocks executed 0%
    #####:  369:			   int connid) {
        -:  370:  int u;
        -:  371:  struct timeval tv;
        -:  372:
    #####:  373:  if (gettimeofday(&tv, NULL) < 0) {
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####:  374:    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "cannot get timeofday");
call    0 never executed
    #####:  375:    return -1;
        -:  376:  }
        -:  377:
    #####:  378:  conn->handle = connid;
    #####:  379:  node->connections[connid].active = 1;
    #####:  380:  memmove(&node->connections[connid].nodeInfo, &defaultNodeInfo, sizeof(defaultNodeInfo));
call    0 never executed
        -:  381:
    #####:  382:  node->connections[connid].numDomains = 1;
    #####:  383:  node->connections[connid].domains[0].active = 1;
    #####:  384:  strcpy(node->connections[connid].domains[0].name, "Domain-0");
call    0 never executed
    #####:  385:  for (u = 0 ; u < 16 ; u++) {
branch  0 never executed
branch  1 never executed
    #####:  386:    node->connections[connid].domains[0].uuid[u] = (u * 75)%255;
        -:  387:  }
    #####:  388:  node->connections[connid].domains[0].info.maxMem = 8192 * 1024;
    #####:  389:  node->connections[connid].domains[0].info.memory = 2048 * 1024;
    #####:  390:  node->connections[connid].domains[0].info.state = VIR_DOMAIN_RUNNING;
    #####:  391:  node->connections[connid].domains[0].info.nrVirtCpu = 2;
    #####:  392:  node->connections[connid].domains[0].info.cpuTime = ((tv.tv_sec * 1000ll * 1000ll  * 1000ll) + (tv.tv_usec * 1000ll));
    #####:  393:  return 0;
        -:  394:}
        -:  395:
        -:  396:
        -:  397:static char *testBuildFilename(const char *relativeTo,
function testBuildFilename called 0 returned 0% blocks executed 0%
    #####:  398:			       const char *filename) {
        -:  399:  char *offset;
        -:  400:  int baseLen;
    #####:  401:  if (!filename || filename[0] == '\0')
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####:  402:    return NULL;
    #####:  403:  if (filename[0] == '/')
branch  0 never executed
branch  1 never executed
    #####:  404:    return strdup(filename);
call    0 never executed
        -:  405:
    #####:  406:  offset = rindex(relativeTo, '/');
call    0 never executed
    #####:  407:  if ((baseLen = (offset-relativeTo+1))) {
branch  0 never executed
branch  1 never executed
    #####:  408:    char *absFile = malloc(baseLen + strlen(filename) + 1);
call    0 never executed
call    1 never executed
    #####:  409:    strncpy(absFile, relativeTo, baseLen);
call    0 never executed
    #####:  410:    absFile[baseLen] = '\0';
    #####:  411:    strcat(absFile, filename);
call    0 never executed
    #####:  412:    return absFile;
        -:  413:  } else {
    #####:  414:    return strdup(filename);
call    0 never executed
        -:  415:  }
        -:  416:}
        -:  417:
        -:  418:static int testOpenFromFile(virConnectPtr conn,
        -:  419:			    int connid,
function testOpenFromFile called 0 returned 0% blocks executed 0%
    #####:  420:			    const char *file) {
        -:  421:  int fd, i;
        -:  422:  xmlDocPtr xml;
    #####:  423:  xmlNodePtr root = NULL;
    #####:  424:  xmlXPathContextPtr ctxt = NULL;
    #####:  425:  xmlXPathObjectPtr obj = NULL;
        -:  426:  virNodeInfoPtr nodeInfo;
        -:  427:
    #####:  428:  if ((fd = open(file, O_RDONLY)) < 0) {
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####:  429:    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "cannot load host definition");
call    0 never executed
    #####:  430:    return -1;
        -:  431:  }
        -:  432:
    #####:  433:  if (!(xml = xmlReadFd(fd, file, NULL,
call    0 never executed
branch  1 never executed
branch  2 never executed
        -:  434:			XML_PARSE_NOENT | XML_PARSE_NONET |
        -:  435:			XML_PARSE_NOERROR | XML_PARSE_NOWARNING))) {
    #####:  436:    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "cannot parse host definition");
call    0 never executed
    #####:  437:    goto error;
        -:  438:  }
    #####:  439:  close(fd);
call    0 never executed
    #####:  440:  fd = -1;
        -:  441:
    #####:  442:  root = xmlDocGetRootElement(xml);
call    0 never executed
    #####:  443:  if ((root == NULL) || (!xmlStrEqual(root->name, BAD_CAST "node"))) {
branch  0 never executed
branch  1 never executed
call    2 never executed
branch  3 never executed
branch  4 never executed
    #####:  444:    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "malformed root element");
call    0 never executed
    #####:  445:    goto error;
        -:  446:  }
        -:  447:
    #####:  448:  ctxt = xmlXPathNewContext(xml);
call    0 never executed
    #####:  449:  if (ctxt == NULL) {
branch  0 never executed
branch  1 never executed
    #####:  450:    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "cannot create xpath context");
call    0 never executed
    #####:  451:    goto error;
        -:  452:  }
        -:  453:
    #####:  454:  conn->handle = connid;
    #####:  455:  node->connections[connid].active = 1;
    #####:  456:  node->connections[connid].numDomains = 0;
    #####:  457:  memmove(&node->connections[connid].nodeInfo, &defaultNodeInfo, sizeof(defaultNodeInfo));
call    0 never executed
        -:  458:
    #####:  459:  nodeInfo = &node->connections[connid].nodeInfo;
    #####:  460:  obj = xmlXPathEval(BAD_CAST "string(/node/cpu/nodes[1])", ctxt);
call    0 never executed
    #####:  461:  if ((obj != NULL) && (obj->type == XPATH_STRING) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
branch  6 never executed
branch  7 never executed
        -:  462:      (obj->stringval != NULL) && (obj->stringval[0] != 0)) {
    #####:  463:    char *conv = NULL;
    #####:  464:    nodeInfo->nodes = strtol((const char*)obj->stringval, &conv, 10);
    #####:  465:    if (conv == (const char*)obj->stringval) {
branch  0 never executed
branch  1 never executed
    #####:  466:      testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "malformed nodes value for node cpu");
call    0 never executed
    #####:  467:      goto error;
        -:  468:    }
    #####:  469:    xmlXPathFreeObject(obj);
call    0 never executed
        -:  470:  }
        -:  471:
    #####:  472:  obj = xmlXPathEval(BAD_CAST "string(/node/cpu/sockets[1])", ctxt);
call    0 never executed
    #####:  473:  if ((obj != NULL) && (obj->type == XPATH_STRING) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
branch  6 never executed
branch  7 never executed
        -:  474:      (obj->stringval != NULL) && (obj->stringval[0] != 0)) {
    #####:  475:    char *conv = NULL;
    #####:  476:    nodeInfo->sockets = strtol((const char*)obj->stringval, &conv, 10);
    #####:  477:    if (conv == (const char*)obj->stringval) {
branch  0 never executed
branch  1 never executed
    #####:  478:      testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "malformed sockets value for node cpu");
call    0 never executed
    #####:  479:      goto error;
        -:  480:    }
    #####:  481:    xmlXPathFreeObject(obj);
call    0 never executed
        -:  482:  }
        -:  483:
    #####:  484:  obj = xmlXPathEval(BAD_CAST "string(/node/cpu/cores[1])", ctxt);
call    0 never executed
    #####:  485:  if ((obj != NULL) && (obj->type == XPATH_STRING) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
branch  6 never executed
branch  7 never executed
        -:  486:      (obj->stringval != NULL) && (obj->stringval[0] != 0)) {
    #####:  487:    char *conv = NULL;
    #####:  488:    nodeInfo->cores = strtol((const char*)obj->stringval, &conv, 10);
    #####:  489:    if (conv == (const char*)obj->stringval) {
branch  0 never executed
branch  1 never executed
    #####:  490:      testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "malformed cores value for node cpu");
call    0 never executed
    #####:  491:      goto error;
        -:  492:    }
    #####:  493:    xmlXPathFreeObject(obj);
call    0 never executed
        -:  494:  }
        -:  495:
    #####:  496:  obj = xmlXPathEval(BAD_CAST "string(/node/cpu/threads[1])", ctxt);
call    0 never executed
    #####:  497:  if ((obj != NULL) && (obj->type == XPATH_STRING) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
branch  6 never executed
branch  7 never executed
        -:  498:      (obj->stringval != NULL) && (obj->stringval[0] != 0)) {
    #####:  499:    char *conv = NULL;
    #####:  500:    nodeInfo->threads = strtol((const char*)obj->stringval, &conv, 10);
    #####:  501:    if (conv == (const char*)obj->stringval) {
branch  0 never executed
branch  1 never executed
    #####:  502:      testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "malformed threads value for node cpu");
call    0 never executed
    #####:  503:      goto error;
        -:  504:    }
    #####:  505:    xmlXPathFreeObject(obj);
call    0 never executed
        -:  506:  }
    #####:  507:  nodeInfo->cpus = nodeInfo->cores * nodeInfo->threads * nodeInfo->sockets * nodeInfo->nodes;
    #####:  508:  obj = xmlXPathEval(BAD_CAST "string(/node/cpu/active[1])", ctxt);
call    0 never executed
    #####:  509:  if ((obj != NULL) && (obj->type == XPATH_STRING) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
branch  6 never executed
branch  7 never executed
        -:  510:      (obj->stringval != NULL) && (obj->stringval[0] != 0)) {
    #####:  511:    char *conv = NULL;
    #####:  512:    unsigned int active = strtol((const char*)obj->stringval, &conv, 10);    
    #####:  513:    if (conv == (const char*)obj->stringval) {
branch  0 never executed
branch  1 never executed
    #####:  514:      testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "malformed active value for node cpu");
call    0 never executed
    #####:  515:      goto error;
        -:  516:    }
    #####:  517:    if (active < nodeInfo->cpus) {
branch  0 never executed
branch  1 never executed
    #####:  518:      nodeInfo->cpus = active;
        -:  519:    }
    #####:  520:    xmlXPathFreeObject(obj);
call    0 never executed
        -:  521:  }
    #####:  522:  obj = xmlXPathEval(BAD_CAST "string(/node/cpu/mhz[1])", ctxt);
call    0 never executed
    #####:  523:  if ((obj != NULL) && (obj->type == XPATH_STRING) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
branch  6 never executed
branch  7 never executed
        -:  524:      (obj->stringval != NULL) && (obj->stringval[0] != 0)) {
    #####:  525:    char *conv = NULL;
    #####:  526:    nodeInfo->mhz = strtol((const char*)obj->stringval, &conv, 10);
    #####:  527:    if (conv == (const char*)obj->stringval) {
branch  0 never executed
branch  1 never executed
    #####:  528:      testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "malformed threads value for node cpu");
call    0 never executed
    #####:  529:      goto error;
        -:  530:    }
    #####:  531:    xmlXPathFreeObject(obj);
call    0 never executed
        -:  532:  }
    #####:  533:  obj = xmlXPathEval(BAD_CAST "string(/node/cpu/model[1])", ctxt);
call    0 never executed
    #####:  534:  if ((obj != NULL) && (obj->type == XPATH_STRING) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
branch  6 never executed
branch  7 never executed
        -:  535:      (obj->stringval != NULL) && (obj->stringval[0] != 0)) {
    #####:  536:    strncpy(nodeInfo->model, (const char *)obj->stringval, sizeof(nodeInfo->model)-1);
call    0 never executed
    #####:  537:    nodeInfo->model[sizeof(nodeInfo->model)-1] = '\0';
    #####:  538:    xmlXPathFreeObject(obj);
call    0 never executed
        -:  539:  }
        -:  540:
    #####:  541:  obj = xmlXPathEval(BAD_CAST "string(/node/memory[1])", ctxt);
call    0 never executed
    #####:  542:  if ((obj != NULL) && (obj->type == XPATH_STRING) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
branch  6 never executed
branch  7 never executed
        -:  543:      (obj->stringval != NULL) && (obj->stringval[0] != 0)) {
    #####:  544:    char *conv = NULL;
    #####:  545:    nodeInfo->memory = strtol((const char*)obj->stringval, &conv, 10);
    #####:  546:    if (conv == (const char*)obj->stringval) {
branch  0 never executed
branch  1 never executed
    #####:  547:      testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "malformed memory value for node");
call    0 never executed
    #####:  548:      goto error;
        -:  549:    }
    #####:  550:    xmlXPathFreeObject(obj);
call    0 never executed
        -:  551:  }
        -:  552:
    #####:  553:  obj = xmlXPathEval(BAD_CAST "/node/domain", ctxt);
call    0 never executed
    #####:  554:  if ((obj == NULL) || (obj->type != XPATH_NODESET) ||
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
        -:  555:      (obj->nodesetval == NULL)) {
    #####:  556:    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "cannot extract domain list");
call    0 never executed
    #####:  557:    goto error;
        -:  558:  }
        -:  559:
    #####:  560:  for (i = 0 ; i < obj->nodesetval->nodeNr ; i++) {
branch  0 never executed
branch  1 never executed
    #####:  561:    xmlChar *domFile = xmlGetProp(obj->nodesetval->nodeTab[i], BAD_CAST "file");
call    0 never executed
    #####:  562:    char *absFile = testBuildFilename(file, (const char *)domFile);
call    0 never executed
    #####:  563:    free(domFile);
call    0 never executed
    #####:  564:    if (!absFile) {
branch  0 never executed
branch  1 never executed
    #####:  565:      testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "cannot resolve filename");
call    0 never executed
    #####:  566:      goto error;
        -:  567:    }
    #####:  568:    if (testLoadDomainFromFile(conn, i, absFile) != 0) {
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####:  569:      free(absFile);
call    0 never executed
    #####:  570:      goto error;
        -:  571:    }
    #####:  572:    free(absFile);
call    0 never executed
    #####:  573:    node->connections[connid].numDomains++;
        -:  574:  }
        -:  575:
    #####:  576:  xmlXPathFreeObject(obj);
call    0 never executed
    #####:  577:  xmlFreeDoc(xml);
call    0 never executed
        -:  578:
    #####:  579:  return 0;
        -:  580:
    #####:  581: error:
    #####:  582:  if (node->connections[connid].active) {
branch  0 never executed
branch  1 never executed
    #####:  583:    for (i = 0 ; i <node->connections[connid].numDomains ; i++) {
branch  0 never executed
branch  1 never executed
    #####:  584:      node->connections[connid].domains[i].active = 0;
        -:  585:    }
    #####:  586:    node->connections[connid].numDomains = 0;
    #####:  587:    node->connections[connid].active = 0;
        -:  588:  }
    #####:  589:  if (obj)
branch  0 never executed
branch  1 never executed
    #####:  590:    xmlXPathFreeObject(obj);
call    0 never executed
    #####:  591:  if (xml)
branch  0 never executed
branch  1 never executed
    #####:  592:    xmlFreeDoc(xml);
call    0 never executed
    #####:  593:  if (fd != -1)
branch  0 never executed
branch  1 never executed
    #####:  594:    close(fd);
call    0 never executed
    #####:  595:  return -1;
        -:  596:}
        -:  597:
function getNextConnection called 0 returned 0% blocks executed 0%
    #####:  598:static int getNextConnection(void) {
        -:  599:  int i;
    #####:  600:  if (node == NULL) {
branch  0 never executed
branch  1 never executed
    #####:  601:    node = calloc(1, sizeof(testNode));
call    0 never executed
    #####:  602:    if (!node) {
branch  0 never executed
branch  1 never executed
    #####:  603:      testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "cannot allocate memory");
call    0 never executed
    #####:  604:      return -1;
        -:  605:    }
        -:  606:  }
        -:  607:
    #####:  608:  for (i = 0 ; i < MAX_CONNECTIONS ; i++) {
branch  0 never executed
branch  1 never executed
    #####:  609:    if (!node->connections[i].active) {
branch  0 never executed
branch  1 never executed
    #####:  610:      return i;
        -:  611:    }
        -:  612:  }
    #####:  613:  return -1;
        -:  614:}
        -:  615:
        -:  616:int testOpen(virConnectPtr conn,
        -:  617:             const char *name,
        -:  618:             int flags)
function testOpen called 0 returned 0% blocks executed 0%
    #####:  619:{
        -:  620:  xmlURIPtr uri;
        -:  621:  int ret, connid;
        -:  622:
    #####:  623:  if (!name) {
branch  0 never executed
branch  1 never executed
    #####:  624:    return -1;
        -:  625:  }
        -:  626:
    #####:  627:  uri = xmlParseURI(name);
call    0 never executed
    #####:  628:  if (uri == NULL) {
branch  0 never executed
branch  1 never executed
    #####:  629:    if (!(flags & VIR_DRV_OPEN_QUIET))
branch  0 never executed
branch  1 never executed
    #####:  630:      testError(conn, NULL, VIR_ERR_NO_SUPPORT, name);
call    0 never executed
    #####:  631:    return(-1);
        -:  632:  }
        -:  633:
    #####:  634:  if (!uri->scheme ||
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
    #####:  635:      strcmp(uri->scheme, "test") ||
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
branch  6 never executed
branch  7 never executed
call    8 never executed
        -:  636:      !uri->path) {
    #####:  637:    xmlFreeURI(uri);
call    0 never executed
    #####:  638:    return -1;
        -:  639:  }
        -:  640:
        -:  641:
    #####:  642:  if ((connid = getNextConnection()) < 0) {
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####:  643:    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "too many connections");
call    0 never executed
    #####:  644:    return -1;
        -:  645:  }
        -:  646:
    #####:  647:  if (!strcmp(uri->path, "/default")) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
branch  6 never executed
branch  7 never executed
call    8 never executed
branch  9 never executed
branch 10 never executed
    #####:  648:    ret = testOpenDefault(conn,
call    0 never executed
        -:  649:			  connid);
        -:  650:  } else {
    #####:  651:    ret = testOpenFromFile(conn,
call    0 never executed
        -:  652:			   connid,
        -:  653:			   uri->path);
        -:  654:  }
        -:  655:
    #####:  656:  xmlFreeURI(uri);
call    0 never executed
        -:  657:
    #####:  658:  return (ret);
        -:  659:}
        -:  660:
        -:  661:int testClose(virConnectPtr conn)
function testClose called 0 returned 0% blocks executed 0%
    #####:  662:{
    #####:  663:  testCon *con = &node->connections[conn->handle];
    #####:  664:  con->active = 0;
    #####:  665:  conn->handle = -1;
    #####:  666:  memset(con, 0, sizeof(testCon));
call    0 never executed
    #####:  667:  return 0;
        -:  668:}
        -:  669:
        -:  670:int testGetVersion(virConnectPtr conn ATTRIBUTE_UNUSED,
        -:  671:                   unsigned long *hvVer)
function testGetVersion called 0 returned 0% blocks executed 0%
    #####:  672:{
    #####:  673:  *hvVer = 2;
    #####:  674:  return 0;
        -:  675:}
        -:  676:
        -:  677:int testNodeGetInfo(virConnectPtr conn,
        -:  678:                    virNodeInfoPtr info)
function testNodeGetInfo called 0 returned 0% blocks executed 0%
    #####:  679:{
    #####:  680:  testCon *con = &node->connections[conn->handle];
    #####:  681:  memcpy(info, &con->nodeInfo, sizeof(virNodeInfo));
call    0 never executed
    #####:  682:  return 0;
        -:  683:}
        -:  684:
        -:  685:int testNumOfDomains(virConnectPtr conn)
function testNumOfDomains called 0 returned 0% blocks executed 0%
    #####:  686:{
    #####:  687:  testCon *con = &node->connections[conn->handle];
    #####:  688:  return con->numDomains;
        -:  689:}
        -:  690:
        -:  691:virDomainPtr
        -:  692:testDomainCreateLinux(virConnectPtr conn, const char *xmlDesc,
        -:  693:		      unsigned int flags ATTRIBUTE_UNUSED)
function testDomainCreateLinux called 0 returned 0% blocks executed 0%
    #####:  694:{
        -:  695:  testCon *con;
        -:  696:  int i;
        -:  697:  virDomainPtr dom;
        -:  698:
    #####:  699:  if (!VIR_IS_CONNECT(conn)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####:  700:    testError(conn, NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
call    0 never executed
    #####:  701:    return (NULL);
        -:  702:  }
    #####:  703:  if (xmlDesc == NULL) {
branch  0 never executed
branch  1 never executed
    #####:  704:    testError(conn, NULL, VIR_ERR_INVALID_ARG, __FUNCTION__);
call    0 never executed
    #####:  705:    return (NULL);
        -:  706:  }
    #####:  707:  if (conn->flags & VIR_CONNECT_RO) {
branch  0 never executed
branch  1 never executed
    #####:  708:    testError(conn, NULL, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
call    0 never executed
    #####:  709:    return (NULL);
        -:  710:  }
        -:  711:  
    #####:  712:  con = &node->connections[conn->handle];
        -:  713:
    #####:  714:  for (i = 0 ; i < MAX_DOMAINS ; i++) {
branch  0 never executed
branch  1 never executed
    #####:  715:    if (!con->domains[i].active) {
branch  0 never executed
branch  1 never executed
    #####:  716:      if (testLoadDomainFromDoc(conn, i, xmlDesc) < 0)
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####:  717:	return NULL;
    #####:  718:      dom = virGetDomain(conn, con->domains[i].name, con->domains[i].uuid);
call    0 never executed
    #####:  719:      if (dom == NULL) {
branch  0 never executed
branch  1 never executed
    #####:  720:	testError(conn, NULL, VIR_ERR_NO_MEMORY, "allocating domain");
call    0 never executed
    #####:  721:	return NULL;
        -:  722:      }
    #####:  723:      con->numDomains++;
    #####:  724:      return dom;
        -:  725:    }
        -:  726:  }
        -:  727:  
    #####:  728:  testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "too many domains");
call    0 never executed
    #####:  729:  return (NULL);
        -:  730:}
        -:  731:
        -:  732:
        -:  733:virDomainPtr testLookupDomainByID(virConnectPtr conn,
        -:  734:                                  int id)
function testLookupDomainByID called 0 returned 0% blocks executed 0%
    #####:  735:{
    #####:  736:  testCon *con = &node->connections[conn->handle];
        -:  737:  virDomainPtr dom;
        -:  738:
    #####:  739:  if (!con->domains[id].active) {
branch  0 never executed
branch  1 never executed
    #####:  740:    return NULL;
        -:  741:  }
        -:  742:
    #####:  743:  dom = virGetDomain(conn, con->domains[id].name, con->domains[id].uuid);
call    0 never executed
    #####:  744:  if (dom == NULL) {
branch  0 never executed
branch  1 never executed
    #####:  745:    testError(conn, NULL, VIR_ERR_NO_MEMORY, "Allocating domain");
call    0 never executed
    #####:  746:    return(NULL);
        -:  747:  }
    #####:  748:  dom->handle = id;
    #####:  749:  return dom;
        -:  750:}
        -:  751:
        -:  752:virDomainPtr testLookupDomainByUUID(virConnectPtr conn,
        -:  753:                                    const unsigned char *uuid)
function testLookupDomainByUUID called 0 returned 0% blocks executed 0%
    #####:  754:{
    #####:  755:  testCon *con = &node->connections[conn->handle];
    #####:  756:  virDomainPtr dom = NULL;
    #####:  757:  int i, id = -1;
    #####:  758:  for (i = 0 ; i < MAX_DOMAINS ; i++) {
branch  0 never executed
branch  1 never executed
    #####:  759:    if (con->domains[i].active &&
branch  0 never executed
branch  1 never executed
call    2 never executed
branch  3 never executed
branch  4 never executed
        -:  760:	memcmp(uuid, con->domains[i].uuid, 16) == 0) {
    #####:  761:      id = i;
    #####:  762:      break;
        -:  763:    }
        -:  764:  }
    #####:  765:  if (id >= 0) {
branch  0 never executed
branch  1 never executed
    #####:  766:    dom = virGetDomain(conn, con->domains[id].name, con->domains[id].uuid);
call    0 never executed
    #####:  767:    if (dom == NULL) {
branch  0 never executed
branch  1 never executed
    #####:  768:      testError(conn, NULL, VIR_ERR_NO_MEMORY, "Allocating domain");
call    0 never executed
    #####:  769:      return(NULL);
        -:  770:    }
    #####:  771:    dom->handle = id;
        -:  772:  }
    #####:  773:  return dom;
        -:  774:}
        -:  775:
        -:  776:virDomainPtr testLookupDomainByName(virConnectPtr conn,
        -:  777:                                    const char *name)
function testLookupDomainByName called 0 returned 0% blocks executed 0%
    #####:  778:{
    #####:  779:  testCon *con = &node->connections[conn->handle];
    #####:  780:  virDomainPtr dom = NULL;
    #####:  781:  int i, id = -1;
    #####:  782:  for (i = 0 ; i < MAX_DOMAINS ; i++) {
branch  0 never executed
branch  1 never executed
    #####:  783:    if (con->domains[i].active &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####:  784:	strcmp(name, con->domains[i].name) == 0) {
call    0 never executed
    #####:  785:      id = i;
    #####:  786:      break;
        -:  787:    }
        -:  788:  }
    #####:  789:  if (id >= 0) {
branch  0 never executed
branch  1 never executed
    #####:  790:    dom = virGetDomain(conn, con->domains[id].name, con->domains[id].uuid);
call    0 never executed
    #####:  791:    if (dom == NULL) {
branch  0 never executed
branch  1 never executed
    #####:  792:      testError(conn, NULL, VIR_ERR_NO_MEMORY, "Allocating domain");
call    0 never executed
    #####:  793:      return(NULL);
        -:  794:    }
    #####:  795:    dom->handle = id;
        -:  796:  }
    #####:  797:  return dom;
        -:  798:}
        -:  799:
        -:  800:int testListDomains (virConnectPtr conn,
        -:  801:                     int *ids,
        -:  802:                     int maxids)
function testListDomains called 0 returned 0% blocks executed 0%
    #####:  803:{
    #####:  804:  testCon *con = &node->connections[conn->handle];
        -:  805:  int n, i;
        -:  806:
    #####:  807:  for (i = 0, n = 0 ; i < MAX_DOMAINS && n < maxids ; i++) {
branch  0 never executed
branch  1 never executed
    #####:  808:    if (con->domains[i].active) {
branch  0 never executed
branch  1 never executed
    #####:  809:      ids[n++] = i;
        -:  810:    }
        -:  811:  }
    #####:  812:  return n;
        -:  813:}
        -:  814:
        -:  815:int testDestroyDomain (virDomainPtr domain)
function testDestroyDomain called 0 returned 0% blocks executed 0%
    #####:  816:{
        -:  817:  testCon *con;
    #####:  818:  if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
    #####:  819:    testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG,
branch  0 never executed
branch  1 never executed
call    2 never executed
        -:  820:	      __FUNCTION__);
    #####:  821:    return(-1);
        -:  822:  }
    #####:  823:  if (domain->conn->flags & VIR_CONNECT_RO) {
branch  0 never executed
branch  1 never executed
    #####:  824:    testError(domain->conn, domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
call    0 never executed
    #####:  825:    return (-1);
        -:  826:  }
        -:  827:  
    #####:  828:  con = &node->connections[domain->conn->handle];
    #####:  829:  con->domains[domain->handle].active = 0;
    #####:  830:  return (0);
        -:  831:}
        -:  832:
        -:  833:int testResumeDomain (virDomainPtr domain)
function testResumeDomain called 0 returned 0% blocks executed 0%
    #####:  834:{
        -:  835:  testCon *con;
    #####:  836:  if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
    #####:  837:    testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG,
branch  0 never executed
branch  1 never executed
call    2 never executed
        -:  838:	      __FUNCTION__);
    #####:  839:    return(-1);
        -:  840:  }
    #####:  841:  if (domain->conn->flags & VIR_CONNECT_RO) {
branch  0 never executed
branch  1 never executed
    #####:  842:    testError(domain->conn, domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
call    0 never executed
    #####:  843:    return (-1);
        -:  844:  }
        -:  845:
    #####:  846:  con = &node->connections[domain->conn->handle];
    #####:  847:  con->domains[domain->handle].info.state = VIR_DOMAIN_RUNNING;
    #####:  848:  return 0;
        -:  849:}
        -:  850:
        -:  851:int testPauseDomain (virDomainPtr domain)
function testPauseDomain called 0 returned 0% blocks executed 0%
    #####:  852:{
        -:  853:  testCon *con;
    #####:  854:  if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
    #####:  855:    testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG,
branch  0 never executed
branch  1 never executed
call    2 never executed
        -:  856:	      __FUNCTION__);
    #####:  857:    return(-1);
        -:  858:  }
    #####:  859:  if (domain->conn->flags & VIR_CONNECT_RO) {
branch  0 never executed
branch  1 never executed
    #####:  860:    testError(domain->conn, domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
call    0 never executed
    #####:  861:    return (-1);
        -:  862:  }
        -:  863:
    #####:  864:  con = &node->connections[domain->conn->handle];
    #####:  865:  con->domains[domain->handle].info.state = VIR_DOMAIN_PAUSED;
    #####:  866:  return (0);
        -:  867:}
        -:  868:
        -:  869:/* We don't do an immediate shutdown. We basically pretend that
        -:  870:   out shutdown sequence takes 'n' seconds to complete. SO, here
        -:  871:   we just set state to shutdown, and subsquent calls to getDomainInfo
        -:  872:   will check to see if shutdown ought to be marked complete. */
        -:  873:int testShutdownDomain (virDomainPtr domain)
function testShutdownDomain called 0 returned 0% blocks executed 0%
    #####:  874:{
        -:  875:  testCon *con;
        -:  876:  struct timeval tv;
    #####:  877:  if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
    #####:  878:    testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG,
branch  0 never executed
branch  1 never executed
call    2 never executed
        -:  879:	      __FUNCTION__);
    #####:  880:    return (-1);
        -:  881:  }
    #####:  882:  if (domain->conn->flags & VIR_CONNECT_RO) {
branch  0 never executed
branch  1 never executed
    #####:  883:    testError(domain->conn, domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
call    0 never executed
    #####:  884:    return (-1);
        -:  885:  }
        -:  886:
    #####:  887:  con = &node->connections[domain->conn->handle];
        -:  888:
    #####:  889:  if (gettimeofday(&tv, NULL) < 0) {
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####:  890:    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "cannot get timeofday");
call    0 never executed
    #####:  891:    return (-1);
        -:  892:  }
        -:  893:
    #####:  894:  con->domains[domain->handle].info.state = VIR_DOMAIN_SHUTDOWN;
    #####:  895:  con->domains[domain->handle].onRestart = VIR_DOMAIN_DESTROY;
    #####:  896:  con->domains[domain->handle].shutdownStartedAt = tv.tv_sec;
    #####:  897:  return (0);
        -:  898:}
        -:  899:
        -:  900:/* Similar behaviour as shutdown */
        -:  901:int testRebootDomain (virDomainPtr domain, virDomainRestart action)
function testRebootDomain called 0 returned 0% blocks executed 0%
    #####:  902:{
        -:  903:  testCon *con;
        -:  904:  struct timeval tv;
    #####:  905:  if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
    #####:  906:    testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG,
branch  0 never executed
branch  1 never executed
call    2 never executed
        -:  907:	      __FUNCTION__);
    #####:  908:    return(-1);
        -:  909:  }
    #####:  910:  if (domain->conn->flags & VIR_CONNECT_RO) {
branch  0 never executed
branch  1 never executed
    #####:  911:    testError(domain->conn, domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
call    0 never executed
    #####:  912:    return (-1);
        -:  913:  }
        -:  914:
    #####:  915:  con = &node->connections[domain->conn->handle];
        -:  916:
    #####:  917:  if (gettimeofday(&tv, NULL) < 0) {
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####:  918:    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "cannot get timeofday");
call    0 never executed
    #####:  919:    return (-1);
        -:  920:  }
        -:  921:
    #####:  922:  if (!action)
branch  0 never executed
branch  1 never executed
    #####:  923:    action = VIR_DOMAIN_RESTART;
        -:  924:
    #####:  925:  con->domains[domain->handle].info.state = VIR_DOMAIN_SHUTDOWN;
    #####:  926:  con->domains[domain->handle].onRestart = action;
    #####:  927:  con->domains[domain->handle].shutdownStartedAt = tv.tv_sec;
    #####:  928:  return (0);
        -:  929:}
        -:  930:
        -:  931:int testGetDomainInfo (virDomainPtr domain,
        -:  932:                       virDomainInfoPtr info)
function testGetDomainInfo called 0 returned 0% blocks executed 0%
    #####:  933:{
        -:  934:  struct timeval tv;
        -:  935:  testCon *con;
    #####:  936:  if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
    #####:  937:    testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG,
branch  0 never executed
branch  1 never executed
call    2 never executed
        -:  938:	      __FUNCTION__);
    #####:  939:    return(-1);
        -:  940:  }
        -:  941:
    #####:  942:  con = &node->connections[domain->conn->handle];
        -:  943:
    #####:  944:  if (gettimeofday(&tv, NULL) < 0) {
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####:  945:    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "cannot get timeofday");
call    0 never executed
    #####:  946:    return (-1);
        -:  947:  }
        -:  948:
        -:  949:  /* Check to see if there is an in-progresss shutdown/reboot that
        -:  950:     needs to be marked completed now */
    #####:  951:  if (con->domains[domain->handle].info.state == VIR_DOMAIN_SHUTDOWN &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
        -:  952:      (tv.tv_sec - con->domains[domain->handle].shutdownStartedAt) > SHUTDOWN_DURATION) {
        -:  953:
    #####:  954:      switch (con->domains[domain->handle].onRestart) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
        -:  955:      case VIR_DOMAIN_DESTROY:
    #####:  956:	con->domains[domain->handle].info.state = VIR_DOMAIN_SHUTOFF;
    #####:  957:	break;
        -:  958:
        -:  959:      case VIR_DOMAIN_RESTART:
    #####:  960:	con->domains[domain->handle].info.state = VIR_DOMAIN_RUNNING;
    #####:  961:	break;
        -:  962:
        -:  963:      case VIR_DOMAIN_PRESERVE:
    #####:  964:	con->domains[domain->handle].info.state = VIR_DOMAIN_SHUTOFF;
    #####:  965:	break;
        -:  966:
        -:  967:      case VIR_DOMAIN_RENAME_RESTART:
    #####:  968:	con->domains[domain->handle].info.state = VIR_DOMAIN_RUNNING;
    #####:  969:	break;
        -:  970:
        -:  971:      default:
    #####:  972:	con->domains[domain->handle].info.state = VIR_DOMAIN_SHUTOFF;
        -:  973:	break;
        -:  974:    }
        -:  975:  }
        -:  976:
    #####:  977:  if (con->domains[domain->handle].info.state == VIR_DOMAIN_SHUTOFF) {
branch  0 never executed
branch  1 never executed
    #####:  978:    con->domains[domain->handle].info.cpuTime = 0;
    #####:  979:    con->domains[domain->handle].info.memory = 0;
        -:  980:  } else {
    #####:  981:    con->domains[domain->handle].info.cpuTime = ((tv.tv_sec * 1000ll * 1000ll  * 1000ll) + (tv.tv_usec * 1000ll));
        -:  982:  }
    #####:  983:  memcpy(info, &con->domains[domain->handle].info, sizeof(virDomainInfo));
call    0 never executed
    #####:  984:  return (0);
        -:  985:}
        -:  986:
function testGetMaxMemory called 0 returned 0% blocks executed 0%
    #####:  987:unsigned long testGetMaxMemory(virDomainPtr domain) {
        -:  988:  testCon *con;
    #####:  989:  if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
    #####:  990:    testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG,
branch  0 never executed
branch  1 never executed
call    2 never executed
        -:  991:	      __FUNCTION__);
    #####:  992:    return(-1);
        -:  993:  }
        -:  994:  
    #####:  995:  con = &node->connections[domain->conn->handle];
    #####:  996:  return con->domains[domain->handle].info.maxMem;
        -:  997:}
        -:  998:
        -:  999:int testSetMaxMemory (virDomainPtr domain,
        -: 1000:                      unsigned long memory)
function testSetMaxMemory called 0 returned 0% blocks executed 0%
    #####: 1001:{
        -: 1002:  testCon *con;
    #####: 1003:  if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
    #####: 1004:    testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG,
branch  0 never executed
branch  1 never executed
call    2 never executed
        -: 1005:	      __FUNCTION__);
    #####: 1006:    return(-1);
        -: 1007:  }
    #####: 1008:  if (domain->conn->flags & VIR_CONNECT_RO) {
branch  0 never executed
branch  1 never executed
    #####: 1009:    testError(domain->conn, domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
call    0 never executed
    #####: 1010:    return (-1);
        -: 1011:  }
        -: 1012:
    #####: 1013:  con = &node->connections[domain->conn->handle];
        -: 1014:  /* XXX validate not over host memory wrt to other domains */
    #####: 1015:  con->domains[domain->handle].info.maxMem = memory;
    #####: 1016:  return (0);
        -: 1017:}
        -: 1018:
        -: 1019:int testSetMemory (virDomainPtr domain,
        -: 1020:		   unsigned long memory)
function testSetMemory called 0 returned 0% blocks executed 0%
    #####: 1021:{
        -: 1022:  testCon *con;
    #####: 1023:  if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
    #####: 1024:    testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG,
branch  0 never executed
branch  1 never executed
call    2 never executed
        -: 1025:	      __FUNCTION__);
    #####: 1026:    return(-1);
        -: 1027:  }
    #####: 1028:  if (domain->conn->flags & VIR_CONNECT_RO) {
branch  0 never executed
branch  1 never executed
    #####: 1029:    testError(domain->conn, domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
call    0 never executed
    #####: 1030:    return (-1);
        -: 1031:  }
        -: 1032:
    #####: 1033:  con = &node->connections[domain->conn->handle];
        -: 1034:
    #####: 1035:  if (memory > con->domains[domain->handle].info.maxMem) {
branch  0 never executed
branch  1 never executed
    #####: 1036:    testError(domain->conn, domain, VIR_ERR_INVALID_ARG, "memory over maximum limit");
call    0 never executed
    #####: 1037:    return (-1);
        -: 1038:  }
        -: 1039:
    #####: 1040:  con->domains[domain->handle].info.memory = memory;
    #####: 1041:  return (0);
        -: 1042:}
        -: 1043:
        -: 1044:int testSetVcpus(virDomainPtr domain,
function testSetVcpus called 0 returned 0% blocks executed 0%
    #####: 1045:		 unsigned int nrCpus) {
        -: 1046:  testCon *con;
        -: 1047:
    #####: 1048:  if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
    #####: 1049:    testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG,
branch  0 never executed
branch  1 never executed
call    2 never executed
        -: 1050:	      __FUNCTION__);
    #####: 1051:    return(-1);
        -: 1052:  }
    #####: 1053:  if (domain->conn->flags & VIR_CONNECT_RO) {
branch  0 never executed
branch  1 never executed
    #####: 1054:    testError(domain->conn, domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
call    0 never executed
    #####: 1055:    return (-1);
        -: 1056:  }
        -: 1057:
    #####: 1058:  con = &node->connections[domain->conn->handle];
        -: 1059:
        -: 1060:  /* We allow more cpus in guest than host */
    #####: 1061:  if (nrCpus > 32) {
branch  0 never executed
branch  1 never executed
    #####: 1062:    testError(domain->conn, domain, VIR_ERR_INVALID_ARG, "too many virtual cpus");
call    0 never executed
    #####: 1063:    return (-1);
        -: 1064:  }
        -: 1065:
    #####: 1066:  con->domains[domain->handle].info.nrVirtCpu = nrCpus;
    #####: 1067:  return (0);
        -: 1068:}
        -: 1069:
        -: 1070:char * testDomainDumpXML(virDomainPtr domain, int flags ATTRIBUTE_UNUSED)
function testDomainDumpXML called 0 returned 0% blocks executed 0%
    #####: 1071:{
        -: 1072:  virBufferPtr buf;
        -: 1073:  char *xml;
        -: 1074:  unsigned char *uuid;
        -: 1075:  testCon *con;
    #####: 1076:  if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
    #####: 1077:    testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG,
branch  0 never executed
branch  1 never executed
call    2 never executed
        -: 1078:	      __FUNCTION__);
    #####: 1079:    return(NULL);
        -: 1080:  }
        -: 1081:  
    #####: 1082:  con = &node->connections[domain->conn->handle];
        -: 1083:  
    #####: 1084:  if (!(buf = virBufferNew(4000))) {
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####: 1085:    return (NULL);
        -: 1086:  }
        -: 1087:  
    #####: 1088:  virBufferVSprintf(buf, "<domain type='test' id='%d'>\n", domain->handle);
call    0 never executed
    #####: 1089:  virBufferVSprintf(buf, "  <name>%s</name>\n", domain->name);
call    0 never executed
    #####: 1090:  uuid = domain->uuid;
    #####: 1091:  virBufferVSprintf(buf,
call    0 never executed
        -: 1092:		    "  <uuid>%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x</uuid>\n",
        -: 1093:		    uuid[0], uuid[1], uuid[2], uuid[3],
        -: 1094:		    uuid[4], uuid[5], uuid[6], uuid[7],
        -: 1095:		    uuid[8], uuid[9], uuid[10], uuid[11],
        -: 1096:		    uuid[12], uuid[13], uuid[14], uuid[15]);
        -: 1097:  
    #####: 1098:  virBufferVSprintf(buf, "  <memory>%d</memory>\n", con->domains[domain->handle].info.maxMem);
call    0 never executed
    #####: 1099:  virBufferVSprintf(buf, "  <vcpu>%d</vcpu>\n", con->domains[domain->handle].info.nrVirtCpu);
call    0 never executed
    #####: 1100:  virBufferVSprintf(buf, "  <on_reboot>%s</on_reboot>\n", testRestartFlagToString(con->domains[domain->handle].onReboot));
call    0 never executed
call    1 never executed
    #####: 1101:  virBufferVSprintf(buf, "  <on_poweroff>%s</on_poweroff>\n", testRestartFlagToString(con->domains[domain->handle].onPoweroff));
call    0 never executed
call    1 never executed
    #####: 1102:  virBufferVSprintf(buf, "  <on_crash>%s</on_crash>\n", testRestartFlagToString(con->domains[domain->handle].onCrash));
call    0 never executed
call    1 never executed
        -: 1103:  
    #####: 1104:  virBufferAdd(buf, "</domain>\n", -1);
call    0 never executed
        -: 1105:  
    #####: 1106:  xml = buf->content;
    #####: 1107:  free(buf);
call    0 never executed
    #####: 1108:  return xml;
        -: 1109:}