tstAPI.cpp revision d99197f8edcfa672509d9418fa6441c0c66af33c
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync * tstAPI - test program for our COM/XPCOM interface
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync * Copyright (C) 2006-2009 Sun Microsystems, Inc.
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync * available from http://www.virtualbox.org. This file is free software;
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync * you can redistribute it and/or modify it under the terms of the GNU
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync * General Public License (GPL) as published by the Free Software
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync * additional information or have any questions.
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsyncusing namespace com;
7cca5a9aeb06913531b982bf772508d09b4c2f0bvboxsync// forward declarations
4bb5cfa1f4d9e95d7d34b5d6ede18d9f4d433bc6vboxsync///////////////////////////////////////////////////////////////////////////////
4bb5cfa1f4d9e95d7d34b5d6ede18d9f4d433bc6vboxsyncstatic Bstr getObjectName(ComPtr<IVirtualBox> aVirtualBox,
7cca5a9aeb06913531b982bf772508d09b4c2f0bvboxsyncstatic void queryMetrics (ComPtr<IVirtualBox> aVirtualBox,
4bb5cfa1f4d9e95d7d34b5d6ede18d9f4d433bc6vboxsyncstatic void listAffectedMetrics(ComPtr<IVirtualBox> aVirtualBox,
2f827df539da232220444c27f2b207a707a045b0vboxsync///////////////////////////////////////////////////////////////////////////////
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsyncHRESULT readAndChangeMachineSettings (IMachine *machine, IMachine *readonlyMachine = 0)
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync CHECK_ERROR_RET (machine, COMGETTER(Name) (name.asOutParam()), rc);
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync CHECK_ERROR (machine, COMGETTER(Id) (guid.asOutParam()));
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync RTPrintf ("Guid::toString(): {%s}\n", Utf8Str(guid).c_str());
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync CHECK_ERROR_RET (machine, COMGETTER(MemorySize) (&memorySize), rc);
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync CHECK_ERROR_RET (machine, COMGETTER(State) (&machineState), rc);
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync CHECK_ERROR (machine, COMGETTER(SettingsModified) (&modified));
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync RTPrintf("Changing memory size to %d...\n", memorySizeBig);
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync CHECK_ERROR (machine, COMSETTER(MemorySize) (memorySizeBig));
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync CHECK_ERROR_RET (machine, COMGETTER(SettingsModified) (&modified), rc);
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync CHECK_ERROR_RET (machine, COMGETTER(MemorySize) (&memorySizeGot), rc);
581bb0c43dececce2fbba05cfb77d9a59c88a078vboxsync RTPrintf ("Getting memory size of the counterpart readonly machine...\n");
2cb52dd865592ea8e27b588beb22898d189646b1vboxsync readonlyMachine->COMGETTER(MemorySize) (&memorySizeRO);
f2e1f71feb5d4ec79d46defcd71de0763234b1e2vboxsync RTPrintf ("Are any settings modified after discarding?...\n");
2cb52dd865592ea8e27b588beb22898d189646b1vboxsync CHECK_ERROR_RET (machine, COMGETTER(SettingsModified) (&modified), rc);
2cb52dd865592ea8e27b588beb22898d189646b1vboxsync CHECK_ERROR_RET (machine, COMGETTER(MemorySize) (&memorySizeGot), rc);
581bb0c43dececce2fbba05cfb77d9a59c88a078vboxsync memorySize = memorySize > 128 ? memorySize / 2 : memorySize * 2;
581bb0c43dececce2fbba05cfb77d9a59c88a078vboxsync RTPrintf("Changing memory size to %d...\n", memorySize);
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync CHECK_ERROR_RET (machine, COMSETTER(MemorySize) (memorySize), rc);
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync CHECK_ERROR_RET (machine, COMGETTER(Description) (desc.asOutParam()), rc);
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync RTPrintf ("Description is: \"%ls\"\n", desc.raw());
2f827df539da232220444c27f2b207a707a045b0vboxsync desc = L"This is an exemplary description (changed).";
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync RTPrintf ("Setting description to \"%ls\"...\n", desc.raw());
2f827df539da232220444c27f2b207a707a045b0vboxsync CHECK_ERROR_RET (machine, COMSETTER(Description) (desc), rc);
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync RTPrintf ("Are any settings modified after saving?...\n");
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync CHECK_ERROR_RET (machine, COMGETTER(SettingsModified) (&modified), rc);
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync RTPrintf ("Getting memory size of the counterpart readonly machine...\n");
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync readonlyMachine->COMGETTER(MemorySize) (&memorySizeRO);
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync RTPrintf ("Getting extra data key {%ls}...\n", extraDataKey.raw());
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync CHECK_ERROR_RET (machine, GetExtraData (extraDataKey, extraData.asOutParam()), rc);
2f827df539da232220444c27f2b207a707a045b0vboxsync RTPrintf ("Extra data value: {%ls}\n", extraData.raw());
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync extraData = L"Das ist die Berliner Luft, Luft, Luft...";
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync "Setting extra data key {%ls} to {%ls}...\n",
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync CHECK_ERROR (machine, SetExtraData (extraDataKey, extraData));
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync RTPrintf ("Getting extra data key {%ls} again...\n", extraDataKey.raw());
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync CHECK_ERROR_RET (machine, GetExtraData (extraDataKey, extraData.asOutParam()), rc);
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync RTPrintf ("Extra data value: {%ls}\n", extraData.raw());
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync///////////////////////////////////////////////////////////////////////////////
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync * Initialize the VBox runtime without loading
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync * the support driver.
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync GetVBoxUserHomeDirectory (homeDir, sizeof (homeDir));
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync RTPrintf ("VirtualBox Home Directory = '%s'\n", homeDir);
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync // scopes all the stuff till shutdown
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync ////////////////////////////////////////////////////////////////////////////
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync // Utf8Str test
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync ////////////////////////////////////////////////////////////////////////////
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync RTPrintf ("nullUtf8Str='%s'\n", nullUtf8Str.raw());
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync RTPrintf ("simpleUtf8Str='%s'\n", simpleUtf8Str.raw());
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync rc = virtualBox.createLocalObject (CLSID_VirtualBox);
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync RTPrintf("ERROR: failed to create the VirtualBox object!\n");
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync RTPrintf("ERROR: failed to create a session object!\n");
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync if (!info.isFullAvailable() && !info.isBasicAvailable())
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync RTPrintf("Most likely, the VirtualBox COM server is not running or failed to start.\n");
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync // Testing VirtualBox::COMGETTER(ProgressOperations).
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync // This is designed to be tested while running
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync // "./VBoxManage clonehd src.vdi clone.vdi" in parallel.
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync // It will then display the progress every 2 seconds.
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync ////////////////////////////////////////////////////////////////////////////
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync RTPrintf ("Testing VirtualBox::COMGETTER(ProgressOperations)...\n");
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync COMGETTER(ProgressOperations)(ComSafeArrayAsOutParam(operations)));
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync break; // No more operations left.
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync RTPrintf ("operations[%u]: %ld\n", (unsigned)i, (long)percent);
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync // IUnknown identity test
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync ////////////////////////////////////////////////////////////////////////////
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync RTPrintf ("Creating one more VirtualBox object...\n");
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync CHECK_RC (virtualBox2.createLocalObject (CLSID_VirtualBox));
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync RTPrintf ("IVirtualBox(virtualBox)=%p IVirtualBox(virtualBox2)=%p\n",
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync (IVirtualBox *) virtualBox, (IVirtualBox *) virtualBox2);
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync Assert ((IVirtualBox *) virtualBox == (IVirtualBox *) virtualBox2);
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync RTPrintf ("IUnknown(virtualBox)=%p IUnknown(virtualBox2)=%p\n",
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync RTPrintf ("IVirtualBox(IUnknown(virtualBox))=%p IVirtualBox(IUnknown(virtualBox2))=%p\n",
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync Assert ((IVirtualBox *) vb == (IVirtualBox *) vb2);
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync CHECK_ERROR_BREAK (virtualBox, COMGETTER(Host)(host.asOutParam()));
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync RTPrintf (" IUnknown(host)=%p\n", (IUnknown *) unk);
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync RTPrintf (" IHost(host_copy)=%p\n", (IHost *) host_copy);
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync RTPrintf (" IUnknown(host_copy)=%p\n", (IUnknown *) unk_copy);
2f827df539da232220444c27f2b207a707a045b0vboxsync Assert ((IUnknown *) unk == (IUnknown *) unk_copy);
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync /* query IUnknown on IUnknown */
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync unk_copy.queryInterfaceTo(unk_copy_copy.asOutParam());
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync RTPrintf (" IUnknown(unk_copy)=%p\n", (IUnknown *) unk_copy_copy);
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync Assert ((IUnknown *) unk_copy == (IUnknown *) unk_copy_copy);
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync /* query IUnknown on IUnknown in the opposite direction */
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync unk_copy_copy.queryInterfaceTo(unk_copy.asOutParam());
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync RTPrintf (" IUnknown(unk_copy_copy)=%p\n", (IUnknown *) unk_copy);
2f827df539da232220444c27f2b207a707a045b0vboxsync Assert ((IUnknown *) unk_copy == (IUnknown *) unk_copy_copy);
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync /* query IUnknown again after releasing all previous IUnknown instances
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync * but keeping IHost -- it should remain the same (Identity Rule) */
4bb5cfa1f4d9e95d7d34b5d6ede18d9f4d433bc6vboxsync RTPrintf (" IUnknown(host)=%p\n", (IUnknown *) unk);
4bb5cfa1f4d9e95d7d34b5d6ede18d9f4d433bc6vboxsync// RTPrintf ("Will be now released (press Enter)...");
4bb5cfa1f4d9e95d7d34b5d6ede18d9f4d433bc6vboxsync// getchar();
4bb5cfa1f4d9e95d7d34b5d6ede18d9f4d433bc6vboxsync // create the event queue
4bb5cfa1f4d9e95d7d34b5d6ede18d9f4d433bc6vboxsync // (here it is necessary only to process remaining XPCOM/IPC events
4bb5cfa1f4d9e95d7d34b5d6ede18d9f4d433bc6vboxsync // after the session is closed)
4bb5cfa1f4d9e95d7d34b5d6ede18d9f4d433bc6vboxsync // the simplest COM API test
4bb5cfa1f4d9e95d7d34b5d6ede18d9f4d433bc6vboxsync ////////////////////////////////////////////////////////////////////////////
4bb5cfa1f4d9e95d7d34b5d6ede18d9f4d433bc6vboxsync CHECK_ERROR_BREAK (virtualBox, COMGETTER(Version) (version.asOutParam()));
4bb5cfa1f4d9e95d7d34b5d6ede18d9f4d433bc6vboxsync RTPrintf ("VirtualBox version = %ls\n", version.raw());
4bb5cfa1f4d9e95d7d34b5d6ede18d9f4d433bc6vboxsync // Array test
4bb5cfa1f4d9e95d7d34b5d6ede18d9f4d433bc6vboxsync ////////////////////////////////////////////////////////////////////////////
4bb5cfa1f4d9e95d7d34b5d6ede18d9f4d433bc6vboxsync COMGETTER(Machines) (ComSafeArrayAsOutParam (machines)));
4bb5cfa1f4d9e95d7d34b5d6ede18d9f4d433bc6vboxsync RTPrintf ("%u machines registered (machines.isNull()=%d).\n",
4bb5cfa1f4d9e95d7d34b5d6ede18d9f4d433bc6vboxsync CHECK_ERROR_BREAK (machines [i], COMGETTER(Name) (name.asOutParam()));
4bb5cfa1f4d9e95d7d34b5d6ede18d9f4d433bc6vboxsync RTPrintf ("machines[%u]='%s'\n", i, Utf8Str (name).raw());
4bb5cfa1f4d9e95d7d34b5d6ede18d9f4d433bc6vboxsync COMGETTER(Uuids) (ComSafeArrayAsOutParam (uuids)));
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync // some outdated stuff
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync ////////////////////////////////////////////////////////////////////////////
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync RTUtf16ToUtf8((PCRTUTF16)driveName, &driveNameUtf8);
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync RTPrintf("Host DVD drive name: %s\n", driveNameUtf8);
4bb5cfa1f4d9e95d7d34b5d6ede18d9f4d433bc6vboxsync dvdColl->GetNextHostDVDDrive(dvdDriveTemp, &dvdDrive);
4bb5cfa1f4d9e95d7d34b5d6ede18d9f4d433bc6vboxsync RTPrintf("Could not get host DVD drive collection\n");
4bb5cfa1f4d9e95d7d34b5d6ede18d9f4d433bc6vboxsync floppyColl->GetNextHostFloppyDrive(floppyDrive, &floppyDrive);
4bb5cfa1f4d9e95d7d34b5d6ede18d9f4d433bc6vboxsync RTUtf16ToUtf8((PCRTUTF16)driveName, &driveNameUtf8);
4bb5cfa1f4d9e95d7d34b5d6ede18d9f4d433bc6vboxsync RTPrintf("Host floppy drive name: %s\n", driveNameUtf8);
4bb5cfa1f4d9e95d7d34b5d6ede18d9f4d433bc6vboxsync floppyColl->GetNextHostFloppyDrive(floppyDriveTemp, &floppyDrive);
4bb5cfa1f4d9e95d7d34b5d6ede18d9f4d433bc6vboxsync RTPrintf("Could not get host floppy drive collection\n");
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync // IVirtualBoxErrorInfo test
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync ////////////////////////////////////////////////////////////////////////////
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync // RPC calls
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync // call a method that will definitely fail
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync rc = virtualBox->GetHardDisk(uuid, hardDisk.asOutParam());
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync RTPrintf ("virtualBox->GetHardDisk(null-uuid)=%08X\n", rc);
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync// com::ErrorInfo info (virtualBox);
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync// PRINT_ERROR_INFO (info);
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync // call a method that will definitely succeed
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync rc = virtualBox->COMGETTER(Version) (version.asOutParam());
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync RTPrintf ("virtualBox->COMGETTER(Version)=%08X\n", rc);
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync // Local calls
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync // call a method that will definitely fail
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync rc = session->COMGETTER(Machine)(machine.asOutParam());
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync RTPrintf ("session->COMGETTER(Machine)=%08X\n", rc);
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync// com::ErrorInfo info (virtualBox);
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync// PRINT_ERROR_INFO (info);
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync // call a method that will definitely succeed
getchar();
getchar();
while (FALSE);
while (FALSE);
#if defined RT_OS_LINUX
while (FALSE);
static const wchar_t *Names[] =
#ifndef RT_OS_LINUX
while (FALSE);
#if defined (RT_OS_LINUX)
while (FALSE);
while (FALSE);
RTPrintf ("key='%ls' desc='%ls' type=", Bstr (propertyNames [a]).raw(), Bstr (propertyDescriptions [a]).raw());
switch (propertyTypes [a])
while (FALSE);
getchar();
while (FALSE);
getchar();
getchar();
while (FALSE);
getchar();
getchar();
while (FALSE);
RTPrintf("Found %d network interfaces, testing with %lS...\n", hostNetworkInterfaces.size(), interfaceName.raw());
#if 0 && defined (VBOX_WITH_RESOURCE_USAGE_API)
getchar();
getchar();
Interpret());
retTypes [a],
while (FALSE);
getchar();
getchar();
return rc;
#ifdef VBOX_WITH_RESOURCE_USAGE_API
//Bstr metricNames[] = { L"CPU/Load/User:avg,CPU/Load/System:avg,CPU/Load/Idle:avg,RAM/Usage/Total,RAM/Usage/Used:avg" };
for (unsigned j = 0; j < retLengths[i]; j++)
return name;