aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/unity/gmenuharness/MenuItemMatcher.h4
-rw-r--r--src/gmenuharness/MenuItemMatcher.cpp16
-rw-r--r--tests/integration/indicator-sound-test-base.cpp76
-rw-r--r--tests/integration/indicator-sound-test-base.h11
-rw-r--r--tests/integration/test-indicator.cpp186
-rw-r--r--tests/integration/utils/dbus-pulse-volume.cpp5
6 files changed, 275 insertions, 23 deletions
diff --git a/include/unity/gmenuharness/MenuItemMatcher.h b/include/unity/gmenuharness/MenuItemMatcher.h
index dc1d6f3..6f7f94c 100644
--- a/include/unity/gmenuharness/MenuItemMatcher.h
+++ b/include/unity/gmenuharness/MenuItemMatcher.h
@@ -93,6 +93,10 @@ public:
MenuItemMatcher& string_attribute(const std::string& name, const std::string& value);
+ MenuItemMatcher& int32_attribute(const std::string& name, int value);
+
+ MenuItemMatcher& double_attribute(const std::string& name, double value);
+
MenuItemMatcher& toggled(bool toggled);
MenuItemMatcher& mode(Mode mode);
diff --git a/src/gmenuharness/MenuItemMatcher.cpp b/src/gmenuharness/MenuItemMatcher.cpp
index 2280ef5..ab22364 100644
--- a/src/gmenuharness/MenuItemMatcher.cpp
+++ b/src/gmenuharness/MenuItemMatcher.cpp
@@ -354,6 +354,22 @@ MenuItemMatcher& MenuItemMatcher::string_attribute(const string& name, const str
&gvariant_deleter));
}
+MenuItemMatcher& MenuItemMatcher::int32_attribute(const std::string& name, int value)
+{
+ return attribute(
+ name,
+ shared_ptr<GVariant>(g_variant_new_int32 (value),
+ &gvariant_deleter));
+}
+
+MenuItemMatcher& MenuItemMatcher::double_attribute(const std::string& name, double value)
+{
+ return attribute(
+ name,
+ shared_ptr<GVariant>(g_variant_new_double (value),
+ &gvariant_deleter));
+}
+
MenuItemMatcher& MenuItemMatcher::toggled(bool isToggled)
{
p->m_isToggled = make_shared<bool>(isToggled);
diff --git a/tests/integration/indicator-sound-test-base.cpp b/tests/integration/indicator-sound-test-base.cpp
index 49e2ec5..a839fbc 100644
--- a/tests/integration/indicator-sound-test-base.cpp
+++ b/tests/integration/indicator-sound-test-base.cpp
@@ -45,7 +45,7 @@ IndicatorSoundTestBase::~IndicatorSoundTestBase()
}
-bool IndicatorSoundTestBase::setVolume(QString const &role, double volume)
+bool IndicatorSoundTestBase::setStreamRestoreVolume(QString const &role, double volume)
{
QProcess setVolume;
setVolume.start(VOLUME_SET_BIN, QStringList()
@@ -60,6 +60,25 @@ bool IndicatorSoundTestBase::setVolume(QString const &role, double volume)
return setVolume.exitCode() == 0;
}
+bool IndicatorSoundTestBase::setSinkVolume(double volume)
+{
+ QString volume_percentage = QString("%1\%").arg(volume*100);
+ QProcess setVolume;
+ setVolume.start("pactl", QStringList()
+ << "-s"
+ << "127.0.0.1"
+ << "set-sink-volume"
+ << "0"
+ << volume_percentage);
+ if (!setVolume.waitForStarted())
+ return false;
+
+ if (!setVolume.waitForFinished())
+ return false;
+
+ return setVolume.exitCode() == 0;
+}
+
bool IndicatorSoundTestBase::startTestSound(QString const &role)
{
testSoundProcess.terminate();
@@ -81,7 +100,37 @@ void IndicatorSoundTestBase::stopTestSound()
testSoundProcess.terminate();
}
-void IndicatorSoundTestBase::startPulse()
+void IndicatorSoundTestBase::startPulseDesktop()
+{
+ try
+ {
+ pulseaudio.reset(
+ new QProcessDBusService(DBusTypes::DBUS_PULSE,
+ QDBusConnection::SessionBus,
+ "pulseaudio",
+ QStringList() << "--start"
+ << "-vvvv"
+ << "--disable-shm=true"
+ << "--daemonize=false"
+ << "--use-pid-file=false"
+ << "--system=false"
+ << "--exit-idle-time=-1"
+ << "-n"
+ << "--load=module-null-sink"
+ << "--log-target=file:/tmp/pulse-daemon.log"
+ << "--load=module-dbus-protocol"
+ << "--load=module-native-protocol-tcp auth-ip-acl=127.0.0.1"
+ ));
+ pulseaudio->start(dbusTestRunner.sessionConnection());
+ }
+ catch (exception const& e)
+ {
+ cout << "pulseaudio(): " << e.what() << endl;
+ throw;
+ }
+}
+
+void IndicatorSoundTestBase::startPulsePhone()
{
try
{
@@ -151,8 +200,6 @@ void IndicatorSoundTestBase::startIndicator()
}
}
-// /usr/bin/pulseaudio --start -vvvv --disable-shm=true --daemonize=false --use-pid-file=false --system=false --exit-idle-time=-1 -n "--load=module-null-sink sink_name=multimedia" --load=module-stream-restore
-
mh::MenuMatcher::Parameters IndicatorSoundTestBase::desktopParameters()
{
return mh::MenuMatcher::Parameters(
@@ -161,6 +208,14 @@ mh::MenuMatcher::Parameters IndicatorSoundTestBase::desktopParameters()
"/com/canonical/indicator/sound/desktop");
}
+mh::MenuMatcher::Parameters IndicatorSoundTestBase::phoneParameters()
+{
+ return mh::MenuMatcher::Parameters(
+ "com.canonical.indicator.sound",
+ { { "indicator", "/com/canonical/indicator/sound" } },
+ "/com/canonical/indicator/sound/phone");
+}
+
void IndicatorSoundTestBase::SetUp()
{
setenv("GSETTINGS_SCHEMA_DIR", SCHEMA_DIR, true);
@@ -216,9 +271,22 @@ unity::gmenuharness::MenuItemMatcher IndicatorSoundTestBase::volumeSlider(double
return mh::MenuItemMatcher().radio()
.label("Volume")
.round_doubles(0.1)
+ .int32_attribute("target", 0)
+ .double_attribute("min-value", 0.0)
+ .double_attribute("max-value", 1.0)
+ .double_attribute("step", 0.01)
+ .string_attribute("x-canonical-type", "com.canonical.unity.slider")
.pass_through_double_attribute("action", volume);
}
+unity::gmenuharness::MenuItemMatcher IndicatorSoundTestBase::silentModeSwitch(bool toggled)
+{
+ return mh::MenuItemMatcher::checkbox()
+ .label("Silent Mode")
+ .action("indicator.silent-mode")
+ .toggled(toggled);
+}
+
bool IndicatorSoundTestBase::waitMenuChange()
{
if (!menu_interface_)
diff --git a/tests/integration/indicator-sound-test-base.h b/tests/integration/indicator-sound-test-base.h
index 04a579f..019efc9 100644
--- a/tests/integration/indicator-sound-test-base.h
+++ b/tests/integration/indicator-sound-test-base.h
@@ -45,10 +45,13 @@ protected:
void TearDown() override;
void startIndicator();
- void startPulse();
+ void startPulseDesktop();
+ void startPulsePhone();
void startAccountsService();
- bool setVolume(QString const &role, double volume);
+ bool setStreamRestoreVolume(QString const &role, double volume);
+
+ bool setSinkVolume(double volume);
bool startTestSound(QString const &role);
@@ -58,8 +61,12 @@ protected:
static unity::gmenuharness::MenuMatcher::Parameters desktopParameters();
+ static unity::gmenuharness::MenuMatcher::Parameters phoneParameters();
+
static unity::gmenuharness::MenuItemMatcher volumeSlider(double volume);
+ static unity::gmenuharness::MenuItemMatcher silentModeSwitch(bool toggled);
+
bool waitMenuChange();
bool waitVolumeChangedInIndicator();
diff --git a/tests/integration/test-indicator.cpp b/tests/integration/test-indicator.cpp
index bb5adec..a248658 100644
--- a/tests/integration/test-indicator.cpp
+++ b/tests/integration/test-indicator.cpp
@@ -32,16 +32,15 @@ class TestIndicator: public IndicatorSoundTestBase
{
};
-TEST_F(TestIndicator, ChangeRoleVolume)
+TEST_F(TestIndicator, PhoneChangeRoleVolume)
{
double INITIAL_VOLUME = 0.0;
ASSERT_NO_THROW(startAccountsService());
- ASSERT_NO_THROW(startPulse());
+ ASSERT_NO_THROW(startPulsePhone());
// initialize volumes in pulseaudio
- EXPECT_TRUE(setVolume("mutimedia", INITIAL_VOLUME));
- EXPECT_TRUE(setVolume("alert", INITIAL_VOLUME));
+ EXPECT_TRUE(setStreamRestoreVolume("alert", INITIAL_VOLUME));
// start now the indicator, so it picks the new volumes
ASSERT_NO_THROW(startIndicator());
@@ -53,7 +52,7 @@ TEST_F(TestIndicator, ChangeRoleVolume)
double randomVolume = randInt / 100.0;
// set an initial volume to the alert role
- setVolume("alert", 1.0);
+ setStreamRestoreVolume("alert", 1.0);
EXPECT_TRUE(waitVolumeChangedInIndicator());
// play a test sound, it should change the role in the indicator
@@ -61,31 +60,31 @@ TEST_F(TestIndicator, ChangeRoleVolume)
EXPECT_TRUE(waitVolumeChangedInIndicator());
// set the random volume to the multimedia role
- EXPECT_TRUE(setVolume("multimedia", randomVolume));
+ EXPECT_TRUE(setStreamRestoreVolume("multimedia", randomVolume));
if (randomVolume != INITIAL_VOLUME)
{
EXPECT_TRUE(waitVolumeChangedInIndicator());
}
// check the indicator
- EXPECT_MATCHRESULT(mh::MenuMatcher(desktopParameters())
+ EXPECT_MATCHRESULT(mh::MenuMatcher(phoneParameters())
.item(mh::MenuItemMatcher()
.action("indicator.root")
.string_attribute("x-canonical-type", "com.canonical.indicator.root")
+ .string_attribute("x-canonical-scroll-action", "indicator.scroll")
.string_attribute("x-canonical-secondary-action", "indicator.mute")
+ .string_attribute("submenu-action", "indicator.indicator-shown")
.mode(mh::MenuItemMatcher::Mode::starts_with)
.submenu()
.item(mh::MenuItemMatcher()
.section()
- .item(mh::MenuItemMatcher().checkbox()
- .label("Mute")
- )
+ .item(silentModeSwitch(false))
.item(volumeSlider(randomVolume))
)
).match());
// check that the last item is Sound Settings
- EXPECT_MATCHRESULT(mh::MenuMatcher(desktopParameters())
+ EXPECT_MATCHRESULT(mh::MenuMatcher(phoneParameters())
.item(mh::MenuItemMatcher()
.action("indicator.root")
.string_attribute("x-canonical-type", "com.canonical.indicator.root")
@@ -94,6 +93,7 @@ TEST_F(TestIndicator, ChangeRoleVolume)
.submenu()
.item(mh::MenuItemMatcher()
.label("Sound Settings…")
+ .action("indicator.phone-settings")
)
).match());
@@ -107,6 +107,97 @@ TEST_F(TestIndicator, ChangeRoleVolume)
}
// check the initial volume for the alert role
+ EXPECT_MATCHRESULT(mh::MenuMatcher(phoneParameters())
+ .item(mh::MenuItemMatcher()
+ .action("indicator.root")
+ .string_attribute("x-canonical-type", "com.canonical.indicator.root")
+ .string_attribute("x-canonical-scroll-action", "indicator.scroll")
+ .string_attribute("x-canonical-secondary-action", "indicator.mute")
+ .string_attribute("submenu-action", "indicator.indicator-shown")
+ .mode(mh::MenuItemMatcher::Mode::starts_with)
+ .submenu()
+ .item(mh::MenuItemMatcher()
+ .section()
+ .item(silentModeSwitch(false))
+ .item(volumeSlider(1.0))
+ )
+ ).match());
+
+ // check that the last item is Sound Settings
+ EXPECT_MATCHRESULT(mh::MenuMatcher(phoneParameters())
+ .item(mh::MenuItemMatcher()
+ .action("indicator.root")
+ .string_attribute("x-canonical-type", "com.canonical.indicator.root")
+ .string_attribute("x-canonical-secondary-action", "indicator.mute")
+ .mode(mh::MenuItemMatcher::Mode::ends_with)
+ .submenu()
+ .item(mh::MenuItemMatcher()
+ .label("Sound Settings…")
+ .action("indicator.phone-settings")
+ )
+ ).match());
+}
+
+TEST_F(TestIndicator, PhoneBasicInitialVolume)
+{
+ double INITIAL_VOLUME = 0.0;
+
+ ASSERT_NO_THROW(startAccountsService());
+ ASSERT_NO_THROW(startPulsePhone());
+
+ // initialize volumes in pulseaudio
+ EXPECT_TRUE(setStreamRestoreVolume("alert", INITIAL_VOLUME));
+
+ // start now the indicator, so it picks the new volumes
+ ASSERT_NO_THROW(startIndicator());
+
+ // check the initial volume for the alert role
+ EXPECT_MATCHRESULT(mh::MenuMatcher(phoneParameters())
+ .item(mh::MenuItemMatcher()
+ .action("indicator.root")
+ .string_attribute("x-canonical-type", "com.canonical.indicator.root")
+ .string_attribute("x-canonical-scroll-action", "indicator.scroll")
+ .string_attribute("x-canonical-secondary-action", "indicator.mute")
+ .string_attribute("submenu-action", "indicator.indicator-shown")
+ .mode(mh::MenuItemMatcher::Mode::starts_with)
+ .submenu()
+ .item(mh::MenuItemMatcher()
+ .section()
+ .item(silentModeSwitch(false))
+ .item(volumeSlider(INITIAL_VOLUME))
+ )
+ ).match());
+
+ // check that the last item is Sound Settings
+ EXPECT_MATCHRESULT(mh::MenuMatcher(phoneParameters())
+ .item(mh::MenuItemMatcher()
+ .action("indicator.root")
+ .string_attribute("x-canonical-type", "com.canonical.indicator.root")
+ .string_attribute("x-canonical-secondary-action", "indicator.mute")
+ .mode(mh::MenuItemMatcher::Mode::ends_with)
+ .submenu()
+ .item(mh::MenuItemMatcher()
+ .label("Sound Settings…")
+ .action("indicator.phone-settings")
+ )
+ ).match());
+}
+
+TEST_F(TestIndicator, DesktopBasicInitialVolume)
+{
+ double INITIAL_VOLUME = 0.0;
+
+ ASSERT_NO_THROW(startAccountsService());
+ ASSERT_NO_THROW(startPulseDesktop());
+
+ // initialize volumes in pulseaudio
+ EXPECT_FALSE(setStreamRestoreVolume("alert", INITIAL_VOLUME));
+ EXPECT_TRUE(setSinkVolume(INITIAL_VOLUME));
+
+ // start now the indicator, so it picks the new volumes
+ ASSERT_NO_THROW(startIndicator());
+
+ // check the initial volume for the alert role
EXPECT_MATCHRESULT(mh::MenuMatcher(desktopParameters())
.item(mh::MenuItemMatcher()
.action("indicator.root")
@@ -119,7 +210,7 @@ TEST_F(TestIndicator, ChangeRoleVolume)
.item(mh::MenuItemMatcher().checkbox()
.label("Mute")
)
- .item(volumeSlider(1.0))
+ .item(volumeSlider(INITIAL_VOLUME))
)
).match());
@@ -137,20 +228,42 @@ TEST_F(TestIndicator, ChangeRoleVolume)
).match());
}
-TEST_F(TestIndicator, BasicInitialVolume)
+TEST_F(TestIndicator, DesktopChangeRoleVolume)
{
double INITIAL_VOLUME = 0.0;
ASSERT_NO_THROW(startAccountsService());
- ASSERT_NO_THROW(startPulse());
+ ASSERT_NO_THROW(startPulseDesktop());
// initialize volumes in pulseaudio
- EXPECT_TRUE(setVolume("alert", INITIAL_VOLUME));
+ // expect false for stream restore, because the module
+ // is not loaded in the desktop pulseaudio instance
+ EXPECT_FALSE(setStreamRestoreVolume("mutimedia", INITIAL_VOLUME));
+ EXPECT_FALSE(setStreamRestoreVolume("alert", INITIAL_VOLUME));
+
+ EXPECT_TRUE(setSinkVolume(INITIAL_VOLUME));
// start now the indicator, so it picks the new volumes
ASSERT_NO_THROW(startIndicator());
- // check the initial volume for the alert role
+ // Generate a random volume
+ QTime now = QTime::currentTime();
+ qsrand(now.msec());
+ int randInt = qrand() % 100;
+ double randomVolume = randInt / 100.0;
+
+// // play a test sound, it should NOT change the role in the indicator
+ EXPECT_TRUE(startTestSound("multimedia"));
+ EXPECT_FALSE(waitVolumeChangedInIndicator());
+
+ // set the random volume
+ EXPECT_TRUE(setSinkVolume(randomVolume));
+ if (randomVolume != INITIAL_VOLUME)
+ {
+ EXPECT_FALSE(waitVolumeChangedInIndicator());
+ }
+
+ // check the indicator
EXPECT_MATCHRESULT(mh::MenuMatcher(desktopParameters())
.item(mh::MenuItemMatcher()
.action("indicator.root")
@@ -163,7 +276,7 @@ TEST_F(TestIndicator, BasicInitialVolume)
.item(mh::MenuItemMatcher().checkbox()
.label("Mute")
)
- .item(volumeSlider(INITIAL_VOLUME))
+ .item(volumeSlider(randomVolume))
)
).match());
@@ -179,6 +292,45 @@ TEST_F(TestIndicator, BasicInitialVolume)
.label("Sound Settings…")
)
).match());
+
+ // stop the test sound, the role should change again to alert
+ stopTestSound();
+
+ // although we were playing something in the multimedia role
+ // the server does not have the streamrestore module, so
+ // the volume does not change (the role does not change)
+ EXPECT_FALSE(waitVolumeChangedInIndicator());
+
+ // check the initial volume for the alert role
+ EXPECT_MATCHRESULT(mh::MenuMatcher(phoneParameters())
+ .item(mh::MenuItemMatcher()
+ .action("indicator.root")
+ .string_attribute("x-canonical-type", "com.canonical.indicator.root")
+ .string_attribute("x-canonical-scroll-action", "indicator.scroll")
+ .string_attribute("x-canonical-secondary-action", "indicator.mute")
+ .string_attribute("submenu-action", "indicator.indicator-shown")
+ .mode(mh::MenuItemMatcher::Mode::starts_with)
+ .submenu()
+ .item(mh::MenuItemMatcher()
+ .section()
+ .item(silentModeSwitch(false))
+ .item(volumeSlider(randomVolume))
+ )
+ ).match());
+
+ // check that the last item is Sound Settings
+ EXPECT_MATCHRESULT(mh::MenuMatcher(phoneParameters())
+ .item(mh::MenuItemMatcher()
+ .action("indicator.root")
+ .string_attribute("x-canonical-type", "com.canonical.indicator.root")
+ .string_attribute("x-canonical-secondary-action", "indicator.mute")
+ .mode(mh::MenuItemMatcher::Mode::ends_with)
+ .submenu()
+ .item(mh::MenuItemMatcher()
+ .label("Sound Settings…")
+ .action("indicator.phone-settings")
+ )
+ ).match());
}
} // namespace
diff --git a/tests/integration/utils/dbus-pulse-volume.cpp b/tests/integration/utils/dbus-pulse-volume.cpp
index a282f77..c8b6ae6 100644
--- a/tests/integration/utils/dbus-pulse-volume.cpp
+++ b/tests/integration/utils/dbus-pulse-volume.cpp
@@ -150,6 +150,11 @@ bool DBusPulseVolume::setVolume(QString const & role, double volume)
}
}
}
+ else
+ {
+ qWarning() << "SetVolume::setVolume(): role " << role << " was not found.";
+ return false;
+ }
return true;
}