From fb453c1e3e7d97613f8e227929a0361357982c76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonatan=20P=C3=A5lsson?= Date: Mon, 17 Feb 2014 07:31:52 +0100 Subject: Implemented IErrorLogger --- .gitignore | 2 - browser/browserhelper.cpp | 2 +- browser/errorlogger.cpp | 37 ++++++- browser/errorlogger.h | 56 ++++++++++- .../unit-tests/errorloggerdbus/errorloggerdbus.pro | 17 ++++ .../errorloggerdbus/testerrorloggerdbus.cpp | 109 +++++++++++++++++++++ .../errorloggerdbus/testerrorloggerdbus.h | 45 +++++++++ common/browserdefs.h | 46 +++++++++ 8 files changed, 304 insertions(+), 10 deletions(-) create mode 100644 browser/unit-tests/errorloggerdbus/errorloggerdbus.pro create mode 100644 browser/unit-tests/errorloggerdbus/testerrorloggerdbus.cpp create mode 100644 browser/unit-tests/errorloggerdbus/testerrorloggerdbus.h diff --git a/.gitignore b/.gitignore index 92eb961..c77998a 100644 --- a/.gitignore +++ b/.gitignore @@ -21,5 +21,3 @@ BrowserDefs* *.db browserdbus-tests cachemanagerdbus-tests -unit-tests -browser diff --git a/browser/browserhelper.cpp b/browser/browserhelper.cpp index f225065..04cf11a 100644 --- a/browser/browserhelper.cpp +++ b/browser/browserhelper.cpp @@ -41,7 +41,7 @@ browserhelper::browserhelper(QString instanceId, QObject *parent) : exit(1); } - errorlogger *err = new errorlogger(); + errorlogger *err = errorlogger::instance(); new IErrorLoggerAdaptor(err); if(!connection->registerObject("/Browser/IErrorLogger", err)) { qDebug() << "failed register object IErrorLogger"; diff --git a/browser/errorlogger.cpp b/browser/errorlogger.cpp index 8aa5139..64209c1 100644 --- a/browser/errorlogger.cpp +++ b/browser/errorlogger.cpp @@ -16,24 +16,51 @@ #include #include #include +#include #include "errorlogger.h" #include "../common/browserdefs.h" -errorlogger::errorlogger(QObject *parent) : - QObject(parent) -{} +errorlogger* errorlogger::m_instance = NULL; uint errorlogger::getItemsCount(qlonglong timeFrom, qlonglong timeTo) { - return 0; + uint num = 0; + for (int i = 0; i < m_errors->size(); i++) { + const conn::brw::ErrorItem *e = &m_errors->at(i); + if (timeFrom <= e->i64DateTime && timeTo >= e->i64DateTime) + num++; + } + return num; } conn::brw::ERROR_IDS errorlogger::getItems(qlonglong timeFrom, qlonglong timeTo, conn::brw::ERROR_SORT_TYPE type, uint startIndex, uint itemsCount, - conn::brw::ErrorItemList items) + conn::brw::ErrorItemList &items) { + if (type == conn::brw::EST_DATE_ASCENDING) + qSort (m_errors->begin(), m_errors->end(), conn::brw::ltError); + else + qSort (m_errors->begin(), m_errors->end(), conn::brw::gtError); + for (int i = 0; i < m_errors->size(); i++){ + } + for (int i = startIndex; i < m_errors->size(); i++) { + const conn::brw::ErrorItem e = m_errors->at(i); + if (timeFrom <= e.i64DateTime && timeTo >= e.i64DateTime) { + if (items.size() < itemsCount){ + items.append(e); + } + else + break; + } + } return conn::brw::EID_NO_ERROR; } + + +void errorlogger::m_logError(conn::brw::ErrorItem item) { + m_errors->append(item); + emit onNewErrorItem(item); +} diff --git a/browser/errorlogger.h b/browser/errorlogger.h index ad7fb9a..814a812 100644 --- a/browser/errorlogger.h +++ b/browser/errorlogger.h @@ -16,6 +16,7 @@ #include #include +#include #include "../common/browserdefs.h" @@ -23,8 +24,51 @@ class errorlogger : public QObject, protected QDBusContext { Q_OBJECT public: - errorlogger(QObject *parent = 0); + static errorlogger *instance() + { + if (!m_instance) + m_instance = new errorlogger(); + return m_instance; + } + static void logError (qlonglong dateTime, + QString browserVersion, + QString connectionType, + QString code, + QString source, + QString desc) + { + conn::brw::ErrorItem err; + err.i64DateTime = dateTime; + err.strBrowserVersion = browserVersion; + err.strConnectionType = connectionType; + err.strCode = code; + err.strSource = source; + err.strDescription = desc; + errorlogger::logError(err); + } + + static void logError(QString error) + { + errorlogger::logError( + QDateTime::currentDateTime().toTime_t(), + "Unknown", + "Unknown", + "Unknown", + "Unknown", + error); + } + + static void logError(conn::brw::ErrorItem item) + { + m_instance->m_logError(item); + } + + void clearErrors() + { + m_errors->clear(); + emit onErrorListChanged(); + } signals: void onErrorListChanged(); void onNewErrorItem (const conn::brw::ErrorItem); @@ -36,9 +80,17 @@ public Q_SLOTS: conn::brw::ERROR_SORT_TYPE sortType, uint startIndex, uint itemsCount, - conn::brw::ErrorItemList items); + conn::brw::ErrorItemList &items); private: + errorlogger(){ + m_errors = new conn::brw::ErrorItemList(); + } + static errorlogger *m_instance; + + void m_logError(conn::brw::ErrorItem); + + conn::brw::ErrorItemList *m_errors; }; #endif // ERRORLOGGER_H diff --git a/browser/unit-tests/errorloggerdbus/errorloggerdbus.pro b/browser/unit-tests/errorloggerdbus/errorloggerdbus.pro new file mode 100644 index 0000000..bdc9080 --- /dev/null +++ b/browser/unit-tests/errorloggerdbus/errorloggerdbus.pro @@ -0,0 +1,17 @@ +CONFIG += qtestlib debug qt +TEMPLATE = app +TARGET = errorloggerdbus-tests +INCLUDEPATH += . ../../../common/ +QT += dbus webkitwidgets + +my_dbus_interfaces.files += ../../../common/IErrorLogger.xml +my_dbus_interfaces.header_flags = -l errorlogger -i ../../../common/browserdefs.h -i ../../errorlogger.h +DBUS_INTERFACES += my_dbus_interfaces + +dbus_adaptors.files += ../../../common/IErrorLogger.xml +dbus_adaptors.header_flags = -l errorlogger -i ../../../common/browserdefs.h -i ../../errorlogger.h +DBUS_ADAPTORS += dbus_adaptors + +# Input +HEADERS += testerrorloggerdbus.h ../../../common/errorloggerdbus.h ../../errorlogger.h +SOURCES += testerrorloggerdbus.cpp ../../../common/errorloggerdbus.cpp ../../errorlogger.cpp diff --git a/browser/unit-tests/errorloggerdbus/testerrorloggerdbus.cpp b/browser/unit-tests/errorloggerdbus/testerrorloggerdbus.cpp new file mode 100644 index 0000000..3edb91b --- /dev/null +++ b/browser/unit-tests/errorloggerdbus/testerrorloggerdbus.cpp @@ -0,0 +1,109 @@ +/** + * Copyright (C) 2014, Pelagicore + * + * Author: Jonatan Palsson + * + * This file is part of the GENIVI project Browser Proof-Of-Concept + * For further information, see http://genivi.org/ + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include +#include + +#include "../../../common/errorloggerdbus.h" +#include "../../../common/browserdefs.h" + +#include "testerrorloggerdbus.h" +#include "ierrorlogger_interface.h" +#include "ierrorlogger_adaptor.h" +#include "../../errorlogger.h" + +void TestErrorLoggerDBus::initTestCase() { + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + + m_connection = new QDBusConnection(QDBusConnection::sessionBus()); + if(!m_connection->isConnected()) { + qDebug() << "failed to connect to dbus"; + exit(1); + } + + QString *dbusservicename = new QString("genivi.poc.browser1"); + qDebug() << *dbusservicename; + + if(!m_connection->registerService(*dbusservicename)) { + qDebug() << "failed register service " << *dbusservicename; + exit(1); + } + + m_err = errorlogger::instance(); + new IErrorLoggerAdaptor(m_err); + if(!m_connection->registerObject("/Browser/IErrorLogger", m_err)) + QFAIL("failed register object IErrorLogger"); + + m_eld = new ErrorLoggerDbus(); + m_eld->connectdbussession("1"); +} +void TestErrorLoggerDBus::cleanup() +{ + m_err->clearErrors(); +} + +void TestErrorLoggerDBus::canLogMessage() +{ + qlonglong date = QDateTime::currentDateTime().toTime_t(); + errorlogger* el = errorlogger::instance(); + el->logError("Error!"); + el->logError("Error2!"); + QVERIFY(m_eld->getItemsCount(date - 10, date + 10) == 2); + conn::brw::ErrorItemList items = m_eld->getItems(date - 10, + date + 10, conn::brw::EST_DATE_DESCENDING, 0, 100); + QVERIFY(items.size() == 2); +} + +void TestErrorLoggerDBus::canGetSorted() +{ + qlonglong date = QDateTime::currentDateTime().toTime_t(); + errorlogger* el = errorlogger::instance(); + el->logError("Error!"); + QTest::qSleep(1000); + el->logError("Error2!"); + conn::brw::ErrorItemList items = m_eld->getItems(date - 10, + date + 10, conn::brw::EST_DATE_ASCENDING, 0, 100); + qDebug() << items.size(); + qDebug() << items.at(0).strDescription; + qDebug() << items.at(1).strDescription; + QVERIFY(items.at(0).strDescription.compare("Error!") == 0); + QVERIFY(items.at(1).strDescription.compare("Error2!") == 0); +} + +void TestErrorLoggerDBus::isNotifiedOnNewItem() +{ + QSignalSpy spy (m_eld, SIGNAL(onNewErrorItem(conn::brw::ErrorItem))); + errorlogger::instance()->logError("Error!"); + QVERIFY (spy.wait(1000)); +} + +void TestErrorLoggerDBus::isNotifiedWhenListChanges() +{ + QSignalSpy spy (m_eld, SIGNAL(onErrorListChanged(void))); + errorlogger::instance()->clearErrors(); + QVERIFY (spy.wait(1000)); +} +QTEST_MAIN (TestErrorLoggerDBus); diff --git a/browser/unit-tests/errorloggerdbus/testerrorloggerdbus.h b/browser/unit-tests/errorloggerdbus/testerrorloggerdbus.h new file mode 100644 index 0000000..bb0e38f --- /dev/null +++ b/browser/unit-tests/errorloggerdbus/testerrorloggerdbus.h @@ -0,0 +1,45 @@ +/** + * Copyright (C) 2014, Pelagicore + * + * Author: Jonatan Palsson + * + * This file is part of the GENIVI project Browser Proof-Of-Concept + * For further information, see http://genivi.org/ + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#ifndef TESTERRORLOGGERDBUS_H +#define TESTERRORLOGGERDBUS_H + +#include +#include + +#include "../../../common/errorloggerdbus.h" +#include "../../../common/browserdefs.h" + +#include "ierrorlogger_interface.h" +#include "ierrorlogger_adaptor.h" +#include "../../errorlogger.h" + +class TestErrorLoggerDBus: public QObject +{ + Q_OBJECT + +private slots: + void initTestCase(); + void cleanup(); + + void canLogMessage(); + void canGetSorted(); + void isNotifiedOnNewItem(); + void isNotifiedWhenListChanges(); + +private: + ErrorLoggerDbus *m_eld = NULL; + QDBusConnection *m_connection = NULL; + errorlogger *m_err; +}; + +#endif /* TESTERRORLOGGERDBUS_H */ diff --git a/common/browserdefs.h b/common/browserdefs.h index 8499904..9747173 100644 --- a/common/browserdefs.h +++ b/common/browserdefs.h @@ -592,6 +592,42 @@ namespace conn { EST_DATE_DESCENDING = 1 }; + //## operation operator>>(QDBusArgument,ERROR_SORT_TYPE) + inline const QDBusArgument& operator>>(const QDBusArgument& a_rDbusArg, ERROR_SORT_TYPE& a_rArg) { + //#[ operation operator>>(QDBusArgument,ERROR_SORT_TYPE) + a_rDbusArg.beginStructure(); + + int param = 0; + a_rDbusArg >> param; + + switch (param) + { + case EST_DATE_ASCENDING: + { + a_rArg = EST_DATE_ASCENDING; + break; + } + case EST_DATE_DESCENDING: + { + a_rArg = EST_DATE_DESCENDING; + break; + } + } + a_rDbusArg.endStructure(); + return a_rDbusArg; + //#] + } + + //## operation operator<<(QDBusArgument,ERROR_SORT_TYPE) + inline const QDBusArgument& operator<<(QDBusArgument& a_rDbusArg, ERROR_SORT_TYPE a_rArg) { + //#[ operation operator<<(QDBusArgument,ERROR_SORT_TYPE) + a_rDbusArg.beginStructure(); + int param = a_rArg; + a_rDbusArg << param; + a_rDbusArg.endStructure(); + return a_rDbusArg; + //#] + } struct ErrorItem { /*! @@ -620,6 +656,16 @@ namespace conn { QString strDescription; //## attribute strDescription }; + inline bool ltError(ErrorItem a, ErrorItem b) + { + return a.i64DateTime < b.i64DateTime; + } + + inline bool gtError( ErrorItem a, ErrorItem b) + { + return a.i64DateTime > b.i64DateTime; + } + //## package connInterfaces::connPublic::conn::brw::def //## class ErrorItemList /*! -- cgit v1.2.1