5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync/* $Id$ */
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync/** @file
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync * tstVBoxAPIPerf - Checks the performance of the COM / XPOM API.
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync */
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync/*
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync * Copyright (C) 2006-2013 Oracle Corporation
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync *
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync * available from http://www.virtualbox.org. This file is free software;
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync * you can redistribute it and/or modify it under the terms of the GNU
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync * General Public License (GPL) as published by the Free Software
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync */
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync/*******************************************************************************
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync* Header Files *
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync*******************************************************************************/
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync#include <VBox/com/com.h>
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync#include <VBox/com/string.h>
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync#include <VBox/com/array.h>
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync#include <VBox/com/Guid.h>
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync#include <VBox/com/ErrorInfo.h>
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync#include <VBox/com/VirtualBox.h>
50546d921ccc80de6aaa216e7c3831834c7d0e47vboxsync#include <VBox/sup.h>
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync#include <iprt/test.h>
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync#include <iprt/time.h>
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync/*******************************************************************************
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync* Global Variables *
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync*******************************************************************************/
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsyncstatic RTTEST g_hTest;
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync/** Worker fro TST_COM_EXPR(). */
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsyncstatic HRESULT tstComExpr(HRESULT hrc, const char *pszOperation, int iLine)
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync{
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync if (FAILED(hrc))
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync RTTestFailed(g_hTest, "%s failed on line %u with hrc=%Rhrc", pszOperation, iLine, hrc);
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync return hrc;
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync}
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync/** Macro that executes the given expression and report any failure.
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync * The expression must return a HRESULT. */
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync#define TST_COM_EXPR(expr) tstComExpr(expr, #expr, __LINE__)
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsyncstatic void tstApiPrf1(IVirtualBox *pVBox)
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync{
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync RTTestSub(g_hTest, "IVirtualBox::Revision performance");
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync uint32_t const cCalls = 65536;
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync uint32_t cLeft = cCalls;
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync uint64_t uStartTS = RTTimeNanoTS();
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync while (cLeft-- > 0)
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync {
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync ULONG uRev;
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync HRESULT hrc = pVBox->COMGETTER(Revision)(&uRev);
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync if (FAILED(hrc))
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync {
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync tstComExpr(hrc, "IVirtualBox::Revision", __LINE__);
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync return;
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync }
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync }
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync uint64_t uElapsed = RTTimeNanoTS() - uStartTS;
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync RTTestValue(g_hTest, "IVirtualBox::Revision average", uElapsed / cCalls, RTTESTUNIT_NS_PER_CALL);
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync RTTestSubDone(g_hTest);
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync}
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsyncstatic void tstApiPrf2(IVirtualBox *pVBox)
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync{
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync RTTestSub(g_hTest, "IVirtualBox::Version performance");
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync uint32_t const cCalls = 65536;
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync uint32_t cLeft = cCalls;
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync uint64_t uStartTS = RTTimeNanoTS();
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync while (cLeft-- > 0)
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync {
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync com::Bstr bstrVersion;
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync HRESULT hrc = pVBox->COMGETTER(Version)(bstrVersion.asOutParam());
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync if (FAILED(hrc))
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync {
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync tstComExpr(hrc, "IVirtualBox::Version", __LINE__);
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync return;
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync }
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync }
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync uint64_t uElapsed = RTTimeNanoTS() - uStartTS;
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync RTTestValue(g_hTest, "IVirtualBox::Version average", uElapsed / cCalls, RTTESTUNIT_NS_PER_CALL);
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync RTTestSubDone(g_hTest);
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync}
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsyncstatic void tstApiPrf3(IVirtualBox *pVBox)
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync{
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync RTTestSub(g_hTest, "IVirtualBox::Host performance");
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync /* The first call. */
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync uint64_t uStartTS = RTTimeNanoTS();
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync IHost *pHost = NULL;
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync HRESULT hrc = pVBox->COMGETTER(Host)(&pHost);
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync if (FAILED(hrc))
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync {
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync tstComExpr(hrc, "IVirtualBox::Host", __LINE__);
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync return;
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync }
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync pHost->Release();
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync uint64_t uElapsed = RTTimeNanoTS() - uStartTS;
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync RTTestValue(g_hTest, "IVirtualBox::Host first", uElapsed, RTTESTUNIT_NS);
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync /* Subsequent calls. */
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync uint32_t const cCalls1 = 4096;
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync uint32_t cLeft = cCalls1;
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync uStartTS = RTTimeNanoTS();
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync while (cLeft-- > 0)
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync {
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync IHost *pHost2 = NULL;
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync hrc = pVBox->COMGETTER(Host)(&pHost2);
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync if (FAILED(hrc))
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync {
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync tstComExpr(hrc, "IVirtualBox::Host", __LINE__);
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync return;
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync }
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync pHost2->Release();
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync }
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync uElapsed = RTTimeNanoTS() - uStartTS;
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync RTTestValue(g_hTest, "IVirtualBox::Host average", uElapsed / cCalls1, RTTESTUNIT_NS_PER_CALL);
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync /* Keep a reference around and see how that changes things.
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync Note! VBoxSVC is not creating and destroying Host(). */
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync pHost = NULL;
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync hrc = pVBox->COMGETTER(Host)(&pHost);
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync uint32_t const cCalls2 = 16384;
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync cLeft = cCalls2;
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync uStartTS = RTTimeNanoTS();
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync while (cLeft-- > 0)
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync {
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync IHost *pHost2 = NULL;
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync hrc = pVBox->COMGETTER(Host)(&pHost2);
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync if (FAILED(hrc))
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync {
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync tstComExpr(hrc, "IVirtualBox::Host", __LINE__);
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync pHost->Release();
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync return;
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync }
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync pHost2->Release();
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync }
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync uElapsed = RTTimeNanoTS() - uStartTS;
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync RTTestValue(g_hTest, "IVirtualBox::Host 2nd ref", uElapsed / cCalls2, RTTESTUNIT_NS_PER_CALL);
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync pHost->Release();
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync RTTestSubDone(g_hTest);
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync}
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsyncstatic void tstApiPrf4(IVirtualBox *pVBox)
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync{
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync RTTestSub(g_hTest, "IHost::GetProcessorFeature performance");
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync IHost *pHost = NULL;
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync HRESULT hrc = pVBox->COMGETTER(Host)(&pHost);
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync if (FAILED(hrc))
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync {
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync tstComExpr(hrc, "IVirtualBox::Host", __LINE__);
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync return;
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync }
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync uint32_t const cCalls = 65536;
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync uint32_t cLeft = cCalls;
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync uint64_t uStartTS = RTTimeNanoTS();
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync while (cLeft-- > 0)
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync {
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync BOOL fSupported;
fd62318f05bd9625444feb8f4b0ae9ff90ed0766vboxsync hrc = pHost->GetProcessorFeature(ProcessorFeature_PAE, &fSupported);
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync if (FAILED(hrc))
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync {
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync tstComExpr(hrc, "IHost::GetProcessorFeature", __LINE__);
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync pHost->Release();
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync return;
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync }
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync }
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync uint64_t uElapsed = RTTimeNanoTS() - uStartTS;
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync RTTestValue(g_hTest, "IHost::GetProcessorFeature average", uElapsed / cCalls, RTTESTUNIT_NS_PER_CALL);
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync pHost->Release();
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync RTTestSubDone(g_hTest);
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync}
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsyncint main(int argc, char **argv)
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync{
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync /*
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync * Initialization.
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync */
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync RTEXITCODE rcExit = RTTestInitAndCreate("tstVBoxAPIPerf", &g_hTest);
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync if (rcExit != RTEXITCODE_SUCCESS)
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync return rcExit;
50546d921ccc80de6aaa216e7c3831834c7d0e47vboxsync SUPR3Init(NULL); /* Better time support. */
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync RTTestBanner(g_hTest);
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync RTTestSub(g_hTest, "Initializing COM and singletons");
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync HRESULT hrc = com::Initialize();
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync if (SUCCEEDED(hrc))
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync {
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync ComPtr<IVirtualBox> ptrVBox;
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync hrc = TST_COM_EXPR(ptrVBox.createLocalObject(CLSID_VirtualBox));
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync if (SUCCEEDED(hrc))
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync {
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync ComPtr<ISession> ptrSession;
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync hrc = TST_COM_EXPR(ptrSession.createInprocObject(CLSID_Session));
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync if (SUCCEEDED(hrc))
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync {
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync RTTestSubDone(g_hTest);
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync /*
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync * Call test functions.
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync */
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync tstApiPrf1(ptrVBox);
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync tstApiPrf2(ptrVBox);
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync tstApiPrf3(ptrVBox);
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync /** @todo Find something that returns a 2nd instance of an interface and see
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync * how if wrapper stuff is reused in any way. */
4091316efc2cdc2f295c9d3e00eaea04e889e67bvboxsync tstApiPrf4(ptrVBox);
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync }
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync }
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync
50546d921ccc80de6aaa216e7c3831834c7d0e47vboxsync ptrVBox.setNull();
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync com::Shutdown();
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync }
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync else
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync RTTestIFailed("com::Initialize failed with hrc=%Rhrc", hrc);
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync return RTTestSummaryAndDestroy(g_hTest);
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync}
5ca41ddc30d96ff1ccdb5c76d6d924adce77e635vboxsync