diff options
Diffstat (limited to 'src/VBox/Devices/VMMDev/VMMDevTesting.cpp')
| -rw-r--r-- | src/VBox/Devices/VMMDev/VMMDevTesting.cpp | 152 |
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; } |
