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