avs-device-sdk/CapabilityAgents/Alerts/test/Renderer/RendererTest.cpp

342 lines
11 KiB
C++
Raw Normal View History

Version 1.4.0 alexa-client-sdk Changes in this update: **Enhancements** * Added the Notifications Capability Agent. This allows a client to receive notification indicators from Alexa. * Added support for the `SoftwareInfo` event. This code is triggered in the `SampleApp` by providing a positive decimal integer as the "firmwareVersion" value in "sampleApp" object of the `AlexaClientSDKConfig.json`. The reported firmware version can be updated after starting the `SampleApp` by calling `SoftwareInfoSender::setFirmwareVersion()`. This code path can be exercised in the `SampleApp` with the new command: `f`. * Added unit tests for Alerts. * The GStreamer-based pipeline allows for the configuration of `MediaPlayer` output based on information provided in `Config`. * Playlist streaming now uses a `BLOCKING` writer, which improves streaming efficiency. **Bug Fixes** * Fixed bug where `SpeechSynthesizer` would not stop playback when a state change timeout was encountered. * Fixed the `SampleApplication` destructor to avoid segfaults if the object is not constructed correctly. * Fixed bug where `AudioPlayer` would erroneously call `executeStop()` in `cancelDirective()`. * [Issue 396](https://github.com/alexa/avs-device-sdk/issues/396) - Fixed bug for compilation error with GCC7 in `AVSCommon/SDKInterfaces/include/AVSCommon/SDKInterfaces/Audio/AlertsAudioFactoryInterface.h` * [Issue 384](https://github.com/alexa/avs-device-sdk/issues/384) - Fixed bug that caused `AuthServer.py` to crash. * Fixed bug where a long delay was encountered after pausing and resuming a large Audible chapter. * Fixed bug that caused named timers and reminders to loop for an additional `loopCount` . * Fixed memory corruption bug in `MessageInterpreter`. * Fixed illegal memory accesses in `MediaPlayer` logging. **Known Issues** * The `ACL` may encounter issues if audio attachments are received but not consumed. * Display Cards for Kindle don't render. * If using the GStreamer-based `MediaPlayer` implementation, after muting and un-muting an audio item, the next item in the queue will begin playing rather than continuing playback of the originally muted audio item. * `SpeechSynthesizerState` currently uses `GAINING_FOCUS` and `LOSING_FOCUS` as a workaround for handling intermediate state. These states may be removed in a future release. * Music playback doesn't immediately stop when a user barges-in on iHeartRadio.
2018-01-12 23:45:42 +00:00
/*
* Copyright 2017-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://aws.amazon.com/apache2.0/
*
* or in the "license" file accompanying this file. This file is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include <AVSCommon/Utils/MediaPlayer/MockMediaPlayer.h>
#include "Alerts/Renderer/Renderer.h"
namespace alexaClientSDK {
namespace capabilityAgents {
namespace alerts {
namespace renderer {
namespace test {
using namespace avsCommon::utils::mediaPlayer::test;
/// Amount of time that the renderer observer should wait for a task to finish.
static const std::chrono::milliseconds TEST_TIMEOUT{100};
/// Test source Id that exists for the tests
static const avsCommon::utils::mediaPlayer::MediaPlayerInterface::SourceId TEST_SOURCE_ID_GOOD = 1234;
/// Test source Id that does not exist for the tests
static const avsCommon::utils::mediaPlayer::MediaPlayerInterface::SourceId TEST_SOURCE_ID_BAD = 5678;
/// Test URLs for the renderer
static const std::string TEST_URL1 = "fake.url.one";
static const std::string TEST_URL2 = "fake.url.two";
/// Loop pause for the renderer.
static const std::chrono::milliseconds TEST_LOOP_PAUSE{100};
/// Loop count for the renderer.
static const int TEST_LOOP_COUNT = 2;
Version 1.8 alexa-client-sdk Changes in this update: Enhancements Added local stop functionality. This allows a user to stop an active function, such as an alert or timer, by uttering "Alexa, stop" when an Alexa-enabled product is offline. Alerts in the background now stream in 10 sec intervals, rather than continuously. Added support for France to the sample app. friendlyName can now be updated for BlueZ implementations of BlueZBluetoothDevice and BlueZHostController. Bug Fixes Fixed an issue where the Bluetooth agent didn't clear user data upon reset, including paired devices and the uuidMapping table. Fixed MediaPlayer threading issues. Now each instance has it's own glib main loop thread, rather than utilizing the default main context worker thread. Fixed segmentation fault issues that occurred when certain static initializers needed to be initialized in a certain order, but the order wasn't defined. Known Issues The ACL may encounter issues if audio attachments are received but not consumed. SpeechSynthesizerState currently uses GAINING_FOCUS and LOSING_FOCUS as a workaround for handling intermediate state. These states may be removed in a future release. The Alexa app doesn't always indicate when a device is successfully connected via Bluetooth. Connecting a product to streaming media via Bluetooth will sometimes stop media playback within the source application. Resuming playback through the source application or toggling next/previous will correct playback. When a source device is streaming silence via Bluetooth, the Alexa companion app indicates that audio content is streaming. The Bluetooth agent assumes that the Bluetooth adapter is always connected to a power source. Disconnecting from a power source during operation is not yet supported. On some products, interrupted Bluetooth playback may not resume if other content is locally streamed. On Raspberry Pi, when streaming audio via Bluetooth, sometimes the audio stream stutters. On Raspberry Pi, BlueALSA must be terminated each time the device boots. See Raspberry Pi Quick Start Guide for more information.
2018-06-27 21:41:15 +00:00
/// Loop background pause for the renderer.
static const auto TEST_BACKGROUND_LOOP_PAUSE = std::chrono::seconds(1);
/// Amount of time that the renderer observer should wait for a task to finish.
static const auto TEST_BACKGROUND_TIMEOUT = std::chrono::seconds(5);
Version 1.4.0 alexa-client-sdk Changes in this update: **Enhancements** * Added the Notifications Capability Agent. This allows a client to receive notification indicators from Alexa. * Added support for the `SoftwareInfo` event. This code is triggered in the `SampleApp` by providing a positive decimal integer as the "firmwareVersion" value in "sampleApp" object of the `AlexaClientSDKConfig.json`. The reported firmware version can be updated after starting the `SampleApp` by calling `SoftwareInfoSender::setFirmwareVersion()`. This code path can be exercised in the `SampleApp` with the new command: `f`. * Added unit tests for Alerts. * The GStreamer-based pipeline allows for the configuration of `MediaPlayer` output based on information provided in `Config`. * Playlist streaming now uses a `BLOCKING` writer, which improves streaming efficiency. **Bug Fixes** * Fixed bug where `SpeechSynthesizer` would not stop playback when a state change timeout was encountered. * Fixed the `SampleApplication` destructor to avoid segfaults if the object is not constructed correctly. * Fixed bug where `AudioPlayer` would erroneously call `executeStop()` in `cancelDirective()`. * [Issue 396](https://github.com/alexa/avs-device-sdk/issues/396) - Fixed bug for compilation error with GCC7 in `AVSCommon/SDKInterfaces/include/AVSCommon/SDKInterfaces/Audio/AlertsAudioFactoryInterface.h` * [Issue 384](https://github.com/alexa/avs-device-sdk/issues/384) - Fixed bug that caused `AuthServer.py` to crash. * Fixed bug where a long delay was encountered after pausing and resuming a large Audible chapter. * Fixed bug that caused named timers and reminders to loop for an additional `loopCount` . * Fixed memory corruption bug in `MessageInterpreter`. * Fixed illegal memory accesses in `MediaPlayer` logging. **Known Issues** * The `ACL` may encounter issues if audio attachments are received but not consumed. * Display Cards for Kindle don't render. * If using the GStreamer-based `MediaPlayer` implementation, after muting and un-muting an audio item, the next item in the queue will begin playing rather than continuing playback of the originally muted audio item. * `SpeechSynthesizerState` currently uses `GAINING_FOCUS` and `LOSING_FOCUS` as a workaround for handling intermediate state. These states may be removed in a future release. * Music playback doesn't immediately stop when a user barges-in on iHeartRadio.
2018-01-12 23:45:42 +00:00
class MockRendererObserver : public RendererObserverInterface {
public:
bool waitFor(RendererObserverInterface::State newState) {
std::unique_lock<std::mutex> lock(m_mutex);
return m_conditionVariable.wait_for(lock, TEST_TIMEOUT, [this, newState] { return m_state == newState; });
}
Version 1.8 alexa-client-sdk Changes in this update: Enhancements Added local stop functionality. This allows a user to stop an active function, such as an alert or timer, by uttering "Alexa, stop" when an Alexa-enabled product is offline. Alerts in the background now stream in 10 sec intervals, rather than continuously. Added support for France to the sample app. friendlyName can now be updated for BlueZ implementations of BlueZBluetoothDevice and BlueZHostController. Bug Fixes Fixed an issue where the Bluetooth agent didn't clear user data upon reset, including paired devices and the uuidMapping table. Fixed MediaPlayer threading issues. Now each instance has it's own glib main loop thread, rather than utilizing the default main context worker thread. Fixed segmentation fault issues that occurred when certain static initializers needed to be initialized in a certain order, but the order wasn't defined. Known Issues The ACL may encounter issues if audio attachments are received but not consumed. SpeechSynthesizerState currently uses GAINING_FOCUS and LOSING_FOCUS as a workaround for handling intermediate state. These states may be removed in a future release. The Alexa app doesn't always indicate when a device is successfully connected via Bluetooth. Connecting a product to streaming media via Bluetooth will sometimes stop media playback within the source application. Resuming playback through the source application or toggling next/previous will correct playback. When a source device is streaming silence via Bluetooth, the Alexa companion app indicates that audio content is streaming. The Bluetooth agent assumes that the Bluetooth adapter is always connected to a power source. Disconnecting from a power source during operation is not yet supported. On some products, interrupted Bluetooth playback may not resume if other content is locally streamed. On Raspberry Pi, when streaming audio via Bluetooth, sometimes the audio stream stutters. On Raspberry Pi, BlueALSA must be terminated each time the device boots. See Raspberry Pi Quick Start Guide for more information.
2018-06-27 21:41:15 +00:00
bool waitFor(RendererObserverInterface::State newState, std::chrono::milliseconds maxWait) {
std::unique_lock<std::mutex> lock(m_mutex);
return m_conditionVariable.wait_for(lock, maxWait, [this, newState] { return m_state == newState; });
}
Version 1.4.0 alexa-client-sdk Changes in this update: **Enhancements** * Added the Notifications Capability Agent. This allows a client to receive notification indicators from Alexa. * Added support for the `SoftwareInfo` event. This code is triggered in the `SampleApp` by providing a positive decimal integer as the "firmwareVersion" value in "sampleApp" object of the `AlexaClientSDKConfig.json`. The reported firmware version can be updated after starting the `SampleApp` by calling `SoftwareInfoSender::setFirmwareVersion()`. This code path can be exercised in the `SampleApp` with the new command: `f`. * Added unit tests for Alerts. * The GStreamer-based pipeline allows for the configuration of `MediaPlayer` output based on information provided in `Config`. * Playlist streaming now uses a `BLOCKING` writer, which improves streaming efficiency. **Bug Fixes** * Fixed bug where `SpeechSynthesizer` would not stop playback when a state change timeout was encountered. * Fixed the `SampleApplication` destructor to avoid segfaults if the object is not constructed correctly. * Fixed bug where `AudioPlayer` would erroneously call `executeStop()` in `cancelDirective()`. * [Issue 396](https://github.com/alexa/avs-device-sdk/issues/396) - Fixed bug for compilation error with GCC7 in `AVSCommon/SDKInterfaces/include/AVSCommon/SDKInterfaces/Audio/AlertsAudioFactoryInterface.h` * [Issue 384](https://github.com/alexa/avs-device-sdk/issues/384) - Fixed bug that caused `AuthServer.py` to crash. * Fixed bug where a long delay was encountered after pausing and resuming a large Audible chapter. * Fixed bug that caused named timers and reminders to loop for an additional `loopCount` . * Fixed memory corruption bug in `MessageInterpreter`. * Fixed illegal memory accesses in `MediaPlayer` logging. **Known Issues** * The `ACL` may encounter issues if audio attachments are received but not consumed. * Display Cards for Kindle don't render. * If using the GStreamer-based `MediaPlayer` implementation, after muting and un-muting an audio item, the next item in the queue will begin playing rather than continuing playback of the originally muted audio item. * `SpeechSynthesizerState` currently uses `GAINING_FOCUS` and `LOSING_FOCUS` as a workaround for handling intermediate state. These states may be removed in a future release. * Music playback doesn't immediately stop when a user barges-in on iHeartRadio.
2018-01-12 23:45:42 +00:00
void onRendererStateChange(RendererObserverInterface::State newState, const std::string& reason) {
std::lock_guard<std::mutex> lock(m_mutex);
m_state = newState;
m_conditionVariable.notify_all();
}
private:
std::mutex m_mutex;
std::condition_variable m_conditionVariable;
RendererObserverInterface::State m_state;
};
class TestMediaPlayer : public MockMediaPlayer {
public:
TestMediaPlayer() {
m_sourceIdRetVal = TEST_SOURCE_ID_GOOD;
m_playRetVal = true;
m_stopRetVal = true;
}
static std::shared_ptr<testing::NiceMock<TestMediaPlayer>> create() {
return std::make_shared<testing::NiceMock<TestMediaPlayer>>();
}
bool play(SourceId id) override {
return m_playRetVal;
}
bool stop(SourceId id) override {
return m_stopRetVal;
}
SourceId setSource(const std::string& url, std::chrono::milliseconds offset = std::chrono::milliseconds::zero())
override {
return m_sourceIdRetVal;
}
Version 1.8 alexa-client-sdk Changes in this update: Enhancements Added local stop functionality. This allows a user to stop an active function, such as an alert or timer, by uttering "Alexa, stop" when an Alexa-enabled product is offline. Alerts in the background now stream in 10 sec intervals, rather than continuously. Added support for France to the sample app. friendlyName can now be updated for BlueZ implementations of BlueZBluetoothDevice and BlueZHostController. Bug Fixes Fixed an issue where the Bluetooth agent didn't clear user data upon reset, including paired devices and the uuidMapping table. Fixed MediaPlayer threading issues. Now each instance has it's own glib main loop thread, rather than utilizing the default main context worker thread. Fixed segmentation fault issues that occurred when certain static initializers needed to be initialized in a certain order, but the order wasn't defined. Known Issues The ACL may encounter issues if audio attachments are received but not consumed. SpeechSynthesizerState currently uses GAINING_FOCUS and LOSING_FOCUS as a workaround for handling intermediate state. These states may be removed in a future release. The Alexa app doesn't always indicate when a device is successfully connected via Bluetooth. Connecting a product to streaming media via Bluetooth will sometimes stop media playback within the source application. Resuming playback through the source application or toggling next/previous will correct playback. When a source device is streaming silence via Bluetooth, the Alexa companion app indicates that audio content is streaming. The Bluetooth agent assumes that the Bluetooth adapter is always connected to a power source. Disconnecting from a power source during operation is not yet supported. On some products, interrupted Bluetooth playback may not resume if other content is locally streamed. On Raspberry Pi, when streaming audio via Bluetooth, sometimes the audio stream stutters. On Raspberry Pi, BlueALSA must be terminated each time the device boots. See Raspberry Pi Quick Start Guide for more information.
2018-06-27 21:41:15 +00:00
SourceId setSource(std::shared_ptr<std::istream> stream, bool repeat) override {
return m_sourceIdRetVal;
}
Version 1.4.0 alexa-client-sdk Changes in this update: **Enhancements** * Added the Notifications Capability Agent. This allows a client to receive notification indicators from Alexa. * Added support for the `SoftwareInfo` event. This code is triggered in the `SampleApp` by providing a positive decimal integer as the "firmwareVersion" value in "sampleApp" object of the `AlexaClientSDKConfig.json`. The reported firmware version can be updated after starting the `SampleApp` by calling `SoftwareInfoSender::setFirmwareVersion()`. This code path can be exercised in the `SampleApp` with the new command: `f`. * Added unit tests for Alerts. * The GStreamer-based pipeline allows for the configuration of `MediaPlayer` output based on information provided in `Config`. * Playlist streaming now uses a `BLOCKING` writer, which improves streaming efficiency. **Bug Fixes** * Fixed bug where `SpeechSynthesizer` would not stop playback when a state change timeout was encountered. * Fixed the `SampleApplication` destructor to avoid segfaults if the object is not constructed correctly. * Fixed bug where `AudioPlayer` would erroneously call `executeStop()` in `cancelDirective()`. * [Issue 396](https://github.com/alexa/avs-device-sdk/issues/396) - Fixed bug for compilation error with GCC7 in `AVSCommon/SDKInterfaces/include/AVSCommon/SDKInterfaces/Audio/AlertsAudioFactoryInterface.h` * [Issue 384](https://github.com/alexa/avs-device-sdk/issues/384) - Fixed bug that caused `AuthServer.py` to crash. * Fixed bug where a long delay was encountered after pausing and resuming a large Audible chapter. * Fixed bug that caused named timers and reminders to loop for an additional `loopCount` . * Fixed memory corruption bug in `MessageInterpreter`. * Fixed illegal memory accesses in `MediaPlayer` logging. **Known Issues** * The `ACL` may encounter issues if audio attachments are received but not consumed. * Display Cards for Kindle don't render. * If using the GStreamer-based `MediaPlayer` implementation, after muting and un-muting an audio item, the next item in the queue will begin playing rather than continuing playback of the originally muted audio item. * `SpeechSynthesizerState` currently uses `GAINING_FOCUS` and `LOSING_FOCUS` as a workaround for handling intermediate state. These states may be removed in a future release. * Music playback doesn't immediately stop when a user barges-in on iHeartRadio.
2018-01-12 23:45:42 +00:00
void setSourceRetVal(SourceId sourceRetVal) {
m_sourceIdRetVal = sourceRetVal;
}
void setPlayRetVal(bool playRetVal) {
m_playRetVal = playRetVal;
}
void setStopRetVal(bool stopRetVal) {
m_stopRetVal = stopRetVal;
}
private:
SourceId m_sourceIdRetVal;
bool m_playRetVal;
bool m_stopRetVal;
};
class RendererTest : public ::testing::Test {
public:
RendererTest();
~RendererTest();
void SetUpTest();
void TearDown() override;
protected:
std::shared_ptr<MockRendererObserver> m_observer;
std::shared_ptr<TestMediaPlayer> m_mediaPlayer;
std::shared_ptr<Renderer> m_renderer;
static std::unique_ptr<std::istream> audioFactoryFunc() {
Verison 1.6 of the avs-device-sdk Changes in this update: **Enhancements** * `rapidJson` is now included with "make install". * Updated the `TemplateRuntimeObserverInterface` to support clearing of `displayCards`. * Added Windows SDK support, along with an installation script (MinGW-w64). * Updated `ContextManager` to ignore context reported by a state provider. * The `SharedDataStream` object is now associated by playlist, rather than by URL. * Added the `RegistrationManager` component. Now, when a user logs out all persistent user-specific data is cleared from the SDK. The log out functionality can be exercised in the sample app with the new command: `k`. **Bug Fixes** * [Issue 400](https://github.com/alexa/avs-device-sdk/issues/400) Fixed a bug where the alert reminder did not iterate as intended after loss of network connection. * [Issue 477](https://github.com/alexa/avs-device-sdk/issues/477) Fixed a bug in which Alexa's weather response was being truncated. * Fixed an issue in which there were reports of instability related to the Sensory engine. To correct this, the `portAudio` [`suggestedLatency`](https://github.com/alexa/avs-device-sdk/blob/master/Integration/AlexaClientSDKConfig.json#L62) value can now be configured. **Known Issues** * The `ACL` may encounter issues if audio attachments are received but not consumed. * `SpeechSynthesizerState` currently uses `GAINING_FOCUS` and `LOSING_FOCUS` as a workaround for handling intermediate state. These states may be removed in a future release. * Music playback doesn't immediately stop when a user barges-in on iHeartRadio. * The Windows sample app sometimes hangs on exit. * GDP receives a `SIGPIPE` when troubleshooting the Windows sample app.
2018-03-09 00:55:39 +00:00
return std::unique_ptr<std::istream>(new std::stringstream());
Version 1.4.0 alexa-client-sdk Changes in this update: **Enhancements** * Added the Notifications Capability Agent. This allows a client to receive notification indicators from Alexa. * Added support for the `SoftwareInfo` event. This code is triggered in the `SampleApp` by providing a positive decimal integer as the "firmwareVersion" value in "sampleApp" object of the `AlexaClientSDKConfig.json`. The reported firmware version can be updated after starting the `SampleApp` by calling `SoftwareInfoSender::setFirmwareVersion()`. This code path can be exercised in the `SampleApp` with the new command: `f`. * Added unit tests for Alerts. * The GStreamer-based pipeline allows for the configuration of `MediaPlayer` output based on information provided in `Config`. * Playlist streaming now uses a `BLOCKING` writer, which improves streaming efficiency. **Bug Fixes** * Fixed bug where `SpeechSynthesizer` would not stop playback when a state change timeout was encountered. * Fixed the `SampleApplication` destructor to avoid segfaults if the object is not constructed correctly. * Fixed bug where `AudioPlayer` would erroneously call `executeStop()` in `cancelDirective()`. * [Issue 396](https://github.com/alexa/avs-device-sdk/issues/396) - Fixed bug for compilation error with GCC7 in `AVSCommon/SDKInterfaces/include/AVSCommon/SDKInterfaces/Audio/AlertsAudioFactoryInterface.h` * [Issue 384](https://github.com/alexa/avs-device-sdk/issues/384) - Fixed bug that caused `AuthServer.py` to crash. * Fixed bug where a long delay was encountered after pausing and resuming a large Audible chapter. * Fixed bug that caused named timers and reminders to loop for an additional `loopCount` . * Fixed memory corruption bug in `MessageInterpreter`. * Fixed illegal memory accesses in `MediaPlayer` logging. **Known Issues** * The `ACL` may encounter issues if audio attachments are received but not consumed. * Display Cards for Kindle don't render. * If using the GStreamer-based `MediaPlayer` implementation, after muting and un-muting an audio item, the next item in the queue will begin playing rather than continuing playback of the originally muted audio item. * `SpeechSynthesizerState` currently uses `GAINING_FOCUS` and `LOSING_FOCUS` as a workaround for handling intermediate state. These states may be removed in a future release. * Music playback doesn't immediately stop when a user barges-in on iHeartRadio.
2018-01-12 23:45:42 +00:00
}
};
RendererTest::RendererTest() :
m_observer{std::make_shared<MockRendererObserver>()},
m_mediaPlayer{TestMediaPlayer::create()},
m_renderer{Renderer::create(m_mediaPlayer)} {
m_renderer->setObserver(m_observer);
}
RendererTest::~RendererTest() {
m_mediaPlayer->setObserver(nullptr);
m_mediaPlayer.reset();
}
void RendererTest::SetUpTest() {
std::function<std::unique_ptr<std::istream>()> audioFactory = RendererTest::audioFactoryFunc;
std::vector<std::string> urls = {TEST_URL1, TEST_URL2};
m_renderer->setObserver(m_observer);
m_renderer->start(audioFactory, urls, TEST_LOOP_COUNT, TEST_LOOP_PAUSE);
}
void RendererTest::TearDown() {
m_mediaPlayer->setSourceRetVal(TEST_SOURCE_ID_GOOD);
m_mediaPlayer->setPlayRetVal(true);
m_mediaPlayer->setStopRetVal(true);
}
/**
* Test if the Renderer class creates an object appropriately and fails when it must
*/
TEST_F(RendererTest, create) {
/// m_renderer was created using create() in the constructor. Check if not null
ASSERT_NE(m_renderer, nullptr);
/// confirm we return a nullptr if a nullptr was passed in
ASSERT_EQ(Renderer::create(nullptr), nullptr);
}
/**
* Test if the Renderer starts
*/
TEST_F(RendererTest, start) {
SetUpTest();
ASSERT_TRUE(m_observer->waitFor(RendererObserverInterface::State::UNSET));
}
/**
* Test if the Renderer stops
*/
TEST_F(RendererTest, stop) {
SetUpTest();
m_renderer->stop();
ASSERT_FALSE(m_observer->waitFor(RendererObserverInterface::State::ERROR));
}
/**
* Test if the Renderer errors out when it cant stop
*/
TEST_F(RendererTest, stopError) {
SetUpTest();
m_mediaPlayer->setStopRetVal(false);
m_renderer->stop();
ASSERT_TRUE(m_observer->waitFor(RendererObserverInterface::State::ERROR));
}
/**
* Test if the Renderer correctly handles Playback starting
*/
TEST_F(RendererTest, onPlaybackStarted) {
SetUpTest();
/// shouldn't start if the source is bad
m_renderer->onPlaybackStarted(TEST_SOURCE_ID_BAD);
ASSERT_FALSE(m_observer->waitFor(RendererObserverInterface::State::STARTED));
/// should start if the source is good
m_renderer->onPlaybackStarted(TEST_SOURCE_ID_GOOD);
ASSERT_TRUE(m_observer->waitFor(RendererObserverInterface::State::STARTED));
}
/**
* Test if the Renderer correctly handles Playback stopping
*/
TEST_F(RendererTest, onPlaybackStopped) {
SetUpTest();
/// shouldn't stop if the source is bad
m_renderer->onPlaybackStopped(TEST_SOURCE_ID_BAD);
ASSERT_FALSE(m_observer->waitFor(RendererObserverInterface::State::STOPPED));
/// should stop if the source is good
m_renderer->onPlaybackStopped(TEST_SOURCE_ID_GOOD);
ASSERT_TRUE(m_observer->waitFor(RendererObserverInterface::State::STOPPED));
}
/**
* Test if the Renderer correctly handles Playback finishing
*/
TEST_F(RendererTest, onPlaybackFinished) {
avsCommon::utils::mediaPlayer::MediaPlayerInterface::SourceId blankSourceId{};
/// shouldn't finish if the source is bad
m_renderer->onPlaybackFinished(TEST_SOURCE_ID_BAD);
ASSERT_FALSE(m_observer->waitFor(RendererObserverInterface::State::STOPPED));
/// should finish if the source is good
m_renderer->onPlaybackFinished(blankSourceId);
ASSERT_TRUE(m_observer->waitFor(RendererObserverInterface::State::STOPPED));
}
/**
* Test if the Renderer gracefully handles errors when Playback finishing
*/
TEST_F(RendererTest, onPlaybackFinishedError) {
SetUpTest();
/// shouldn't finish even if the source is good, if the media player is errored out
m_mediaPlayer->setSourceRetVal(avsCommon::utils::mediaPlayer::MediaPlayerInterface::ERROR);
m_renderer->onPlaybackFinished(TEST_SOURCE_ID_GOOD);
ASSERT_FALSE(m_observer->waitFor(RendererObserverInterface::State::STOPPED));
/// shouldn't finish even if the source is good, if the media player can't play it
m_mediaPlayer->setSourceRetVal(TEST_SOURCE_ID_GOOD);
m_mediaPlayer->setPlayRetVal(false);
m_renderer->onPlaybackFinished(TEST_SOURCE_ID_GOOD);
ASSERT_FALSE(m_observer->waitFor(RendererObserverInterface::State::STOPPED));
}
/**
* Test if the Renderer correctly handles Playback erroring out
*/
TEST_F(RendererTest, onPlaybackError) {
const avsCommon::utils::mediaPlayer::ErrorType& errorType =
avsCommon::utils::mediaPlayer::ErrorType::MEDIA_ERROR_INVALID_REQUEST;
std::string errorMsg = "testError";
SetUpTest();
/// shouldn't respond with errors if the source is bad
m_renderer->onPlaybackError(TEST_SOURCE_ID_BAD, errorType, errorMsg);
ASSERT_FALSE(m_observer->waitFor(RendererObserverInterface::State::ERROR));
/// shouldn't respond with errors if the source is good
m_renderer->onPlaybackError(TEST_SOURCE_ID_GOOD, errorType, errorMsg);
ASSERT_TRUE(m_observer->waitFor(RendererObserverInterface::State::ERROR));
}
Version 1.8 alexa-client-sdk Changes in this update: Enhancements Added local stop functionality. This allows a user to stop an active function, such as an alert or timer, by uttering "Alexa, stop" when an Alexa-enabled product is offline. Alerts in the background now stream in 10 sec intervals, rather than continuously. Added support for France to the sample app. friendlyName can now be updated for BlueZ implementations of BlueZBluetoothDevice and BlueZHostController. Bug Fixes Fixed an issue where the Bluetooth agent didn't clear user data upon reset, including paired devices and the uuidMapping table. Fixed MediaPlayer threading issues. Now each instance has it's own glib main loop thread, rather than utilizing the default main context worker thread. Fixed segmentation fault issues that occurred when certain static initializers needed to be initialized in a certain order, but the order wasn't defined. Known Issues The ACL may encounter issues if audio attachments are received but not consumed. SpeechSynthesizerState currently uses GAINING_FOCUS and LOSING_FOCUS as a workaround for handling intermediate state. These states may be removed in a future release. The Alexa app doesn't always indicate when a device is successfully connected via Bluetooth. Connecting a product to streaming media via Bluetooth will sometimes stop media playback within the source application. Resuming playback through the source application or toggling next/previous will correct playback. When a source device is streaming silence via Bluetooth, the Alexa companion app indicates that audio content is streaming. The Bluetooth agent assumes that the Bluetooth adapter is always connected to a power source. Disconnecting from a power source during operation is not yet supported. On some products, interrupted Bluetooth playback may not resume if other content is locally streamed. On Raspberry Pi, when streaming audio via Bluetooth, sometimes the audio stream stutters. On Raspberry Pi, BlueALSA must be terminated each time the device boots. See Raspberry Pi Quick Start Guide for more information.
2018-06-27 21:41:15 +00:00
/**
* Test empty URL with non-zero loop pause, simulating playing a default alarm audio on background
*/
TEST_F(RendererTest, emptyURLNonZeroLoopPause) {
std::function<std::unique_ptr<std::istream>()> audioFactory = RendererTest::audioFactoryFunc;
std::vector<std::string> urls;
m_renderer->setObserver(m_observer);
// pass empty URLS with 10s pause and no loop count
// this simulates playing a default alarm audio on background
// it is expected to renderer to play the alert sound continuously at loop pause intervals
m_renderer->start(audioFactory, urls, TEST_LOOP_COUNT, TEST_BACKGROUND_LOOP_PAUSE);
// mediaplayer starts playing the alarm audio, in this case audio is of 0 length
m_renderer->onPlaybackStarted(TEST_SOURCE_ID_GOOD);
// record the time audio starts playing
auto now = std::chrono::high_resolution_clock::now();
// expect the renderer state to change to 'STARTED'
ASSERT_TRUE(m_observer->waitFor(RendererObserverInterface::State::STARTED, TEST_BACKGROUND_TIMEOUT));
// mediaplayer finishes playing the alarm audio
m_renderer->onPlaybackFinished(TEST_SOURCE_ID_GOOD);
// mediaplayer starts playing the alarm audio, in this case audio is of 0 length
m_renderer->onPlaybackStarted(TEST_SOURCE_ID_GOOD);
// mediaplayer finishes playing the alarm audio
m_renderer->onPlaybackFinished(TEST_SOURCE_ID_GOOD);
ASSERT_TRUE(m_observer->waitFor(RendererObserverInterface::State::STARTED, TEST_BACKGROUND_TIMEOUT));
// expect the renderer state to change to 'STOPPED' after TEST_BACKGROUND_LOOP_PAUSE
ASSERT_TRUE(m_observer->waitFor(RendererObserverInterface::State::COMPLETED, TEST_BACKGROUND_TIMEOUT));
// get the elapsed time
auto elapsed = std::chrono::high_resolution_clock::now() - now;
// check the elapsed time is ~TEST_BACKGROUND_LOOP_PAUSE
ASSERT_TRUE((elapsed >= TEST_BACKGROUND_LOOP_PAUSE) && (elapsed < TEST_BACKGROUND_TIMEOUT));
}
Version 1.4.0 alexa-client-sdk Changes in this update: **Enhancements** * Added the Notifications Capability Agent. This allows a client to receive notification indicators from Alexa. * Added support for the `SoftwareInfo` event. This code is triggered in the `SampleApp` by providing a positive decimal integer as the "firmwareVersion" value in "sampleApp" object of the `AlexaClientSDKConfig.json`. The reported firmware version can be updated after starting the `SampleApp` by calling `SoftwareInfoSender::setFirmwareVersion()`. This code path can be exercised in the `SampleApp` with the new command: `f`. * Added unit tests for Alerts. * The GStreamer-based pipeline allows for the configuration of `MediaPlayer` output based on information provided in `Config`. * Playlist streaming now uses a `BLOCKING` writer, which improves streaming efficiency. **Bug Fixes** * Fixed bug where `SpeechSynthesizer` would not stop playback when a state change timeout was encountered. * Fixed the `SampleApplication` destructor to avoid segfaults if the object is not constructed correctly. * Fixed bug where `AudioPlayer` would erroneously call `executeStop()` in `cancelDirective()`. * [Issue 396](https://github.com/alexa/avs-device-sdk/issues/396) - Fixed bug for compilation error with GCC7 in `AVSCommon/SDKInterfaces/include/AVSCommon/SDKInterfaces/Audio/AlertsAudioFactoryInterface.h` * [Issue 384](https://github.com/alexa/avs-device-sdk/issues/384) - Fixed bug that caused `AuthServer.py` to crash. * Fixed bug where a long delay was encountered after pausing and resuming a large Audible chapter. * Fixed bug that caused named timers and reminders to loop for an additional `loopCount` . * Fixed memory corruption bug in `MessageInterpreter`. * Fixed illegal memory accesses in `MediaPlayer` logging. **Known Issues** * The `ACL` may encounter issues if audio attachments are received but not consumed. * Display Cards for Kindle don't render. * If using the GStreamer-based `MediaPlayer` implementation, after muting and un-muting an audio item, the next item in the queue will begin playing rather than continuing playback of the originally muted audio item. * `SpeechSynthesizerState` currently uses `GAINING_FOCUS` and `LOSING_FOCUS` as a workaround for handling intermediate state. These states may be removed in a future release. * Music playback doesn't immediately stop when a user barges-in on iHeartRadio.
2018-01-12 23:45:42 +00:00
} // namespace test
} // namespace renderer
} // namespace alerts
} // namespace capabilityAgents
} // namespace alexaClientSDK