summaryrefslogtreecommitdiff
path: root/src/VBox/Devices/VMMDev/VMMDevTesting.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@baserock.org>2014-03-26 19:21:20 +0000
committer <>2014-05-08 15:03:54 +0000
commitfb123f93f9f5ce42c8e5785d2f8e0edaf951740e (patch)
treec2103d76aec5f1f10892cd1d3a38e24f665ae5db /src/VBox/Devices/VMMDev/VMMDevTesting.cpp
parent58ed4748338f9466599adfc8a9171280ed99e23f (diff)
downloadVirtualBox-master.tar.gz
Imported from /home/lorry/working-area/delta_VirtualBox/VirtualBox-4.3.10.tar.bz2.HEADVirtualBox-4.3.10master
Diffstat (limited to 'src/VBox/Devices/VMMDev/VMMDevTesting.cpp')
-rw-r--r--src/VBox/Devices/VMMDev/VMMDevTesting.cpp152
1 files changed, 108 insertions, 44 deletions
diff --git a/src/VBox/Devices/VMMDev/VMMDevTesting.cpp b/src/VBox/Devices/VMMDev/VMMDevTesting.cpp
index 8f5d64d2..220f4792 100644
--- a/src/VBox/Devices/VMMDev/VMMDevTesting.cpp
+++ b/src/VBox/Devices/VMMDev/VMMDevTesting.cpp
@@ -6,7 +6,7 @@
*/
/*
- * Copyright (C) 2010-2012 Oracle Corporation
+ * Copyright (C) 2010-2013 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -31,9 +31,7 @@
#include <iprt/assert.h>
#include <iprt/string.h>
#include <iprt/time.h>
-#ifdef IN_RING3
-# include <iprt/stream.h>
-#endif
+#include <iprt/test.h>
#include "VMMDevState.h"
#include "VMMDevTesting.h"
@@ -46,7 +44,6 @@
{ \
LogAlways(a);\
LogRel(a);\
- RTPrintf a; \
} while (0)
/**
@@ -133,22 +130,23 @@ static void vmmdevTestingCmdExec_ValueReg(PPDMDEVINS pDevIns, VMMDevState *pThis
size_t const cchValueNm = strlen(pszValueNm);
if (cchValueNm && pszRegNm && *pszRegNm)
{
- PVM pVM = PDMDevHlpGetVM(pDevIns);
+ PUVM pUVM = PDMDevHlpGetUVM(pDevIns);
+ PVM pVM = PDMDevHlpGetVM(pDevIns);
VMCPUID idCpu = VMMGetCpuId(pVM);
uint64_t u64Value;
- int rc2 = DBGFR3RegNmQueryU64(pVM, idCpu, pszRegNm, &u64Value);
+ int rc2 = DBGFR3RegNmQueryU64(pUVM, idCpu, pszRegNm, &u64Value);
if (RT_SUCCESS(rc2))
{
const char *pszWarn = rc2 == VINF_DBGF_TRUNCATED_REGISTER ? " truncated" : "";
#if 1 /*!RTTestValue format*/
char szFormat[128], szValue[128];
RTStrPrintf(szFormat, sizeof(szFormat), "%%VR{%s}", pszRegNm);
- rc2 = DBGFR3RegPrintf(pVM, idCpu, szValue, sizeof(szValue), szFormat);
+ rc2 = DBGFR3RegPrintf(pUVM, idCpu, szValue, sizeof(szValue), szFormat);
if (RT_SUCCESS(rc2))
VMMDEV_TESTING_OUTPUT(("testing: VALUE '%s'%*s: %16s {reg=%s}%s\n",
pszValueNm,
(ssize_t)cchValueNm - 12 > 48 ? 0 : 48 - ((ssize_t)cchValueNm - 12), "",
- szValue, pszRegNm));
+ szValue, pszRegNm, pszWarn));
else
#endif
VMMDEV_TESTING_OUTPUT(("testing: VALUE '%s'%*s: %'9llu (%#llx) [0] {reg=%s}%s\n",
@@ -233,23 +231,36 @@ PDMBOTHCBDECL(int) vmmdevTestingIoWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPO
else
{
#ifdef IN_RING3
+ pThis->TestingData.String.sz[off] = '\0';
switch (uCmd)
{
case VMMDEV_TESTING_CMD_INIT:
- VMMDEV_TESTING_OUTPUT(("testing: INIT '%.*s'\n",
- sizeof(pThis->TestingData.String.sz) - 1, pThis->TestingData.String.sz));
+ VMMDEV_TESTING_OUTPUT(("testing: INIT '%s'\n", pThis->TestingData.String.sz));
+ if (pThis->hTestingTest != NIL_RTTEST)
+ {
+ RTTestChangeName(pThis->hTestingTest, pThis->TestingData.String.sz);
+ RTTestBanner(pThis->hTestingTest);
+ }
break;
case VMMDEV_TESTING_CMD_SUB_NEW:
- VMMDEV_TESTING_OUTPUT(("testing: SUB_NEW '%.*s'\n",
- sizeof(pThis->TestingData.String.sz) - 1, pThis->TestingData.String.sz));
+ VMMDEV_TESTING_OUTPUT(("testing: SUB_NEW '%s'\n", pThis->TestingData.String.sz));
+ if (pThis->hTestingTest != NIL_RTTEST)
+ RTTestSub(pThis->hTestingTest, pThis->TestingData.String.sz);
break;
case VMMDEV_TESTING_CMD_FAILED:
- VMMDEV_TESTING_OUTPUT(("testing: FAILED '%.*s'\n",
- sizeof(pThis->TestingData.String.sz) - 1, pThis->TestingData.String.sz));
+ if (pThis->hTestingTest != NIL_RTTEST)
+ RTTestFailed(pThis->hTestingTest, "%s", pThis->TestingData.String.sz);
+ VMMDEV_TESTING_OUTPUT(("testing: FAILED '%s'\n", pThis->TestingData.String.sz));
break;
case VMMDEV_TESTING_CMD_SKIPPED:
- VMMDEV_TESTING_OUTPUT(("testing: SKIPPED '%.*s'\n",
- sizeof(pThis->TestingData.String.sz) - 1, pThis->TestingData.String.sz));
+ if (pThis->hTestingTest != NIL_RTTEST)
+ {
+ if (off)
+ RTTestSkipped(pThis->hTestingTest, "%s", pThis->TestingData.String.sz);
+ else
+ RTTestSkipped(pThis->hTestingTest, NULL);
+ }
+ VMMDEV_TESTING_OUTPUT(("testing: SKIPPED '%s'\n", pThis->TestingData.String.sz));
break;
}
#else
@@ -268,9 +279,27 @@ PDMBOTHCBDECL(int) vmmdevTestingIoWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPO
#ifdef IN_RING3
pThis->TestingData.Error.c = u32;
if (uCmd == VMMDEV_TESTING_CMD_TERM)
+ {
+ if (pThis->hTestingTest != NIL_RTTEST)
+ {
+ while (RTTestErrorCount(pThis->hTestingTest) < u32)
+ RTTestErrorInc(pThis->hTestingTest); /* A bit stupid, but does the trick. */
+ RTTestSubDone(pThis->hTestingTest);
+ RTTestSummaryAndDestroy(pThis->hTestingTest);
+ pThis->hTestingTest = NIL_RTTEST;
+ }
VMMDEV_TESTING_OUTPUT(("testing: TERM - %u errors\n", u32));
+ }
else
+ {
+ if (pThis->hTestingTest != NIL_RTTEST)
+ {
+ while (RTTestSubErrorCount(pThis->hTestingTest) < u32)
+ RTTestErrorInc(pThis->hTestingTest); /* A bit stupid, but does the trick. */
+ RTTestSubDone(pThis->hTestingTest);
+ }
VMMDEV_TESTING_OUTPUT(("testing: SUB_DONE - %u errors\n", u32));
+ }
return VINF_SUCCESS;
#else
return VINF_IOM_R3_IOPORT_WRITE;
@@ -294,7 +323,7 @@ PDMBOTHCBDECL(int) vmmdevTestingIoWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPO
}
if ( off >= 12
&& cb == 1
- && off < sizeof(pThis->TestingData.Value.szName) - 1 - 12)
+ && off - 12 < sizeof(pThis->TestingData.Value.szName) - 1)
{
if (u32)
{
@@ -304,8 +333,20 @@ PDMBOTHCBDECL(int) vmmdevTestingIoWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPO
else
{
#ifdef IN_RING3
- VMMDEV_TESTING_OUTPUT(("testing: VALUE '%.*s'%*s: %'9llu (%#llx) [%u]\n",
- sizeof(pThis->TestingData.Value.szName) - 1, pThis->TestingData.Value.szName,
+ pThis->TestingData.Value.szName[off - 12] = '\0';
+
+ RTTESTUNIT enmUnit = (RTTESTUNIT)pThis->TestingData.Value.u32Unit;
+ if (enmUnit <= RTTESTUNIT_INVALID || enmUnit >= RTTESTUNIT_END)
+ {
+ VMMDEV_TESTING_OUTPUT(("Invalid log value unit %#x\n", pThis->TestingData.Value.u32Unit));
+ enmUnit = RTTESTUNIT_NONE;
+ }
+ if (pThis->hTestingTest != NIL_RTTEST)
+ RTTestValue(pThis->hTestingTest, pThis->TestingData.Value.szName,
+ pThis->TestingData.Value.u64Value.u, enmUnit);
+
+ VMMDEV_TESTING_OUTPUT(("testing: VALUE '%s'%*s: %'9llu (%#llx) [%u]\n",
+ pThis->TestingData.Value.szName,
off - 12 > 48 ? 0 : 48 - (off - 12), "",
pThis->TestingData.Value.u64Value.u, pThis->TestingData.Value.u64Value.u,
pThis->TestingData.Value.u32Unit));
@@ -314,17 +355,6 @@ PDMBOTHCBDECL(int) vmmdevTestingIoWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPO
#endif
}
return VINF_SUCCESS;
-
-#ifdef IN_RING3
- pThis->TestingData.Error.c = u32;
- if (uCmd == VMMDEV_TESTING_CMD_TERM)
- VMMDEV_TESTING_OUTPUT(("testing: TERM - %u errors\n", u32));
- else
- VMMDEV_TESTING_OUTPUT(("testing: SUB_DONE - %u errors\n", u32));
- return VINF_SUCCESS;
-#else
- return VINF_IOM_R3_IOPORT_WRITE;
-#endif
}
break;
@@ -441,28 +471,54 @@ PDMBOTHCBDECL(int) vmmdevTestingIoRead(PPDMDEVINS pDevIns, void *pvUser, RTIOPOR
* @returns VBox status code.
* @param pDevIns The VMMDev device instance.
*/
+void vmmdevTestingTerminate(PPDMDEVINS pDevIns)
+{
+ VMMDevState *pThis = PDMINS_2_DATA(pDevIns, VMMDevState *);
+ if (!pThis->fTestingEnabled)
+ return;
+
+ if (pThis->hTestingTest != NIL_RTTEST)
+ {
+ RTTestFailed(pThis->hTestingTest, "Still open at vmmdev destruction.");
+ RTTestSummaryAndDestroy(pThis->hTestingTest);
+ pThis->hTestingTest = NIL_RTTEST;
+ }
+}
+
+
+/**
+ * Initializes the testing part of the VMMDev if enabled.
+ *
+ * @returns VBox status code.
+ * @param pDevIns The VMMDev device instance.
+ */
int vmmdevTestingInitialize(PPDMDEVINS pDevIns)
{
VMMDevState *pThis = PDMINS_2_DATA(pDevIns, VMMDevState *);
+ int rc;
+
if (!pThis->fTestingEnabled)
return VINF_SUCCESS;
- /*
- * Register a chunk of MMIO memory that we'll use for various
- * tests interfaces.
- */
- int rc = PDMDevHlpMMIORegister(pDevIns, VMMDEV_TESTING_MMIO_BASE, VMMDEV_TESTING_MMIO_SIZE, NULL /*pvUser*/,
+ if (pThis->fTestingMMIO)
+ {
+ /*
+ * Register a chunk of MMIO memory that we'll use for various
+ * tests interfaces. Optional, needs to be explicitly enabled.
+ */
+ rc = PDMDevHlpMMIORegister(pDevIns, VMMDEV_TESTING_MMIO_BASE, VMMDEV_TESTING_MMIO_SIZE, NULL /*pvUser*/,
IOMMMIO_FLAGS_READ_PASSTHRU | IOMMMIO_FLAGS_WRITE_PASSTHRU,
vmmdevTestingMmioWrite, vmmdevTestingMmioRead, "VMMDev Testing");
- AssertRCReturn(rc, rc);
- if (pThis->fRZEnabled)
- {
- rc = PDMDevHlpMMIORegisterR0(pDevIns, VMMDEV_TESTING_MMIO_BASE, VMMDEV_TESTING_MMIO_SIZE, NIL_RTR0PTR /*pvUser*/,
- "vmmdevTestingMmioWrite", "vmmdevTestingMmioRead");
- AssertRCReturn(rc, rc);
- rc = PDMDevHlpMMIORegisterRC(pDevIns, VMMDEV_TESTING_MMIO_BASE, VMMDEV_TESTING_MMIO_SIZE, NIL_RTRCPTR /*pvUser*/,
- "vmmdevTestingMmioWrite", "vmmdevTestingMmioRead");
AssertRCReturn(rc, rc);
+ if (pThis->fRZEnabled)
+ {
+ rc = PDMDevHlpMMIORegisterR0(pDevIns, VMMDEV_TESTING_MMIO_BASE, VMMDEV_TESTING_MMIO_SIZE, NIL_RTR0PTR /*pvUser*/,
+ "vmmdevTestingMmioWrite", "vmmdevTestingMmioRead");
+ AssertRCReturn(rc, rc);
+ rc = PDMDevHlpMMIORegisterRC(pDevIns, VMMDEV_TESTING_MMIO_BASE, VMMDEV_TESTING_MMIO_SIZE, NIL_RTRCPTR /*pvUser*/,
+ "vmmdevTestingMmioWrite", "vmmdevTestingMmioRead");
+ AssertRCReturn(rc, rc);
+ }
}
@@ -494,6 +550,14 @@ int vmmdevTestingInitialize(PPDMDEVINS pDevIns)
AssertRCReturn(rc, rc);
}
+ /*
+ * Open the XML output file(/pipe/whatever) if specfied.
+ */
+ rc = RTTestCreateEx("VMMDevTesting", RTTEST_C_USE_ENV | RTTEST_C_NO_TLS | RTTEST_C_XML_DELAY_TOP_TEST,
+ RTTESTLVL_INVALID, -1 /*iNativeTestPipe*/, pThis->pszTestingXmlOutput, &pThis->hTestingTest);
+ if (RT_FAILURE(rc))
+ return PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS, "Error creating testing instance");
+
return VINF_SUCCESS;
}