summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2016-08-11 10:08:21 +0200
committerPaul Lemire <paul.lemire@kdab.com>2016-08-11 20:17:43 +0000
commit71edf63d457de56740578939a62645ffbc71e040 (patch)
tree74ec5ed7e9dacec605d1dff7c0a122473a26c367 /tests
parentd6e836de654e6309eaf88d3ba907ab28026ddcb8 (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.cpp102
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"