VirtualBox

Changeset 93970 in vbox for trunk


Ignore:
Timestamp:
Feb 28, 2022 11:09:46 AM (3 years ago)
Author:
vboxsync
Message:

Validation Kit/HGCM: Split out the HGCM testing (mocking) framework into an own header, added documentation, more code for generalizing this [build fix].

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/GuestHost/HGCMMock.h

    r93969 r93970  
    2121 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
    2222 */
    23 
     23#ifndef VBOX_INCLUDED_HGCMMock_h
     24#define VBOX_INCLUDED_HGCMMock_h
     25#ifndef RT_WITHOUT_PRAGMA_ONCE
     26# pragma once
     27#endif
     28
     29#include <iprt/types.h>
     30
     31#include <iprt/asm.h>
    2432#include <iprt/assert.h>
    25 #include <iprt/initterm.h>
     33#include <iprt/list.h>
    2634#include <iprt/mem.h>
    2735#include <iprt/rand.h>
    2836#include <iprt/semaphore.h>
    29 #include <iprt/stream.h>
    30 #include <iprt/string.h>
    3137#include <iprt/test.h>
     38#include <iprt/time.h>
     39#include <iprt/thread.h>
    3240#include <iprt/utf16.h>
    3341
     42#include <VBox/err.h>
    3443#include <VBox/VBoxGuestLib.h>
     44#include <VBox/hgcmsvc.h>
    3545
    3646
     
    3949*********************************************************************************************************************************/
    4050
    41 extern "C" DECLCALLBACK(DECLEXPORT(int)) VBoxHGCMSvcLoad(VBOXHGCMSVCFNTABLE *ptable);
    42 
    43 typedef uint32_t HGCMCLIENTID;
     51RT_C_DECLS_BEGIN
     52
     53#if defined(IN_RING3) /* Only R3 parts implemented so far. */
     54
     55extern DECLCALLBACK(DECLEXPORT(int)) VBoxHGCMSvcLoad(VBOXHGCMSVCFNTABLE *ptable);
     56
    4457# define VBGLR3DECL(type) DECL_HIDDEN_NOTHROW(type) VBOXCALL
    4558
    46 RT_C_DECLS_BEGIN
    47 
    4859/** Simple call handle structure for the guest call completion callback. */
    49 struct VBOXHGCMCALLHANDLE_TYPEDEF
     60typedef struct VBOXHGCMCALLHANDLE_TYPEDEF
    5061{
    5162    /** Where to store the result code on call completion. */
    5263    int32_t rc;
    53 };
     64} VBOXHGCMCALLHANDLE_TYPEDEF;
    5465
    5566/**
     
    6576} TSTHGCMMOCKFNTYPE;
    6677
    67 /** Forward declaration of the HGCM mock service. */
    68 struct TSTHGCMMOCKSVC;
     78/** Pointer to a mock HGCM service. */
     79typedef struct TSTHGCMMOCKSVC *PTSTHGCMMOCKSVC;
    6980
    7081/**
     
    7485{
    7586    /** Pointer to to mock service instance this client belongs to. */
    76     TSTHGCMMOCKSVC            *pSvc;
     87    PTSTHGCMMOCKSVC            pSvc;
    7788    /** Assigned HGCM client ID. */
    7889    uint32_t                   idClient;
     
    108119    union
    109120    {
    110         struct
    111         {
    112         } Connect;
    113         struct
    114         {
    115         } Disconnect;
    116121        struct
    117122        {
     
    170175    volatile bool      fShutdown;
    171176} TSTHGCMMOCKSVC;
    172 /** Pointer to a mock HGCM service. */
    173 typedef TSTHGCMMOCKSVC *PTSTHGCMMOCKSVC;
    174177
    175178/** Static HGCM service to mock. */
    176179static TSTHGCMMOCKSVC s_tstHgcmSvc;
    177 
    178180
    179181/*********************************************************************************************************************************
    180182*  Prototypes.                                                                                                                   *
    181183*********************************************************************************************************************************/
    182 DECLINLINE(PTSTHGCMMOCKSVC) tstHgcmMockSvcInst(void);
     184PTSTHGCMMOCKSVC    TstHgcmMockSvcInst(void);
     185PTSTHGCMMOCKCLIENT TstHgcmMockSvcWaitForConnectEx(PTSTHGCMMOCKSVC pSvc, RTMSINTERVAL msTimeout);
     186PTSTHGCMMOCKCLIENT TstHgcmMockSvcWaitForConnect(PTSTHGCMMOCKSVC pSvc);
     187int                TstHgcmMockSvcCreate(PTSTHGCMMOCKSVC pSvc, size_t cbClient);
     188int                TstHgcmMockSvcDestroy(PTSTHGCMMOCKSVC pSvc);
     189int                TstHgcmMockSvcStart(PTSTHGCMMOCKSVC pSvc);
     190int                TstHgcmMockSvcStop(PTSTHGCMMOCKSVC pSvc);
     191
     192int                TstHgcmMockSvcHostCall(PTSTHGCMMOCKSVC pSvc, void *pvService, int32_t function, uint32_t cParms, VBOXHGCMSVCPARM paParms[]);
     193
     194VBGLR3DECL(int)    VbglR3HGCMConnect(const char *pszServiceName, HGCMCLIENTID *pidClient);
     195VBGLR3DECL(int)    VbglR3HGCMDisconnect(HGCMCLIENTID idClient);
     196VBGLR3DECL(int)    VbglR3HGCMCall(PVBGLIOCHGCMCALL pInfo, size_t cbInfo);
     197
    183198
    184199
     
    328343
    329344/* @copydoc VBOXHGCMSVCFNTABLE::pfnHostCall */
    330 static DECLCALLBACK(int) tstHgcmMockSvcHostCall(PTSTHGCMMOCKSVC pSvc, void *pvService, int32_t function, uint32_t cParms, VBOXHGCMSVCPARM paParms[])
     345/** Note: Public for also being able to test host calls via testcases. */
     346int TstHgcmMockSvcHostCall(PTSTHGCMMOCKSVC pSvc, void *pvService, int32_t function, uint32_t cParms, VBOXHGCMSVCPARM paParms[])
    331347{
    332348    RT_NOREF(pvService);
     
    371387static DECLCALLBACK(int) tstHgcmMockSvcCallComplete(VBOXHGCMCALLHANDLE callHandle, int32_t rc)
    372388{
    373     PTSTHGCMMOCKSVC pSvc = tstHgcmMockSvcInst();
     389    PTSTHGCMMOCKSVC pSvc = TstHgcmMockSvcInst();
    374390
    375391    for (size_t i = 0; RT_ELEMENTS(pSvc->aHgcmClient); i++)
     
    501517 * @return Pointer to HGCM mock service instance.
    502518 */
    503 DECLINLINE(PTSTHGCMMOCKSVC) tstHgcmMockSvcInst(void)
     519PTSTHGCMMOCKSVC TstHgcmMockSvcInst(void)
    504520{
    505521    return &s_tstHgcmSvc;
     
    507523
    508524/**
    509  * Waits for a HGCM mock client to connect.
     525 * Waits for a HGCM mock client to connect, extended version.
    510526 *
    511527 * @return VBox status code.
    512528 * @param  pSvc                 HGCM mock service instance.
    513  */
    514 static PTSTHGCMMOCKCLIENT tstHgcmMockSvcWaitForConnect(PTSTHGCMMOCKSVC pSvc)
    515 {
    516     int rc = RTSemEventWait(pSvc->hEventWait, RT_MS_30SEC);
     529 * @param  msTimeout            Timeout (in ms) to wait for connection.
     530 */
     531PTSTHGCMMOCKCLIENT TstHgcmMockSvcWaitForConnectEx(PTSTHGCMMOCKSVC pSvc, RTMSINTERVAL msTimeout)
     532{
     533    int rc = RTSemEventWait(pSvc->hEventWait, msTimeout);
    517534    if (RT_SUCCESS(rc))
    518535    {
     
    521538    }
    522539    return NULL;
     540}
     541
     542/**
     543 * Waits for a HGCM mock client to connect.
     544 *
     545 * @return VBox status code.
     546 * @param  pSvc                 HGCM mock service instance.
     547 */
     548PTSTHGCMMOCKCLIENT TstHgcmMockSvcWaitForConnect(PTSTHGCMMOCKSVC pSvc)
     549{
     550    return TstHgcmMockSvcWaitForConnectEx(pSvc, RT_MS_30SEC);
    523551}
    524552
     
    531559 *                              allocate for a HGCM mock client.
    532560 */
    533 static int tstHgcmMockSvcCreate(PTSTHGCMMOCKSVC pSvc, size_t cbClient)
     561int TstHgcmMockSvcCreate(PTSTHGCMMOCKSVC pSvc, size_t cbClient)
    534562{
    535563    AssertReturn(cbClient, VERR_INVALID_PARAMETER);
     
    562590 * @param  pSvc                 HGCM mock service instance to destroy.
    563591 */
    564 static int tstHgcmMockSvcDestroy(PTSTHGCMMOCKSVC pSvc)
     592int TstHgcmMockSvcDestroy(PTSTHGCMMOCKSVC pSvc)
    565593{
    566594    int rc = RTSemEventDestroy(pSvc->hEventQueue);
     
    580608 * @param  pSvc                 HGCM mock service instance to start.
    581609 */
    582 static int tstHgcmMockSvcStart(PTSTHGCMMOCKSVC pSvc)
     610int TstHgcmMockSvcStart(PTSTHGCMMOCKSVC pSvc)
    583611{
    584612    int rc = RTThreadCreate(&pSvc->hThread, tstHgcmMockSvcThread, pSvc, 0, RTTHREADTYPE_DEFAULT, RTTHREADFLAGS_WAITABLE,
     
    596624 * @param  pSvc                 HGCM mock service instance to stop.
    597625 */
    598 static int tstHgcmMockSvcStop(PTSTHGCMMOCKSVC pSvc)
     626int TstHgcmMockSvcStop(PTSTHGCMMOCKSVC pSvc)
    599627{
    600628    ASMAtomicWriteBool(&pSvc->fShutdown, true);
     
    629657    RT_NOREF(pszServiceName);
    630658
    631     PTSTHGCMMOCKSVC pSvc = tstHgcmMockSvcInst();
     659    PTSTHGCMMOCKSVC pSvc = TstHgcmMockSvcInst();
    632660
    633661    return tstHgcmMockSvcConnect(pSvc, pSvc->fnTable.pvService, pidClient);
     
    642670VBGLR3DECL(int) VbglR3HGCMDisconnect(HGCMCLIENTID idClient)
    643671{
    644     PTSTHGCMMOCKSVC pSvc = tstHgcmMockSvcInst();
     672    PTSTHGCMMOCKSVC pSvc = TstHgcmMockSvcInst();
    645673
    646674    return tstHgcmMockSvcDisconnect(pSvc, pSvc->fnTable.pvService, idClient);
     
    698726    }
    699727
    700     PTSTHGCMMOCKSVC const pSvc = tstHgcmMockSvcInst();
     728    PTSTHGCMMOCKSVC const pSvc = TstHgcmMockSvcInst();
    701729
    702730    int rc2 = tstHgcmMockSvcCall(pSvc, pSvc->fnTable.pvService, &pSvc->aHgcmClient[pInfo->u32ClientID].hCall,
     
    743771}
    744772
     773#endif /* IN_RING3 */
     774
    745775RT_C_DECLS_END
     776
     777#endif /* !VBOX_INCLUDED_HGCMMock_h */
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette