84d86b6582f583d8f79920843e87d0589816fcd3vboxsync/* $Id$ */
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync/** @file
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync *
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync * Output stream parsing test cases.
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync */
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync/*
c7814cf6e1240a519cbec0441e033d0e2470ed00vboxsync * Copyright (C) 2011-2012 Oracle Corporation
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync *
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync * available from http://www.virtualbox.org. This file is free software;
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync * you can redistribute it and/or modify it under the terms of the GNU
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync * General Public License (GPL) as published by the Free Software
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync */
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync
2c338d90d2e97e357ab12f4e31aecf7ac8782748vboxsync#define LOG_ENABLED
2c338d90d2e97e357ab12f4e31aecf7ac8782748vboxsync#define LOG_GROUP LOG_GROUP_MAIN
2c338d90d2e97e357ab12f4e31aecf7ac8782748vboxsync#define LOG_INSTANCE NULL
2c338d90d2e97e357ab12f4e31aecf7ac8782748vboxsync#include <VBox/log.h>
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync
c5049e597080f2a132a663467e6048a6b2826e9dvboxsync#include "../include/GuestCtrlImplPrivate.h"
c5049e597080f2a132a663467e6048a6b2826e9dvboxsync
c5049e597080f2a132a663467e6048a6b2826e9dvboxsyncusing namespace com;
c5049e597080f2a132a663467e6048a6b2826e9dvboxsync
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync#include <iprt/env.h>
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync#include <iprt/test.h>
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync#include <iprt/stream.h>
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync
bc626ccdbb077b0b1c82484b5d1ef12002b02b46vboxsync#ifndef BYTE
bc626ccdbb077b0b1c82484b5d1ef12002b02b46vboxsync# define BYTE uint8_t
bc626ccdbb077b0b1c82484b5d1ef12002b02b46vboxsync#endif
bc626ccdbb077b0b1c82484b5d1ef12002b02b46vboxsync
84d86b6582f583d8f79920843e87d0589816fcd3vboxsynctypedef struct VBOXGUESTCTRL_BUFFER_VALUE
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync{
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync char *pszValue;
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync} VBOXGUESTCTRL_BUFFER_VALUE, *PVBOXGUESTCTRL_BUFFER_VALUE;
154ed29e9462101350c438a9ace34cb60d92e56fvboxsynctypedef std::map< RTCString, VBOXGUESTCTRL_BUFFER_VALUE > GuestBufferMap;
154ed29e9462101350c438a9ace34cb60d92e56fvboxsynctypedef std::map< RTCString, VBOXGUESTCTRL_BUFFER_VALUE >::iterator GuestBufferMapIter;
154ed29e9462101350c438a9ace34cb60d92e56fvboxsynctypedef std::map< RTCString, VBOXGUESTCTRL_BUFFER_VALUE >::const_iterator GuestBufferMapIterConst;
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync
99ca608baa061219892d090d8d68b013ef73e7c3vboxsyncchar szUnterm1[] = { 'a', 's', 'd', 'f' };
99ca608baa061219892d090d8d68b013ef73e7c3vboxsyncchar szUnterm2[] = { 'f', 'o', 'o', '3', '=', 'b', 'a', 'r', '3' };
154ed29e9462101350c438a9ace34cb60d92e56fvboxsync
84d86b6582f583d8f79920843e87d0589816fcd3vboxsyncstatic struct
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync{
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync const char *pbData;
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync size_t cbData;
bc626ccdbb077b0b1c82484b5d1ef12002b02b46vboxsync uint32_t uOffsetStart;
bc626ccdbb077b0b1c82484b5d1ef12002b02b46vboxsync uint32_t uOffsetAfter;
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync uint32_t uMapElements;
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync int iResult;
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync} aTestBlock[] =
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync{
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync /*
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync * Single object parsing.
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync * An object is represented by one or multiple key=value pairs which are
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync * separated by a single "\0". If this termination is missing it will be assumed
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync * that we need to collect more data to do a successful parsing.
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync */
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync /* Invalid stuff. */
8782e654b5a355600d165b6e0bb761b8f4e769fdvboxsync { NULL, 0, 0, 0, 0, VERR_INVALID_POINTER },
8782e654b5a355600d165b6e0bb761b8f4e769fdvboxsync { NULL, 512, 0, 0, 0, VERR_INVALID_POINTER },
8782e654b5a355600d165b6e0bb761b8f4e769fdvboxsync { "", 0, 0, 0, 0, VERR_INVALID_PARAMETER },
8782e654b5a355600d165b6e0bb761b8f4e769fdvboxsync { "", 0, 0, 0, 0, VERR_INVALID_PARAMETER },
8782e654b5a355600d165b6e0bb761b8f4e769fdvboxsync { "foo=bar1", 0, 0, 0, 0, VERR_INVALID_PARAMETER },
8782e654b5a355600d165b6e0bb761b8f4e769fdvboxsync { "foo=bar2", 0, 50, 50, 0, VERR_INVALID_PARAMETER },
8782e654b5a355600d165b6e0bb761b8f4e769fdvboxsync /* Empty buffers. */
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync { "", 1, 0, 1, 0, VINF_SUCCESS },
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync { "\0", 1, 0, 1, 0, VINF_SUCCESS },
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync /* Unterminated values (missing "\0"). */
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync { "test1", sizeof("test1"), 0, 0, 0, VERR_MORE_DATA },
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync { "test2=", sizeof("test2="), 0, 0, 0, VERR_MORE_DATA },
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync { "test3=test3", sizeof("test3=test3"), 0, 0, 0, VERR_MORE_DATA },
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync { "test4=test4\0t41", sizeof("test4=test4\0t41"), 0, sizeof("test4=test4\0") - 1, 1, VERR_MORE_DATA },
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync { "test5=test5\0t51=t51", sizeof("test5=test5\0t51=t51"), 0, sizeof("test5=test5\0") - 1, 1, VERR_MORE_DATA },
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync /* Next block unterminated. */
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync { "t51=t51\0t52=t52\0\0t53=t53", sizeof("t51=t51\0t52=t52\0\0t53=t53"), 0, sizeof("t51=t51\0t52=t52\0") - 1, 2, VINF_SUCCESS },
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync { "test6=test6\0\0t61=t61", sizeof("test6=test6\0\0t61=t61"), 0, sizeof("test6=test6\0") - 1, 1, VINF_SUCCESS },
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync /* Good stuff. */
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync { "test61=\0test611=test611\0", sizeof("test61=\0test611=test611\0"), 0, sizeof("test61=\0test611=test611\0") - 1, 2, VINF_SUCCESS },
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync { "test7=test7\0\0", sizeof("test7=test7\0\0"), 0, sizeof("test7=test7\0") - 1, 1, VINF_SUCCESS },
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync { "test8=test8\0t81=t81\0\0", sizeof("test8=test8\0t81=t81\0\0"), 0, sizeof("test8=test8\0t81=t81\0") - 1, 2, VINF_SUCCESS },
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync /* Good stuff, but with a second block -- should be *not* taken into account since
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync * we're only interested in parsing/handling the first object. */
396ad8a2e743a2181c333d433b303ff25f7d11a6vboxsync { "t9=t9\0t91=t91\0\0t92=t92\0\0", sizeof("t9=t9\0t91=t91\0\0t92=t92\0\0"), 0, sizeof("t9=t9\0t91=t91\0") - 1, 2, VINF_SUCCESS },
0996fd788d333737b874067040e4e373dd925077vboxsync /* Nasty stuff. */
0996fd788d333737b874067040e4e373dd925077vboxsync { "���=f��\0\0", sizeof("���=f��\0\0"), 0, sizeof("���=f��\0") - 1, 1, VINF_SUCCESS },
0996fd788d333737b874067040e4e373dd925077vboxsync { "���=f��\0���=���", sizeof("���=f��\0���=���"), 0, sizeof("���=f��\0") - 1, 1, VERR_MORE_DATA },
396ad8a2e743a2181c333d433b303ff25f7d11a6vboxsync /* Some "real world" examples. */
396ad8a2e743a2181c333d433b303ff25f7d11a6vboxsync { "hdr_id=vbt_stat\0hdr_ver=1\0name=foo.txt\0\0",
396ad8a2e743a2181c333d433b303ff25f7d11a6vboxsync sizeof("hdr_id=vbt_stat\0hdr_ver=1\0name=foo.txt\0\0"),
0996fd788d333737b874067040e4e373dd925077vboxsync 0, sizeof("hdr_id=vbt_stat\0hdr_ver=1\0name=foo.txt\0") - 1,
396ad8a2e743a2181c333d433b303ff25f7d11a6vboxsync 3, VINF_SUCCESS }
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync};
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync
99ca608baa061219892d090d8d68b013ef73e7c3vboxsyncstatic struct
99ca608baa061219892d090d8d68b013ef73e7c3vboxsync{
99ca608baa061219892d090d8d68b013ef73e7c3vboxsync const char *pbData;
99ca608baa061219892d090d8d68b013ef73e7c3vboxsync size_t cbData;
99ca608baa061219892d090d8d68b013ef73e7c3vboxsync /** Number of data blocks retrieved. These are separated by "\0\0". */
99ca608baa061219892d090d8d68b013ef73e7c3vboxsync uint32_t uNumBlocks;
99ca608baa061219892d090d8d68b013ef73e7c3vboxsync /** Overall result when done parsing. */
99ca608baa061219892d090d8d68b013ef73e7c3vboxsync int iResult;
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync} aTestStream[] =
99ca608baa061219892d090d8d68b013ef73e7c3vboxsync{
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync /* No blocks. */
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync { "\0\0\0\0", sizeof("\0\0\0\0"), 0, VERR_NO_DATA },
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync /* Good stuff. */
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync { "\0b1=b1\0\0", sizeof("\0b1=b1\0\0"), 1, VERR_NO_DATA },
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync { "b1=b1\0\0", sizeof("b1=b1\0\0"), 1, VERR_NO_DATA },
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync { "b1=b1\0b2=b2\0\0", sizeof("b1=b1\0b2=b2\0\0"), 1, VERR_NO_DATA },
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync { "b1=b1\0b2=b2\0\0\0", sizeof("b1=b1\0b2=b2\0\0\0"), 1, VERR_NO_DATA }
99ca608baa061219892d090d8d68b013ef73e7c3vboxsync};
99ca608baa061219892d090d8d68b013ef73e7c3vboxsync
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsyncint manualTest()
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync{
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync int rc;
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync static struct
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync {
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync const char *pbData;
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync size_t cbData;
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync uint32_t uOffsetStart;
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync uint32_t uOffsetAfter;
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync uint32_t uMapElements;
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync int iResult;
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync } aTest[] =
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync {
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync { "test5=test5\0t51=t51", sizeof("test5=test5\0t51=t51"), 0, sizeof("test5=test5\0") - 1, 1, VERR_MORE_DATA },
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync { "\0\0test5=test5\0t51=t51", sizeof("\0\0test5=test5\0t51=t51"), 0, sizeof("\0\0test5=test5\0") - 1, 1, VERR_MORE_DATA },
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync };
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync
ba0d723785d91133361ecef138f1198fe5fbfd26vboxsync unsigned iTest = 0;
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync for (iTest; iTest < RT_ELEMENTS(aTest); iTest++)
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync {
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync RTTestIPrintf(RTTESTLVL_DEBUG, "Manual test #%d\n", iTest);
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync GuestProcessStream stream;
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync rc = stream.AddData((BYTE*)aTest[iTest].pbData, aTest[iTest].cbData);
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync for (;;)
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync {
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync GuestProcessStreamBlock block;
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync rc = stream.ParseBlock(block);
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync RTTestIPrintf(RTTESTLVL_DEBUG, "\tReturned with rc=%Rrc, numItems=%ld\n",
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync rc, block.GetCount());
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync if (block.GetCount())
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync break;
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync }
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync }
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync return rc;
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync}
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync
84d86b6582f583d8f79920843e87d0589816fcd3vboxsyncint main()
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync{
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync RTTEST hTest;
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync int rc = RTTestInitAndCreate("tstParseBuffer", &hTest);
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync if (rc)
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync return rc;
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync RTTestBanner(hTest);
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync
8c1f2405e07844f5079af0df14d67b7f8abbefb9vboxsync RTTestIPrintf(RTTESTLVL_DEBUG, "Initializing COM...\n");
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync HRESULT hrc = com::Initialize();
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync if (FAILED(hrc))
2c338d90d2e97e357ab12f4e31aecf7ac8782748vboxsync {
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync RTTestFailed(hTest, "Failed to initialize COM (%Rhrc)!\n", hrc);
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync return RTEXITCODE_FAILURE;
2c338d90d2e97e357ab12f4e31aecf7ac8782748vboxsync }
2c338d90d2e97e357ab12f4e31aecf7ac8782748vboxsync
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync#ifdef DEBUG_andy
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync rc = manualTest();
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync#endif
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync
99ca608baa061219892d090d8d68b013ef73e7c3vboxsync RTTestIPrintf(RTTESTLVL_INFO, "Doing basic tests ...\n");
99ca608baa061219892d090d8d68b013ef73e7c3vboxsync
bc626ccdbb077b0b1c82484b5d1ef12002b02b46vboxsync if (sizeof("sizecheck") != 10)
8782e654b5a355600d165b6e0bb761b8f4e769fdvboxsync RTTestFailed(hTest, "Basic size test #1 failed (%u <-> 10)", sizeof("sizecheck"));
8782e654b5a355600d165b6e0bb761b8f4e769fdvboxsync if (sizeof("off=rab") != 8)
8782e654b5a355600d165b6e0bb761b8f4e769fdvboxsync RTTestFailed(hTest, "Basic size test #2 failed (%u <-> 7)", sizeof("off=rab"));
8782e654b5a355600d165b6e0bb761b8f4e769fdvboxsync if (sizeof("off=rab\0\0") != 10)
8782e654b5a355600d165b6e0bb761b8f4e769fdvboxsync RTTestFailed(hTest, "Basic size test #3 failed (%u <-> 10)", sizeof("off=rab\0\0"));
bc626ccdbb077b0b1c82484b5d1ef12002b02b46vboxsync
99ca608baa061219892d090d8d68b013ef73e7c3vboxsync RTTestIPrintf(RTTESTLVL_INFO, "Doing line tests ...\n");
99ca608baa061219892d090d8d68b013ef73e7c3vboxsync
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync /* Don't let the assertions trigger here
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync * -- we rely on the return values in the test(s) below. */
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync RTAssertSetQuiet(true);
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync
8782e654b5a355600d165b6e0bb761b8f4e769fdvboxsync unsigned iTest = 0;
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync for (iTest; iTest < RT_ELEMENTS(aTestBlock); iTest++)
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync {
bc626ccdbb077b0b1c82484b5d1ef12002b02b46vboxsync RTTestIPrintf(RTTESTLVL_DEBUG, "=> Test #%u\n", iTest);
bc626ccdbb077b0b1c82484b5d1ef12002b02b46vboxsync
2c338d90d2e97e357ab12f4e31aecf7ac8782748vboxsync GuestProcessStream stream;
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync int iResult = stream.AddData((BYTE*)aTestBlock[iTest].pbData, aTestBlock[iTest].cbData);
8c1f2405e07844f5079af0df14d67b7f8abbefb9vboxsync if (RT_SUCCESS(iResult))
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync {
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync GuestProcessStreamBlock curBlock;
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync iResult = stream.ParseBlock(curBlock);
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync if (iResult != aTestBlock[iTest].iResult)
8c1f2405e07844f5079af0df14d67b7f8abbefb9vboxsync {
687794577e2e35c3cae67e692a7f2130d1262a82vboxsync RTTestFailed(hTest, "\tReturned %Rrc, expected %Rrc\n",
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync iResult, aTestBlock[iTest].iResult);
8c1f2405e07844f5079af0df14d67b7f8abbefb9vboxsync }
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync else if (stream.GetOffset() != aTestBlock[iTest].uOffsetAfter)
8c1f2405e07844f5079af0df14d67b7f8abbefb9vboxsync {
687794577e2e35c3cae67e692a7f2130d1262a82vboxsync RTTestFailed(hTest, "\tOffset %u wrong, expected %u\n",
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync stream.GetOffset(), aTestBlock[iTest].uOffsetAfter);
8c1f2405e07844f5079af0df14d67b7f8abbefb9vboxsync }
8c1f2405e07844f5079af0df14d67b7f8abbefb9vboxsync else if (iResult == VERR_MORE_DATA)
bc626ccdbb077b0b1c82484b5d1ef12002b02b46vboxsync {
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync RTTestIPrintf(RTTESTLVL_DEBUG, "\tMore data (Offset: %u)\n", stream.GetOffset());
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync }
8c1f2405e07844f5079af0df14d67b7f8abbefb9vboxsync
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync if ( ( RT_SUCCESS(iResult)
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync || iResult == VERR_MORE_DATA))
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync {
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync if (curBlock.GetCount() != aTestBlock[iTest].uMapElements)
8c1f2405e07844f5079af0df14d67b7f8abbefb9vboxsync {
687794577e2e35c3cae67e692a7f2130d1262a82vboxsync RTTestFailed(hTest, "\tMap has %u elements, expected %u\n",
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync curBlock.GetCount(), aTestBlock[iTest].uMapElements);
8c1f2405e07844f5079af0df14d67b7f8abbefb9vboxsync }
bc626ccdbb077b0b1c82484b5d1ef12002b02b46vboxsync }
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync /* There is remaining data left in the buffer (which needs to be merged
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync * with a following buffer) -- print it. */
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync uint32_t uOffset = stream.GetOffset();
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync size_t uToWrite = aTestBlock[iTest].cbData - uOffset;
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync if (uToWrite)
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync {
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync const char *pszRemaining = aTestBlock[iTest].pbData;
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync RTTestIPrintf(RTTESTLVL_DEBUG, "\tRemaining (%u):\n", uToWrite);
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync /* How to properly get the current RTTESTLVL (aka IPRT_TEST_MAX_LEVEL) here?
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync * Hack alert: Using RTEnvGet for now. */
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync if (!RTStrICmp(RTEnvGet("IPRT_TEST_MAX_LEVEL"), "debug"))
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync RTStrmWriteEx(g_pStdOut, &aTestBlock[iTest].pbData[uOffset], uToWrite - 1, NULL);
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync }
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync }
99ca608baa061219892d090d8d68b013ef73e7c3vboxsync }
99ca608baa061219892d090d8d68b013ef73e7c3vboxsync
99ca608baa061219892d090d8d68b013ef73e7c3vboxsync RTTestIPrintf(RTTESTLVL_INFO, "Doing block tests ...\n");
99ca608baa061219892d090d8d68b013ef73e7c3vboxsync
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync iTest = 0;
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync for (iTest; iTest < RT_ELEMENTS(aTestStream); iTest++)
99ca608baa061219892d090d8d68b013ef73e7c3vboxsync {
99ca608baa061219892d090d8d68b013ef73e7c3vboxsync RTTestIPrintf(RTTESTLVL_DEBUG, "=> Block test #%u\n", iTest);
99ca608baa061219892d090d8d68b013ef73e7c3vboxsync
2c338d90d2e97e357ab12f4e31aecf7ac8782748vboxsync GuestProcessStream stream;
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync int iResult = stream.AddData((BYTE*)aTestStream[iTest].pbData, aTestStream[iTest].cbData);
2c338d90d2e97e357ab12f4e31aecf7ac8782748vboxsync if (RT_SUCCESS(iResult))
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync {
2c338d90d2e97e357ab12f4e31aecf7ac8782748vboxsync uint32_t uNumBlocks = 0;
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync uint8_t uSafeCouunter = 0;
2c338d90d2e97e357ab12f4e31aecf7ac8782748vboxsync do
99ca608baa061219892d090d8d68b013ef73e7c3vboxsync {
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync GuestProcessStreamBlock curBlock;
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync iResult = stream.ParseBlock(curBlock);
8c1f2405e07844f5079af0df14d67b7f8abbefb9vboxsync RTTestIPrintf(RTTESTLVL_DEBUG, "\tReturned with %Rrc\n", iResult);
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync if (RT_SUCCESS(iResult))
8c1f2405e07844f5079af0df14d67b7f8abbefb9vboxsync {
8c1f2405e07844f5079af0df14d67b7f8abbefb9vboxsync /* Only count block which have at least one pair. */
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync if (curBlock.GetCount())
8c1f2405e07844f5079af0df14d67b7f8abbefb9vboxsync uNumBlocks++;
8c1f2405e07844f5079af0df14d67b7f8abbefb9vboxsync }
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync if (uSafeCouunter++ > 32)
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync break;
26cec6aa441d34334499fc3ccca7bd9db04adde6vboxsync } while (RT_SUCCESS(iResult));
99ca608baa061219892d090d8d68b013ef73e7c3vboxsync
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync if (iResult != aTestStream[iTest].iResult)
2c338d90d2e97e357ab12f4e31aecf7ac8782748vboxsync {
687794577e2e35c3cae67e692a7f2130d1262a82vboxsync RTTestFailed(hTest, "\tReturned %Rrc, expected %Rrc\n",
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync iResult, aTestStream[iTest].iResult);
2c338d90d2e97e357ab12f4e31aecf7ac8782748vboxsync }
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync else if (uNumBlocks != aTestStream[iTest].uNumBlocks)
2c338d90d2e97e357ab12f4e31aecf7ac8782748vboxsync {
2c338d90d2e97e357ab12f4e31aecf7ac8782748vboxsync RTTestFailed(hTest, "\tReturned %u blocks, expected %u\n",
e8585c2453d47913a762ede88f7818c766e2f1c3vboxsync uNumBlocks, aTestStream[iTest].uNumBlocks);
99ca608baa061219892d090d8d68b013ef73e7c3vboxsync }
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync }
2c338d90d2e97e357ab12f4e31aecf7ac8782748vboxsync else
2c338d90d2e97e357ab12f4e31aecf7ac8782748vboxsync RTTestFailed(hTest, "\tAdding data failed with %Rrc", iResult);
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync }
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync
8c1f2405e07844f5079af0df14d67b7f8abbefb9vboxsync RTTestIPrintf(RTTESTLVL_DEBUG, "Shutting down COM...\n");
2c338d90d2e97e357ab12f4e31aecf7ac8782748vboxsync com::Shutdown();
2c338d90d2e97e357ab12f4e31aecf7ac8782748vboxsync
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync /*
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync * Summary.
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync */
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync return RTTestSummaryAndDestroy(hTest);
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync}
84d86b6582f583d8f79920843e87d0589816fcd3vboxsync