tstClipboardServiceHost.cpp revision b9b8a4b9a11af5f68f550405b8c6dde8f8876ff4
/* $Id$ */
/** @file
* Shared Clipboard host service test case.
*/
/*
* Copyright (C) 2011 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* you can redistribute it and/or modify it under the terms of the GNU
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
#include "../VBoxClipboard.h"
#include <VBox/HostServices/VBoxClipboardSvc.h>
#define IN_VMM_R3 /* so that the SSM function stubs are exports not imports */
#include <VBox/vmm/ssm.h>
#include <iprt/assert.h>
#include <iprt/string.h>
#include <iprt/test.h>
extern "C" DECLCALLBACK(DECLEXPORT(int)) VBoxHGCMSvcLoad (VBOXHGCMSVCFNTABLE *ptable);
static int setupTable(VBOXHGCMSVCFNTABLE *pTable)
{
pTable->cbSize = sizeof(*pTable);
pTable->u32Version = VBOX_HGCM_SVC_VERSION;
return VBoxHGCMSvcLoad(pTable);
}
static void testSetMode(void)
{
struct VBOXHGCMSVCPARM parms[2];
VBOXHGCMSVCFNTABLE table;
uint32_t u32Mode;
int rc;
RTTestISub("Testing HOST_FN_SET_MODE");
rc = setupTable(&table);
RTTESTI_CHECK_MSG_RETV(RT_SUCCESS(rc), ("rc=%Rrc\n", rc));
/* Reset global variable which doesn't reset itself. */
parms[0].setUInt32(VBOX_SHARED_CLIPBOARD_MODE_OFF);
rc = table.pfnHostCall(NULL, VBOX_SHARED_CLIPBOARD_HOST_FN_SET_MODE,
1, parms);
RTTESTI_CHECK_RC_OK(rc);
u32Mode = testClipSvcGetMode();
RTTESTI_CHECK_MSG(u32Mode == VBOX_SHARED_CLIPBOARD_MODE_OFF,
("u32Mode=%u\n", (unsigned) u32Mode));
rc = table.pfnHostCall(NULL, VBOX_SHARED_CLIPBOARD_HOST_FN_SET_MODE,
0, parms);
RTTESTI_CHECK_RC(rc, VERR_INVALID_PARAMETER);
rc = table.pfnHostCall(NULL, VBOX_SHARED_CLIPBOARD_HOST_FN_SET_MODE,
2, parms);
RTTESTI_CHECK_RC(rc, VERR_INVALID_PARAMETER);
parms[0].setUInt64(99);
rc = table.pfnHostCall(NULL, VBOX_SHARED_CLIPBOARD_HOST_FN_SET_MODE,
1, parms);
RTTESTI_CHECK_RC(rc, VERR_INVALID_PARAMETER);
parms[0].setUInt32(VBOX_SHARED_CLIPBOARD_MODE_HOST_TO_GUEST);
rc = table.pfnHostCall(NULL, VBOX_SHARED_CLIPBOARD_HOST_FN_SET_MODE,
1, parms);
RTTESTI_CHECK_RC_OK(rc);
u32Mode = testClipSvcGetMode();
RTTESTI_CHECK_MSG(u32Mode == VBOX_SHARED_CLIPBOARD_MODE_HOST_TO_GUEST,
("u32Mode=%u\n", (unsigned) u32Mode));
parms[0].setUInt32(99);
rc = table.pfnHostCall(NULL, VBOX_SHARED_CLIPBOARD_HOST_FN_SET_MODE,
1, parms);
RTTESTI_CHECK_RC_OK(rc);
u32Mode = testClipSvcGetMode();
RTTESTI_CHECK_MSG(u32Mode == VBOX_SHARED_CLIPBOARD_MODE_OFF,
("u32Mode=%u\n", (unsigned) u32Mode));
}
static void testSetHeadless(void)
{
struct VBOXHGCMSVCPARM parms[2];
VBOXHGCMSVCFNTABLE table;
bool fHeadless;
int rc;
RTTestISub("Testing HOST_FN_SET_HEADLESS");
rc = setupTable(&table);
RTTESTI_CHECK_MSG_RETV(RT_SUCCESS(rc), ("rc=%Rrc\n", rc));
/* Reset global variable which doesn't reset itself. */
parms[0].setUInt32(false);
rc = table.pfnHostCall(NULL, VBOX_SHARED_CLIPBOARD_HOST_FN_SET_HEADLESS,
1, parms);
RTTESTI_CHECK_RC_OK(rc);
fHeadless = vboxSvcClipboardGetHeadless();
RTTESTI_CHECK_MSG(fHeadless == false, ("fHeadless=%RTbool\n", fHeadless));
rc = table.pfnHostCall(NULL, VBOX_SHARED_CLIPBOARD_HOST_FN_SET_HEADLESS,
0, parms);
RTTESTI_CHECK_RC(rc, VERR_INVALID_PARAMETER);
rc = table.pfnHostCall(NULL, VBOX_SHARED_CLIPBOARD_HOST_FN_SET_HEADLESS,
2, parms);
RTTESTI_CHECK_RC(rc, VERR_INVALID_PARAMETER);
parms[0].setUInt64(99);
rc = table.pfnHostCall(NULL, VBOX_SHARED_CLIPBOARD_HOST_FN_SET_HEADLESS,
1, parms);
RTTESTI_CHECK_RC(rc, VERR_INVALID_PARAMETER);
parms[0].setUInt32(true);
rc = table.pfnHostCall(NULL, VBOX_SHARED_CLIPBOARD_HOST_FN_SET_HEADLESS,
1, parms);
RTTESTI_CHECK_RC_OK(rc);
fHeadless = vboxSvcClipboardGetHeadless();
RTTESTI_CHECK_MSG(fHeadless == true, ("fHeadless=%RTbool\n", fHeadless));
parms[0].setUInt32(99);
rc = table.pfnHostCall(NULL, VBOX_SHARED_CLIPBOARD_HOST_FN_SET_HEADLESS,
1, parms);
RTTESTI_CHECK_RC_OK(rc);
fHeadless = vboxSvcClipboardGetHeadless();
RTTESTI_CHECK_MSG(fHeadless == true, ("fHeadless=%RTbool\n", fHeadless));
}
static void testHostCall(void)
{
testSetMode();
testSetHeadless();
}
int main(int argc, char *argv[])
{
/*
* Init the runtime, test and say hello.
*/
const char *pcszExecName;
NOREF(argc);
pcszExecName = strrchr(argv[0], '/');
pcszExecName = pcszExecName ? pcszExecName + 1 : argv[0];
RTTEST hTest;
RTEXITCODE rcExit = RTTestInitAndCreate(pcszExecName, &hTest);
if (rcExit != RTEXITCODE_SUCCESS)
return rcExit;
RTTestBanner(hTest);
/*
* Run the tests.
*/
testHostCall();
/*
* Summary
*/
return RTTestSummaryAndDestroy(hTest);
}
int vboxClipboardInit() { return VINF_SUCCESS; }
void vboxClipboardDestroy() { AssertFailed(); }
void vboxClipboardDisconnect(_VBOXCLIPBOARDCLIENTDATA*) { AssertFailed(); }
int vboxClipboardConnect(_VBOXCLIPBOARDCLIENTDATA*)
{ AssertFailed(); return VERR_WRONG_ORDER; }
void vboxClipboardFormatAnnounce(_VBOXCLIPBOARDCLIENTDATA*, unsigned int)
{ AssertFailed(); }
int vboxClipboardReadData(_VBOXCLIPBOARDCLIENTDATA*, unsigned int, void*, unsigned int, unsigned int*)
{ AssertFailed(); return VERR_WRONG_ORDER; }
void vboxClipboardWriteData(_VBOXCLIPBOARDCLIENTDATA*, void*, unsigned int, unsigned int) { AssertFailed(); }
VMMR3DECL(int) SSMR3PutU32(PSSMHANDLE pSSM, uint32_t u32)
{ AssertFailed(); return VERR_WRONG_ORDER; }
VMMR3DECL(int) SSMR3PutStructEx(PSSMHANDLE pSSM, const void *pvStruct, size_t cbStruct, uint32_t fFlags, PCSSMFIELD paFields, void *pvUser)
{ AssertFailed(); return VERR_WRONG_ORDER; }
VMMR3DECL(int) SSMR3GetU32(PSSMHANDLE pSSM, uint32_t *pu32)
{ AssertFailed(); return VERR_WRONG_ORDER; }
VMMR3DECL(uint32_t) SSMR3HandleHostBits(PSSMHANDLE pSSM)
{ AssertFailed(); return 0; }
VMMR3DECL(int) SSMR3GetStructEx(PSSMHANDLE pSSM, void *pvStruct, size_t cbStruct, uint32_t fFlags, PCSSMFIELD paFields, void *pvUser)
{ AssertFailed(); return VERR_WRONG_ORDER; }
int vboxClipboardSync(_VBOXCLIPBOARDCLIENTDATA*)
{ AssertFailed(); return VERR_WRONG_ORDER; }