Project

General

Profile

Patch #162 ยป linux.diff

dyblast dyblast, 03/29/2011 08:27 PM

View differences:

application/Common/Global.cpp
#include <QDir>
#include <QDirIterator>
#include <qDebug>
#include <QDebug>
#include <QtGlobal>
#ifdef Q_OS_WIN32
application/Common/TestsCommon/Tests.cpp
/**
* D-LAN - A decentralized LAN file sharing software.
* Copyright (C) 2010-2011 Greg Burri <greg.burri@gmail.com>
*
* 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 3 of the License, or
* (at your option) any later version.
*
* 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 <http://www.gnu.org/licenses/>.
*/
#include <Tests.h>
#include <QtDebug>
#include <QByteArray>
#include <QFile>
#include <QDir>
#include <QElapsedTimer>
#include <Protos/common.pb.h>
#include <Protos/core_settings.pb.h>
#include <Network/MessageHeader.h>
#include <PersistentData.h>
#include <Settings.h>
#include <Global.h>
#include <ZeroCopyStreamQIODevice.h>
using namespace Common;
Tests::Tests()
{
}
void Tests::initTestCase()
{
qDebug() << "Application folder path (where the settings and persistent data are put) : " << Global::getDataFolder(Common::Global::ROAMING, false);
}
void Tests::nCombinations()
{
QCOMPARE(Global::nCombinations(5, 4), 5);
QCOMPARE(Global::nCombinations(4, 2), 6);
QCOMPARE(Global::nCombinations(4, 4), 1);
QCOMPARE(Global::nCombinations(42, 6), 5245786);
QCOMPARE(Global::nCombinations(2, 4), 0);
QCOMPARE(Global::nCombinations(-1, 1), 0);
QCOMPARE(Global::nCombinations(1, -1), 0);
QCOMPARE(Global::nCombinations(-1, -1), 0);
}
void Tests::formatByteSize()
{
QCOMPARE(Global::formatByteSize(-42), QString("0 B"));
QCOMPARE(Global::formatByteSize(0), QString("0 B"));
QCOMPARE(Global::formatByteSize(42), QString("42 B"));
QCOMPARE(Global::formatByteSize(1023), QString("1023 B"));
QCOMPARE(Global::formatByteSize(1024), QString("1.0 KiB"));
QCOMPARE(Global::formatByteSize(1484), QString("1.4 KiB"));
QCOMPARE(Global::formatByteSize(1485), QString("1.5 KiB"));
QCOMPARE(Global::formatByteSize(1996), QString("1.9 KiB"));
QCOMPARE(Global::formatByteSize(1997), QString("2.0 KiB"));
QCOMPARE(Global::formatByteSize(1024 * 1484), QString("1.4 MiB"));
QCOMPARE(Global::formatByteSize(1024 * 1485), QString("1.5 MiB"));
QCOMPARE(Global::formatByteSize(1024 * 1996), QString("1.9 MiB"));
QCOMPARE(Global::formatByteSize(1024 * 1997), QString("2.0 MiB"));
QCOMPARE(Global::formatByteSize(42LL * 1024 * 1024 * 1024 * 1024 * 1024), QString("42.0 PiB"));
QCOMPARE(Global::formatByteSize(42LL * 1020 * 1024 * 1024 * 1024 * 1024), QString("41.8 PiB"));
QCOMPARE(Global::formatByteSize(-42, 2), QString("0 B"));
QCOMPARE(Global::formatByteSize(0, 2), QString("0 B"));
QCOMPARE(Global::formatByteSize(42, 2), QString("42 B"));
QCOMPARE(Global::formatByteSize(1023, 2), QString("1023 B"));
QCOMPARE(Global::formatByteSize(1024, 2), QString("1.00 KiB"));
QCOMPARE(Global::formatByteSize(1484, 2), QString("1.45 KiB"));
QCOMPARE(Global::formatByteSize(1485, 2), QString("1.45 KiB"));
QCOMPARE(Global::formatByteSize(1996, 2), QString("1.95 KiB"));
QCOMPARE(Global::formatByteSize(1997, 2), QString("1.95 KiB"));
QCOMPARE(Global::formatByteSize(1024 * 1484, 2), QString("1.45 MiB"));
QCOMPARE(Global::formatByteSize(1024 * 1485, 2), QString("1.45 MiB"));
QCOMPARE(Global::formatByteSize(1024 * 1996, 2), QString("1.95 MiB"));
QCOMPARE(Global::formatByteSize(1024 * 1997, 2), QString("1.95 MiB"));
QCOMPARE(Global::formatByteSize(42LL * 1024 * 1024 * 1024 * 1024 * 1024, 2), QString("42.00 PiB"));
QCOMPARE(Global::formatByteSize(42LL * 1020 * 1024 * 1024 * 1024 * 1024, 2), QString("41.84 PiB"));
}
void Tests::availableDiskSpace()
{
qDebug() << "Available disk space [Mo] : " << Global::availableDiskSpace(".") / 1024 / 1024;
}
void Tests::writePersistentData()
{
this->hash = Hash::rand();
Protos::Common::Hash hashMessage;
hashMessage.set_hash(this->hash.getData(), Hash::HASH_SIZE);
PersistentData::setValue("paul", hashMessage, Global::ROAMING);
}
void Tests::readPersistentData()
{
Protos::Common::Hash hashMessage;
PersistentData::getValue("paul", hashMessage, Global::ROAMING);
Hash hashRead(hashMessage.hash().data());
QVERIFY(this->hash == hashRead);
try
{
PersistentData::getValue("john", hashMessage, Global::ROAMING);
QFAIL("'john' shouldn't exist");
}
catch (UnknownValueException)
{
qDebug() << "Ok, exception UnknownValueException catched for the value 'john'";
}
catch (...)
{
QFAIL("Unknown exception occured");
}
}
void Tests::removePersistentData()
{
QVERIFY(PersistentData::rmValue("paul", Global::ROAMING));
}
void Tests::writeSettings()
{
this->hash = Hash::rand();
SETTINGS.setFilename("tests_core_settings.txt");
SETTINGS.setSettingsMessage(new Protos::Core::Settings());
SETTINGS.set("nick", QString("paul"));
SETTINGS.set("peer_id", this->hash);
SETTINGS.save();
}
void Tests::readSettings()
{
SETTINGS.load();
QString nick = SETTINGS.get<QString>("nick");
Hash hash = SETTINGS.get<Hash>("peer_id");
QCOMPARE(nick, QString("paul"));
QCOMPARE(hash.toStr(), this->hash.toStr());
}
void Tests::removeSettings()
{
SETTINGS.remove();
}
void Tests::generateAHash()
{
const char array[Hash::HASH_SIZE] = {
0x2d, 0x73, 0x73, 0x6f,
0x34, 0xa7, 0x38, 0x37,
0xd4, 0x22, 0xf7, 0xab,
0xa2, 0x74, 0x0d, 0x84,
0x09, 0xac, 0x60, 0xdf
};
QByteArray byteArray(array, Hash::HASH_SIZE);
qDebug() << "Reference : " << byteArray.toHex();;
Hash h1 = Hash::rand();
qDebug() << "h1 (Randomly generated hash) : " << h1.toStr();
Hash h2(byteArray);
qDebug() << "h2 (from QByteArray) : " << h2.toStr();
QVERIFY(memcmp(h2.getData(), array, Hash::HASH_SIZE) == 0);
Hash h3(h2);
qDebug() << "h3 (copied from h2) : " << h3.toStr();
QVERIFY(memcmp(h3.getData(), array, Hash::HASH_SIZE) == 0);
Hash h4(array);
qDebug() << "h4 (from char[]) : " << h4.toStr();
QVERIFY(memcmp(h4.getData(), array, Hash::HASH_SIZE) == 0);
}
void Tests::buildAnHashFromAString()
{
QString str("2d73736f34a73837d422f7aba2740d8409ac60df");
Hash h = Hash::fromStr(str);
QCOMPARE(h.toStr(), str);
}
void Tests::compareTwoHash()
{
const char array[Hash::HASH_SIZE] = {
0x2d, 0x73, 0x73, 0x6f,
0x34, 0xa7, 0x38, 0x37,
0xd4, 0x22, 0xf7, 0xab,
0xa2, 0x74, 0x0d, 0x84,
0x09, 0xac, 0x60, 0xdf
};
QByteArray byteArray(array, Hash::HASH_SIZE);
QString str("2d73736f34a73837d422f7aba2740d8409ac60df");
Hash h1 = Hash::fromStr(str);
Hash h2(byteArray);
Hash h3 = h1;
Hash h4;
h4 = h1;
QVERIFY(h1 == h1);
QVERIFY(h1 == h2);
QVERIFY(h1 == h3);
QVERIFY(h1 == h4);
QVERIFY(h2 == h3);
QVERIFY(h2 == h4);
}
void Tests::hasher()
{
char str1[] = "abc";
char str2[] = "abc";
char str3[] = "cba";
Hasher hasher;
hasher.addData(str1, sizeof(str1));
hasher.addData(str3, sizeof(str3));
Hash h1 = hasher.getResult();
hasher.reset();
hasher.addData(str2, sizeof(str2));
hasher.addData(str3, sizeof(str3));
Hash h2 = hasher.getResult();
hasher.reset();
hasher.addData(str3, sizeof(str3));
Hash h3 = hasher.getResult();
hasher.reset();
hasher.addPredefinedSalt();
hasher.addData(str1, sizeof(str1));
Hash h4 = hasher.getResult();
hasher.reset();
hasher.addPredefinedSalt();
hasher.addData(str2, sizeof(str2));
Hash h5 = hasher.getResult();
QVERIFY(h1 == h2);
QVERIFY(h1 != h3);
QVERIFY(h2 != h3);
QVERIFY(h4 != h1);
QVERIFY(h4 == h5);
}
void Tests::messageHeader()
{
const char data[MessageHeader::HEADER_SIZE] = {
0x00, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x2a,
0x2d, 0x73, 0x73, 0x6f,
0x34, 0xa7, 0x38, 0x37,
0xd4, 0x22, 0xf7, 0xab,
0xa2, 0x74, 0x0d, 0x84,
0x09, 0xac, 0x60, 0xdf
};
const QString peerID("2d73736f34a73837d422f7aba2740d8409ac60df");
MessageHeader header = MessageHeader::readHeader(data);
qDebug() << header.toStr();
QVERIFY(!header.isNull());
QCOMPARE(header.getType(), MessageHeader::CORE_IM_ALIVE);
QCOMPARE(header.getSize(), 42u);
QCOMPARE(header.getSenderID().toStr(), peerID);
// We use a larger buffer to check if the last four bytes has been alterate.
char buffer[MessageHeader::HEADER_SIZE + 4];
memset(buffer, 0, sizeof(buffer));
MessageHeader::writeHeader(buffer, header);
QVERIFY(qstrncmp(data, buffer, MessageHeader::HEADER_SIZE) == 0);
QVERIFY(qstrncmp(buffer + MessageHeader::HEADER_SIZE, "\0\0\0\0", 4) == 0);
}
void Tests::readAndWriteWithZeroCopyStreamQIODevice()
{
QString filePath(QDir::tempPath().append("/test.bin"));
QFile file(filePath);
file.remove();
Hash hash1 = Hash::fromStr("2c583d414e4a9eb956228209b367e48f59078a4b");
Hash hash2 = Hash::fromStr("5c9c3741bded231f84b8a8200eaf3e30a9c0a951");
qDebug() << "hash1 : " << hash1.toStr();
qDebug() << "hash2 : " << hash2.toStr();
Protos::Common::Hash hashMessage1;
Protos::Common::Hash hashMessage2;
file.open(QIODevice::WriteOnly);
{
ZeroCopyOutputStreamQIODevice outputStream(&file);
hashMessage1.set_hash(hash1.getData(), Hash::HASH_SIZE);
hashMessage1.SerializeToZeroCopyStream(&outputStream);
hashMessage2.set_hash(hash2.getData(), Hash::HASH_SIZE);
hashMessage2.SerializeToZeroCopyStream(&outputStream);
}
file.close();
QFileInfo fileInfo(filePath);
QCOMPARE(fileInfo.size(), static_cast<long long>(hashMessage1.ByteSize() + hashMessage2.ByteSize()));
hashMessage1.Clear();
hashMessage2.Clear();
file.open(QIODevice::ReadOnly);
{
ZeroCopyInputStreamQIODevice inputStream(&file);
hashMessage1.ParseFromBoundedZeroCopyStream(&inputStream, Hash::HASH_SIZE + 2);
hashMessage2.ParseFromBoundedZeroCopyStream(&inputStream, Hash::HASH_SIZE + 2);
}
file.close();
QCOMPARE(QByteArray(hashMessage1.hash().data(), Hash::HASH_SIZE), QByteArray(hash1.getData(), Hash::HASH_SIZE));
QCOMPARE(QByteArray(hashMessage2.hash().data(), Hash::HASH_SIZE), QByteArray(hash2.getData(), Hash::HASH_SIZE));
}
application/Common/TestsCommon/Tests.h
/**
* D-LAN - A decentralized LAN file sharing software.
* Copyright (C) 2010-2011 Greg Burri <greg.burri@gmail.com>
*
* 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 3 of the License, or
* (at your option) any later version.
*
* 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 <http://www.gnu.org/licenses/>.
*/
#ifndef TESTS_COMMON_H
#define TESTS_COMMON_H
#include <QTest>
#include <Hash.h>
class Tests : public QObject
{
Q_OBJECT
public:
Tests();
private slots:
void initTestCase();
// Global class.
void nCombinations();
void formatByteSize();
void availableDiskSpace();
// PersistentData class.
void writePersistentData();
void readPersistentData();
void removePersistentData();
// Settings class.
void writeSettings();
void readSettings();
void removeSettings();
// Hash class.
void generateAHash();
void buildAnHashFromAString();
void compareTwoHash();
void hasher();
void messageHeader();
// ZeroCopyOutputStreamQIODevice and ZeroCopyInputStreamQIODevice classes.
void readAndWriteWithZeroCopyStreamQIODevice();
private:
Common::Hash hash;
};
#endif
application/Common/TestsCommon/TestsCommon.pro
# -------------------------------------------------
# Project created by QtCreator 2009-10-04T02:24:09
# -------------------------------------------------
QT += testlib
QT -= gui
TARGET = TestsCommon
CONFIG += link_prl
include(../common.pri)
include(../../Libs/protobuf.pri)
LIBS += -L"../output/$$FOLDER" -lCommon
POST_TARGETDEPS += ../output/$$FOLDER/libCommon.a
INCLUDEPATH += . \
.. \
../..
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp \
Tests.cpp \
../../Protos/common.pb.cc \
../../Protos/core_settings.pb.cc
HEADERS += Tests.h
application/Common/TestsCommon/main.cpp
/**
* D-LAN - A decentralized LAN file sharing software.
* Copyright (C) 2010-2011 Greg Burri <greg.burri@gmail.com>
*
* 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 3 of the License, or
* (at your option) any later version.
*
* 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 <http://www.gnu.org/licenses/>.
*/
#include <QCoreApplication>
#include <QTest>
#include <Tests.h>
int main(int argc, char *argv[])
{
Tests tests;
return QTest::qExec(&tests, argc, argv);
}
application/Common/Version.h
#define VERSION_TAG "Beta10"
// These two values are automatically updated during the release building process. See the script 'Application/Tools/update_version.sh'
#define BUILD_TIME "2011-03-16_18-02"
#define GIT_VERSION "d95667c422c53c67353299de443bfa4ad905a162"
#define BUILD_TIME "2011-03-28_13-03"
#define GIT_VERSION "57073952baf03b969debc1c36411eb755a03e2ca"
#endif
/dev/null
/**
* D-LAN - A decentralized LAN file sharing software.
* Copyright (C) 2010-2011 Greg Burri <greg.burri@gmail.com>
*
* 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 3 of the License, or
* (at your option) any later version.
*
* 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 <http://www.gnu.org/licenses/>.
*/
#include <Tests.h>
#include <QtDebug>
#include <QByteArray>
#include <QFile>
#include <QDir>
#include <QElapsedTimer>
#include <Protos/common.pb.h>
#include <Protos/core_settings.pb.h>
#include <Network/MessageHeader.h>
#include <PersistentData.h>
#include <Settings.h>
#include <Global.h>
#include <ZeroCopyStreamQIODevice.h>
using namespace Common;
Tests::Tests()
{
}
void Tests::initTestCase()
{
qDebug() << "Application folder path (where the settings and persistent data are put) : " << Global::getDataFolder(Common::Global::ROAMING, false);
}
void Tests::nCombinations()
{
QCOMPARE(Global::nCombinations(5, 4), 5);
QCOMPARE(Global::nCombinations(4, 2), 6);
QCOMPARE(Global::nCombinations(4, 4), 1);
QCOMPARE(Global::nCombinations(42, 6), 5245786);
QCOMPARE(Global::nCombinations(2, 4), 0);
QCOMPARE(Global::nCombinations(-1, 1), 0);
QCOMPARE(Global::nCombinations(1, -1), 0);
QCOMPARE(Global::nCombinations(-1, -1), 0);
}
void Tests::formatByteSize()
{
QCOMPARE(Global::formatByteSize(-42), QString("0 B"));
QCOMPARE(Global::formatByteSize(0), QString("0 B"));
QCOMPARE(Global::formatByteSize(42), QString("42 B"));
QCOMPARE(Global::formatByteSize(1023), QString("1023 B"));
QCOMPARE(Global::formatByteSize(1024), QString("1.0 KiB"));
QCOMPARE(Global::formatByteSize(1484), QString("1.4 KiB"));
QCOMPARE(Global::formatByteSize(1485), QString("1.5 KiB"));
QCOMPARE(Global::formatByteSize(1996), QString("1.9 KiB"));
QCOMPARE(Global::formatByteSize(1997), QString("2.0 KiB"));
QCOMPARE(Global::formatByteSize(1024 * 1484), QString("1.4 MiB"));
QCOMPARE(Global::formatByteSize(1024 * 1485), QString("1.5 MiB"));
QCOMPARE(Global::formatByteSize(1024 * 1996), QString("1.9 MiB"));
QCOMPARE(Global::formatByteSize(1024 * 1997), QString("2.0 MiB"));
QCOMPARE(Global::formatByteSize(42LL * 1024 * 1024 * 1024 * 1024 * 1024), QString("42.0 PiB"));
QCOMPARE(Global::formatByteSize(42LL * 1020 * 1024 * 1024 * 1024 * 1024), QString("41.8 PiB"));
QCOMPARE(Global::formatByteSize(-42, 2), QString("0 B"));
QCOMPARE(Global::formatByteSize(0, 2), QString("0 B"));
QCOMPARE(Global::formatByteSize(42, 2), QString("42 B"));
QCOMPARE(Global::formatByteSize(1023, 2), QString("1023 B"));
QCOMPARE(Global::formatByteSize(1024, 2), QString("1.00 KiB"));
QCOMPARE(Global::formatByteSize(1484, 2), QString("1.45 KiB"));
QCOMPARE(Global::formatByteSize(1485, 2), QString("1.45 KiB"));
QCOMPARE(Global::formatByteSize(1996, 2), QString("1.95 KiB"));
QCOMPARE(Global::formatByteSize(1997, 2), QString("1.95 KiB"));
QCOMPARE(Global::formatByteSize(1024 * 1484, 2), QString("1.45 MiB"));
QCOMPARE(Global::formatByteSize(1024 * 1485, 2), QString("1.45 MiB"));
QCOMPARE(Global::formatByteSize(1024 * 1996, 2), QString("1.95 MiB"));
QCOMPARE(Global::formatByteSize(1024 * 1997, 2), QString("1.95 MiB"));
QCOMPARE(Global::formatByteSize(42LL * 1024 * 1024 * 1024 * 1024 * 1024, 2), QString("42.00 PiB"));
QCOMPARE(Global::formatByteSize(42LL * 1020 * 1024 * 1024 * 1024 * 1024, 2), QString("41.84 PiB"));
}
void Tests::availableDiskSpace()
{
qDebug() << "Available disk space [Mo] : " << Global::availableDiskSpace(".") / 1024 / 1024;
}
void Tests::writePersistentData()
{
this->hash = Hash::rand();
Protos::Common::Hash hashMessage;
hashMessage.set_hash(this->hash.getData(), Hash::HASH_SIZE);
PersistentData::setValue("paul", hashMessage, Global::ROAMING);
}
void Tests::readPersistentData()
{
Protos::Common::Hash hashMessage;
PersistentData::getValue("paul", hashMessage, Global::ROAMING);
Hash hashRead(hashMessage.hash().data());
QVERIFY(this->hash == hashRead);
try
{
PersistentData::getValue("john", hashMessage, Global::ROAMING);
QFAIL("'john' shouldn't exist");
}
catch (UnknownValueException)
{
qDebug() << "Ok, exception UnknownValueException catched for the value 'john'";
}
catch (...)
{
QFAIL("Unknown exception occured");
}
}
void Tests::removePersistentData()
{
QVERIFY(PersistentData::rmValue("paul", Global::ROAMING));
}
void Tests::writeSettings()
{
this->hash = Hash::rand();
SETTINGS.setFilename("tests_core_settings.txt");
SETTINGS.setSettingsMessage(new Protos::Core::Settings());
SETTINGS.set("nick", QString("paul"));
SETTINGS.set("peer_id", this->hash);
SETTINGS.save();
}
void Tests::readSettings()
{
SETTINGS.load();
QString nick = SETTINGS.get<QString>("nick");
Hash hash = SETTINGS.get<Hash>("peer_id");
QCOMPARE(nick, QString("paul"));
QCOMPARE(hash.toStr(), this->hash.toStr());
}
void Tests::removeSettings()
{
SETTINGS.remove();
}
void Tests::generateAHash()
{
const char array[Hash::HASH_SIZE] = {
0x2d, 0x73, 0x73, 0x6f,
0x34, 0xa7, 0x38, 0x37,
0xd4, 0x22, 0xf7, 0xab,
0xa2, 0x74, 0x0d, 0x84,
0x09, 0xac, 0x60, 0xdf
};
QByteArray byteArray(array, Hash::HASH_SIZE);
qDebug() << "Reference : " << byteArray.toHex();;
Hash h1 = Hash::rand();
qDebug() << "h1 (Randomly generated hash) : " << h1.toStr();
Hash h2(byteArray);
qDebug() << "h2 (from QByteArray) : " << h2.toStr();
QVERIFY(memcmp(h2.getData(), array, Hash::HASH_SIZE) == 0);
Hash h3(h2);
qDebug() << "h3 (copied from h2) : " << h3.toStr();
QVERIFY(memcmp(h3.getData(), array, Hash::HASH_SIZE) == 0);
Hash h4(array);
qDebug() << "h4 (from char[]) : " << h4.toStr();
QVERIFY(memcmp(h4.getData(), array, Hash::HASH_SIZE) == 0);
}
void Tests::buildAnHashFromAString()
{
QString str("2d73736f34a73837d422f7aba2740d8409ac60df");
Hash h = Hash::fromStr(str);
QCOMPARE(h.toStr(), str);
}
void Tests::compareTwoHash()
{
const char array[Hash::HASH_SIZE] = {
0x2d, 0x73, 0x73, 0x6f,
0x34, 0xa7, 0x38, 0x37,
0xd4, 0x22, 0xf7, 0xab,
0xa2, 0x74, 0x0d, 0x84,
0x09, 0xac, 0x60, 0xdf
};
QByteArray byteArray(array, Hash::HASH_SIZE);
QString str("2d73736f34a73837d422f7aba2740d8409ac60df");
Hash h1 = Hash::fromStr(str);
Hash h2(byteArray);
Hash h3 = h1;
Hash h4;
h4 = h1;
QVERIFY(h1 == h1);
QVERIFY(h1 == h2);
QVERIFY(h1 == h3);
QVERIFY(h1 == h4);
QVERIFY(h2 == h3);
QVERIFY(h2 == h4);
}
void Tests::hasher()
{
char str1[] = "abc";
char str2[] = "abc";
char str3[] = "cba";
Hasher hasher;
hasher.addData(str1, sizeof(str1));
hasher.addData(str3, sizeof(str3));
Hash h1 = hasher.getResult();
hasher.reset();
hasher.addData(str2, sizeof(str2));
hasher.addData(str3, sizeof(str3));
Hash h2 = hasher.getResult();
hasher.reset();
hasher.addData(str3, sizeof(str3));
Hash h3 = hasher.getResult();
hasher.reset();
hasher.addPredefinedSalt();
hasher.addData(str1, sizeof(str1));
Hash h4 = hasher.getResult();
hasher.reset();
hasher.addPredefinedSalt();
hasher.addData(str2, sizeof(str2));
Hash h5 = hasher.getResult();
QVERIFY(h1 == h2);
QVERIFY(h1 != h3);
QVERIFY(h2 != h3);
QVERIFY(h4 != h1);
QVERIFY(h4 == h5);
}
void Tests::messageHeader()
{
const char data[MessageHeader::HEADER_SIZE] = {
0x00, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x2a,
0x2d, 0x73, 0x73, 0x6f,
0x34, 0xa7, 0x38, 0x37,
0xd4, 0x22, 0xf7, 0xab,
0xa2, 0x74, 0x0d, 0x84,
0x09, 0xac, 0x60, 0xdf
};
const QString peerID("2d73736f34a73837d422f7aba2740d8409ac60df");
MessageHeader header = MessageHeader::readHeader(data);
qDebug() << header.toStr();
QVERIFY(!header.isNull());
QCOMPARE(header.getType(), MessageHeader::CORE_IM_ALIVE);
QCOMPARE(header.getSize(), 42u);
QCOMPARE(header.getSenderID().toStr(), peerID);
// We use a larger buffer to check if the last four bytes has been alterate.
char buffer[MessageHeader::HEADER_SIZE + 4];
memset(buffer, 0, sizeof(buffer));
MessageHeader::writeHeader(buffer, header);
QVERIFY(qstrncmp(data, buffer, MessageHeader::HEADER_SIZE) == 0);
QVERIFY(qstrncmp(buffer + MessageHeader::HEADER_SIZE, "\0\0\0\0", 4) == 0);
}
void Tests::readAndWriteWithZeroCopyStreamQIODevice()
{
QString filePath(QDir::tempPath().append("/test.bin"));
QFile file(filePath);
file.remove();
Hash hash1 = Hash::fromStr("2c583d414e4a9eb956228209b367e48f59078a4b");
Hash hash2 = Hash::fromStr("5c9c3741bded231f84b8a8200eaf3e30a9c0a951");
qDebug() << "hash1 : " << hash1.toStr();
qDebug() << "hash2 : " << hash2.toStr();
Protos::Common::Hash hashMessage1;
Protos::Common::Hash hashMessage2;
file.open(QIODevice::WriteOnly);
{
ZeroCopyOutputStreamQIODevice outputStream(&file);
hashMessage1.set_hash(hash1.getData(), Hash::HASH_SIZE);
hashMessage1.SerializeToZeroCopyStream(&outputStream);
hashMessage2.set_hash(hash2.getData(), Hash::HASH_SIZE);
hashMessage2.SerializeToZeroCopyStream(&outputStream);
}
file.close();
QFileInfo fileInfo(filePath);
QCOMPARE(fileInfo.size(), static_cast<long long>(hashMessage1.ByteSize() + hashMessage2.ByteSize()));
hashMessage1.Clear();
hashMessage2.Clear();
file.open(QIODevice::ReadOnly);
{
ZeroCopyInputStreamQIODevice inputStream(&file);
hashMessage1.ParseFromBoundedZeroCopyStream(&inputStream, Hash::HASH_SIZE + 2);
hashMessage2.ParseFromBoundedZeroCopyStream(&inputStream, Hash::HASH_SIZE + 2);
}
file.close();
QCOMPARE(QByteArray(hashMessage1.hash().data(), Hash::HASH_SIZE), QByteArray(hash1.getData(), Hash::HASH_SIZE));
QCOMPARE(QByteArray(hashMessage2.hash().data(), Hash::HASH_SIZE), QByteArray(hash2.getData(), Hash::HASH_SIZE));
}
/dev/null
/**
* D-LAN - A decentralized LAN file sharing software.
* Copyright (C) 2010-2011 Greg Burri <greg.burri@gmail.com>
*
* 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 3 of the License, or
* (at your option) any later version.
*
* 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 <http://www.gnu.org/licenses/>.
*/
#ifndef TESTS_COMMON_H
#define TESTS_COMMON_H
#include <QTest>
#include <Hash.h>
class Tests : public QObject
{
Q_OBJECT
public:
Tests();
private slots:
void initTestCase();
// Global class.
void nCombinations();
void formatByteSize();
void availableDiskSpace();
// PersistentData class.
void writePersistentData();
void readPersistentData();
void removePersistentData();
// Settings class.
void writeSettings();
void readSettings();
void removeSettings();
// Hash class.
void generateAHash();
void buildAnHashFromAString();
void compareTwoHash();
void hasher();
void messageHeader();
// ZeroCopyOutputStreamQIODevice and ZeroCopyInputStreamQIODevice classes.
void readAndWriteWithZeroCopyStreamQIODevice();
private:
Common::Hash hash;
};
#endif
/dev/null
# -------------------------------------------------
# Project created by QtCreator 2009-10-04T02:24:09
# -------------------------------------------------
QT += testlib
QT -= gui
TARGET = TestsCommon
CONFIG += link_prl
include(../common.pri)
include(../../Libs/protobuf.pri)
LIBS += -L"../output/$$FOLDER" -lCommon
POST_TARGETDEPS += ../output/$$FOLDER/libCommon.a
INCLUDEPATH += . \
.. \
../..
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp \
Tests.cpp \
../../Protos/common.pb.cc \
../../Protos/core_settings.pb.cc
HEADERS += Tests.h
/dev/null
/**
* D-LAN - A decentralized LAN file sharing software.
* Copyright (C) 2010-2011 Greg Burri <greg.burri@gmail.com>
*
* 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 3 of the License, or
* (at your option) any later version.
*
* 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 <http://www.gnu.org/licenses/>.
*/
#include <QCoreApplication>
#include <QTest>
#include <Tests.h>
int main(int argc, char *argv[])
{
Tests tests;
return QTest::qExec(&tests, argc, argv);
}
application/Core/ConsoleReader.cpp
using namespace CoreSpace;
#include <cstdio>
#include <windows.h>
#if defined(Q_OS_LINUX)
#elif defined(Q_OS_WIN32)
#include <windows.h>
#endif
#include <QCoreApplication>
application/Core/FileManager/priv/FileUpdater/DirWatcher.cpp
#if defined(Q_OS_WIN32)
return new DirWatcherWin();
#else
LOG_WARN("Cannot create a watcher for the current platform, no implementation.");
L_WARN("Cannot create a watcher for the current platform, no implementation.");
return 0;
#endif
}
application/Core/NetworkListener/priv/UDPListener.cpp
mreq.imr_multiaddr.s_addr = htonl(MULTICAST_GROUP.toIPv4Address());
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
#if defined(Q_OS_LINUX)
if (int error = setsockopt(socketDescriptor, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof mreq))
if (int error = setsockopt(multicastSocketDescriptor, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof mreq))
#elif defined(Q_OS_WIN32)
if (int error = setsockopt(multicastSocketDescriptor, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mreq, sizeof mreq))
#endif
application/Core/PeerManager/priv/PeerManager.cpp
#include <Common/Settings.h>
#include <Common/Network/MessageHeader.h>
#include <Priv/Constants.h>
#include <priv/Constants.h>
/**
* @class PM::PeerManager
application/D-LAN.pro
TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS = Common \
Common/TestsCommon \
Common/LogManager \
Common/RemoteCoreController \
Core/FileManager \
Core/FileManager/TestsFileManager \
Core/PeerManager \
Core/PeerManager/TestsPeerManager \
Core/UploadManager \
Core/DownloadManager \
Core/NetworkListener \
Core/RemoteControlManager \
Core \
GUI \
Tools/LogViewer \
Tools/PasswordHasher
application/GUI/CheckBoxList.cpp
#include <CheckBoxList.h>
using namespace GUI;
#include <QCHeckBox>
#include <QCheckBox>
#include <QApplication>
#include <QStylePainter>
#include <QAbstractItemView>
application/configure_linux.sh
qmake D-LAN.pro -r -spec linux-g++
application/configure_windows.sh
qmake D-LAN.pro -r -spec win32-g++
    (1-1/1)