From 98d888063bda80b69296239e6870a70c675fdbdd Mon Sep 17 00:00:00 2001 From: Felix Geyer Date: Wed, 9 Oct 2013 23:11:18 +0200 Subject: [PATCH] Add tests for Random::randomUInt() and randomUIntRange(). --- tests/CMakeLists.txt | 3 ++ tests/TestRandom.cpp | 97 ++++++++++++++++++++++++++++++++++++++++++++ tests/TestRandom.h | 51 +++++++++++++++++++++++ 3 files changed, 151 insertions(+) create mode 100644 tests/TestRandom.cpp create mode 100644 tests/TestRandom.h diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 38c931eb7..6ff137d59 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -162,6 +162,9 @@ add_unit_test(NAME testentry SOURCES TestEntry.cpp MOCS TestEntry.h add_unit_test(NAME testargumentparser SOURCES TestArgumentParser.cpp MOCS TestArgumentParser.h LIBS ${TEST_LIBRARIES}) +add_unit_test(NAME testrandom SOURCES TestRandom.cpp MOCS TestRandom.h + LIBS ${TEST_LIBRARIES}) + if(WITH_GUI_TESTS) add_subdirectory(gui) endif(WITH_GUI_TESTS) diff --git a/tests/TestRandom.cpp b/tests/TestRandom.cpp new file mode 100644 index 000000000..313cd19c1 --- /dev/null +++ b/tests/TestRandom.cpp @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2013 Felix Geyer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "TestRandom.h" + +#include "tests.h" +#include "core/Endian.h" + +#include + +void TestRandom::initTestCase() +{ + m_backend = new RandomBackendTest(); + + Random::createWithBackend(m_backend); +} + +void TestRandom::testUInt() +{ + QByteArray nextBytes; + + nextBytes = Endian::int32ToBytes(42, QSysInfo::ByteOrder); + m_backend->setNextBytes(nextBytes); + QCOMPARE(randomGen()->randomUInt(100), 42U); + + nextBytes = Endian::int32ToBytes(117, QSysInfo::ByteOrder); + m_backend->setNextBytes(nextBytes); + QCOMPARE(randomGen()->randomUInt(100), 17U); + + nextBytes = Endian::int32ToBytes(1001, QSysInfo::ByteOrder); + m_backend->setNextBytes(nextBytes); + QCOMPARE(randomGen()->randomUInt(1), 0U); + + nextBytes.clear(); + nextBytes.append(Endian::int32ToBytes(4294967295U, QSysInfo::ByteOrder)); + nextBytes.append(Endian::int32ToBytes(4294897295U, QSysInfo::ByteOrder)); + m_backend->setNextBytes(nextBytes); + QCOMPARE(randomGen()->randomUInt(100000U), 97295U); + + nextBytes.clear(); + for (int i = 0; i < 10000; i++) { + nextBytes.append(Endian::int32ToBytes(2147483648U + i, QSysInfo::ByteOrder)); + } + nextBytes.append(Endian::int32ToBytes(2147483647U, QSysInfo::ByteOrder)); + m_backend->setNextBytes(nextBytes); + QCOMPARE(randomGen()->randomUInt(2147483648U), 2147483647U); +} + +void TestRandom::testUIntRange() +{ + QByteArray nextBytes; + + nextBytes = Endian::int32ToBytes(42, QSysInfo::ByteOrder); + m_backend->setNextBytes(nextBytes); + QCOMPARE(randomGen()->randomUIntRange(100, 200), 142U); +} + + +RandomBackendTest::RandomBackendTest() + : m_bytesIndex(0) +{ +} + +void RandomBackendTest::randomize(void* data, int len) +{ + QVERIFY(len <= (m_nextBytes.size() - m_bytesIndex)); + + char* charData = reinterpret_cast(data); + + for (int i = 0; i < len; i++) { + charData[i] = m_nextBytes[m_bytesIndex + i]; + } + + m_bytesIndex += len; +} + +void RandomBackendTest::setNextBytes(const QByteArray& nextBytes) +{ + m_nextBytes = nextBytes; + m_bytesIndex = 0; +} + +QTEST_GUILESS_MAIN(TestRandom) diff --git a/tests/TestRandom.h b/tests/TestRandom.h new file mode 100644 index 000000000..a308f36e5 --- /dev/null +++ b/tests/TestRandom.h @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2013 Felix Geyer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef KEEPASSX_TESTRANDOM_H +#define KEEPASSX_TESTRANDOM_H + +#include "core/Global.h" +#include "crypto/Random.h" + +#include + +class RandomBackendTest : public RandomBackend +{ +public: + RandomBackendTest(); + void randomize(void* data, int len) Q_DECL_OVERRIDE; + void setNextBytes(const QByteArray& nextBytes); + +private: + QByteArray m_nextBytes; + int m_bytesIndex; +}; + +class TestRandom : public QObject +{ + Q_OBJECT + +private Q_SLOTS: + void initTestCase(); + void testUInt(); + void testUIntRange(); + +private: + RandomBackendTest* m_backend; +}; + +#endif // KEEPASSX_TESTRANDOM_H