Added qmafw-gst-subtitles-renderer-0.0.55 for Meego Harmattan 1.2
[mafwsubrenderer] / qmafw-gst-subtitles-renderer / unittests / ut_MafwGstRendererVolume / ut_MafwGstRendererVolume.cpp
diff --git a/qmafw-gst-subtitles-renderer/unittests/ut_MafwGstRendererVolume/ut_MafwGstRendererVolume.cpp b/qmafw-gst-subtitles-renderer/unittests/ut_MafwGstRendererVolume/ut_MafwGstRendererVolume.cpp
new file mode 100644 (file)
index 0000000..1558361
--- /dev/null
@@ -0,0 +1,223 @@
+/*
+ * 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 "ut_MafwGstRendererVolume.h"
+
+#include <QDebug>
+#include <QVariant>
+#include <dbus/dbus.h>
+
+#include "MafwGstRendererVolume.h"
+#include "MafwStubHelper.h"
+
+extern void setStubHelper(MafwStubHelper* stubHlp);
+extern void signalVolumeUpdated(uint channel, uint value);
+extern void giveRestoreEntryReply();
+extern void giveVolumeReply(QMap<uint, uint> volumes);
+extern DBusMessage* m_setVolumeMethod;
+
+void Ut_MafwGstRendererVolume::initTestCase()
+{
+    m_stubHelper = new MafwStubHelper;
+    setStubHelper(m_stubHelper);
+
+    //Tests the case where first pulseaudio connect fails and
+    //DBUSConnectionEventLoop::addConnection fails.
+    m_stubHelper->expect("dbus_connection_open", false);
+    m_stubHelper->expect("dbus_error_is_set", true);
+    m_volume = new MafwGstRendererVolume();
+    QVERIFY(m_stubHelper->allCallsConsumed());
+    //Wait that connecting to pulseaudio is retried
+
+    m_stubHelper->expect("dbus_connection_open", true);
+    m_stubHelper->expect("dbus_error_is_set", false);
+    m_stubHelper->expect("addConnection", false);
+    QTest::qWait(3000);
+    QVERIFY(m_stubHelper->allCallsConsumed());
+
+    delete m_volume;
+    //Tests the successfull case
+    m_stubHelper->expect("dbus_connection_open", true);
+    m_stubHelper->expect("dbus_error_is_set", false);
+    m_stubHelper->expect("addConnection", true);
+    m_volume = new MafwGstRendererVolume();
+    QVERIFY(m_stubHelper->allCallsConsumed());
+}
+
+void Ut_MafwGstRendererVolume::cleanupTestCase()
+{
+    m_stubHelper->expect("removeConnection", false);
+    delete m_volume;
+    QVERIFY(m_stubHelper->allCallsConsumed());
+    delete m_stubHelper;
+}
+
+void Ut_MafwGstRendererVolume::testVolumeReply()
+{
+    QMap<uint, uint> map;
+//Error reply for "GetEntryByName"
+    m_stubHelper->expect("dbus_set_error_from_message", true);
+    
+    //Pulseaudio reconnect is done
+    m_stubHelper->expect("removeConnection", false);
+    m_stubHelper->expect("dbus_connection_open", true);
+    m_stubHelper->expect("dbus_error_is_set", false);
+    m_stubHelper->expect("addConnection", true);
+    giveRestoreEntryReply();    
+    QTest::qWait(500);
+    QVERIFY(m_stubHelper->allCallsConsumed());    
+    QCOMPARE(m_volume->getVolume(), (uint)0);
+//Error reply for "Get Volume"
+    m_stubHelper->expect("dbus_set_error_from_message", false);
+    m_stubHelper->expect("dbus_set_error_from_message", true);
+    giveRestoreEntryReply();
+    giveVolumeReply(map);
+    QVERIFY(m_stubHelper->allCallsConsumed());
+    QCOMPARE(m_volume->getVolume(), (uint)0);
+//Invalid reply for "Get Volume"
+    m_stubHelper->expect("dbus_set_error_from_message", false);
+    m_stubHelper->expect("dbus_set_error_from_message", false);
+    giveRestoreEntryReply();
+    giveVolumeReply(map);
+    QVERIFY(m_stubHelper->allCallsConsumed());
+    QCOMPARE(m_volume->getVolume(), (uint)0);
+
+//Maximum value
+    giveRestoreEntryReply();
+    map[0] = 0x10000;
+    giveVolumeReply(map);
+    QCOMPARE(m_volume->getVolume(), (uint)100);
+//Maximum value-1
+    giveRestoreEntryReply();
+    map[0] = 0x10000;
+    giveVolumeReply(map);
+    QCOMPARE(m_volume->getVolume(), (uint)100);
+//Value above range
+    giveRestoreEntryReply();
+    map[0] = 0x10001;
+    giveVolumeReply(map);
+    QCOMPARE(m_volume->getVolume(), (uint)100);
+//Huge value
+    map[0] = 0xFF000;
+    giveRestoreEntryReply();
+    giveVolumeReply(map);
+    QCOMPARE(m_volume->getVolume(), (uint)100);
+//Zero
+    map[0] = 0;
+    giveRestoreEntryReply();
+    giveVolumeReply(map);
+    QCOMPARE(m_volume->getVolume(), (uint)0);
+//Many channels, containing mono channel
+    map[0] = 0x10000/2;
+    map[1] = 20;
+    map[2] = 30;
+    map[3] = 40;
+    giveRestoreEntryReply();
+    giveVolumeReply(map);
+    QCOMPARE(m_volume->getVolume(), (uint)50);
+//Many channels, without mono channel
+    map.remove(0);
+    map[1] = 0x10000/3;
+    map[2] = 0x10000/4;
+    map[3] = 0x10000/5;
+    giveRestoreEntryReply();
+    giveVolumeReply(map);
+    QCOMPARE(m_volume->getVolume(), (uint)(100/3));
+}
+
+void Ut_MafwGstRendererVolume::testSignal()
+{    
+    QSignalSpy spy(m_volume, SIGNAL(volumeChanged(uint)));
+    QFETCH(uint, volume);
+    QFETCH(uint, channel);
+    // Volume updated signal gives volume level as pulse audio's native value
+    // Which has range 0 - 0x10000
+    signalVolumeUpdated(channel, 0x10000*volume/100);
+
+    QCOMPARE(spy.count(), 1);
+    QList<QVariant> arguments = spy.takeFirst();
+
+    if (volume > 100) //Volume must not be set out of range
+    {
+        volume = 100;
+    }
+    QCOMPARE(arguments.at(0).toUInt(), volume);
+    QCOMPARE(m_volume->getVolume(), volume);
+}
+
+void Ut_MafwGstRendererVolume::testSignal_data()
+{
+    QTest::addColumn<uint>("volume");
+    QTest::addColumn<uint>("channel");
+
+    QTest::newRow("Maximum value") << (uint)100 << (uint)0;
+    QTest::newRow("Maximum value -1") << (uint)99 << (uint)0;
+    QTest::newRow("Value above range") << (uint)101 << (uint)0;
+    QTest::newRow("Huge value") << (uint)-1 << (uint)0;
+    QTest::newRow("Zero") << (uint)0 << (uint)0;
+    QTest::newRow("One") << (uint)1 << (uint)0;
+    QTest::newRow("Another channel") << (uint)2 << (uint)1;
+}
+
+//one MAFW volume step is 0x10000/100 = 655,36 native volume steps
+void Ut_MafwGstRendererVolume::testSetVolume()
+{    
+    QFETCH(uint, volume);
+    quint32 value = 1;
+
+    m_volume->setVolume(volume);
+    QVERIFY(m_setVolumeMethod != 0);
+    DBusMessageIter iter, array_iterator, struct_iterator, value_iterator;
+    dbus_message_iter_init (m_setVolumeMethod, &iter);
+    QCOMPARE(dbus_message_iter_get_arg_type(&iter), DBUS_TYPE_STRING);//interface
+    dbus_message_iter_next(&iter);
+    QCOMPARE(dbus_message_iter_get_arg_type(&iter), DBUS_TYPE_STRING);//property
+    dbus_message_iter_next(&iter);
+    dbus_message_iter_recurse (&iter, &array_iterator);
+    QCOMPARE(dbus_message_iter_get_arg_type(&array_iterator), DBUS_TYPE_ARRAY);
+    dbus_message_iter_recurse (&array_iterator, &struct_iterator);
+    QCOMPARE(dbus_message_iter_get_arg_type(&struct_iterator), DBUS_TYPE_STRUCT);
+
+    dbus_message_iter_recurse (&struct_iterator, &value_iterator);
+    QCOMPARE(dbus_message_iter_get_arg_type (&value_iterator), DBUS_TYPE_UINT32);
+    dbus_message_iter_get_basic (&value_iterator, &value);
+    QCOMPARE(value, (quint32)0); //mono channel
+    dbus_message_iter_next (&value_iterator);
+    QCOMPARE(dbus_message_iter_get_arg_type (&value_iterator), DBUS_TYPE_UINT32);
+    dbus_message_iter_get_basic (&value_iterator, &value);
+
+    if (volume > 100) //Volume must not be set out of range
+    {
+        volume = 100;
+    }
+
+    QCOMPARE(value, (quint32)(volume*0x10000/100));
+}
+
+
+void Ut_MafwGstRendererVolume::testSetVolume_data()
+{        
+    QTest::addColumn<uint>("volume");
+
+    QTest::newRow("Set volume to 0") << (uint)0;
+    QTest::newRow("Set volume to 1") << (uint)1;
+    QTest::newRow("Set volume to 99") << (uint)99;
+    QTest::newRow("Set volume to 100") << (uint)100;
+    QTest::newRow("Set volume to huge value") << (uint)-1;
+}
+
+QTEST_MAIN(Ut_MafwGstRendererVolume)
+