--- /dev/null
+/*
+ * This file is part of QMAFW
+ *
+ * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights
+ * reserved.
+ *
+ * Contact: Visa Smolander <visa.smolander@nokia.com>
+ *
+ * This software, including documentation, is protected by copyright controlled
+ * by Nokia Corporation. All rights are reserved. Copying, including
+ * reproducing, storing, adapting or translating, any or all of this material
+ * requires the prior written consent of Nokia Corporation. This material also
+ * contains confidential information which may not be disclosed to others
+ * without the prior written consent of Nokia.
+ *
+ */
+
+#include <MafwInternalRegistry.h>
+#include <MafwRenderer.h>
+#include <QVariant>
+#include <QtTest/QtTest>
+#include <glib-object.h>
+#include <QSettings>
+
+#include "Ut_MafwGstRendererPlugin.h"
+#include "MafwGstRendererPlugin.h"
+#include "MafwGstRenderer.h"
+#include "MafwGstRendererVolume.h"
+#include "MafwGstRendererDolby.h"
+#include "../common/MafwStubHelper.h"
+
+Q_DECLARE_METATYPE(MafwRenderer*)
+
+extern void setStubHelper(MafwStubHelper* stubHlp);
+QMap<QString,QString> renderers;
+int renderer_index = 0;
+
+void Ut_MafwGstRendererPlugin::initTestCase()
+{
+ qRegisterMetaType<MafwRenderer*>();
+ m_stubHelper = new MafwStubHelper;
+ setStubHelper(m_stubHelper);
+
+ m_plugin = new MafwGstRendererPlugin();
+}
+
+void Ut_MafwGstRendererPlugin::testInProcess()
+{
+ QSignalSpy addedSpy( MafwRegistry::instance(), SIGNAL(rendererAdded(const QString&, const QString&)) );
+ QSignalSpy removedSpy( MafwRegistry::instance(), SIGNAL(rendererRemoved(const QString&, const QString&)) );
+ //MafwBasicRenderer::initialize is called twice:
+ //from its own constructor and from MafwGstRenderer::initialize
+
+ //Basic renderer initialize fails
+ m_stubHelper->expect("initialize", false);
+ m_stubHelper->expect("initialize", false);
+ m_plugin->initialize( MafwInternalRegistry::internalInstance() );
+ QCOMPARE( addedSpy.size(), 0 );
+ addedSpy.clear();
+ removedSpy.clear();
+
+ m_stubHelper->expect("initialize", true);
+ m_stubHelper->expect("initialize", true);
+ m_plugin->initialize( MafwInternalRegistry::internalInstance() );
+ QCOMPARE( addedSpy.size(), 1 );
+ QCOMPARE( removedSpy.size(), 0 );
+ QVariantList arguments = addedSpy.takeFirst();
+
+ QString uuid = arguments.at(0).toString();
+ QCOMPARE(uuid, QString("mafw_gst_renderer"));
+ QCOMPARE(arguments.at(1).toString(), QString("QMAFW GStreamer Renderer"));
+
+ MafwRenderer* rnd = MafwRegistry::instance()->renderer(uuid);
+ QVERIFY(rnd != 0);
+ QCOMPARE(rnd->pluginName(), m_plugin->name());
+
+ MafwInternalRegistry::internalInstance()->removeExtension(uuid);
+ QCOMPARE( removedSpy.size(), 1 );
+}
+
+void Ut_MafwGstRendererPlugin::testOutProcess()
+{
+ QCoreApplication::setApplicationName("qmafw-dbus-wrapper");
+ //TODO empty settings case
+
+ renderers.insert("mafw-gst-renderer", "Mafw-GStreamer-Renderer");
+ renderers.insert("mafw-gst-video-suite-renderer", "Mafw-GStreamer-Renderer-For-Video");
+
+ QSignalSpy addedSpy( MafwRegistry::instance(), SIGNAL(rendererAdded(const QString&, const QString&)) );
+ QSignalSpy removedSpy( MafwRegistry::instance(), SIGNAL(rendererRemoved(const QString&, const QString&)) );
+ //MafwBasicRenderer::initialize is called twice:
+ //from its own constructor and from MafwGstRenderer::initialize
+
+ //Basic renderer initialize fails
+ m_stubHelper->expect("initialize", false);
+ m_stubHelper->expect("initialize", false);
+ m_stubHelper->expect("initialize", false);
+ m_stubHelper->expect("initialize", false);
+ m_plugin->initialize( MafwInternalRegistry::internalInstance() );
+ QCOMPARE( addedSpy.size(), 0 );
+ addedSpy.clear();
+ removedSpy.clear();
+
+ m_stubHelper->expect("initialize", true);
+ m_stubHelper->expect("initialize", true);
+ m_stubHelper->expect("initialize", true);
+ m_stubHelper->expect("initialize", true);
+ m_plugin->initialize( MafwInternalRegistry::internalInstance() );
+ QCOMPARE( addedSpy.size(), 2 );
+ QCOMPARE( removedSpy.size(), 0 );
+
+ QVariantList arguments = addedSpy.takeFirst();
+ QString uuid1 = arguments.at(0).toString();
+ QString name1 = arguments.at(1).toString();
+ arguments = addedSpy.takeFirst();
+ QString uuid2 = arguments.at(0).toString();
+ QString name2 = arguments.at(1).toString();
+
+ MafwRenderer* rnd1 = MafwRegistry::instance()->renderer(uuid1);
+ QVERIFY(rnd1 != 0);
+ QCOMPARE(rnd1->pluginName(), m_plugin->name());
+ MafwRenderer* rnd2 = MafwRegistry::instance()->renderer(uuid2);
+ QVERIFY(rnd2 != 0);
+ QCOMPARE(rnd2->pluginName(), m_plugin->name());
+
+ QCOMPARE(uuid1, rnd1->uuid());
+ QCOMPARE(name1, rnd1->name());
+ QCOMPARE(uuid2, rnd2->uuid());
+ QCOMPARE(name2, rnd2->name());
+
+ MafwInternalRegistry::internalInstance()->removeExtension(uuid1);
+ MafwInternalRegistry::internalInstance()->removeExtension(uuid2);
+
+ // Test huge amount of renderers
+ renderers.clear();
+ addedSpy.clear();
+ removedSpy.clear();
+ for(int i = 0; i < 100; i++)
+ {
+ QString rndId = QString("rndId %1").arg(i);
+ QString rndName = QString("rndName %1").arg(i);
+ renderers.insert(rndId, rndName);
+ m_stubHelper->expect("initialize", true);
+ m_stubHelper->expect("initialize", true);
+ }
+ m_plugin->initialize( MafwInternalRegistry::internalInstance());
+ QCOMPARE(removedSpy.size(), 0);
+ QCOMPARE(addedSpy.size(), 100);
+
+ // Let's only remove 99 renderers
+ for(int i = 0; i < 99; i++)
+ {
+ QString rndId = QString("rndId %1").arg(i);
+ MafwInternalRegistry::internalInstance()->removeExtension(rndId);
+ }
+ QCOMPARE(removedSpy.size(), 99);
+ // Check that there is still one renderer left
+ MafwRenderer* rnd99 = MafwRegistry::instance()->renderer("rndId 99");
+ QVERIFY(rnd99 != 0);
+ MafwInternalRegistry::internalInstance()->removeExtension("rndId 99");
+
+ addedSpy.clear();
+ removedSpy.clear();
+
+ //Test no renderers
+ renderers.clear();
+ m_plugin->initialize(MafwInternalRegistry::internalInstance());
+ QCOMPARE(addedSpy.size(), 0);
+
+ //Test 2 renderers with same uuid and name
+ renderers.insert("rndId1", "rndName1");
+ renderers.insert("rndId1", "rndName1");
+ m_stubHelper->expect("initialize", true);
+ m_stubHelper->expect("initialize", true);
+ m_stubHelper->expect("initialize", false);
+ m_stubHelper->expect("initialize", false);
+ m_plugin->initialize( MafwInternalRegistry::internalInstance());
+ QCOMPARE(addedSpy.size(), 1);
+
+}
+
+void Ut_MafwGstRendererPlugin::cleanupTestCase()
+{
+ delete m_plugin;
+ while(QCoreApplication::hasPendingEvents())
+ {
+ QCoreApplication::sendPostedEvents();
+ QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
+ QCoreApplication::processEvents();
+ }
+}
+
+void gst_init(int *argc, char **argv[])
+{
+ Q_UNUSED(argc);
+ Q_UNUSED(argv);
+}
+
+QTEST_MAIN(Ut_MafwGstRendererPlugin)
+
+//Volume stub
+MafwGstRendererVolume::MafwGstRendererVolume()
+{
+ qDebug() << "Volume stub ctor";
+}
+
+void MafwGstRendererVolume::connectToPulseAudio()
+{
+}
+
+MafwGstRendererVolume::~MafwGstRendererVolume()
+{
+}
+
+uint MafwGstRendererVolume::getVolume()
+{
+ qDebug(__PRETTY_FUNCTION__);
+ return (uint)1;
+}
+
+bool MafwGstRendererVolume::setVolume (uint value)
+{
+ Q_UNUSED(value);
+ return true;
+}
+
+//QSettings stub
+QSettings::QSettings( const QString&, const QString&, QObject* ){}
+//Hope we will never need below ctor stub, because it is used somehow by unit test framework.
+//QSettings::QSettings(QSettings::Scope, const QString&, const QString&, QObject*){}
+QSettings::QSettings(QSettings::Format, QSettings::Scope, const QString&, const QString&, QObject*){}
+QSettings::QSettings(const QString&, QSettings::Format, QObject*){}
+QSettings::QSettings(QObject*){}
+QSettings::~QSettings(){}
+
+QVariant QSettings::value(const QString& key, const QVariant& ) const
+{
+ if(renderers.size() == 0)
+ {
+ return QString();
+ }
+ QMap<QString, QString>::const_iterator renderers_iterator = renderers.constBegin();
+ for(int i = 0; i < renderer_index; i++)
+ {
+ renderers_iterator++;
+ }
+
+ if(key == "Id")
+ {
+ return renderers_iterator.key();
+ }
+ else
+ {
+ return renderers_iterator.value();
+ }
+}
+
+int QSettings::beginReadArray(const QString&)
+{
+ return renderers.count();
+}
+
+void QSettings::setArrayIndex(int i)
+{
+ renderer_index = i;
+}
+
+void QSettings::endArray()
+{
+}
+
+void QSettings::beginGroup(const QString &prefix)
+{
+ Q_UNUSED(prefix);
+}
+
+void QSettings::endGroup()
+{
+
+}
+
+bool QSettings::contains(const QString &key) const
+{
+ return true;
+}