File indexing completed on 2025-02-16 04:37:45

0001 /*
0002     SPDX-FileCopyrightText: 2010 Joris Guisson <joris.guisson@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include <QObject>
0008 #include <QRandomGenerator>
0009 #include <QtTest>
0010 
0011 #include <ctime>
0012 
0013 #include <util/circularbuffer.h>
0014 #include <util/log.h>
0015 #include <util/pipe.h>
0016 
0017 using namespace bt;
0018 
0019 class CircularBufferTest : public QEventLoop
0020 {
0021     Q_OBJECT
0022 public:
0023 private Q_SLOTS:
0024     void initTestCase()
0025     {
0026         memset(data, 0xFF, 13);
0027         memset(data2, 0xEE, 6);
0028     }
0029 
0030     void cleanupTestCase()
0031     {
0032     }
0033 
0034     void testWrite()
0035     {
0036         bt::CircularBuffer wnd(20);
0037         QVERIFY(wnd.capacity() == 20);
0038         QVERIFY(wnd.size() == 0);
0039 
0040         QVERIFY(wnd.write(data, 13) == 13);
0041         QVERIFY(wnd.size() == 13);
0042 
0043         QVERIFY(wnd.write(data2, 6) == 6);
0044         QVERIFY(wnd.size() == 19);
0045 
0046         QVERIFY(wnd.write(data2, 6) == 1);
0047         QVERIFY(wnd.size() == 20);
0048     }
0049 
0050     void testRead()
0051     {
0052         bt::CircularBuffer wnd(20);
0053         QVERIFY(wnd.capacity() == 20);
0054         QVERIFY(wnd.write(data, 13) == 13);
0055         QVERIFY(wnd.write(data2, 6) == 6);
0056 
0057         bt::Uint8 ret[19];
0058         QVERIFY(wnd.read(ret, 19) == 19);
0059         QVERIFY(wnd.size() == 0);
0060         QVERIFY(memcmp(ret, data, 13) == 0);
0061         QVERIFY(memcmp(ret + 13, data2, 6) == 0);
0062 
0063         QVERIFY(wnd.write(data, 13) == 13);
0064         QVERIFY(wnd.size() == 13);
0065 
0066         QVERIFY(wnd.write(data2, 6) == 6);
0067         QVERIFY(wnd.size() == 19);
0068 
0069         QVERIFY(wnd.read(ret, 19) == 19);
0070         QVERIFY(wnd.size() == 0);
0071         QVERIFY(memcmp(ret, data, 13) == 0);
0072         QVERIFY(memcmp(ret + 13, data2, 6) == 0);
0073     }
0074 
0075     void testIntensively()
0076     {
0077         CircularBuffer cbuf(20);
0078 
0079         for (int i = 0; i < 1000; i++) {
0080             Uint32 r = 1 + QRandomGenerator::global()->bounded(20);
0081             Uint32 expected = r;
0082             if (expected + cbuf.size() >= 20)
0083                 expected = 20 - cbuf.size();
0084 
0085             QVERIFY(cbuf.write(data, r) == expected);
0086 
0087             bt::Uint8 ret[20];
0088             memset(ret, 0, 20);
0089             r = 1 + QRandomGenerator::global()->bounded(20);
0090             expected = qMin(r, cbuf.size());
0091             QVERIFY(cbuf.read(ret, expected) == expected);
0092         }
0093     }
0094 
0095     void testErrors()
0096     {
0097         CircularBuffer cbuf(20);
0098         bt::Uint8 too_much[40];
0099         QVERIFY(cbuf.write(too_much, 40) == 20);
0100         QVERIFY(cbuf.write(too_much, 40) == 0);
0101     }
0102 
0103 private:
0104     bt::Uint8 data[13];
0105     bt::Uint8 data2[6];
0106 };
0107 
0108 QTEST_MAIN(CircularBufferTest)
0109 
0110 #include "circularbuffertest.moc"