--- /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 "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)
+