VirtualBox

Changeset 102884 in vbox for trunk/src


Ignore:
Timestamp:
Jan 16, 2024 8:25:22 AM (13 months ago)
Author:
vboxsync
Message:

Runtime/tstRTSg: Use a deterministic random number generator and print the used seed so there is an actual chance to debug testcase failures

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/testcase/tstRTSg.cpp

    r101753 r102884  
    4545#include <iprt/string.h>
    4646#include <iprt/test.h>
     47#include <iprt/time.h>
    4748
    4849
     
    108109
    109110
    110 static PRTSGBUF createRandBuffer(unsigned cMaxSegs, size_t cbMin, size_t cbMax, bool fAllowZeroSegs, size_t *pcbTotal)
     111static PRTSGBUF createRandBuffer(RTRAND hRnd, unsigned cMaxSegs, size_t cbMin, size_t cbMax, bool fAllowZeroSegs, size_t *pcbTotal)
    111112{
    112     unsigned const cSegs   = RTRandU32Ex(1, cMaxSegs);
    113     size_t const   cbTotal = (size_t)RTRandU64Ex(RT_MAX(cbMin, fAllowZeroSegs ? 1 : cSegs), cbMax);
     113    unsigned const cSegs   = RTRandAdvU32Ex(hRnd, 1, cMaxSegs);
     114    size_t const   cbTotal = (size_t)RTRandAdvU64Ex(hRnd, RT_MAX(cbMin, fAllowZeroSegs ? 1 : cSegs), cbMax);
    114115    PRTSGBUF       pSgBuf  = (PRTSGBUF)RTMemAlloc(cSegs * sizeof(RTSGSEG) + sizeof(*pSgBuf) + cbTotal);
    115116    if (pSgBuf)
     
    117118        PRTSGSEG   paSegs   = (PRTSGSEG)(pSgBuf + 1);
    118119        uint8_t   *pbBytes  = (uint8_t *)&paSegs[cSegs];
    119         RTRandBytes(pbBytes, cbTotal);
     120        RTRandAdvBytes(hRnd, pbBytes, cbTotal);
    120121
    121122        size_t     cbLeft   = cbTotal;
     
    123124        for (idxSeg = 0; idxSeg < cSegs - 1; idxSeg++)
    124125        {
    125             size_t const cbSeg = cbLeft ? (size_t)RTRandU64Ex(fAllowZeroSegs ? 0 : 1, cbLeft) : 0;
     126            size_t const cbSeg = cbLeft ? (size_t)RTRandAdvU64Ex(hRnd, fAllowZeroSegs ? 0 : 1, cbLeft) : 0;
    126127            paSegs[idxSeg].cbSeg = cbSeg;
    127128            paSegs[idxSeg].pvSeg = pbBytes;
     
    148149    RTTestSub(g_hTest, "basics");
    149150
     151    RTRAND hRnd;
     152    int rc = RTRandAdvCreateParkMiller(&hRnd);
     153    RTTESTI_CHECK_RC(rc, VINF_SUCCESS);
     154    if (RT_FAILURE(rc))
     155        return;
     156
     157    uint64_t u64Seed = RTTimeSystemNanoTS();
     158    rc = RTRandAdvSeed(hRnd, u64Seed);
     159    RTTESTI_CHECK_RC(rc, VINF_SUCCESS);
     160    if (RT_FAILURE(rc))
     161    {
     162        RTRandAdvDestroy(hRnd);
     163        return;
     164    }
     165    RTTestIPrintf(RTTESTLVL_ALWAYS, "Seed: %#RX64\n", u64Seed);
     166
    150167    for (unsigned iBufVar = 0; iBufVar < 64; iBufVar++)
    151168    {
    152169        size_t   cbSgBuf1;
    153         PRTSGBUF pSgBuf1 = createRandBuffer(16, 32, _1M, true, &cbSgBuf1);
     170        PRTSGBUF pSgBuf1 = createRandBuffer(hRnd, 16, 32, _1M, true, &cbSgBuf1);
    154171        RTTESTI_CHECK_RETV(pSgBuf1);
    155172
     
    164181            while (cbLeft > 0)
    165182            {
    166                 size_t cbToAdv = (size_t)RTRandU64Ex(0, iRun & 1 ? cbSgBuf1 * 2 : cbLeft);
     183                size_t cbToAdv = (size_t)RTRandAdvU64Ex(hRnd, 0, iRun & 1 ? cbSgBuf1 * 2 : cbLeft);
    167184                size_t cbActual = RTSgBufAdvance(pSgBuf1, cbToAdv);
    168185                RTTESTI_CHECK(cbActual <= cbToAdv);
     
    197214            if (iRun > 1)
    198215            {
    199                 size_t const cbInitial = (size_t)RTRandU64Ex(iRun, cbSgBuf1);
     216                size_t const cbInitial = (size_t)RTRandAdvU64Ex(hRnd, iRun, cbSgBuf1);
    200217                size_t cbAdvanced = RTSgBufAdvance(pSgBuf1, cbInitial);
    201                 RTTESTI_CHECK_MSG(cbAdvanced == cbInitial, ("cbAdvanced=%zu, cbInitial=%zu\n", cbAdvanced, cbInitial));
     218                RTTESTI_CHECK_MSG(cbAdvanced == cbInitial, ("iBufVar=%u iRun=%u cbAdvanced=%zu, cbInitial=%zu\n", iBufVar, iRun, cbAdvanced, cbInitial));
    202219                /* should probably print part of pSgBuf1 values... */
    203220                cbLeft -= cbInitial;
     
    222239
    223240        /* Copy out of the S/G buffer and into a flat buffer w/ electric guard page: */
    224         bool const fHead = RTRandU32Ex(0, 1) == 0;
     241        bool const fHead = RTRandAdvU32Ex(hRnd, 0, 1) == 0;
    225242        void *pvTmp = NULL;
    226         int rc = RTTestGuardedAlloc(g_hTest, cbSgBuf1, 1, fHead, &pvTmp);
     243        rc = RTTestGuardedAlloc(g_hTest, cbSgBuf1, 1, fHead, &pvTmp);
    227244        RTTESTI_CHECK_RC(rc, VINF_SUCCESS);
    228245        if (RT_SUCCESS(rc))
     
    236253                if (iRun > 1)
    237254                {
    238                     cbInitial = (size_t)RTRandU64Ex(iRun, cbSgBuf1);
     255                    cbInitial = (size_t)RTRandAdvU64Ex(hRnd, iRun, cbSgBuf1);
    239256                    size_t cbAdvanced = RTSgBufAdvance(pSgBuf1, cbInitial);
    240257                    RTTESTI_CHECK_MSG(cbAdvanced == cbInitial, ("cbAdvanced=%zu, cbInitial=%zu\n",
     
    245262                size_t cbToCopy = cbLeft;
    246263                if (iRun  > _1K / 4 * 3)
    247                     cbToCopy = (size_t)RTRandU64Ex(0, iRun & 1 ? cbToCopy : cbSgBuf1);
     264                    cbToCopy = (size_t)RTRandAdvU64Ex(hRnd, 0, iRun & 1 ? cbToCopy : cbSgBuf1);
    248265
    249266                uint8_t *pbDst = (uint8_t *)pvTmp;
     
    268285        RTMemFree(pSgBuf1);
    269286    }
     287
     288    rc = RTRandAdvDestroy(hRnd);
     289    RTTESTI_CHECK_RC(rc, VINF_SUCCESS);
    270290}
    271291
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