diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2016-08-11 10:08:21 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2016-08-11 20:17:43 +0000 |
commit | 71edf63d457de56740578939a62645ffbc71e040 (patch) | |
tree | 74ec5ed7e9dacec605d1dff7c0a122473a26c367 /tests | |
parent | d6e836de654e6309eaf88d3ba907ab28026ddcb8 (diff) |
HandleManager: do not allow counter to overflow
This could otherwise have happened if an element was acquired and released
repeatedly.
Change-Id: I29a327f32fdd9d9a02460bff26c9ff56fdd3dd61
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/core/handlemanager/tst_handlemanager.cpp | 102 |
1 files changed, 101 insertions, 1 deletions
diff --git a/tests/auto/core/handlemanager/tst_handlemanager.cpp b/tests/auto/core/handlemanager/tst_handlemanager.cpp index a60d3cc57..3198b54a9 100644 --- a/tests/auto/core/handlemanager/tst_handlemanager.cpp +++ b/tests/auto/core/handlemanager/tst_handlemanager.cpp @@ -47,6 +47,7 @@ private slots: void updateChangesValue(); void resetRemovesAllEntries(); void maximumEntries(); + void checkNoCounterOverflow(); }; class SimpleResource @@ -63,61 +64,83 @@ typedef Qt3DCore::QHandle<SimpleResource> Handle; void tst_HandleManager::construction() { + // GIVEN Qt3DCore::QHandleManager<SimpleResource> manager; + + // THEN QVERIFY(manager.activeEntries() == 0); } void tst_HandleManager::correctPointer() { + // GIVEN Qt3DCore::QHandleManager<SimpleResource> manager; SimpleResource *p1 = (SimpleResource *)0xdeadbeef; + + // WHEN const Handle h = manager.acquire(p1); bool ok = false; SimpleResource *p2 = manager.data(h, &ok); + + // THEN QVERIFY(ok == true); QVERIFY(p1 == p2); } void tst_HandleManager::correctPointers() { + // GIVEN Qt3DCore::QHandleManager<SimpleResource> manager; SimpleResource *p[3]; p[0] = (SimpleResource *)0xdeadbeef; p[1] = (SimpleResource *)0x11111111; p[2] = (SimpleResource *)0x22222222; + // WHEN for (int i = 0; i < 3; ++i) { + // WHEN const Handle h = manager.acquire(p[i]); bool ok = false; SimpleResource *q = manager.data(h, &ok); + + // THEN QVERIFY(ok == true); QVERIFY(p[i] == q); } + // THEN QVERIFY(manager.activeEntries() == 3); } void tst_HandleManager::correctConstPointer() { + // GIVEN Qt3DCore::QHandleManager<SimpleResource> manager; QSharedPointer<SimpleResource> p1(new SimpleResource); const Handle h = manager.acquire(p1.data()); + // WHEN bool ok = false; const SimpleResource *p2 = manager.constData(h, &ok); + + // THEN QVERIFY(ok == true); QVERIFY(p1.data() == p2); } void tst_HandleManager::nullForRemovedEntry() { + // GIVEN Qt3DCore::QHandleManager<SimpleResource> manager; QSharedPointer<SimpleResource> p1(new SimpleResource); const Handle h = manager.acquire(p1.data()); + + // WHEN manager.release(h); + // THEN bool ok = false; SimpleResource *p2 = manager.data(h, &ok); QVERIFY(ok == false); @@ -126,44 +149,67 @@ void tst_HandleManager::nullForRemovedEntry() void tst_HandleManager::validHandleForReplacementEntry() { + // GIVEN Qt3DCore::QHandleManager<SimpleResource> manager; QSharedPointer<SimpleResource> p1(new SimpleResource); const Handle h = manager.acquire(p1.data()); + + // THEN QVERIFY(manager.activeEntries() == 1); + + // WHEN manager.release(h); + + // THEN QVERIFY(manager.activeEntries() == 0); + // WHEN QSharedPointer<SimpleResource> p2(new SimpleResource); const Handle h2 = manager.acquire(p2.data()); + + // THEN QVERIFY(h2.isNull() == false); QVERIFY(h2.counter() == 2); QVERIFY(manager.activeEntries() == 1); + // WHEN bool ok = false; SimpleResource *p3 = manager.data(h2, &ok); + + // THEN QVERIFY(ok == true); QVERIFY(p3 == p2); } void tst_HandleManager::updateChangesValue() { + // GIVEN Qt3DCore::QHandleManager<SimpleResource> manager; QSharedPointer<SimpleResource> p1(new SimpleResource); const Handle h = manager.acquire(p1.data()); + // WHEN QSharedPointer<SimpleResource> p2(new SimpleResource); manager.update(h, p2.data()); + + // THEN QVERIFY(manager.activeEntries() == 1); + // WHEN bool ok = false; SimpleResource *p3 = manager.data(h, &ok); + + // THEN QVERIFY(ok == true); QVERIFY(p3 == p2); } void tst_HandleManager::resetRemovesAllEntries() { + // GIVEN Qt3DCore::QHandleManager<SimpleResource> manager; + + // WHEN for (int i = 0; i < 100; ++i) { SimpleResource *p = (SimpleResource *) 0xdead0000 + i; const Handle h = manager.acquire(p); @@ -174,18 +220,25 @@ void tst_HandleManager::resetRemovesAllEntries() QVERIFY(p == q); } + // THEN QVERIFY(manager.activeEntries() == 100); + // WHEN manager.reset(); + + // THEN QVERIFY(manager.activeEntries() == 0); } void tst_HandleManager::maximumEntries() { + // GIVEN Qt3DCore::QHandleManager<SimpleResource> manager; + // THEN QCOMPARE(Handle::maxIndex(), (uint)((1 << 16) - 1)); + // WHEN for (int i = 0; i < (int)Handle::maxIndex(); ++i) { SimpleResource *p = (SimpleResource *) 0xdead0000 + i; const Handle h = manager.acquire(p); @@ -196,11 +249,58 @@ void tst_HandleManager::maximumEntries() QVERIFY(p == q); } - QVERIFY(manager.activeEntries() == Handle::maxIndex()); + // THEN + QVERIFY(manager.activeEntries() == Handle::maxIndex());\ + + // WHEN manager.reset(); + + // THEN QVERIFY(manager.activeEntries() == 0); } +void tst_HandleManager::checkNoCounterOverflow() +{ + // GIVEN + const int indexBits = 16; + Qt3DCore::QHandleManager<SimpleResource, indexBits> manager; + SimpleResource *p = (SimpleResource *) 0xdead0000; + Qt3DCore::QHandle<SimpleResource, indexBits> h = manager.acquire(p); + + // THEN + QCOMPARE(h.maxCounter(), (quint32)((1 << (32 - indexBits - 2)) - 1)); + QCOMPARE(h.counter(), (quint32)1); + + // WHEN + const quint32 maxIterations = h.maxCounter() - 2; + const quint32 handleIndex = h.index(); + + qDebug() << maxIterations << handleIndex; + + // Acquire and release maxIteration time to increase counter + for (quint32 i = 0; i < maxIterations; ++i) { + // WHEN + manager.release(h); + h = manager.acquire(p); + + // THEN + QCOMPARE(h.index(), handleIndex); + QCOMPARE(h.counter(), i + 2); + } + + // THEN + QCOMPARE(h.counter(), h.maxCounter() - 1); + + // WHEN + manager.release(h); + h = manager.acquire(p); + + // THEN + QCOMPARE(h.counter(), (quint32)1); +} + + + QTEST_APPLESS_MAIN(tst_HandleManager) #include "tst_handlemanager.moc" |