2018-01-12 23:45:42 +00:00
|
|
|
/*
|
Version 1.12 alexa-client-sdk
Changes in this update:
**Enhancements**
* Support was added for the `fr_CA` locale.
* The Executor has been optimized to run a single thread when there are active job in the queue, and to remain idle when there are not active jobs.
* An additional parameter of `alertType` has been added to the Alerts capability agent. This will allow observers of alerts to know the type of alert being delivered.
* Support for programmatic unload and load of PulseAudio Bluetooth modules was added. To enable this feature, there is a [new CMake option](https://github.com/alexa/avs-device-sdk/wiki/CMake-parameters#bluetooth): `BLUETOOTH_BLUEZ_PULSEAUDIO_OVERRIDE_ENDPOINTS`. Note that [libpulse-dev is a required dependency](https://github.com/alexa/avs-device-sdk/wiki/Dependencies#bluetooth) of this feature.
* An observer interface was added for when an active Bluetooth device connects and disconnects.
* The `BluetoothDeviceManagerInterface` instantiation was moved from `DefaultClient` to `SampleApp` to allow applications to override it.
* The `MediaPlayerInterface` now supports repeating playback of URL sources.
* The Kitt.AI wake word engine (WWE) is now compatible with GCC5+.
* Stop of ongoing alerts, management of MessageObservers, and management of CallStateObservers have been exposed through DefaultClient.
**Bug Fixes**
* [Issue 953](https://github.com/alexa/avs-device-sdk/issues/953) - The `MediaPlayerInterface` requirement that callbacks not be made upon a callers thread has been removed.
* [Issue 1136](https://github.com/alexa/avs-device-sdk/issues/1136) - Added a missing default virtual destructor.
* [Issue 1140](https://github.com/alexa/avs-device-sdk/issues/1140) - Fixed an issue where DND states were not synchronized to the AVS cloud after device reset.
* [Issue 1143](https://github.com/alexa/avs-device-sdk/issues/1143) - Fixed an issue in which the SpeechSynthesizer couldn't enter a sleeping state.
* [Issue 1183](https://github.com/alexa/avs-device-sdk/issues/1183) - Fixed an issue where alarm is not sounding for certain timezones
* Changing an alert's volume from the Alexa app now works when an alert is playing.
* Added missing shutdown handling for ContentDecrypter to prevent the `Stop` command from triggering a crash when SAMPLE-AES encrypted content was streaming.
* Fixed a bug where if the Notifications database is empty, due to a crash or corruption, the SDK initialization process enters an infinite loop when it retries to get context from the Notifications capability agent.
* Fixed a race condition that caused `AlertsRenderer` observers to miss notification that an alert has been completed.
**Known Issues**
* `PlaylistParser` and `IterativePlaylistParser` generate two HTTP requests (one to fetch the content type, and one to fetch the audio data) for each audio stream played.
* Music playback history isn't being displayed in the Alexa app for certain account and device types.
* On GCC 8+, issues related to `-Wclass-memaccess` will trigger warnings. However, this won't cause the build to fail and these warnings can be ignored.
* Android error ("libDefaultClient.so" not found) can be resolved by upgrading to ADB version 1.0.40
* When network connection is lost, lost connection status is not returned via local TTS.
* `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 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.
* `make integration` is currently not available for Android. In order to run integration tests on Android, you'll need to manually upload the test binary file along with any input file. At that point, the adb can be used to run the integration tests.
* On Raspberry Pi running Android Things with HDMI output audio, beginning of speech is truncated when Alexa responds to user text-to-speech (TTS).
* When the sample app is restarted and network connection is lost, Reminder TTS does not play. Instead, the default alarm tone will play twice.
2019-02-26 00:45:37 +00:00
|
|
|
* Copyright 2017-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
2018-01-12 23:45:42 +00:00
|
|
|
*
|
|
|
|
* 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 <memory>
|
|
|
|
#include <random>
|
|
|
|
|
|
|
|
#include <gtest/gtest.h>
|
|
|
|
#include <gmock/gmock.h>
|
|
|
|
|
|
|
|
#include <Notifications/SQLiteNotificationsStorage.h>
|
|
|
|
#include <Notifications/NotificationIndicator.h>
|
|
|
|
|
|
|
|
#include <AVSCommon/Utils/File/FileUtils.h>
|
|
|
|
|
|
|
|
using namespace ::testing;
|
|
|
|
|
|
|
|
namespace alexaClientSDK {
|
|
|
|
namespace capabilityAgents {
|
|
|
|
namespace notifications {
|
|
|
|
namespace test {
|
|
|
|
|
|
|
|
using namespace avsCommon::utils::file;
|
|
|
|
using IndicatorState = avsCommon::avs::IndicatorState;
|
|
|
|
|
|
|
|
/// The filename we will use for the test database file.
|
|
|
|
static const std::string TEST_DATABASE_FILE_PATH = "notificationsStorageTestDatabase.db";
|
|
|
|
|
|
|
|
/// The path delimiter used by the OS to identify file locations.
|
|
|
|
static const std::string PATH_DELIMITER = "/";
|
|
|
|
|
|
|
|
/// AssetId strings for testing
|
|
|
|
static const std::string TEST_ASSET_ID1 = "testAssetId1";
|
|
|
|
static const std::string TEST_ASSET_ID2 = "testAssetId2";
|
|
|
|
|
|
|
|
/// AssetUrl strings for testing
|
|
|
|
static const std::string TEST_ASSET_URL1 = "testAssetUrl1";
|
|
|
|
static const std::string TEST_ASSET_URL2 = "testAssetUrl2";
|
|
|
|
|
Version 1.12 alexa-client-sdk
Changes in this update:
**Enhancements**
* Support was added for the `fr_CA` locale.
* The Executor has been optimized to run a single thread when there are active job in the queue, and to remain idle when there are not active jobs.
* An additional parameter of `alertType` has been added to the Alerts capability agent. This will allow observers of alerts to know the type of alert being delivered.
* Support for programmatic unload and load of PulseAudio Bluetooth modules was added. To enable this feature, there is a [new CMake option](https://github.com/alexa/avs-device-sdk/wiki/CMake-parameters#bluetooth): `BLUETOOTH_BLUEZ_PULSEAUDIO_OVERRIDE_ENDPOINTS`. Note that [libpulse-dev is a required dependency](https://github.com/alexa/avs-device-sdk/wiki/Dependencies#bluetooth) of this feature.
* An observer interface was added for when an active Bluetooth device connects and disconnects.
* The `BluetoothDeviceManagerInterface` instantiation was moved from `DefaultClient` to `SampleApp` to allow applications to override it.
* The `MediaPlayerInterface` now supports repeating playback of URL sources.
* The Kitt.AI wake word engine (WWE) is now compatible with GCC5+.
* Stop of ongoing alerts, management of MessageObservers, and management of CallStateObservers have been exposed through DefaultClient.
**Bug Fixes**
* [Issue 953](https://github.com/alexa/avs-device-sdk/issues/953) - The `MediaPlayerInterface` requirement that callbacks not be made upon a callers thread has been removed.
* [Issue 1136](https://github.com/alexa/avs-device-sdk/issues/1136) - Added a missing default virtual destructor.
* [Issue 1140](https://github.com/alexa/avs-device-sdk/issues/1140) - Fixed an issue where DND states were not synchronized to the AVS cloud after device reset.
* [Issue 1143](https://github.com/alexa/avs-device-sdk/issues/1143) - Fixed an issue in which the SpeechSynthesizer couldn't enter a sleeping state.
* [Issue 1183](https://github.com/alexa/avs-device-sdk/issues/1183) - Fixed an issue where alarm is not sounding for certain timezones
* Changing an alert's volume from the Alexa app now works when an alert is playing.
* Added missing shutdown handling for ContentDecrypter to prevent the `Stop` command from triggering a crash when SAMPLE-AES encrypted content was streaming.
* Fixed a bug where if the Notifications database is empty, due to a crash or corruption, the SDK initialization process enters an infinite loop when it retries to get context from the Notifications capability agent.
* Fixed a race condition that caused `AlertsRenderer` observers to miss notification that an alert has been completed.
**Known Issues**
* `PlaylistParser` and `IterativePlaylistParser` generate two HTTP requests (one to fetch the content type, and one to fetch the audio data) for each audio stream played.
* Music playback history isn't being displayed in the Alexa app for certain account and device types.
* On GCC 8+, issues related to `-Wclass-memaccess` will trigger warnings. However, this won't cause the build to fail and these warnings can be ignored.
* Android error ("libDefaultClient.so" not found) can be resolved by upgrading to ADB version 1.0.40
* When network connection is lost, lost connection status is not returned via local TTS.
* `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 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.
* `make integration` is currently not available for Android. In order to run integration tests on Android, you'll need to manually upload the test binary file along with any input file. At that point, the adb can be used to run the integration tests.
* On Raspberry Pi running Android Things with HDMI output audio, beginning of speech is truncated when Alexa responds to user text-to-speech (TTS).
* When the sample app is restarted and network connection is lost, Reminder TTS does not play. Instead, the default alarm tone will play twice.
2019-02-26 00:45:37 +00:00
|
|
|
/// Indicator state table/column name in the database.
|
|
|
|
static const std::string INDICATOR_STATE_NAME = "indicatorState";
|
|
|
|
|
|
|
|
/// Value to represent the invalid indicator state.
|
|
|
|
static const int INVALID_STATE_VALUE = 123;
|
|
|
|
|
2018-01-12 23:45:42 +00:00
|
|
|
/// Number to use when generating many NotificationIndicators.
|
|
|
|
static const unsigned int NUM_TEST_INDICATORS = 15;
|
|
|
|
|
|
|
|
/// Seed to generate random values for NotificationIndicators.
|
|
|
|
static const unsigned int NOTIFICATION_INDICATOR_SEED = 1;
|
|
|
|
|
|
|
|
/// The max random number to generate.
|
|
|
|
static const unsigned int MAX_RANDOM_INT = 100;
|
|
|
|
|
2018-03-09 00:55:39 +00:00
|
|
|
/**
|
|
|
|
* Utility function to determine if the storage component is opened.
|
|
|
|
*
|
|
|
|
* @param storage The storage component to check.
|
|
|
|
* @return True if the storage component's underlying database is opened, false otherwise.
|
|
|
|
*/
|
|
|
|
static bool isOpen(const std::shared_ptr<NotificationsStorageInterface>& storage) {
|
|
|
|
int dummySize;
|
|
|
|
return storage->getQueueSize(&dummySize);
|
|
|
|
}
|
|
|
|
|
2018-01-12 23:45:42 +00:00
|
|
|
class NotificationsStorageTest : public ::testing::Test {
|
|
|
|
public:
|
|
|
|
NotificationsStorageTest();
|
|
|
|
|
|
|
|
~NotificationsStorageTest();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Utility function to create the database, using the global filename.
|
|
|
|
*/
|
|
|
|
void createDatabase();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Utility function to cleanup the test database file, if it exists.
|
|
|
|
*/
|
|
|
|
void cleanupLocalDbFile();
|
|
|
|
|
|
|
|
void checkNotificationIndicatorsEquality(
|
|
|
|
const NotificationIndicator& actual,
|
|
|
|
const NotificationIndicator& expected);
|
|
|
|
|
|
|
|
protected:
|
|
|
|
/// The message database object we will test.
|
|
|
|
std::shared_ptr<SQLiteNotificationsStorage> m_storage;
|
|
|
|
};
|
|
|
|
|
2018-03-09 00:55:39 +00:00
|
|
|
NotificationsStorageTest::NotificationsStorageTest() :
|
|
|
|
m_storage{std::make_shared<SQLiteNotificationsStorage>(TEST_DATABASE_FILE_PATH)} {
|
2018-01-12 23:45:42 +00:00
|
|
|
cleanupLocalDbFile();
|
|
|
|
}
|
|
|
|
|
|
|
|
NotificationsStorageTest::~NotificationsStorageTest() {
|
|
|
|
m_storage->close();
|
|
|
|
cleanupLocalDbFile();
|
|
|
|
}
|
|
|
|
|
|
|
|
void NotificationsStorageTest::createDatabase() {
|
2018-03-09 00:55:39 +00:00
|
|
|
m_storage->createDatabase();
|
2018-01-12 23:45:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void NotificationsStorageTest::cleanupLocalDbFile() {
|
|
|
|
if (fileExists(TEST_DATABASE_FILE_PATH)) {
|
|
|
|
removeFile(TEST_DATABASE_FILE_PATH.c_str());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void NotificationsStorageTest::checkNotificationIndicatorsEquality(
|
|
|
|
const NotificationIndicator& actual,
|
|
|
|
const NotificationIndicator& expected) {
|
|
|
|
ASSERT_EQ(actual.persistVisualIndicator, expected.persistVisualIndicator);
|
|
|
|
ASSERT_EQ(actual.playAudioIndicator, expected.playAudioIndicator);
|
|
|
|
ASSERT_EQ(actual.asset.assetId, expected.asset.assetId);
|
|
|
|
ASSERT_EQ(actual.asset.url, expected.asset.url);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Test basic construction. Database should not be open.
|
|
|
|
*/
|
2019-05-22 23:06:18 +00:00
|
|
|
TEST_F(NotificationsStorageTest, test_constructionAndDestruction) {
|
2018-03-09 00:55:39 +00:00
|
|
|
ASSERT_FALSE(isOpen(m_storage));
|
2018-01-12 23:45:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Test database creation.
|
|
|
|
*/
|
2019-05-22 23:06:18 +00:00
|
|
|
TEST_F(NotificationsStorageTest, test_databaseCreation) {
|
2018-03-09 00:55:39 +00:00
|
|
|
ASSERT_FALSE(isOpen(m_storage));
|
2018-01-12 23:45:42 +00:00
|
|
|
createDatabase();
|
2018-03-09 00:55:39 +00:00
|
|
|
ASSERT_TRUE(isOpen(m_storage));
|
2018-01-12 23:45:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Test opening and closing a database.
|
|
|
|
*/
|
2019-05-22 23:06:18 +00:00
|
|
|
TEST_F(NotificationsStorageTest, test_openAndCloseDatabase) {
|
2018-03-09 00:55:39 +00:00
|
|
|
ASSERT_FALSE(isOpen(m_storage));
|
2018-01-12 23:45:42 +00:00
|
|
|
createDatabase();
|
2018-03-09 00:55:39 +00:00
|
|
|
ASSERT_TRUE(isOpen(m_storage));
|
2018-01-12 23:45:42 +00:00
|
|
|
m_storage->close();
|
2018-03-09 00:55:39 +00:00
|
|
|
ASSERT_FALSE(isOpen(m_storage));
|
|
|
|
ASSERT_TRUE(m_storage->open());
|
|
|
|
ASSERT_TRUE(isOpen(m_storage));
|
2018-01-12 23:45:42 +00:00
|
|
|
m_storage->close();
|
2018-03-09 00:55:39 +00:00
|
|
|
ASSERT_FALSE(isOpen(m_storage));
|
2018-01-12 23:45:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Test enqueueing and dequeueing records in the database.
|
|
|
|
*/
|
2019-05-22 23:06:18 +00:00
|
|
|
TEST_F(NotificationsStorageTest, test_databaseEnqueueAndDequeue) {
|
2018-01-12 23:45:42 +00:00
|
|
|
NotificationIndicator firstIndicator(true, false, TEST_ASSET_ID1, TEST_ASSET_URL1);
|
|
|
|
NotificationIndicator secondIndicator(false, true, TEST_ASSET_ID2, TEST_ASSET_URL2);
|
|
|
|
|
|
|
|
// should fail to enqueue/dequeue if database is not open for business
|
|
|
|
ASSERT_FALSE(m_storage->enqueue(firstIndicator));
|
|
|
|
ASSERT_FALSE(m_storage->dequeue());
|
|
|
|
|
|
|
|
createDatabase();
|
2018-03-09 00:55:39 +00:00
|
|
|
ASSERT_TRUE(isOpen(m_storage));
|
2018-01-12 23:45:42 +00:00
|
|
|
|
|
|
|
ASSERT_TRUE(m_storage->enqueue(firstIndicator));
|
|
|
|
ASSERT_TRUE(m_storage->enqueue(secondIndicator));
|
|
|
|
|
|
|
|
NotificationIndicator firstDequeue;
|
|
|
|
ASSERT_TRUE(m_storage->peek(&firstDequeue));
|
|
|
|
ASSERT_TRUE(m_storage->dequeue());
|
|
|
|
// should match the first indicator
|
|
|
|
checkNotificationIndicatorsEquality(firstDequeue, firstIndicator);
|
|
|
|
|
|
|
|
// one more for good measure
|
|
|
|
NotificationIndicator secondDequeue;
|
|
|
|
ASSERT_TRUE(m_storage->peek(&secondDequeue));
|
|
|
|
ASSERT_TRUE(m_storage->dequeue());
|
|
|
|
// should match the second indicator
|
|
|
|
checkNotificationIndicatorsEquality(secondDequeue, secondIndicator);
|
|
|
|
|
|
|
|
// dequeue should fail if there is nothing left to dequeue
|
|
|
|
ASSERT_FALSE(m_storage->dequeue());
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Test setting and getting the IndicatorState
|
|
|
|
*/
|
2019-05-22 23:06:18 +00:00
|
|
|
TEST_F(NotificationsStorageTest, test_settingAndGettingIndicatorState) {
|
2018-01-12 23:45:42 +00:00
|
|
|
IndicatorState state;
|
|
|
|
|
|
|
|
// should fail to set/get if database is not open for business
|
|
|
|
ASSERT_FALSE(m_storage->setIndicatorState(IndicatorState::ON));
|
|
|
|
ASSERT_FALSE(m_storage->getIndicatorState(&state));
|
|
|
|
|
|
|
|
createDatabase();
|
2018-03-09 00:55:39 +00:00
|
|
|
ASSERT_TRUE(isOpen(m_storage));
|
2018-01-12 23:45:42 +00:00
|
|
|
|
|
|
|
ASSERT_TRUE(m_storage->setIndicatorState(IndicatorState::ON));
|
|
|
|
ASSERT_TRUE(m_storage->getIndicatorState(&state));
|
|
|
|
|
|
|
|
ASSERT_EQ(state, IndicatorState::ON);
|
|
|
|
|
|
|
|
ASSERT_TRUE(m_storage->setIndicatorState(IndicatorState::OFF));
|
|
|
|
ASSERT_TRUE(m_storage->getIndicatorState(&state));
|
|
|
|
|
|
|
|
ASSERT_EQ(state, IndicatorState::OFF);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Test just clearing the notification indicators table.
|
|
|
|
*/
|
2019-05-22 23:06:18 +00:00
|
|
|
TEST_F(NotificationsStorageTest, test_clearingNotificationIndicators) {
|
2018-01-12 23:45:42 +00:00
|
|
|
createDatabase();
|
2018-03-09 00:55:39 +00:00
|
|
|
ASSERT_TRUE(isOpen(m_storage));
|
2018-01-12 23:45:42 +00:00
|
|
|
|
|
|
|
NotificationIndicator firstIndicator(true, false, TEST_ASSET_ID1, TEST_ASSET_URL1);
|
|
|
|
NotificationIndicator secondIndicator(false, true, TEST_ASSET_ID2, TEST_ASSET_URL2);
|
|
|
|
|
|
|
|
ASSERT_TRUE(m_storage->enqueue(firstIndicator));
|
|
|
|
ASSERT_TRUE(m_storage->enqueue(secondIndicator));
|
|
|
|
ASSERT_TRUE(m_storage->clearNotificationIndicators());
|
|
|
|
|
|
|
|
ASSERT_FALSE(m_storage->dequeue());
|
|
|
|
}
|
|
|
|
|
Version 1.12 alexa-client-sdk
Changes in this update:
**Enhancements**
* Support was added for the `fr_CA` locale.
* The Executor has been optimized to run a single thread when there are active job in the queue, and to remain idle when there are not active jobs.
* An additional parameter of `alertType` has been added to the Alerts capability agent. This will allow observers of alerts to know the type of alert being delivered.
* Support for programmatic unload and load of PulseAudio Bluetooth modules was added. To enable this feature, there is a [new CMake option](https://github.com/alexa/avs-device-sdk/wiki/CMake-parameters#bluetooth): `BLUETOOTH_BLUEZ_PULSEAUDIO_OVERRIDE_ENDPOINTS`. Note that [libpulse-dev is a required dependency](https://github.com/alexa/avs-device-sdk/wiki/Dependencies#bluetooth) of this feature.
* An observer interface was added for when an active Bluetooth device connects and disconnects.
* The `BluetoothDeviceManagerInterface` instantiation was moved from `DefaultClient` to `SampleApp` to allow applications to override it.
* The `MediaPlayerInterface` now supports repeating playback of URL sources.
* The Kitt.AI wake word engine (WWE) is now compatible with GCC5+.
* Stop of ongoing alerts, management of MessageObservers, and management of CallStateObservers have been exposed through DefaultClient.
**Bug Fixes**
* [Issue 953](https://github.com/alexa/avs-device-sdk/issues/953) - The `MediaPlayerInterface` requirement that callbacks not be made upon a callers thread has been removed.
* [Issue 1136](https://github.com/alexa/avs-device-sdk/issues/1136) - Added a missing default virtual destructor.
* [Issue 1140](https://github.com/alexa/avs-device-sdk/issues/1140) - Fixed an issue where DND states were not synchronized to the AVS cloud after device reset.
* [Issue 1143](https://github.com/alexa/avs-device-sdk/issues/1143) - Fixed an issue in which the SpeechSynthesizer couldn't enter a sleeping state.
* [Issue 1183](https://github.com/alexa/avs-device-sdk/issues/1183) - Fixed an issue where alarm is not sounding for certain timezones
* Changing an alert's volume from the Alexa app now works when an alert is playing.
* Added missing shutdown handling for ContentDecrypter to prevent the `Stop` command from triggering a crash when SAMPLE-AES encrypted content was streaming.
* Fixed a bug where if the Notifications database is empty, due to a crash or corruption, the SDK initialization process enters an infinite loop when it retries to get context from the Notifications capability agent.
* Fixed a race condition that caused `AlertsRenderer` observers to miss notification that an alert has been completed.
**Known Issues**
* `PlaylistParser` and `IterativePlaylistParser` generate two HTTP requests (one to fetch the content type, and one to fetch the audio data) for each audio stream played.
* Music playback history isn't being displayed in the Alexa app for certain account and device types.
* On GCC 8+, issues related to `-Wclass-memaccess` will trigger warnings. However, this won't cause the build to fail and these warnings can be ignored.
* Android error ("libDefaultClient.so" not found) can be resolved by upgrading to ADB version 1.0.40
* When network connection is lost, lost connection status is not returned via local TTS.
* `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 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.
* `make integration` is currently not available for Android. In order to run integration tests on Android, you'll need to manually upload the test binary file along with any input file. At that point, the adb can be used to run the integration tests.
* On Raspberry Pi running Android Things with HDMI output audio, beginning of speech is truncated when Alexa responds to user text-to-speech (TTS).
* When the sample app is restarted and network connection is lost, Reminder TTS does not play. Instead, the default alarm tone will play twice.
2019-02-26 00:45:37 +00:00
|
|
|
/**
|
|
|
|
* Test that empty database (due to a corruption or crash) results in default indicator state being used
|
|
|
|
* (non-undefined).
|
|
|
|
*/
|
2019-05-22 23:06:18 +00:00
|
|
|
TEST_F(NotificationsStorageTest, test_defaultValueForEmptyStorage) {
|
Version 1.12 alexa-client-sdk
Changes in this update:
**Enhancements**
* Support was added for the `fr_CA` locale.
* The Executor has been optimized to run a single thread when there are active job in the queue, and to remain idle when there are not active jobs.
* An additional parameter of `alertType` has been added to the Alerts capability agent. This will allow observers of alerts to know the type of alert being delivered.
* Support for programmatic unload and load of PulseAudio Bluetooth modules was added. To enable this feature, there is a [new CMake option](https://github.com/alexa/avs-device-sdk/wiki/CMake-parameters#bluetooth): `BLUETOOTH_BLUEZ_PULSEAUDIO_OVERRIDE_ENDPOINTS`. Note that [libpulse-dev is a required dependency](https://github.com/alexa/avs-device-sdk/wiki/Dependencies#bluetooth) of this feature.
* An observer interface was added for when an active Bluetooth device connects and disconnects.
* The `BluetoothDeviceManagerInterface` instantiation was moved from `DefaultClient` to `SampleApp` to allow applications to override it.
* The `MediaPlayerInterface` now supports repeating playback of URL sources.
* The Kitt.AI wake word engine (WWE) is now compatible with GCC5+.
* Stop of ongoing alerts, management of MessageObservers, and management of CallStateObservers have been exposed through DefaultClient.
**Bug Fixes**
* [Issue 953](https://github.com/alexa/avs-device-sdk/issues/953) - The `MediaPlayerInterface` requirement that callbacks not be made upon a callers thread has been removed.
* [Issue 1136](https://github.com/alexa/avs-device-sdk/issues/1136) - Added a missing default virtual destructor.
* [Issue 1140](https://github.com/alexa/avs-device-sdk/issues/1140) - Fixed an issue where DND states were not synchronized to the AVS cloud after device reset.
* [Issue 1143](https://github.com/alexa/avs-device-sdk/issues/1143) - Fixed an issue in which the SpeechSynthesizer couldn't enter a sleeping state.
* [Issue 1183](https://github.com/alexa/avs-device-sdk/issues/1183) - Fixed an issue where alarm is not sounding for certain timezones
* Changing an alert's volume from the Alexa app now works when an alert is playing.
* Added missing shutdown handling for ContentDecrypter to prevent the `Stop` command from triggering a crash when SAMPLE-AES encrypted content was streaming.
* Fixed a bug where if the Notifications database is empty, due to a crash or corruption, the SDK initialization process enters an infinite loop when it retries to get context from the Notifications capability agent.
* Fixed a race condition that caused `AlertsRenderer` observers to miss notification that an alert has been completed.
**Known Issues**
* `PlaylistParser` and `IterativePlaylistParser` generate two HTTP requests (one to fetch the content type, and one to fetch the audio data) for each audio stream played.
* Music playback history isn't being displayed in the Alexa app for certain account and device types.
* On GCC 8+, issues related to `-Wclass-memaccess` will trigger warnings. However, this won't cause the build to fail and these warnings can be ignored.
* Android error ("libDefaultClient.so" not found) can be resolved by upgrading to ADB version 1.0.40
* When network connection is lost, lost connection status is not returned via local TTS.
* `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 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.
* `make integration` is currently not available for Android. In order to run integration tests on Android, you'll need to manually upload the test binary file along with any input file. At that point, the adb can be used to run the integration tests.
* On Raspberry Pi running Android Things with HDMI output audio, beginning of speech is truncated when Alexa responds to user text-to-speech (TTS).
* When the sample app is restarted and network connection is lost, Reminder TTS does not play. Instead, the default alarm tone will play twice.
2019-02-26 00:45:37 +00:00
|
|
|
createDatabase();
|
|
|
|
ASSERT_TRUE(isOpen(m_storage));
|
|
|
|
|
|
|
|
NotificationIndicator firstIndicator(true, false, TEST_ASSET_ID1, TEST_ASSET_URL1);
|
|
|
|
|
|
|
|
ASSERT_TRUE(m_storage->enqueue(firstIndicator));
|
|
|
|
ASSERT_TRUE(m_storage->clearNotificationIndicators());
|
|
|
|
|
|
|
|
IndicatorState indicatorState = IndicatorState::UNDEFINED;
|
|
|
|
ASSERT_TRUE(m_storage->getIndicatorState(&indicatorState));
|
|
|
|
ASSERT_TRUE(IndicatorState::UNDEFINED != indicatorState);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Test that invalid database value (due to a corruption or crash) results in default indicator state being used
|
|
|
|
* (non-undefined).
|
|
|
|
*/
|
2019-05-22 23:06:18 +00:00
|
|
|
TEST_F(NotificationsStorageTest, test_defaultValueForInvalidDBContents) {
|
Version 1.12 alexa-client-sdk
Changes in this update:
**Enhancements**
* Support was added for the `fr_CA` locale.
* The Executor has been optimized to run a single thread when there are active job in the queue, and to remain idle when there are not active jobs.
* An additional parameter of `alertType` has been added to the Alerts capability agent. This will allow observers of alerts to know the type of alert being delivered.
* Support for programmatic unload and load of PulseAudio Bluetooth modules was added. To enable this feature, there is a [new CMake option](https://github.com/alexa/avs-device-sdk/wiki/CMake-parameters#bluetooth): `BLUETOOTH_BLUEZ_PULSEAUDIO_OVERRIDE_ENDPOINTS`. Note that [libpulse-dev is a required dependency](https://github.com/alexa/avs-device-sdk/wiki/Dependencies#bluetooth) of this feature.
* An observer interface was added for when an active Bluetooth device connects and disconnects.
* The `BluetoothDeviceManagerInterface` instantiation was moved from `DefaultClient` to `SampleApp` to allow applications to override it.
* The `MediaPlayerInterface` now supports repeating playback of URL sources.
* The Kitt.AI wake word engine (WWE) is now compatible with GCC5+.
* Stop of ongoing alerts, management of MessageObservers, and management of CallStateObservers have been exposed through DefaultClient.
**Bug Fixes**
* [Issue 953](https://github.com/alexa/avs-device-sdk/issues/953) - The `MediaPlayerInterface` requirement that callbacks not be made upon a callers thread has been removed.
* [Issue 1136](https://github.com/alexa/avs-device-sdk/issues/1136) - Added a missing default virtual destructor.
* [Issue 1140](https://github.com/alexa/avs-device-sdk/issues/1140) - Fixed an issue where DND states were not synchronized to the AVS cloud after device reset.
* [Issue 1143](https://github.com/alexa/avs-device-sdk/issues/1143) - Fixed an issue in which the SpeechSynthesizer couldn't enter a sleeping state.
* [Issue 1183](https://github.com/alexa/avs-device-sdk/issues/1183) - Fixed an issue where alarm is not sounding for certain timezones
* Changing an alert's volume from the Alexa app now works when an alert is playing.
* Added missing shutdown handling for ContentDecrypter to prevent the `Stop` command from triggering a crash when SAMPLE-AES encrypted content was streaming.
* Fixed a bug where if the Notifications database is empty, due to a crash or corruption, the SDK initialization process enters an infinite loop when it retries to get context from the Notifications capability agent.
* Fixed a race condition that caused `AlertsRenderer` observers to miss notification that an alert has been completed.
**Known Issues**
* `PlaylistParser` and `IterativePlaylistParser` generate two HTTP requests (one to fetch the content type, and one to fetch the audio data) for each audio stream played.
* Music playback history isn't being displayed in the Alexa app for certain account and device types.
* On GCC 8+, issues related to `-Wclass-memaccess` will trigger warnings. However, this won't cause the build to fail and these warnings can be ignored.
* Android error ("libDefaultClient.so" not found) can be resolved by upgrading to ADB version 1.0.40
* When network connection is lost, lost connection status is not returned via local TTS.
* `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 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.
* `make integration` is currently not available for Android. In order to run integration tests on Android, you'll need to manually upload the test binary file along with any input file. At that point, the adb can be used to run the integration tests.
* On Raspberry Pi running Android Things with HDMI output audio, beginning of speech is truncated when Alexa responds to user text-to-speech (TTS).
* When the sample app is restarted and network connection is lost, Reminder TTS does not play. Instead, the default alarm tone will play twice.
2019-02-26 00:45:37 +00:00
|
|
|
createDatabase();
|
|
|
|
ASSERT_TRUE(isOpen(m_storage));
|
|
|
|
|
|
|
|
NotificationIndicator firstIndicator(true, false, TEST_ASSET_ID1, TEST_ASSET_URL1);
|
|
|
|
|
|
|
|
ASSERT_TRUE(m_storage->enqueue(firstIndicator));
|
|
|
|
|
|
|
|
// Setup direct access to the DB.
|
|
|
|
alexaClientSDK::storage::sqliteStorage::SQLiteDatabase database(TEST_DATABASE_FILE_PATH);
|
|
|
|
ASSERT_TRUE(database.open());
|
|
|
|
|
|
|
|
std::string sqlString = "UPDATE " + INDICATOR_STATE_NAME + " SET " + INDICATOR_STATE_NAME + " = (?);";
|
|
|
|
|
|
|
|
auto updateStatement = database.createStatement(sqlString);
|
|
|
|
|
|
|
|
ASSERT_THAT(updateStatement, NotNull());
|
|
|
|
|
|
|
|
ASSERT_TRUE(updateStatement->bindIntParameter(1, INVALID_STATE_VALUE));
|
|
|
|
|
|
|
|
ASSERT_TRUE(updateStatement->step());
|
|
|
|
|
|
|
|
updateStatement->finalize();
|
|
|
|
|
|
|
|
IndicatorState indicatorState = IndicatorState::UNDEFINED;
|
|
|
|
ASSERT_TRUE(m_storage->getIndicatorState(&indicatorState));
|
|
|
|
ASSERT_TRUE(IndicatorState::UNDEFINED != indicatorState);
|
|
|
|
}
|
|
|
|
|
2018-01-12 23:45:42 +00:00
|
|
|
/**
|
|
|
|
* Test checking for an empty queue.
|
|
|
|
*/
|
2019-05-22 23:06:18 +00:00
|
|
|
TEST_F(NotificationsStorageTest, test_checkingEmptyQueue) {
|
2018-01-12 23:45:42 +00:00
|
|
|
createDatabase();
|
2018-03-09 00:55:39 +00:00
|
|
|
ASSERT_TRUE(isOpen(m_storage));
|
2018-01-12 23:45:42 +00:00
|
|
|
|
|
|
|
bool empty = false;
|
|
|
|
|
|
|
|
// should start out empty
|
|
|
|
ASSERT_TRUE(m_storage->checkForEmptyQueue(&empty));
|
|
|
|
ASSERT_TRUE(empty);
|
|
|
|
|
|
|
|
NotificationIndicator firstIndicator(true, false, TEST_ASSET_ID1, TEST_ASSET_URL1);
|
|
|
|
NotificationIndicator secondIndicator(false, true, TEST_ASSET_ID2, TEST_ASSET_URL2);
|
|
|
|
|
|
|
|
ASSERT_TRUE(m_storage->enqueue(firstIndicator));
|
|
|
|
ASSERT_TRUE(m_storage->enqueue(secondIndicator));
|
|
|
|
|
|
|
|
// should not be empty anymore
|
|
|
|
ASSERT_TRUE(m_storage->checkForEmptyQueue(&empty));
|
|
|
|
ASSERT_FALSE(empty);
|
|
|
|
|
|
|
|
ASSERT_TRUE(m_storage->dequeue());
|
|
|
|
|
|
|
|
// only dequeued once, should still contain a record
|
|
|
|
ASSERT_TRUE(m_storage->checkForEmptyQueue(&empty));
|
|
|
|
ASSERT_FALSE(empty);
|
|
|
|
|
|
|
|
ASSERT_TRUE(m_storage->dequeue());
|
|
|
|
|
|
|
|
// should finally be empty again
|
|
|
|
ASSERT_TRUE(m_storage->checkForEmptyQueue(&empty));
|
|
|
|
ASSERT_TRUE(empty);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Test persistence across closing and reopening database.
|
|
|
|
*/
|
2019-05-22 23:06:18 +00:00
|
|
|
TEST_F(NotificationsStorageTest, test_databasePersistence) {
|
2018-01-12 23:45:42 +00:00
|
|
|
createDatabase();
|
2018-03-09 00:55:39 +00:00
|
|
|
ASSERT_TRUE(isOpen(m_storage));
|
2018-01-12 23:45:42 +00:00
|
|
|
|
|
|
|
NotificationIndicator firstIndicator(true, false, TEST_ASSET_ID1, TEST_ASSET_URL1);
|
|
|
|
NotificationIndicator secondIndicator(false, true, TEST_ASSET_ID2, TEST_ASSET_URL2);
|
|
|
|
|
|
|
|
ASSERT_TRUE(m_storage->enqueue(firstIndicator));
|
|
|
|
ASSERT_TRUE(m_storage->enqueue(secondIndicator));
|
|
|
|
|
|
|
|
m_storage->close();
|
|
|
|
|
2018-03-09 00:55:39 +00:00
|
|
|
ASSERT_FALSE(isOpen(m_storage));
|
|
|
|
ASSERT_TRUE(m_storage->open());
|
|
|
|
ASSERT_TRUE(isOpen(m_storage));
|
2018-01-12 23:45:42 +00:00
|
|
|
|
|
|
|
NotificationIndicator firstDequeue;
|
|
|
|
ASSERT_TRUE(m_storage->peek(&firstDequeue));
|
|
|
|
ASSERT_TRUE(m_storage->dequeue());
|
|
|
|
// should match the first indicator
|
|
|
|
checkNotificationIndicatorsEquality(firstDequeue, firstIndicator);
|
|
|
|
|
|
|
|
// let's try closing again before the second dequeue
|
|
|
|
m_storage->close();
|
|
|
|
|
2018-03-09 00:55:39 +00:00
|
|
|
ASSERT_FALSE(isOpen(m_storage));
|
|
|
|
ASSERT_TRUE(m_storage->open());
|
|
|
|
ASSERT_TRUE(isOpen(m_storage));
|
2018-01-12 23:45:42 +00:00
|
|
|
|
|
|
|
NotificationIndicator secondDequeue;
|
|
|
|
ASSERT_TRUE(m_storage->peek(&secondDequeue));
|
|
|
|
ASSERT_TRUE(m_storage->dequeue());
|
|
|
|
// should match the second indicator
|
|
|
|
checkNotificationIndicatorsEquality(secondDequeue, secondIndicator);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Test that ordering is maintained with multiple queueing/dequeueing.
|
|
|
|
*/
|
2019-05-22 23:06:18 +00:00
|
|
|
TEST_F(NotificationsStorageTest, test_queueOrder) {
|
2018-01-12 23:45:42 +00:00
|
|
|
createDatabase();
|
2018-03-09 00:55:39 +00:00
|
|
|
ASSERT_TRUE(isOpen(m_storage));
|
2018-01-12 23:45:42 +00:00
|
|
|
|
|
|
|
// generate ints with a random generator, this will be used to produce random bool values
|
|
|
|
std::default_random_engine intGenerator;
|
|
|
|
intGenerator.seed(NOTIFICATION_INDICATOR_SEED);
|
|
|
|
|
|
|
|
std::uniform_int_distribution<int>(1, MAX_RANDOM_INT);
|
|
|
|
|
|
|
|
std::vector<NotificationIndicator> notificationIndicators;
|
|
|
|
|
|
|
|
// generate a bunch of random NotificationIndicators and enqueue them
|
|
|
|
for (unsigned int i = 0; i < NUM_TEST_INDICATORS; i++) {
|
|
|
|
// populate the new NotificationIndicator with random values
|
|
|
|
bool r_persistVisualIndicator = intGenerator() % 2;
|
|
|
|
bool r_playAudioIndicator = intGenerator() % 2;
|
|
|
|
std::string r_assetId = intGenerator() % 2 ? TEST_ASSET_ID1 : TEST_ASSET_ID2;
|
|
|
|
std::string r_assetUrl = intGenerator() % 2 ? TEST_ASSET_URL1 : TEST_ASSET_URL2;
|
|
|
|
|
|
|
|
NotificationIndicator ni(r_persistVisualIndicator, r_playAudioIndicator, r_assetId, r_assetUrl);
|
|
|
|
notificationIndicators.push_back(ni);
|
|
|
|
m_storage->enqueue(ni);
|
|
|
|
}
|
|
|
|
|
|
|
|
NotificationIndicator dequeuePtr;
|
|
|
|
|
|
|
|
// dequeue all the NotificationIndicators and check that they match the random ones previously generated
|
|
|
|
for (unsigned int i = 0; i < NUM_TEST_INDICATORS; i++) {
|
|
|
|
ASSERT_TRUE(m_storage->peek(&dequeuePtr));
|
|
|
|
ASSERT_TRUE(m_storage->dequeue());
|
|
|
|
checkNotificationIndicatorsEquality(dequeuePtr, notificationIndicators[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Test that peek() functionality works.
|
|
|
|
*/
|
2019-05-22 23:06:18 +00:00
|
|
|
TEST_F(NotificationsStorageTest, test_peek) {
|
2018-01-12 23:45:42 +00:00
|
|
|
createDatabase();
|
2018-03-09 00:55:39 +00:00
|
|
|
ASSERT_TRUE(isOpen(m_storage));
|
2018-01-12 23:45:42 +00:00
|
|
|
|
|
|
|
NotificationIndicator firstIndicator(true, false, TEST_ASSET_ID1, TEST_ASSET_URL1);
|
|
|
|
NotificationIndicator secondIndicator(false, true, TEST_ASSET_ID2, TEST_ASSET_URL2);
|
|
|
|
|
|
|
|
ASSERT_TRUE(m_storage->enqueue(firstIndicator));
|
|
|
|
ASSERT_TRUE(m_storage->enqueue(secondIndicator));
|
|
|
|
|
|
|
|
NotificationIndicator peekedAt;
|
|
|
|
ASSERT_TRUE(m_storage->peek(&peekedAt));
|
|
|
|
|
|
|
|
// should match the first indicator
|
|
|
|
checkNotificationIndicatorsEquality(peekedAt, firstIndicator);
|
|
|
|
ASSERT_TRUE(m_storage->dequeue());
|
|
|
|
|
|
|
|
// let's peek again, this time expecting the second indicator
|
|
|
|
ASSERT_TRUE(m_storage->peek(&peekedAt));
|
|
|
|
// should match the first indicator
|
|
|
|
checkNotificationIndicatorsEquality(peekedAt, secondIndicator);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Test that queueSize() works correctly.
|
|
|
|
*/
|
|
|
|
|
2019-05-22 23:06:18 +00:00
|
|
|
TEST_F(NotificationsStorageTest, test_size) {
|
2018-01-12 23:45:42 +00:00
|
|
|
createDatabase();
|
2018-03-09 00:55:39 +00:00
|
|
|
ASSERT_TRUE(isOpen(m_storage));
|
2018-01-12 23:45:42 +00:00
|
|
|
|
|
|
|
int size = 0;
|
|
|
|
ASSERT_TRUE(m_storage->getQueueSize(&size));
|
|
|
|
ASSERT_EQ(size, 0);
|
|
|
|
|
|
|
|
// test size after adding a few indicators
|
|
|
|
NotificationIndicator firstIndicator(true, false, TEST_ASSET_ID1, TEST_ASSET_URL1);
|
|
|
|
ASSERT_TRUE(m_storage->enqueue(firstIndicator));
|
|
|
|
ASSERT_TRUE(m_storage->getQueueSize(&size));
|
|
|
|
ASSERT_EQ(size, 1);
|
|
|
|
|
|
|
|
NotificationIndicator secondIndicator(false, true, TEST_ASSET_ID2, TEST_ASSET_URL2);
|
|
|
|
ASSERT_TRUE(m_storage->enqueue(secondIndicator));
|
|
|
|
ASSERT_TRUE(m_storage->getQueueSize(&size));
|
|
|
|
ASSERT_EQ(size, 2);
|
|
|
|
|
|
|
|
// and now pop everything off, checking size at every step
|
|
|
|
ASSERT_TRUE(m_storage->dequeue());
|
|
|
|
ASSERT_TRUE(m_storage->getQueueSize(&size));
|
|
|
|
ASSERT_EQ(size, 1);
|
|
|
|
|
|
|
|
ASSERT_TRUE(m_storage->dequeue());
|
|
|
|
ASSERT_TRUE(m_storage->getQueueSize(&size));
|
|
|
|
ASSERT_EQ(size, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace test
|
|
|
|
} // namespace notifications
|
|
|
|
} // namespace capabilityAgents
|
|
|
|
} // namespace alexaClientSDK
|
|
|
|
|
|
|
|
int main(int argc, char** argv) {
|
|
|
|
::testing::InitGoogleTest(&argc, argv);
|
|
|
|
if (argc < 1) {
|
|
|
|
std::cerr << "USAGE: " << std::string(argv[0]) << std::endl;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
return RUN_ALL_TESTS();
|
|
|
|
}
|