diff options
Diffstat (limited to 'src/components/transport_manager')
32 files changed, 814 insertions, 332 deletions
diff --git a/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_transport_adapter.h b/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_transport_adapter.h index c4bd02d64b..14f954286f 100644 --- a/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_transport_adapter.h +++ b/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_transport_adapter.h @@ -49,7 +49,11 @@ class BluetoothTransportAdapter : public TransportAdapterImpl { /** * @brief Constructor. */ - BluetoothTransportAdapter(resumption::LastState& last_state, + BluetoothTransportAdapter(resumption::LastStateWrapperPtr last_state_wrapper, + const TransportManagerSettings& settings); + + DEPRECATED + BluetoothTransportAdapter(resumption::LastState&, const TransportManagerSettings& settings); /** diff --git a/src/components/transport_manager/include/transport_manager/cloud/cloud_websocket_transport_adapter.h b/src/components/transport_manager/include/transport_manager/cloud/cloud_websocket_transport_adapter.h index 138f9ca895..c8b2cc9508 100644 --- a/src/components/transport_manager/include/transport_manager/cloud/cloud_websocket_transport_adapter.h +++ b/src/components/transport_manager/include/transport_manager/cloud/cloud_websocket_transport_adapter.h @@ -50,7 +50,7 @@ class CloudWebsocketTransportAdapter : public TransportAdapterImpl { * @brief Constructor. */ explicit CloudWebsocketTransportAdapter( - resumption::LastState& last_state, + resumption::LastStateWrapperPtr last_state_wrapper, const TransportManagerSettings& settings); /** diff --git a/src/components/transport_manager/include/transport_manager/iap2_emulation/iap2_transport_adapter.h b/src/components/transport_manager/include/transport_manager/iap2_emulation/iap2_transport_adapter.h index a802a64afa..3dabfb39ca 100644 --- a/src/components/transport_manager/include/transport_manager/iap2_emulation/iap2_transport_adapter.h +++ b/src/components/transport_manager/include/transport_manager/iap2_emulation/iap2_transport_adapter.h @@ -33,7 +33,7 @@ #ifndef SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_IAP2_EMULATION_IAP2_TRANSPORT_ADAPTER_H_ #define SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_IAP2_EMULATION_IAP2_TRANSPORT_ADAPTER_H_ -#include "resumption/last_state.h" +#include "resumption/last_state_wrapper.h" #include "transport_manager/tcp/tcp_transport_adapter.h" #include "transport_manager/transport_manager_settings.h" #include "utils/macro.h" @@ -60,9 +60,14 @@ class IAP2BluetoothEmulationTransportAdapter : public TcpTransportAdapter { */ IAP2BluetoothEmulationTransportAdapter( const uint16_t port, - resumption::LastState& last_state, + resumption::LastStateWrapperPtr last_state_wrapper, const TransportManagerSettings& settings); + DEPRECATED + IAP2BluetoothEmulationTransportAdapter( + const uint16_t port, + resumption::LastState& last_state_wrapper, + const TransportManagerSettings& settings); /** * @brief DeviceSwitched is called during switching from iAP2 Bluetooth to * iAP2 USB transport. @@ -103,9 +108,16 @@ class IAP2USBEmulationTransportAdapter : public TcpTransportAdapter { * @param last_state LastState instance reference * @param settings Settings reference */ + IAP2USBEmulationTransportAdapter( + const uint16_t port, + resumption::LastStateWrapperPtr last_state_wrapper, + const TransportManagerSettings& settings); + + DEPRECATED IAP2USBEmulationTransportAdapter(const uint16_t port, - resumption::LastState& last_state, - const TransportManagerSettings& settings); + resumption::LastState&, + const TransportManagerSettings& settings) = + delete; /** * Destructor diff --git a/src/components/transport_manager/include/transport_manager/tcp/tcp_transport_adapter.h b/src/components/transport_manager/include/transport_manager/tcp/tcp_transport_adapter.h index 37f5a7fe49..c5948062c9 100644 --- a/src/components/transport_manager/include/transport_manager/tcp/tcp_transport_adapter.h +++ b/src/components/transport_manager/include/transport_manager/tcp/tcp_transport_adapter.h @@ -49,9 +49,14 @@ class TcpTransportAdapter : public TransportAdapterImpl { /** * @brief Constructor. */ - explicit TcpTransportAdapter(uint16_t port, - resumption::LastState& last_state, - const TransportManagerSettings& settings); + TcpTransportAdapter(uint16_t port, + resumption::LastStateWrapperPtr last_state_wrapper, + const TransportManagerSettings& settings); + + DEPRECATED + TcpTransportAdapter(uint16_t port, + resumption::LastState&, + const TransportManagerSettings& settings) = delete; /** * @brief Destructor. diff --git a/src/components/transport_manager/include/transport_manager/transport_adapter/connection.h b/src/components/transport_manager/include/transport_manager/transport_adapter/connection.h index 2374d8a126..4d9910b9f3 100644 --- a/src/components/transport_manager/include/transport_manager/transport_adapter/connection.h +++ b/src/components/transport_manager/include/transport_manager/transport_adapter/connection.h @@ -64,6 +64,13 @@ class Connection { * @brief Disconnect the current connection. */ virtual TransportAdapter::Error Disconnect() = 0; + + /** + * @brief Terminate method may implement the logic of correct thread + * termination, if necessary for specific connection. Unlike the disconnect + * method, which manipulates physical descriptors + */ + virtual void Terminate() {} }; typedef std::shared_ptr<Connection> ConnectionSPtr; diff --git a/src/components/transport_manager/include/transport_manager/transport_adapter/threaded_socket_connection.h b/src/components/transport_manager/include/transport_manager/transport_adapter/threaded_socket_connection.h index 11123ceb1c..7c4e07fa59 100644 --- a/src/components/transport_manager/include/transport_manager/transport_adapter/threaded_socket_connection.h +++ b/src/components/transport_manager/include/transport_manager/transport_adapter/threaded_socket_connection.h @@ -74,6 +74,8 @@ class ThreadedSocketConnection : public Connection { */ TransportAdapter::Error Disconnect(); + void Terminate() OVERRIDE; + /** * @brief Start thread creation. * diff --git a/src/components/transport_manager/include/transport_manager/transport_adapter/transport_adapter_impl.h b/src/components/transport_manager/include/transport_manager/transport_adapter/transport_adapter_impl.h index 0750b58aae..db9bb03998 100644 --- a/src/components/transport_manager/include/transport_manager/transport_adapter/transport_adapter_impl.h +++ b/src/components/transport_manager/include/transport_manager/transport_adapter/transport_adapter_impl.h @@ -43,7 +43,7 @@ #include "utils/rwlock.h" #include "utils/timer.h" -#include "resumption/last_state.h" +#include "resumption/last_state_wrapper.h" #include "transport_manager/transport_adapter/connection.h" #include "transport_manager/transport_adapter/transport_adapter.h" #include "transport_manager/transport_adapter/transport_adapter_controller.h" @@ -82,9 +82,16 @@ class TransportAdapterImpl : public TransportAdapter, TransportAdapterImpl(DeviceScanner* device_scanner, ServerConnectionFactory* server_connection_factory, ClientConnectionListener* client_connection_listener, - resumption::LastState& last_state, + resumption::LastStateWrapperPtr last_state_wrapper, const TransportManagerSettings& settings); + DEPRECATED + TransportAdapterImpl(DeviceScanner* device_scanner, + ServerConnectionFactory* server_connection_factory, + ClientConnectionListener* client_connection_listener, + resumption::LastState& last_state, + const TransportManagerSettings& settings) = delete; + /** * @brief Destructor. **/ @@ -500,7 +507,7 @@ class TransportAdapterImpl : public TransportAdapter, * * @param observer - pointer to observer */ - void SetTelemetryObserver(TMTelemetryObserver* observer); + void SetTelemetryObserver(TMTelemetryObserver* observer) OVERRIDE; /** * @brief Return Time metric observer @@ -662,7 +669,7 @@ class TransportAdapterImpl : public TransportAdapter, #endif // TELEMETRY_MONITOR resumption::LastState& last_state() const { - return last_state_; + return last_state_wrapper_->get_accessor().GetMutableData(); } /** @@ -680,7 +687,7 @@ class TransportAdapterImpl : public TransportAdapter, */ ClientConnectionListener* client_connection_listener_; - resumption::LastState& last_state_; + resumption::LastStateWrapperPtr last_state_wrapper_; const TransportManagerSettings& settings_; }; diff --git a/src/components/transport_manager/include/transport_manager/transport_manager_default.h b/src/components/transport_manager/include/transport_manager/transport_manager_default.h index 7fb0904fdf..9d428cf817 100644 --- a/src/components/transport_manager/include/transport_manager/transport_manager_default.h +++ b/src/components/transport_manager/include/transport_manager/transport_manager_default.h @@ -38,24 +38,47 @@ #include "transport_manager/transport_manager_impl.h" -namespace resumption { -class LastState; -} - namespace transport_manager { +struct TransportAdapterFactory { + TransportAdapterFactory(); + template <typename... Args> + using CreatorTA = + std::function<transport_adapter::TransportAdapter*(Args&&... args)>; +#ifdef BLUETOOTH_SUPPORT + CreatorTA<resumption::LastStateWrapperPtr&, const TransportManagerSettings&> + ta_bluetooth_creator_; +#endif + CreatorTA<const uint16_t, + resumption::LastStateWrapperPtr&, + const TransportManagerSettings&> + ta_tcp_creator_; +#if defined(USB_SUPPORT) + CreatorTA<resumption::LastStateWrapperPtr&, const TransportManagerSettings&> + ta_usb_creator_; +#endif +#if defined(CLOUD_APP_WEBSOCKET_TRANSPORT_SUPPORT) + CreatorTA<resumption::LastStateWrapperPtr&, const TransportManagerSettings&> + ta_cloud_creator_; +#endif +}; + /** * @brief Default realization of transport_manager_impl class. */ class TransportManagerDefault : public TransportManagerImpl { public: - explicit TransportManagerDefault(const TransportManagerSettings& settings); + explicit TransportManagerDefault(const TransportManagerSettings& settings, + const TransportAdapterFactory& ta_factory_); /** * @brief Initialize transport manager. * * @return Code error. */ + int Init(resumption::LastStateWrapperPtr last_state_wrapper) OVERRIDE; + + DEPRECATED int Init(resumption::LastState& last_state) OVERRIDE; /** @@ -63,6 +86,8 @@ class TransportManagerDefault : public TransportManagerImpl { */ virtual ~TransportManagerDefault(); + private: + TransportAdapterFactory ta_factory_; DISALLOW_COPY_AND_ASSIGN(TransportManagerDefault); }; } // namespace transport_manager diff --git a/src/components/transport_manager/include/transport_manager/transport_manager_impl.h b/src/components/transport_manager/include/transport_manager/transport_manager_impl.h index 5e97a5567e..2fbd592b72 100644 --- a/src/components/transport_manager/include/transport_manager/transport_manager_impl.h +++ b/src/components/transport_manager/include/transport_manager/transport_manager_impl.h @@ -124,6 +124,9 @@ class TransportManagerImpl * * @return Code error. */ + int Init(resumption::LastStateWrapperPtr last_state_wrapper) OVERRIDE; + + DEPRECATED int Init(resumption::LastState& last_state) OVERRIDE; /** diff --git a/src/components/transport_manager/include/transport_manager/usb/usb_aoa_adapter.h b/src/components/transport_manager/include/transport_manager/usb/usb_aoa_adapter.h index ee7039efde..45c6d4c0e4 100644 --- a/src/components/transport_manager/include/transport_manager/usb/usb_aoa_adapter.h +++ b/src/components/transport_manager/include/transport_manager/usb/usb_aoa_adapter.h @@ -44,8 +44,13 @@ namespace transport_adapter { class UsbAoaAdapter : public TransportAdapterImpl { public: - UsbAoaAdapter(resumption::LastState& last_state, + UsbAoaAdapter(resumption::LastStateWrapperPtr last_state_wrapper, const TransportManagerSettings& settings); + + DEPRECATED + UsbAoaAdapter(resumption::LastState&, + const TransportManagerSettings& settings) = delete; + virtual ~UsbAoaAdapter(); protected: diff --git a/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc b/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc index 911658bc56..066751c474 100644 --- a/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc +++ b/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc @@ -57,12 +57,13 @@ CREATE_LOGGERPTR_GLOBAL(logger_, "TransportManager") BluetoothTransportAdapter::~BluetoothTransportAdapter() {} BluetoothTransportAdapter::BluetoothTransportAdapter( - resumption::LastState& last_state, const TransportManagerSettings& settings) + resumption::LastStateWrapperPtr last_state_wrapper, + const TransportManagerSettings& settings) : TransportAdapterImpl( new BluetoothDeviceScanner(this, true, 0, settings.bluetooth_uuid()), new BluetoothConnectionFactory(this), NULL, - last_state, + last_state_wrapper, settings) {} DeviceType BluetoothTransportAdapter::GetDeviceType() const { @@ -112,23 +113,25 @@ void BluetoothTransportAdapter::Store() const { } } bluetooth_adapter_dictionary["devices"] = devices_dictionary; - Json::Value& dictionary = last_state().get_dictionary(); + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); dictionary["TransportManager"]["BluetoothAdapter"] = bluetooth_adapter_dictionary; + accessor.GetMutableData().set_dictionary(dictionary); LOG4CXX_TRACE(logger_, "exit"); } bool BluetoothTransportAdapter::Restore() { LOG4CXX_TRACE(logger_, "enter"); bool errors_occured = false; + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); const Json::Value bluetooth_adapter_dictionary = - last_state().get_dictionary()["TransportManager"]["BluetoothAdapter"]; + dictionary["TransportManager"]["BluetoothAdapter"]; const Json::Value devices_dictionary = bluetooth_adapter_dictionary["devices"]; - for (Json::Value::const_iterator i = devices_dictionary.begin(); - i != devices_dictionary.end(); - ++i) { - const Json::Value device_dictionary = *i; + for (const auto& bt_device : devices_dictionary) { + const Json::Value device_dictionary = bt_device; std::string name = device_dictionary["name"].asString(); std::string address_record = device_dictionary["address"].asString(); bdaddr_t address; @@ -136,10 +139,8 @@ bool BluetoothTransportAdapter::Restore() { RfcommChannelVector rfcomm_channels; const Json::Value applications_dictionary = device_dictionary["applications"]; - for (Json::Value::const_iterator j = applications_dictionary.begin(); - j != applications_dictionary.end(); - ++j) { - const Json::Value application_dictionary = *j; + for (const auto& application : applications_dictionary) { + const Json::Value application_dictionary = application; std::string rfcomm_channel_record = application_dictionary["rfcomm_channel"].asString(); uint8_t rfcomm_channel = @@ -150,11 +151,9 @@ bool BluetoothTransportAdapter::Restore() { new BluetoothDevice(address, name.c_str(), rfcomm_channels); DeviceSptr device(bluetooth_device); AddDevice(device); - for (RfcommChannelVector::const_iterator j = rfcomm_channels.begin(); - j != rfcomm_channels.end(); - ++j) { + for (const auto& channel : rfcomm_channels) { ApplicationHandle app_handle = - *j; // for Bluetooth device app_handle is just RFCOMM channel + channel; // for Bluetooth device app_handle is just RFCOMM channel if (Error::OK != Connect(device->unique_device_id(), app_handle)) { errors_occured = true; } diff --git a/src/components/transport_manager/src/cloud/cloud_websocket_transport_adapter.cc b/src/components/transport_manager/src/cloud/cloud_websocket_transport_adapter.cc index 622531b120..2d1de703b1 100644 --- a/src/components/transport_manager/src/cloud/cloud_websocket_transport_adapter.cc +++ b/src/components/transport_manager/src/cloud/cloud_websocket_transport_adapter.cc @@ -44,11 +44,12 @@ namespace transport_adapter { CREATE_LOGGERPTR_GLOBAL(logger_, "TransportManager") CloudWebsocketTransportAdapter::CloudWebsocketTransportAdapter( - resumption::LastState& last_state, const TransportManagerSettings& settings) + resumption::LastStateWrapperPtr last_state_wrapper, + const TransportManagerSettings& settings) : TransportAdapterImpl(NULL, new CloudWebsocketConnectionFactory(this), NULL, - last_state, + last_state_wrapper, settings) {} CloudWebsocketTransportAdapter::~CloudWebsocketTransportAdapter() {} diff --git a/src/components/transport_manager/src/iap2_emulation/iap2_transport_adapter.cc b/src/components/transport_manager/src/iap2_emulation/iap2_transport_adapter.cc index 2e37f76bc9..6a43f66c64 100644 --- a/src/components/transport_manager/src/iap2_emulation/iap2_transport_adapter.cc +++ b/src/components/transport_manager/src/iap2_emulation/iap2_transport_adapter.cc @@ -54,9 +54,9 @@ CREATE_LOGGERPTR_GLOBAL(logger_, "IAP2Emulation"); IAP2BluetoothEmulationTransportAdapter::IAP2BluetoothEmulationTransportAdapter( const uint16_t port, - resumption::LastState& last_state, + resumption::LastStateWrapperPtr last_state_wrapper, const TransportManagerSettings& settings) - : TcpTransportAdapter(port, last_state, settings) {} + : TcpTransportAdapter(port, last_state_wrapper, settings) {} void IAP2BluetoothEmulationTransportAdapter::DeviceSwitched( const DeviceUID& device_handle) { @@ -76,9 +76,9 @@ void IAP2BluetoothEmulationTransportAdapter::TransportConfigUpdated( IAP2USBEmulationTransportAdapter::IAP2USBEmulationTransportAdapter( const uint16_t port, - resumption::LastState& last_state, + resumption::LastStateWrapperPtr last_state_wrapper, const TransportManagerSettings& settings) - : TcpTransportAdapter(port, last_state, settings), out_(0) { + : TcpTransportAdapter(port, last_state_wrapper, settings), out_(0) { auto delegate = new IAPSignalHandlerDelegate(*this); signal_handler_ = threads::CreateThread("iAP signal handler", delegate); signal_handler_->start(); diff --git a/src/components/transport_manager/src/tcp/tcp_transport_adapter.cc b/src/components/transport_manager/src/tcp/tcp_transport_adapter.cc index aeb50f3830..54eb3a7b6d 100644 --- a/src/components/transport_manager/src/tcp/tcp_transport_adapter.cc +++ b/src/components/transport_manager/src/tcp/tcp_transport_adapter.cc @@ -53,7 +53,7 @@ CREATE_LOGGERPTR_GLOBAL(logger_, "TransportManager") TcpTransportAdapter::TcpTransportAdapter( const uint16_t port, - resumption::LastState& last_state, + resumption::LastStateWrapperPtr last_state_wrapper, const TransportManagerSettings& settings) : TransportAdapterImpl( NULL, @@ -63,7 +63,7 @@ TcpTransportAdapter::TcpTransportAdapter( port, true, settings.transport_manager_tcp_adapter_network_interface()), - last_state, + last_state_wrapper, settings) {} TcpTransportAdapter::~TcpTransportAdapter() {} @@ -131,20 +131,22 @@ void TcpTransportAdapter::Store() const { } } tcp_adapter_dictionary["devices"] = devices_dictionary; - Json::Value& dictionary = last_state().get_dictionary(); + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); dictionary["TransportManager"]["TcpAdapter"] = tcp_adapter_dictionary; + accessor.GetMutableData().set_dictionary(dictionary); } bool TcpTransportAdapter::Restore() { LOG4CXX_AUTO_TRACE(logger_); bool errors_occurred = false; + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); const Json::Value tcp_adapter_dictionary = - last_state().get_dictionary()["TransportManager"]["TcpAdapter"]; + dictionary["TransportManager"]["TcpAdapter"]; const Json::Value devices_dictionary = tcp_adapter_dictionary["devices"]; - for (Json::Value::const_iterator i = devices_dictionary.begin(); - i != devices_dictionary.end(); - ++i) { - const Json::Value device_dictionary = *i; + for (const auto& tcp_adapter_device : devices_dictionary) { + const Json::Value device_dictionary = tcp_adapter_device; std::string name = device_dictionary["name"].asString(); std::string address_record = device_dictionary["address"].asString(); in_addr_t address = inet_addr(address_record.c_str()); @@ -153,10 +155,8 @@ bool TcpTransportAdapter::Restore() { AddDevice(device); const Json::Value applications_dictionary = device_dictionary["applications"]; - for (Json::Value::const_iterator j = applications_dictionary.begin(); - j != applications_dictionary.end(); - ++j) { - const Json::Value application_dictionary = *j; + for (const auto& application : applications_dictionary) { + const Json::Value application_dictionary = application; std::string port_record = application_dictionary["port"].asString(); int port = atoi(port_record.c_str()); ApplicationHandle app_handle = tcp_device->AddDiscoveredApplication(port); diff --git a/src/components/transport_manager/src/transport_adapter/threaded_socket_connection.cc b/src/components/transport_manager/src/transport_adapter/threaded_socket_connection.cc index 96c4c2c370..7d96c685f1 100644 --- a/src/components/transport_manager/src/transport_adapter/threaded_socket_connection.cc +++ b/src/components/transport_manager/src/transport_adapter/threaded_socket_connection.cc @@ -62,7 +62,7 @@ ThreadedSocketConnection::ThreadedSocketConnection( , unexpected_disconnect_(false) , device_uid_(device_id) , app_handle_(app_handle) - , thread_(NULL) { + , thread_(nullptr) { const std::string thread_name = std::string("Socket ") + device_handle(); thread_ = threads::CreateThread(thread_name.c_str(), new SocketConnectionDelegate(this)); @@ -70,7 +70,7 @@ ThreadedSocketConnection::ThreadedSocketConnection( ThreadedSocketConnection::~ThreadedSocketConnection() { LOG4CXX_AUTO_TRACE(logger_); - DCHECK(NULL == thread_); + DCHECK(nullptr == thread_); if (-1 != read_fd_) { close(read_fd_); @@ -82,10 +82,12 @@ ThreadedSocketConnection::~ThreadedSocketConnection() { void ThreadedSocketConnection::StopAndJoinThread() { Disconnect(); - thread_->join(); - delete thread_->delegate(); - threads::DeleteThread(thread_); - thread_ = NULL; + if (thread_) { + thread_->join(); + delete thread_->delegate(); + threads::DeleteThread(thread_); + thread_ = nullptr; + } } void ThreadedSocketConnection::Abort() { @@ -167,16 +169,23 @@ TransportAdapter::Error ThreadedSocketConnection::Disconnect() { return Notify(); } +void ThreadedSocketConnection::Terminate() { + LOG4CXX_AUTO_TRACE(logger_); + StopAndJoinThread(); +} + void ThreadedSocketConnection::threadMain() { LOG4CXX_AUTO_TRACE(logger_); - ConnectError* connect_error = NULL; + ConnectError* connect_error = nullptr; if (!Establish(&connect_error)) { LOG4CXX_ERROR(logger_, "Connection Establish failed"); delete connect_error; Abort(); + } else { + LOG4CXX_DEBUG(logger_, "Connection established"); + controller_->ConnectDone(device_handle(), application_handle()); } - LOG4CXX_DEBUG(logger_, "Connection established"); - controller_->ConnectDone(device_handle(), application_handle()); + while (!terminate_flag_) { Transmit(); } diff --git a/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc b/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc index f0bfabf2e4..4e057aee63 100644 --- a/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc +++ b/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc @@ -70,7 +70,7 @@ TransportAdapterImpl::TransportAdapterImpl( DeviceScanner* device_scanner, ServerConnectionFactory* server_connection_factory, ClientConnectionListener* client_connection_listener, - resumption::LastState& last_state, + resumption::LastStateWrapperPtr last_state_wrapper, const TransportManagerSettings& settings) : listeners_() , initialised_(0) @@ -86,7 +86,7 @@ TransportAdapterImpl::TransportAdapterImpl( device_scanner_(device_scanner) , server_connection_factory_(server_connection_factory) , client_connection_listener_(client_connection_listener) - , last_state_(last_state) + , last_state_wrapper_(last_state_wrapper) , settings_(settings) { } @@ -138,6 +138,12 @@ void TransportAdapterImpl::Terminate() { connections_lock_.AcquireForWriting(); std::swap(connections, connections_); connections_lock_.Release(); + for (const auto& connection : connections) { + auto& info = connection.second; + if (info.connection) { + info.connection->Terminate(); + } + } connections.clear(); LOG4CXX_DEBUG(logger_, "Connections deleted"); @@ -948,23 +954,35 @@ void TransportAdapterImpl::RemoveFinalizedConnection( const DeviceUID& device_handle, const ApplicationHandle& app_handle) { const DeviceUID device_uid = device_handle; LOG4CXX_AUTO_TRACE(logger_); - sync_primitives::AutoWriteLock lock(connections_lock_); - ConnectionMap::iterator it_conn = - connections_.find(std::make_pair(device_uid, app_handle)); - if (it_conn == connections_.end()) { - LOG4CXX_WARN(logger_, - "Device_id: " << &device_uid << ", app_handle: " << &app_handle - << " connection not found"); - return; + { + sync_primitives::AutoWriteLock lock(connections_lock_); + auto it_conn = connections_.find(std::make_pair(device_uid, app_handle)); + if (connections_.end() == it_conn) { + LOG4CXX_WARN(logger_, + "Device_id: " << &device_uid << ", app_handle: " + << &app_handle << " connection not found"); + return; + } + const ConnectionInfo& info = it_conn->second; + if (ConnectionInfo::FINALISING != info.state) { + LOG4CXX_WARN(logger_, + "Device_id: " << &device_uid << ", app_handle: " + << &app_handle << " connection not finalized"); + return; + } + connections_.erase(it_conn); } - const ConnectionInfo& info = it_conn->second; - if (info.state != ConnectionInfo::FINALISING) { - LOG4CXX_WARN(logger_, - "Device_id: " << &device_uid << ", app_handle: " << &app_handle - << " connection not finalized"); + + DeviceSptr device = FindDevice(device_handle); + if (!device) { + LOG4CXX_WARN(logger_, "Device: uid " << &device_uid << " not found"); return; } - connections_.erase(it_conn); + + if (ToBeAutoDisconnected(device) && + IsSingleApplication(device_handle, app_handle)) { + RemoveDevice(device_uid); + } } void TransportAdapterImpl::AddListener(TransportAdapterListener* listener) { diff --git a/src/components/transport_manager/src/transport_manager_default.cc b/src/components/transport_manager/src/transport_manager_default.cc index 71fc41ada9..868fcc3f15 100644 --- a/src/components/transport_manager/src/transport_manager_default.cc +++ b/src/components/transport_manager/src/transport_manager_default.cc @@ -55,67 +55,92 @@ namespace transport_manager { CREATE_LOGGERPTR_GLOBAL(logger_, "TransportManager") +TransportAdapterFactory::TransportAdapterFactory() { +#ifdef BLUETOOTH_SUPPORT + ta_bluetooth_creator_ = [](resumption::LastStateWrapperPtr last_state_wrapper, + const TransportManagerSettings& settings) { + return new transport_adapter::BluetoothTransportAdapter(last_state_wrapper, + settings); + }; +#endif + ta_tcp_creator_ = [](const uint16_t port, + resumption::LastStateWrapperPtr last_state_wrapper, + const TransportManagerSettings& settings) { + return new transport_adapter::TcpTransportAdapter( + port, last_state_wrapper, settings); + }; +#if defined(USB_SUPPORT) + ta_usb_creator_ = [](resumption::LastStateWrapperPtr last_state_wrapper, + const TransportManagerSettings& settings) { + return new transport_adapter::UsbAoaAdapter(last_state_wrapper, settings); + }; +#endif +#if defined(CLOUD_APP_WEBSOCKET_TRANSPORT_SUPPORT) + ta_cloud_creator_ = [](resumption::LastStateWrapperPtr last_state_wrapper, + const TransportManagerSettings& settings) { + return new transport_adapter::CloudWebsocketTransportAdapter( + last_state_wrapper, settings); + }; +#endif +} + TransportManagerDefault::TransportManagerDefault( - const TransportManagerSettings& settings) - : TransportManagerImpl(settings) {} + const TransportManagerSettings& settings, + const TransportAdapterFactory& ta_factory) + : TransportManagerImpl(settings), ta_factory_(ta_factory) {} -int TransportManagerDefault::Init(resumption::LastState& last_state) { +int TransportManagerDefault::Init( + resumption::LastStateWrapperPtr last_state_wrapper) { LOG4CXX_TRACE(logger_, "enter"); - if (E_SUCCESS != TransportManagerImpl::Init(last_state)) { + if (E_SUCCESS != TransportManagerImpl::Init(last_state_wrapper)) { LOG4CXX_TRACE(logger_, "exit with E_TM_IS_NOT_INITIALIZED. Condition: E_SUCCESS != " "TransportManagerImpl::Init()"); return E_TM_IS_NOT_INITIALIZED; } -#ifdef BLUETOOTH_SUPPORT - transport_adapter::TransportAdapterImpl* ta_bluetooth = - new transport_adapter::BluetoothTransportAdapter(last_state, - get_settings()); + const auto& settings = get_settings(); + +#if defined(BLUETOOTH_SUPPORT) + auto ta_bluetooth = + ta_factory_.ta_bluetooth_creator_(last_state_wrapper, settings); #ifdef TELEMETRY_MONITOR if (metric_observer_) { ta_bluetooth->SetTelemetryObserver(metric_observer_); } #endif // TELEMETRY_MONITOR AddTransportAdapter(ta_bluetooth); - ta_bluetooth = NULL; -#endif +#endif // BLUETOOTH_SUPPORT - const uint16_t port = get_settings().transport_manager_tcp_adapter_port(); - transport_adapter::TransportAdapterImpl* ta_tcp = - new transport_adapter::TcpTransportAdapter( - port, last_state, get_settings()); + auto ta_tcp = + ta_factory_.ta_tcp_creator_(settings.transport_manager_tcp_adapter_port(), + last_state_wrapper, + settings); #ifdef TELEMETRY_MONITOR if (metric_observer_) { ta_tcp->SetTelemetryObserver(metric_observer_); } #endif // TELEMETRY_MONITOR AddTransportAdapter(ta_tcp); - ta_tcp = NULL; #if defined(USB_SUPPORT) - transport_adapter::TransportAdapterImpl* ta_usb = - new transport_adapter::UsbAoaAdapter(last_state, get_settings()); + auto ta_usb = ta_factory_.ta_usb_creator_(last_state_wrapper, settings); #ifdef TELEMETRY_MONITOR if (metric_observer_) { ta_usb->SetTelemetryObserver(metric_observer_); } #endif // TELEMETRY_MONITOR AddTransportAdapter(ta_usb); - ta_usb = NULL; #endif // USB_SUPPORT #if defined(CLOUD_APP_WEBSOCKET_TRANSPORT_SUPPORT) - transport_adapter::TransportAdapterImpl* ta_cloud = - new transport_adapter::CloudWebsocketTransportAdapter(last_state, - get_settings()); + auto ta_cloud = ta_factory_.ta_cloud_creator_(last_state_wrapper, settings); #ifdef TELEMETRY_MONITOR if (metric_observer_) { ta_cloud->SetTelemetryObserver(metric_observer_); } #endif // TELEMETRY_MONITOR AddTransportAdapter(ta_cloud); - ta_cloud = NULL; #endif // CLOUD_APP_WEBSOCKET_TRANSPORT_SUPPORT #if defined BUILD_TESTS @@ -123,14 +148,14 @@ int TransportManagerDefault::Init(resumption::LastState& last_state) { transport_adapter::IAP2BluetoothEmulationTransportAdapter* iap2_bt_emu_adapter = new transport_adapter::IAP2BluetoothEmulationTransportAdapter( - iap2_bt_emu_port, last_state, get_settings()); + iap2_bt_emu_port, last_state_wrapper, settings); AddTransportAdapter(iap2_bt_emu_adapter); const uint16_t iap2_usb_emu_port = 34567; transport_adapter::IAP2USBEmulationTransportAdapter* iap2_usb_emu_adapter = new transport_adapter::IAP2USBEmulationTransportAdapter( - iap2_usb_emu_port, last_state, get_settings()); + iap2_usb_emu_port, last_state_wrapper, settings); AddTransportAdapter(iap2_usb_emu_adapter); #endif // BUILD_TEST @@ -139,6 +164,10 @@ int TransportManagerDefault::Init(resumption::LastState& last_state) { return E_SUCCESS; } +int TransportManagerDefault::Init(resumption::LastState&) { + return 1; +} + TransportManagerDefault::~TransportManagerDefault() {} } // namespace transport_manager diff --git a/src/components/transport_manager/src/transport_manager_impl.cc b/src/components/transport_manager/src/transport_manager_impl.cc index 07dd35bc2f..c6fd60a185 100644 --- a/src/components/transport_manager/src/transport_manager_impl.cc +++ b/src/components/transport_manager/src/transport_manager_impl.cc @@ -581,8 +581,18 @@ int TransportManagerImpl::SearchDevices() { return transport_adapter_search; } +int TransportManagerImpl::Init( + resumption::LastStateWrapperPtr last_state_wrapper) { + // Last state wrapper required to initialize Transport adapters + UNUSED(last_state_wrapper); + LOG4CXX_TRACE(logger_, "enter"); + is_initialized_ = true; + LOG4CXX_TRACE(logger_, "exit with E_SUCCESS"); + return E_SUCCESS; +} + int TransportManagerImpl::Init(resumption::LastState& last_state) { - // Last state requred to initialize Transport adapters + // Last state required to initialize Transport adapters UNUSED(last_state); LOG4CXX_TRACE(logger_, "enter"); is_initialized_ = true; diff --git a/src/components/transport_manager/src/usb/usb_aoa_adapter.cc b/src/components/transport_manager/src/usb/usb_aoa_adapter.cc index d1e9c64c3b..9ce571eb6c 100644 --- a/src/components/transport_manager/src/usb/usb_aoa_adapter.cc +++ b/src/components/transport_manager/src/usb/usb_aoa_adapter.cc @@ -43,12 +43,12 @@ namespace transport_manager { namespace transport_adapter { CREATE_LOGGERPTR_GLOBAL(logger_, "TransportManager") -UsbAoaAdapter::UsbAoaAdapter(resumption::LastState& last_state, +UsbAoaAdapter::UsbAoaAdapter(resumption::LastStateWrapperPtr last_state_wrapper, const TransportManagerSettings& settings) : TransportAdapterImpl(new UsbDeviceScanner(this, settings), new UsbConnectionFactory(this), NULL, - last_state, + last_state_wrapper, settings) , is_initialised_(false) , usb_handler_(new UsbHandler()) { diff --git a/src/components/transport_manager/test/include/transport_manager/bt/mock_bluetooth_transport_adapter.h b/src/components/transport_manager/test/include/transport_manager/bt/mock_bluetooth_transport_adapter.h new file mode 100644 index 0000000000..ffd8cd9647 --- /dev/null +++ b/src/components/transport_manager/test/include/transport_manager/bt/mock_bluetooth_transport_adapter.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2019, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_TRANSPORT_MANAGER_BT_MOCK_BLUETOOTH_TRANSPORT_ADAPTER_H_ +#define SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_TRANSPORT_MANAGER_BT_MOCK_BLUETOOTH_TRANSPORT_ADAPTER_H_ + +#include "transport_manager/transport_adapter/mock_transport_adapter.h" + +namespace test { +namespace components { +namespace transport_manager_test { + +using namespace ::transport_manager::transport_adapter; + +class MockBluetoothTransportAdapter : public MockTransportAdapter { + public: + MOCK_CONST_METHOD0(GetDeviceType, DeviceType()); + MOCK_CONST_METHOD0(Store, void()); + MOCK_METHOD0(Restore, bool()); +}; + +} // namespace transport_manager_test +} // namespace components +} // namespace test + +#endif // SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_TRANSPORT_MANAGER_BT_MOCK_BLUETOOTH_TRANSPORT_ADAPTER_H_ diff --git a/src/components/transport_manager/test/include/transport_manager/cloud/mock_cloud_websocket_transport_adapter.h b/src/components/transport_manager/test/include/transport_manager/cloud/mock_cloud_websocket_transport_adapter.h new file mode 100644 index 0000000000..6e74ae759f --- /dev/null +++ b/src/components/transport_manager/test/include/transport_manager/cloud/mock_cloud_websocket_transport_adapter.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2019, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_TRANSPORT_MANAGER_CLOUD_MOCK_CLOUD_WEBSOCKET_TRANSPORT_ADAPTER_H_ +#define SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_TRANSPORT_MANAGER_CLOUD_MOCK_CLOUD_WEBSOCKET_TRANSPORT_ADAPTER_H_ + +#include "transport_manager/cloud/cloud_websocket_transport_adapter.h" + +namespace test { +namespace components { +namespace transport_manager_test { + +using namespace ::transport_manager::transport_adapter; + +class MockCloudWebsocketTransportAdapter + : public CloudWebsocketTransportAdapter { + public: + MockCloudWebsocketTransportAdapter( + resumption::LastStateWrapperPtr last_state_wrapper, + const transport_manager::TransportManagerSettings& settings) + : CloudWebsocketTransportAdapter(last_state_wrapper, settings) {} + MOCK_CONST_METHOD0(GetDeviceType, DeviceType()); + MOCK_CONST_METHOD0(Store, void()); + MOCK_METHOD0(Restore, bool()); + MOCK_CONST_METHOD0(IsInitialised, bool()); + MOCK_METHOD1(AddListener, void(TransportAdapterListener* listener)); + MOCK_METHOD0(Init, TransportAdapter::Error()); + MOCK_METHOD0(Terminate, void()); +}; + +} // namespace transport_manager_test +} // namespace components +} // namespace test + +#endif // SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_TRANSPORT_MANAGER_CLOUD_MOCK_CLOUD_WEBSOCKET_TRANSPORT_ADAPTER_H_ diff --git a/src/components/transport_manager/test/include/transport_manager/cloud/sample_websocket_server.h b/src/components/transport_manager/test/include/transport_manager/cloud/sample_websocket_server.h index a8b801c1fe..e29f182059 100644 --- a/src/components/transport_manager/test/include/transport_manager/cloud/sample_websocket_server.h +++ b/src/components/transport_manager/test/include/transport_manager/cloud/sample_websocket_server.h @@ -39,6 +39,7 @@ #include <boost/asio/placeholders.hpp> #include <boost/asio/ssl/stream.hpp> #include <boost/asio/strand.hpp> +#include <boost/asio/thread_pool.hpp> #include <boost/beast/core.hpp> #include <boost/beast/websocket.hpp> #include <boost/beast/websocket/ssl.hpp> @@ -61,9 +62,9 @@ namespace ssl = boost::asio::ssl; // from <boost/asio/ssl.hpp> using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp> // Accepts incoming connections and launches the WSServer -class WSSession { +class WSSession : public std::enable_shared_from_this<WSSession> { private: - class WSServer { + class WSServer : public std::enable_shared_from_this<WSServer> { public: explicit WSServer(tcp::socket&& socket); void AddURLRoute(const std::string& route); @@ -95,6 +96,7 @@ class WSSession { private: void on_accept(boost::system::error_code ec); boost::asio::io_context ioc_; + boost::asio::thread_pool io_pool_; const std::string& address_; uint16_t port_; tcp::acceptor acceptor_; @@ -106,9 +108,9 @@ class WSSession { }; // Accepts incoming connections and launches the sessions -class WSSSession { +class WSSSession : public std::enable_shared_from_this<WSSSession> { private: - class WSSServer { + class WSSServer : public std::enable_shared_from_this<WSSServer> { public: // Take ownership of the socket WSSServer(tcp::socket&& socket, ssl::context& ctx); @@ -148,6 +150,7 @@ class WSSSession { private: boost::asio::io_context ioc_; + boost::asio::thread_pool io_pool_; tcp::acceptor acceptor_; tcp::socket socket_; ssl::context ctx_; diff --git a/src/components/transport_manager/test/include/transport_manager/tcp/mock_tcp_transport_adapter.h b/src/components/transport_manager/test/include/transport_manager/tcp/mock_tcp_transport_adapter.h index daa9397b7d..dbac183d32 100644 --- a/src/components/transport_manager/test/include/transport_manager/tcp/mock_tcp_transport_adapter.h +++ b/src/components/transport_manager/test/include/transport_manager/tcp/mock_tcp_transport_adapter.h @@ -33,10 +33,7 @@ #ifndef SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_TRANSPORT_MANAGER_TCP_MOCK_TCP_TRANSPORT_ADAPTER_H_ #define SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_TRANSPORT_MANAGER_TCP_MOCK_TCP_TRANSPORT_ADAPTER_H_ -#include "gmock/gmock.h" -#include "transport_manager/common.h" #include "transport_manager/tcp/tcp_transport_adapter.h" -#include "transport_manager/transport_manager_settings.h" namespace test { namespace components { @@ -48,9 +45,9 @@ class MockTCPTransportAdapter : public TcpTransportAdapter { public: MockTCPTransportAdapter( uint16_t port, - resumption::LastState& last_state, + resumption::LastStateWrapperPtr last_state_wrapper, const transport_manager::TransportManagerSettings& settings) - : TcpTransportAdapter(port, last_state, settings) {} + : TcpTransportAdapter(port, last_state_wrapper, settings) {} MOCK_CONST_METHOD2( FindEstablishedConnection, ConnectionSPtr(const transport_manager::DeviceUID& device_handle, @@ -63,6 +60,11 @@ class MockTCPTransportAdapter : public TcpTransportAdapter { TransportAdapter::Error( const transport_manager::DeviceUID& device_handle, const transport_manager::ApplicationHandle& app_handle)); + + MOCK_CONST_METHOD0(IsInitialised, bool()); + MOCK_METHOD1(AddListener, void(TransportAdapterListener* listener)); + MOCK_METHOD0(Init, TransportAdapter::Error()); + MOCK_METHOD0(Terminate, void()); void CallStore() { Store(); } diff --git a/src/components/transport_manager/test/include/transport_manager/transport_adapter/mock_connection.h b/src/components/transport_manager/test/include/transport_manager/transport_adapter/mock_connection.h index d1f48c1ed9..7bb272c82e 100644 --- a/src/components/transport_manager/test/include/transport_manager/transport_adapter/mock_connection.h +++ b/src/components/transport_manager/test/include/transport_manager/transport_adapter/mock_connection.h @@ -48,6 +48,7 @@ class MockConnection : public Connection { SendData, TransportAdapter::Error(::protocol_handler::RawMessagePtr message)); MOCK_METHOD0(Disconnect, TransportAdapter::Error()); + MOCK_METHOD0(Terminate, void()); }; } // namespace transport_manager_test diff --git a/src/components/transport_manager/test/include/transport_manager/transport_adapter/mock_transport_adapter_impl.h b/src/components/transport_manager/test/include/transport_manager/transport_adapter/mock_transport_adapter_impl.h index 592ed855cc..7b1d720ba2 100644 --- a/src/components/transport_manager/test/include/transport_manager/transport_adapter/mock_transport_adapter_impl.h +++ b/src/components/transport_manager/test/include/transport_manager/transport_adapter/mock_transport_adapter_impl.h @@ -58,14 +58,21 @@ class MockTransportAdapterImpl : public TransportAdapterImpl { DeviceScanner* device_scanner, ServerConnectionFactory* server_connection_factory, ClientConnectionListener* client_connection_listener, - resumption::LastState& last_state, + resumption::LastStateWrapperPtr last_state_wrapper, const transport_manager::TransportManagerSettings& settings) : TransportAdapterImpl(device_scanner, server_connection_factory, client_connection_listener, - last_state, + last_state_wrapper, settings) {} + DEPRECATED + MockTransportAdapterImpl(DeviceScanner*, + ServerConnectionFactory*, + ClientConnectionListener*, + resumption::LastState&, + const transport_manager::TransportManagerSettings&); + ConnectionSPtr FindStatedConnection(const DeviceUID& device_handle, const ApplicationHandle& app_handle) { return this->FindEstablishedConnection(device_handle, app_handle); diff --git a/src/components/transport_manager/test/include/transport_manager/usb/mock_usb_aoa_adapter.h b/src/components/transport_manager/test/include/transport_manager/usb/mock_usb_aoa_adapter.h new file mode 100644 index 0000000000..affd6aee47 --- /dev/null +++ b/src/components/transport_manager/test/include/transport_manager/usb/mock_usb_aoa_adapter.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2019, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_TRANSPORT_MANAGER_USB_MOCK_USB_AOA_ADAPTER_H_ +#define SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_TRANSPORT_MANAGER_USB_MOCK_USB_AOA_ADAPTER_H_ + +#include "transport_manager/usb/usb_aoa_adapter.h" + +namespace test { +namespace components { +namespace transport_manager_test { + +using namespace ::transport_manager::transport_adapter; + +class MockUsbAoaAdapter : public UsbAoaAdapter { + public: + MockUsbAoaAdapter(resumption::LastStateWrapperPtr last_state_wrapper, + const transport_manager::TransportManagerSettings& settings) + : UsbAoaAdapter(last_state_wrapper, settings) {} + MOCK_CONST_METHOD0(GetDeviceType, DeviceType()); + MOCK_CONST_METHOD0(IsInitialised, bool()); + MOCK_METHOD1(AddListener, void(TransportAdapterListener* listener)); + MOCK_METHOD0(Init, TransportAdapter::Error()); + MOCK_METHOD0(Terminate, void()); + + MOCK_CONST_METHOD1(ToBeAutoConnected, bool(DeviceSptr device)); +}; + +} // namespace transport_manager_test +} // namespace components +} // namespace test + +#endif // SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_TRANSPORT_MANAGER_USB_MOCK_USB_AOA_ADAPTER_H_ diff --git a/src/components/transport_manager/test/sample_websocket_server.cc b/src/components/transport_manager/test/sample_websocket_server.cc index 917184a361..9b0e5b59d5 100644 --- a/src/components/transport_manager/test/sample_websocket_server.cc +++ b/src/components/transport_manager/test/sample_websocket_server.cc @@ -51,11 +51,12 @@ void WSSession::WSServer::AddURLRoute(const std::string& target) { void WSSession::WSServer::Run() { req_ = {}; - http::async_read( - ws_.next_layer(), - buffer_, - req_, - std::bind(&WSServer::OnWebsocketHandshake, this, std::placeholders::_1)); + http::async_read(ws_.next_layer(), + buffer_, + req_, + std::bind(&WSServer::OnWebsocketHandshake, + shared_from_this(), + std::placeholders::_1)); } void WSSession::WSServer::OnWebsocketHandshake( @@ -75,9 +76,10 @@ void WSSession::WSServer::OnWebsocketHandshake( // Accept the websocket handshake ws_.async_accept( req_, - boost::asio::bind_executor( - strand_, - std::bind(&WSServer::OnAccept, this, std::placeholders::_1))); + boost::asio::bind_executor(strand_, + std::bind(&WSServer::OnAccept, + shared_from_this(), + std::placeholders::_1))); } } @@ -112,7 +114,8 @@ std::string WSSession::WSServer::ParseRouteFromTarget( } WSSession::WSSession(const std::string& address, uint16_t port) - : address_(address) + : io_pool_(1) + , address_(address) , port_(port) , acceptor_(ioc_) , socket_(ioc_) @@ -152,8 +155,10 @@ WSSession::WSSession(const std::string& address, uint16_t port) void WSSession::Run() { if (acceptor_.is_open()) { acceptor_.async_accept( - socket_, std::bind(&WSSession::on_accept, this, std::placeholders::_1)); - ioc_.run(); + socket_, + std::bind( + &WSSession::on_accept, shared_from_this(), std::placeholders::_1)); + boost::asio::post(io_pool_, [&]() { ioc_.run(); }); } } @@ -161,6 +166,7 @@ void WSSession::Stop() { try { ioc_.stop(); acceptor_.close(); + io_pool_.join(); } catch (...) { std::cerr << "Failed to close connection" << std::endl; } @@ -199,9 +205,10 @@ void WSSSession::WSSServer::AddURLRoute(const std::string& target) { } void WSSSession::WSSServer::Run() { // Perform the SSL handshake - wss_.next_layer().async_handshake( - ssl::stream_base::server, - std::bind(&WSSServer::OnSSLHandshake, this, std::placeholders::_1)); + wss_.next_layer().async_handshake(ssl::stream_base::server, + std::bind(&WSSServer::OnSSLHandshake, + shared_from_this(), + std::placeholders::_1)); } void WSSSession::WSSServer::OnSSLHandshake(beast::error_code ec) { @@ -210,11 +217,12 @@ void WSSSession::WSSServer::OnSSLHandshake(beast::error_code ec) { } req_ = {}; - http::async_read( - wss_.next_layer(), - buffer_, - req_, - std::bind(&WSSServer::OnWebsocketHandshake, this, std::placeholders::_1)); + http::async_read(wss_.next_layer(), + buffer_, + req_, + std::bind(&WSSServer::OnWebsocketHandshake, + shared_from_this(), + std::placeholders::_1)); } void WSSSession::WSSServer::OnWebsocketHandshake( @@ -233,7 +241,9 @@ void WSSSession::WSSServer::OnWebsocketHandshake( } // Accept the websocket handshake wss_.async_accept( - req_, std::bind(&WSSServer::OnAccept, this, std::placeholders::_1)); + req_, + std::bind( + &WSSServer::OnAccept, shared_from_this(), std::placeholders::_1)); } } @@ -271,7 +281,8 @@ WSSSession::WSSSession(const std::string& address, uint16_t port, const std::string& certificate, const std::string& private_key) - : acceptor_(ioc_) + : io_pool_(1) + , acceptor_(ioc_) , socket_(ioc_) , ctx_(ssl::context::sslv23_server) , wss_(nullptr) { @@ -336,6 +347,7 @@ void WSSSession::Stop() { try { ioc_.stop(); acceptor_.close(); + io_pool_.join(); } catch (...) { std::cerr << "Failed to close connection" << std::endl; } @@ -353,8 +365,9 @@ void WSSSession::do_accept() { if (acceptor_.is_open()) { acceptor_.async_accept( socket_, - std::bind(&WSSSession::on_accept, this, std::placeholders::_1)); - ioc_.run(); + std::bind( + &WSSSession::on_accept, shared_from_this(), std::placeholders::_1)); + boost::asio::post(io_pool_, [&]() { ioc_.run(); }); } } diff --git a/src/components/transport_manager/test/tcp_transport_adapter_test.cc b/src/components/transport_manager/test/tcp_transport_adapter_test.cc index f5f6cc38c8..cacdfb6fbd 100644 --- a/src/components/transport_manager/test/tcp_transport_adapter_test.cc +++ b/src/components/transport_manager/test/tcp_transport_adapter_test.cc @@ -34,6 +34,7 @@ #include "gtest/gtest.h" #include "protocol/raw_message.h" #include "resumption/last_state_impl.h" +#include "resumption/last_state_wrapper_impl.h" #include "transport_manager/mock_transport_manager_settings.h" #include "transport_manager/tcp/mock_tcp_transport_adapter.h" #include "transport_manager/transport_adapter/connection.h" @@ -55,9 +56,13 @@ using namespace transport_manager::transport_adapter; class TcpAdapterTest : public ::testing::Test { protected: - TcpAdapterTest() : last_state_("app_storage_folder", "app_info_storage") {} + TcpAdapterTest() { + last_state_wrapper_ = std::make_shared<resumption::LastStateWrapperImpl>( + std::make_shared<resumption::LastStateImpl>("app_storage_folder", + "app_info_storage")); + } MockTransportManagerSettings transport_manager_settings; - resumption::LastStateImpl last_state_; + std::shared_ptr<resumption::LastStateWrapperImpl> last_state_wrapper_; const uint32_t port = 12345; const std::string string_port = "12345"; std::string network_interface = ""; @@ -72,7 +77,7 @@ class TcpAdapterTest : public ::testing::Test { TEST_F(TcpAdapterTest, StoreDataWithOneDeviceAndOneApplication) { // Prepare MockTCPTransportAdapter transport_adapter( - port, last_state_, transport_manager_settings); + port, last_state_wrapper_, transport_manager_settings); std::string uniq_id = "unique_device_name"; std::shared_ptr<MockTCPDevice> mockdev = std::make_shared<MockTCPDevice>(port, uniq_id); @@ -96,8 +101,9 @@ TEST_F(TcpAdapterTest, StoreDataWithOneDeviceAndOneApplication) { transport_adapter.CallStore(); // Check that value is saved - Json::Value& tcp_dict = - last_state_.get_dictionary()["TransportManager"]["TcpAdapter"]; + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + const Json::Value dictionary = accessor.GetData().dictionary(); + const Json::Value& tcp_dict = dictionary["TransportManager"]["TcpAdapter"]; ASSERT_TRUE(tcp_dict.isObject()); ASSERT_FALSE(tcp_dict["devices"].isNull()); @@ -112,7 +118,7 @@ TEST_F(TcpAdapterTest, StoreDataWithOneDeviceAndOneApplication) { TEST_F(TcpAdapterTest, StoreDataWithSeveralDevicesAndOneApplication) { // Prepare MockTCPTransportAdapter transport_adapter( - port, last_state_, transport_manager_settings); + port, last_state_wrapper_, transport_manager_settings); const uint32_t count_dev = 10; std::shared_ptr<MockTCPDevice> mockdev[count_dev]; std::string uniq_id[count_dev]; @@ -148,8 +154,9 @@ TEST_F(TcpAdapterTest, StoreDataWithSeveralDevicesAndOneApplication) { transport_adapter.CallStore(); // Check that values are saved - Json::Value& tcp_dict = - last_state_.get_dictionary()["TransportManager"]["TcpAdapter"]; + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + const Json::Value dictionary = accessor.GetData().dictionary(); + const Json::Value& tcp_dict = dictionary["TransportManager"]["TcpAdapter"]; ASSERT_TRUE(tcp_dict.isObject()); ASSERT_FALSE(tcp_dict["devices"].isNull()); @@ -166,7 +173,7 @@ TEST_F(TcpAdapterTest, StoreDataWithSeveralDevicesAndOneApplication) { TEST_F(TcpAdapterTest, StoreDataWithSeveralDevicesAndSeveralApplications) { // Prepare MockTCPTransportAdapter transport_adapter( - port, last_state_, transport_manager_settings); + port, last_state_wrapper_, transport_manager_settings); const uint32_t count_dev = 10; std::shared_ptr<MockTCPDevice> mockdev[count_dev]; @@ -206,8 +213,9 @@ TEST_F(TcpAdapterTest, StoreDataWithSeveralDevicesAndSeveralApplications) { transport_adapter.CallStore(); // Check that value is saved - Json::Value& tcp_dict = - last_state_.get_dictionary()["TransportManager"]["TcpAdapter"]; + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + const Json::Value dictionary = accessor.GetData().dictionary(); + const Json::Value& tcp_dict = dictionary["TransportManager"]["TcpAdapter"]; ASSERT_TRUE(tcp_dict.isObject()); ASSERT_FALSE(tcp_dict["devices"].isNull()); @@ -225,7 +233,7 @@ TEST_F(TcpAdapterTest, StoreDataWithSeveralDevicesAndSeveralApplications) { TEST_F(TcpAdapterTest, StoreData_ConnectionNotExist_DataNotStored) { // Prepare MockTCPTransportAdapter transport_adapter( - port, last_state_, transport_manager_settings); + port, last_state_wrapper_, transport_manager_settings); std::string uniq_id = "unique_device_name"; auto mockdev = std::make_shared<MockTCPDevice>(port, uniq_id); transport_adapter.AddDevice(mockdev); @@ -243,26 +251,32 @@ TEST_F(TcpAdapterTest, StoreData_ConnectionNotExist_DataNotStored) { transport_adapter.CallStore(); // Check that value is not saved - Json::Value& tcp_dict = - last_state_.get_dictionary()["TransportManager"]["TcpAdapter"]["devices"]; + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + const Json::Value dictionary = accessor.GetData().dictionary(); + const Json::Value& tcp_dict = + dictionary["TransportManager"]["TcpAdapter"]["devices"]; ASSERT_TRUE(tcp_dict.isNull()); } TEST_F(TcpAdapterTest, RestoreData_DataNotStored) { - Json::Value& tcp_adapter_dictionary = - last_state_.get_dictionary()["TransportManager"]["TcpAdapter"]; - - tcp_adapter_dictionary = Json::Value(); + { + resumption::LastStateAccessor accessor = + last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); + Json::Value& tcp_dictionary = dictionary["TransportManager"]["TcpAdapter"]; + tcp_dictionary = Json::Value(); + accessor.GetMutableData().set_dictionary(dictionary); + } MockTCPTransportAdapter transport_adapter( - port, last_state_, transport_manager_settings); + port, last_state_wrapper_, transport_manager_settings); EXPECT_CALL(transport_adapter, Connect(_, _)).Times(0); EXPECT_TRUE(transport_adapter.CallRestore()); } TEST_F(TcpAdapterTest, StoreDataWithOneDevice_RestoreData) { MockTCPTransportAdapter transport_adapter( - port, last_state_, transport_manager_settings); + port, last_state_wrapper_, transport_manager_settings); std::string uniq_id = "unique_device_name"; std::shared_ptr<MockTCPDevice> mockdev = std::make_shared<MockTCPDevice>(port, uniq_id); @@ -297,7 +311,7 @@ TEST_F(TcpAdapterTest, StoreDataWithOneDevice_RestoreData) { TEST_F(TcpAdapterTest, StoreDataWithSeveralDevices_RestoreData) { MockTCPTransportAdapter transport_adapter( - port, last_state_, transport_manager_settings); + port, last_state_wrapper_, transport_manager_settings); const uint32_t count_dev = 10; std::shared_ptr<MockTCPDevice> mockdev[count_dev]; @@ -350,8 +364,8 @@ TEST_F(TcpAdapterTest, StoreDataWithSeveralDevices_RestoreData) { TEST_F(TcpAdapterTest, NotifyTransportConfigUpdated) { MockTransportAdapterListener mock_adapter_listener; - MockTCPTransportAdapter transport_adapter( - port, last_state_, transport_manager_settings); + TcpTransportAdapter transport_adapter( + port, last_state_wrapper_, transport_manager_settings); transport_adapter.AddListener(&mock_adapter_listener); TransportConfig config; @@ -359,14 +373,16 @@ TEST_F(TcpAdapterTest, NotifyTransportConfigUpdated) { config[tc_tcp_ip_address] = std::string("192.168.1.1"); config[tc_tcp_port] = std::string("12345"); - EXPECT_CALL(mock_adapter_listener, OnTransportConfigUpdated(_)).Times(1); + EXPECT_CALL(mock_adapter_listener, + OnTransportConfigUpdated(&transport_adapter)) + .Times(1); transport_adapter.TransportConfigUpdated(config); } TEST_F(TcpAdapterTest, GetTransportConfiguration) { MockTCPTransportAdapter transport_adapter( - port, last_state_, transport_manager_settings); + port, last_state_wrapper_, transport_manager_settings); TransportConfig config; config[tc_enabled] = std::string("true"); diff --git a/src/components/transport_manager/test/transport_adapter_test.cc b/src/components/transport_manager/test/transport_adapter_test.cc index 712cc5f750..1773ecfb67 100644 --- a/src/components/transport_manager/test/transport_adapter_test.cc +++ b/src/components/transport_manager/test/transport_adapter_test.cc @@ -51,6 +51,7 @@ #include "config_profile/profile.h" #include "resumption/last_state_impl.h" +#include "resumption/last_state_wrapper_impl.h" namespace test { namespace components { @@ -65,8 +66,11 @@ using namespace ::protocol_handler; class TransportAdapterTest : public ::testing::Test { protected: - TransportAdapterTest() - : last_state_("app_storage_folder", "app_info_storage") {} + TransportAdapterTest() { + last_state_wrapper_ = std::make_shared<resumption::LastStateWrapperImpl>( + std::make_shared<resumption::LastStateImpl>("app_storage_folder", + "app_info_storage")); + } void SetUp() OVERRIDE { dev_id = "device_id"; @@ -82,7 +86,7 @@ class TransportAdapterTest : public ::testing::Test { } NiceMock<MockTransportManagerSettings> transport_manager_settings; - resumption::LastStateImpl last_state_; + std::shared_ptr<resumption::LastStateWrapperImpl> last_state_wrapper_; std::string dev_id; std::string uniq_id; int app_handle; @@ -228,7 +232,7 @@ TEST_F(TransportAdapterTest, Init) { MockTransportAdapterImpl transport_adapter(dev_mock, serverMock, clientMock, - last_state_, + last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*dev_mock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -247,8 +251,11 @@ TEST_F(TransportAdapterTest, Init) { TEST_F(TransportAdapterTest, SearchDevices_WithoutScanner) { MockClientConnectionListener* clientMock = new MockClientConnectionListener(); MockServerConnectionFactory* serverMock = new MockServerConnectionFactory(); - MockTransportAdapterImpl transport_adapter( - NULL, serverMock, clientMock, last_state_, transport_manager_settings); + MockTransportAdapterImpl transport_adapter(NULL, + serverMock, + clientMock, + last_state_wrapper_, + transport_manager_settings); EXPECT_CALL(*clientMock, Init()).WillOnce(Return(TransportAdapter::OK)); EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -264,7 +271,7 @@ TEST_F(TransportAdapterTest, SearchDevices_WithoutScanner) { TEST_F(TransportAdapterTest, SearchDevices_DeviceNotInitialized) { MockDeviceScanner* dev_mock = new MockDeviceScanner(); MockTransportAdapterImpl transport_adapter( - dev_mock, NULL, NULL, last_state_, transport_manager_settings); + dev_mock, NULL, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*dev_mock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -280,7 +287,7 @@ TEST_F(TransportAdapterTest, SearchDevices_DeviceNotInitialized) { TEST_F(TransportAdapterTest, SearchDevices_DeviceInitialized) { MockDeviceScanner* dev_mock = new MockDeviceScanner(); MockTransportAdapterImpl transport_adapter( - dev_mock, NULL, NULL, last_state_, transport_manager_settings); + dev_mock, NULL, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*dev_mock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -296,7 +303,7 @@ TEST_F(TransportAdapterTest, SearchDevices_DeviceInitialized) { TEST_F(TransportAdapterTest, SearchDeviceDone_DeviceExisting) { MockTransportAdapterImpl transport_adapter( - NULL, NULL, NULL, last_state_, transport_manager_settings); + NULL, NULL, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true)); transport_adapter.Init(); @@ -313,7 +320,7 @@ TEST_F(TransportAdapterTest, SearchDeviceDone_DeviceExisting) { TEST_F(TransportAdapterTest, SearchDeviceFailed) { MockTransportAdapterImpl transport_adapter( - NULL, NULL, NULL, last_state_, transport_manager_settings); + NULL, NULL, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true)); transport_adapter.Init(); @@ -328,7 +335,7 @@ TEST_F(TransportAdapterTest, SearchDeviceFailed) { TEST_F(TransportAdapterTest, AddDevice) { MockTransportAdapterImpl transport_adapter( - NULL, NULL, NULL, last_state_, transport_manager_settings); + NULL, NULL, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true)); transport_adapter.Init(); @@ -346,7 +353,7 @@ TEST_F(TransportAdapterTest, AddDevice) { TEST_F(TransportAdapterTest, Connect_ServerNotSupported) { MockClientConnectionListener* clientMock = new MockClientConnectionListener(); MockTransportAdapterImpl transport_adapter( - NULL, NULL, clientMock, last_state_, transport_manager_settings); + NULL, NULL, clientMock, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*clientMock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -364,7 +371,7 @@ TEST_F(TransportAdapterTest, Connect_ServerNotSupported) { TEST_F(TransportAdapterTest, Connect_ServerNotInitialized) { MockServerConnectionFactory* serverMock = new MockServerConnectionFactory(); MockTransportAdapterImpl transport_adapter( - NULL, serverMock, NULL, last_state_, transport_manager_settings); + NULL, serverMock, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -382,7 +389,7 @@ TEST_F(TransportAdapterTest, Connect_ServerNotInitialized) { TEST_F(TransportAdapterTest, Connect_Success) { MockServerConnectionFactory* serverMock = new MockServerConnectionFactory(); MockTransportAdapterImpl transport_adapter( - NULL, serverMock, NULL, last_state_, transport_manager_settings); + NULL, serverMock, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -401,7 +408,7 @@ TEST_F(TransportAdapterTest, Connect_Success) { TEST_F(TransportAdapterTest, Connect_DeviceAddedTwice) { MockServerConnectionFactory* serverMock = new MockServerConnectionFactory(); MockTransportAdapterImpl transport_adapter( - NULL, serverMock, NULL, last_state_, transport_manager_settings); + NULL, serverMock, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -424,7 +431,7 @@ TEST_F(TransportAdapterTest, Connect_DeviceAddedTwice) { TEST_F(TransportAdapterTest, ConnectDevice_ServerNotAdded_DeviceAdded) { MockTransportAdapterImpl transport_adapter( - NULL, NULL, NULL, last_state_, transport_manager_settings); + NULL, NULL, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true)); transport_adapter.Init(); @@ -450,7 +457,7 @@ TEST_F(TransportAdapterTest, ConnectDevice_ServerNotAdded_DeviceAdded) { TEST_F(TransportAdapterTest, ConnectDevice_DeviceNotAdded) { MockServerConnectionFactory* serverMock = new MockServerConnectionFactory(); MockTransportAdapterImpl transport_adapter( - NULL, serverMock, NULL, last_state_, transport_manager_settings); + NULL, serverMock, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK)); EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true)); @@ -471,7 +478,7 @@ TEST_F(TransportAdapterTest, ConnectDevice_DeviceNotAdded) { TEST_F(TransportAdapterTest, ConnectDevice_DeviceAdded) { MockServerConnectionFactory* serverMock = new MockServerConnectionFactory(); MockTransportAdapterImpl transport_adapter( - NULL, serverMock, NULL, last_state_, transport_manager_settings); + NULL, serverMock, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -504,7 +511,7 @@ TEST_F(TransportAdapterTest, ConnectDevice_DeviceAdded) { TEST_F(TransportAdapterTest, ConnectDevice_DeviceAdded_ConnectFailedRetry) { MockServerConnectionFactory* server_mock = new MockServerConnectionFactory(); MockTransportAdapterImpl transport_adapter( - NULL, server_mock, NULL, last_state_, transport_manager_settings); + NULL, server_mock, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*server_mock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -541,7 +548,7 @@ TEST_F(TransportAdapterTest, ConnectDevice_DeviceAdded_ConnectFailedRetry) { TEST_F(TransportAdapterTest, ConnectDevice_DeviceAddedTwice) { MockServerConnectionFactory* serverMock = new MockServerConnectionFactory(); MockTransportAdapterImpl transport_adapter( - NULL, serverMock, NULL, last_state_, transport_manager_settings); + NULL, serverMock, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -585,7 +592,7 @@ TEST_F(TransportAdapterTest, ConnectDevice_DeviceAddedTwice) { TEST_F(TransportAdapterTest, Disconnect_ConnectDoneSuccess) { MockServerConnectionFactory* serverMock = new MockServerConnectionFactory(); MockTransportAdapterImpl transport_adapter( - NULL, serverMock, NULL, last_state_, transport_manager_settings); + NULL, serverMock, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -611,13 +618,14 @@ TEST_F(TransportAdapterTest, Disconnect_ConnectDoneSuccess) { EXPECT_EQ(TransportAdapter::OK, new_res); EXPECT_CALL(*serverMock, Terminate()); + EXPECT_CALL(*mock_connection, Terminate()); } #if defined(CLOUD_APP_WEBSOCKET_TRANSPORT_SUPPORT) TEST_F(TransportAdapterTest, FindPending) { MockServerConnectionFactory* serverMock = new MockServerConnectionFactory(); MockTransportAdapterImpl transport_adapter( - NULL, serverMock, NULL, last_state_, transport_manager_settings); + NULL, serverMock, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -651,13 +659,16 @@ TEST_F(TransportAdapterTest, FindPending) { ConnectionSPtr mock_connection_fake = transport_adapter.FindPendingConnection(uniq_id, 1); ASSERT_TRUE(mock_connection_fake.use_count() == 0); + + EXPECT_CALL(*serverMock, Terminate()); + EXPECT_CALL(*connection, Terminate()); } TEST_F(TransportAdapterTest, Pending_Connect_Disconnect_ConnectDoneSuccess_PendingDeviceAdded) { MockServerConnectionFactory* serverMock = new MockServerConnectionFactory(); MockTransportAdapterImpl transport_adapter( - NULL, serverMock, NULL, last_state_, transport_manager_settings); + NULL, serverMock, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -743,12 +754,14 @@ TEST_F(TransportAdapterTest, EXPECT_EQ(ConnectionStatus::PENDING, mockdev2->connection_status()); EXPECT_CALL(*serverMock, Terminate()); + EXPECT_CALL(*mock_connection, Terminate()); + EXPECT_CALL(*connection2, Terminate()); } TEST_F(TransportAdapterTest, WebsocketEndpointParsing_SUCCESS) { std::shared_ptr<CloudWebsocketTransportAdapter> cta = std::make_shared<CloudWebsocketTransportAdapter>( - last_state_, transport_manager_settings); + last_state_wrapper_, transport_manager_settings); for (auto protocol : kWebsocketProtocols) { for (auto endpoint : kValidTestEndpoints) { @@ -776,7 +789,7 @@ TEST_F(TransportAdapterTest, WebsocketEndpointParsing_SUCCESS) { TEST_F(TransportAdapterTest, WebsocketEndpointParsing_INVALID) { std::shared_ptr<CloudWebsocketTransportAdapter> cta = std::make_shared<CloudWebsocketTransportAdapter>( - last_state_, transport_manager_settings); + last_state_wrapper_, transport_manager_settings); for (auto protocol : kWebsocketProtocols) { for (auto endpoint : kInvalidTestEndpoints) { @@ -796,7 +809,7 @@ TEST_F(TransportAdapterTest, WebsocketEndpointParsing_INVALID) { TEST_F(TransportAdapterTest, WebsocketEndpointParsing_INCORRECT) { std::shared_ptr<CloudWebsocketTransportAdapter> cta = std::make_shared<CloudWebsocketTransportAdapter>( - last_state_, transport_manager_settings); + last_state_wrapper_, transport_manager_settings); for (auto protocol : kWebsocketProtocols) { for (auto endpoint : kIncorrectTestEndpoints) { @@ -826,7 +839,7 @@ TEST_F(TransportAdapterTest, WebsocketEndpointParsing_INCORRECT) { TEST_F(TransportAdapterTest, DisconnectDevice_DeviceAddedConnectionCreated) { MockServerConnectionFactory* serverMock = new MockServerConnectionFactory(); MockTransportAdapterImpl transport_adapter( - NULL, serverMock, NULL, last_state_, transport_manager_settings); + NULL, serverMock, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -864,12 +877,13 @@ TEST_F(TransportAdapterTest, DisconnectDevice_DeviceAddedConnectionCreated) { EXPECT_EQ(ConnectionStatus::CLOSING, mockdev->connection_status()); EXPECT_CALL(*serverMock, Terminate()); + EXPECT_CALL(*mock_connection, Terminate()); } TEST_F(TransportAdapterTest, DeviceDisconnected) { MockServerConnectionFactory* serverMock = new MockServerConnectionFactory(); MockTransportAdapterImpl transport_adapter( - NULL, serverMock, NULL, last_state_, transport_manager_settings); + NULL, serverMock, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -919,7 +933,7 @@ TEST_F(TransportAdapterTest, DeviceDisconnected) { TEST_F(TransportAdapterTest, AbortedConnectSuccess) { MockServerConnectionFactory* serverMock = new MockServerConnectionFactory(); MockTransportAdapterImpl transport_adapter( - NULL, serverMock, NULL, last_state_, transport_manager_settings); + NULL, serverMock, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -945,8 +959,11 @@ TEST_F(TransportAdapterTest, AbortedConnectSuccess) { TEST_F(TransportAdapterTest, SendData) { MockDeviceScanner* dev_mock = new MockDeviceScanner(); MockServerConnectionFactory* serverMock = new MockServerConnectionFactory(); - MockTransportAdapterImpl transport_adapter( - dev_mock, serverMock, NULL, last_state_, transport_manager_settings); + MockTransportAdapterImpl transport_adapter(dev_mock, + serverMock, + NULL, + last_state_wrapper_, + transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*dev_mock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -978,6 +995,7 @@ TEST_F(TransportAdapterTest, SendData) { EXPECT_CALL(*dev_mock, Terminate()); EXPECT_CALL(*serverMock, Terminate()); + EXPECT_CALL(*mock_connection, Terminate()); } TEST_F(TransportAdapterTest, SendData_ConnectionNotEstablished) { @@ -987,7 +1005,7 @@ TEST_F(TransportAdapterTest, SendData_ConnectionNotEstablished) { MockTransportAdapterImpl transport_adapter(dev_mock, serverMock, clientMock, - last_state_, + last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); @@ -1018,13 +1036,17 @@ TEST_F(TransportAdapterTest, SendData_ConnectionNotEstablished) { EXPECT_CALL(*dev_mock, Terminate()); EXPECT_CALL(*clientMock, Terminate()); EXPECT_CALL(*serverMock, Terminate()); + EXPECT_CALL(*mock_connection, Terminate()); } TEST_F(TransportAdapterTest, StartClientListening_ClientNotInitialized) { MockDeviceScanner* dev_mock = new MockDeviceScanner(); MockClientConnectionListener* clientMock = new MockClientConnectionListener(); - MockTransportAdapterImpl transport_adapter( - dev_mock, NULL, clientMock, last_state_, transport_manager_settings); + MockTransportAdapterImpl transport_adapter(dev_mock, + NULL, + clientMock, + last_state_wrapper_, + transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*dev_mock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -1046,8 +1068,11 @@ TEST_F(TransportAdapterTest, StartClientListening_ClientNotInitialized) { TEST_F(TransportAdapterTest, StartClientListening) { MockDeviceScanner* dev_mock = new MockDeviceScanner(); MockClientConnectionListener* clientMock = new MockClientConnectionListener(); - MockTransportAdapterImpl transport_adapter( - dev_mock, NULL, clientMock, last_state_, transport_manager_settings); + MockTransportAdapterImpl transport_adapter(dev_mock, + NULL, + clientMock, + last_state_wrapper_, + transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*dev_mock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -1074,7 +1099,7 @@ TEST_F(TransportAdapterTest, StopClientListening_Success) { MockTransportAdapterImpl transport_adapter(dev_mock, serverMock, clientMock, - last_state_, + last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); @@ -1110,7 +1135,7 @@ TEST_F(TransportAdapterTest, FindNewApplicationsRequest) { MockTransportAdapterImpl transport_adapter(dev_mock, serverMock, clientMock, - last_state_, + last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); @@ -1133,7 +1158,7 @@ TEST_F(TransportAdapterTest, FindNewApplicationsRequest) { TEST_F(TransportAdapterTest, GetDeviceAndApplicationLists) { MockTransportAdapterImpl transport_adapter( - NULL, NULL, NULL, last_state_, transport_manager_settings); + NULL, NULL, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true)); transport_adapter.Init(); @@ -1158,7 +1183,7 @@ TEST_F(TransportAdapterTest, GetDeviceAndApplicationLists) { TEST_F(TransportAdapterTest, FindEstablishedConnection) { MockServerConnectionFactory* serverMock = new MockServerConnectionFactory(); MockTransportAdapterImpl transport_adapter( - NULL, serverMock, NULL, last_state_, transport_manager_settings); + NULL, serverMock, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -1171,7 +1196,7 @@ TEST_F(TransportAdapterTest, FindEstablishedConnection) { TransportAdapter::Error res = transport_adapter.Connect(dev_id, app_handle); EXPECT_EQ(TransportAdapter::OK, res); - ConnectionSPtr mock_connection = std::make_shared<MockConnection>(); + auto mock_connection = std::make_shared<MockConnection>(); transport_adapter.ConnectionCreated(mock_connection, dev_id, app_handle); EXPECT_CALL(transport_adapter, Store()); @@ -1182,13 +1207,14 @@ TEST_F(TransportAdapterTest, FindEstablishedConnection) { EXPECT_EQ(mock_connection, conn); EXPECT_CALL(*serverMock, Terminate()); + EXPECT_CALL(*mock_connection, Terminate()); } TEST_F(TransportAdapterTest, RunAppOnDevice_NoDeviseWithAskedId_UNSUCCESS) { const std::string bundle_id = "test_bundle_id"; MockTransportAdapterImpl transport_adapter( - NULL, NULL, NULL, last_state_, transport_manager_settings); + NULL, NULL, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); std::shared_ptr<MockDevice> mock_device = @@ -1208,7 +1234,7 @@ TEST_F(TransportAdapterTest, RunAppOnDevice_DeviseWithAskedIdWasFound_SUCCESS) { const std::string device_uid = "test_device_uid"; MockTransportAdapterImpl transport_adapter( - NULL, NULL, NULL, last_state_, transport_manager_settings); + NULL, NULL, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); std::shared_ptr<MockDevice> mock_device = @@ -1225,7 +1251,7 @@ TEST_F(TransportAdapterTest, RunAppOnDevice_DeviseWithAskedIdWasFound_SUCCESS) { TEST_F(TransportAdapterTest, StopDevice) { MockTransportAdapterImpl transport_adapter( - NULL, NULL, NULL, last_state_, transport_manager_settings); + NULL, NULL, NULL, last_state_wrapper_, transport_manager_settings); EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true)); transport_adapter.Init(); @@ -1240,7 +1266,7 @@ TEST_F(TransportAdapterTest, StopDevice) { TEST_F(TransportAdapterTest, TransportConfigUpdated) { MockTransportAdapterImpl transport_adapter( - NULL, NULL, NULL, last_state_, transport_manager_settings); + NULL, NULL, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true)); transport_adapter.Init(); @@ -1259,7 +1285,7 @@ TEST_F(TransportAdapterTest, TransportConfigUpdated) { TEST_F(TransportAdapterTest, GetTransportConfigration) { MockTransportAdapterImpl transport_adapter( - NULL, NULL, NULL, last_state_, transport_manager_settings); + NULL, NULL, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true)); transport_adapter.Init(); diff --git a/src/components/transport_manager/test/transport_manager_default_test.cc b/src/components/transport_manager/test/transport_manager_default_test.cc index 40938d0370..bedc1634cc 100644 --- a/src/components/transport_manager/test/transport_manager_default_test.cc +++ b/src/components/transport_manager/test/transport_manager_default_test.cc @@ -32,15 +32,23 @@ #include "transport_manager/transport_manager_default.h" #include "gtest/gtest.h" +#include "resumption/last_state_wrapper_impl.h" #include "resumption/mock_last_state.h" +#include "transport_manager/bt/mock_bluetooth_transport_adapter.h" +#include "transport_manager/cloud/mock_cloud_websocket_transport_adapter.h" #include "transport_manager/mock_transport_manager_settings.h" +#include "transport_manager/tcp/mock_tcp_transport_adapter.h" +#include "transport_manager/transport_adapter/mock_device.h" +#include "transport_manager/transport_adapter/mock_transport_adapter_listener.h" #include "transport_manager/transport_manager.h" +#include "transport_manager/usb/mock_usb_aoa_adapter.h" namespace test { namespace components { namespace transport_manager_test { using resumption_test::MockLastState; +using ::testing::_; using ::testing::NiceMock; using ::testing::Return; using ::testing::ReturnRef; @@ -75,117 +83,216 @@ std::vector<uint8_t> kBTUUID = {0x93, 0xA8}; } // namespace -TEST(TestTransportManagerDefault, Init_LastStateNotUsed) { - MockTransportManagerSettings transport_manager_settings; - transport_manager::TransportManagerDefault transport_manager( - transport_manager_settings); - - NiceMock<MockLastState> mock_last_state; - Json::Value custom_dictionary = Json::Value(); - - ON_CALL(mock_last_state, get_dictionary()) - .WillByDefault(ReturnRef(custom_dictionary)); - - EXPECT_CALL(transport_manager_settings, use_last_state()) - .WillRepeatedly(Return(false)); - EXPECT_CALL(transport_manager_settings, transport_manager_tcp_adapter_port()) - .WillRepeatedly(Return(12345u)); - std::string network_interface = ""; - EXPECT_CALL(transport_manager_settings, - transport_manager_tcp_adapter_network_interface()) - .WillRepeatedly(ReturnRef(network_interface)); - EXPECT_CALL(transport_manager_settings, bluetooth_uuid()) - .WillRepeatedly(Return(kBTUUID.data())); +class TestTransportManagerDefault : public ::testing::Test { + public: + TestTransportManagerDefault() + : transport_manager_settings_() + , mock_last_state_(std::make_shared<MockLastState>()) + , unique_tcp_dev_name_("unique_tcp_device_name") + , dev_id_("device_id") + , tcp_adapter_port_(1u) + , network_interface_("test_iface") + , last_state_wrapper_(std::make_shared<resumption::LastStateWrapperImpl>( + mock_last_state_)) {} - std::string dummy_parameter; - EXPECT_CALL(transport_manager_settings, aoa_filter_manufacturer()) - .WillRepeatedly(ReturnRef(dummy_parameter)); - EXPECT_CALL(transport_manager_settings, aoa_filter_model_name()) - .WillRepeatedly(ReturnRef(dummy_parameter)); - EXPECT_CALL(transport_manager_settings, aoa_filter_description()) - .WillRepeatedly(ReturnRef(dummy_parameter)); - EXPECT_CALL(transport_manager_settings, aoa_filter_version()) - .WillRepeatedly(ReturnRef(dummy_parameter)); - EXPECT_CALL(transport_manager_settings, aoa_filter_uri()) - .WillRepeatedly(ReturnRef(dummy_parameter)); - EXPECT_CALL(transport_manager_settings, aoa_filter_serial_number()) - .WillRepeatedly(ReturnRef(dummy_parameter)); - transport_manager.Init(mock_last_state); - transport_manager.Stop(); -} + void SetUp() OVERRIDE { + EXPECT_CALL(transport_manager_settings_, + transport_manager_tcp_adapter_network_interface()) + .WillRepeatedly(ReturnRef(network_interface_)); + + // Replace creation of real transport adapters by mock objects + // to be able to check related function calls + mock_bt_ta_ = new MockBluetoothTransportAdapter(); + mock_tcp_ta_ = new MockTCPTransportAdapter( + tcp_adapter_port_, last_state_wrapper_, transport_manager_settings_); + mock_usb_aoa_ta_ = + new MockUsbAoaAdapter(last_state_wrapper_, transport_manager_settings_); + mock_cloud_websocket_ta_ = new MockCloudWebsocketTransportAdapter( + last_state_wrapper_, transport_manager_settings_); + + TransportAdapterFactory ta_factory; +#ifdef BLUETOOTH_SUPPORT + ta_factory.ta_bluetooth_creator_ = + [&](resumption::LastStateWrapperPtr& last_state_wrapper, + const TransportManagerSettings& settings) { + UNUSED(last_state_wrapper); + UNUSED(settings); + return mock_bt_ta_; + }; +#endif + ta_factory.ta_tcp_creator_ = + [&](const uint16_t port, + resumption::LastStateWrapperPtr& last_state_wrapper, + const TransportManagerSettings& settings) { + UNUSED(port); + UNUSED(last_state_wrapper); + UNUSED(settings); + return mock_tcp_ta_; + }; +#if defined(USB_SUPPORT) + ta_factory.ta_usb_creator_ = + [&](resumption::LastStateWrapperPtr& last_state_wrapper, + const TransportManagerSettings& settings) { + UNUSED(last_state_wrapper); + UNUSED(settings); + return mock_usb_aoa_ta_; + }; +#endif +#if defined(CLOUD_APP_WEBSOCKET_TRANSPORT_SUPPORT) + ta_factory.ta_cloud_creator_ = + [&](resumption::LastStateWrapperPtr& last_state_wrapper, + const TransportManagerSettings& settings) { + UNUSED(last_state_wrapper); + UNUSED(settings); + return mock_cloud_websocket_ta_; + }; +#endif + transport_manager_ = std::unique_ptr<TransportManagerDefault>( + new TransportManagerDefault(transport_manager_settings_, ta_factory)); + } -TEST(TestTransportManagerDefault, Init_LastStateUsed) { - MockTransportManagerSettings transport_manager_settings; - transport_manager::TransportManagerDefault transport_manager( - transport_manager_settings); + void ExpectationsSettings_TM(const bool use_last_state); + void ExpectationsBluetooth_TA(); + void ExpectationsTCP_TA(); + void ExpectationsUSB_TA(); + void ExpectationsCloudWebsocket_TA(); - NiceMock<MockLastState> mock_last_state; - Json::Value custom_dictionary; + protected: + MockTransportManagerSettings transport_manager_settings_; + std::unique_ptr<TransportManagerDefault> transport_manager_; + std::shared_ptr<MockLastState> mock_last_state_; + Json::Value custom_dictionary_; + const std::string unique_tcp_dev_name_; + const std::string dev_id_; + const uint16_t tcp_adapter_port_; + std::string network_interface_; + std::string dummy_parameter_; + // Arrange necessary transport adapters mock objects + MockBluetoothTransportAdapter* mock_bt_ta_; + MockTCPTransportAdapter* mock_tcp_ta_; + MockUsbAoaAdapter* mock_usb_aoa_ta_; + MockCloudWebsocketTransportAdapter* mock_cloud_websocket_ta_; + std::shared_ptr<resumption::LastStateWrapperImpl> last_state_wrapper_; +}; + +void TestTransportManagerDefault::ExpectationsSettings_TM( + const bool use_last_state) { + // Arrange TM Settings expectations Json::Value tcp_device; - tcp_device[kDeviceName] = "unique_tcp_device_name"; + tcp_device[kDeviceName] = unique_tcp_dev_name_; tcp_device[kDeviceAddress] = "127.0.0.1"; - tcp_device[kDeviceApplications][0][kApplicationPort] = kApplicationPortValue; + tcp_device[kDeviceApplications][0][kApplicationPort] = "1"; Json::Value bluetooth_device; - bluetooth_device[kDeviceName] = "unique_bluetooth_device_name"; + + std::string unique_bt_dev_name("unique_bluetooth_device_name"); + bluetooth_device[kDeviceName] = unique_bt_dev_name; bluetooth_device[kDeviceAddress] = "AB:CD:EF:GH:IJ:KL"; bluetooth_device[kDeviceApplications][0][kApplicationRfcomm] = kApplicationRfcommValue; - custom_dictionary[kTransportManager][kTcpAdapter][kDevices][0] = tcp_device; - custom_dictionary[kTransportManager][kBluetoothAdapter][kDevices][0] = + custom_dictionary_[kTransportManager][kTcpAdapter][kDevices][0] = tcp_device; + custom_dictionary_[kTransportManager][kBluetoothAdapter][kDevices][0] = bluetooth_device; + ON_CALL(*mock_last_state_, dictionary()) + .WillByDefault(Return(custom_dictionary_)); + ON_CALL(*mock_last_state_, get_dictionary()) + .WillByDefault(ReturnRef(custom_dictionary_)); + EXPECT_CALL(transport_manager_settings_, use_last_state()) + .WillRepeatedly(Return(use_last_state)); + EXPECT_CALL(transport_manager_settings_, transport_manager_tcp_adapter_port()) + .WillRepeatedly(Return(tcp_adapter_port_)); + EXPECT_CALL(transport_manager_settings_, bluetooth_uuid()) + .WillRepeatedly(Return(kBTUUID.data())); + EXPECT_CALL(transport_manager_settings_, aoa_filter_manufacturer()) + .WillRepeatedly(ReturnRef(dummy_parameter_)); + EXPECT_CALL(transport_manager_settings_, aoa_filter_model_name()) + .WillRepeatedly(ReturnRef(dummy_parameter_)); + EXPECT_CALL(transport_manager_settings_, aoa_filter_description()) + .WillRepeatedly(ReturnRef(dummy_parameter_)); + EXPECT_CALL(transport_manager_settings_, aoa_filter_version()) + .WillRepeatedly(ReturnRef(dummy_parameter_)); + EXPECT_CALL(transport_manager_settings_, aoa_filter_uri()) + .WillRepeatedly(ReturnRef(dummy_parameter_)); + EXPECT_CALL(transport_manager_settings_, aoa_filter_serial_number()) + .WillRepeatedly(ReturnRef(dummy_parameter_)); +} + +void TestTransportManagerDefault::ExpectationsBluetooth_TA() { + // Expectations for Mock of bluetooth transport adapter +#ifdef BLUETOOTH_SUPPORT + EXPECT_CALL(*mock_bt_ta_, AddListener(_)); + EXPECT_CALL(*mock_bt_ta_, IsInitialised()).WillRepeatedly(Return(true)); + EXPECT_CALL(*mock_bt_ta_, Init()) + .WillRepeatedly(Return(TransportAdapter::OK)); + EXPECT_CALL(*mock_bt_ta_, Terminate()); +#endif +} + +void TestTransportManagerDefault::ExpectationsTCP_TA() { + // Expectations for Mock of TCP transport adapter + EXPECT_CALL(*mock_tcp_ta_, AddListener(_)); + EXPECT_CALL(*mock_tcp_ta_, IsInitialised()).WillRepeatedly(Return(true)); + EXPECT_CALL(*mock_tcp_ta_, Init()) + .WillRepeatedly(Return(TransportAdapter::OK)); - ON_CALL(mock_last_state, get_dictionary()) - .WillByDefault(ReturnRef(custom_dictionary)); + std::shared_ptr<MockDevice> mockdev = + std::make_shared<MockDevice>(dev_id_, unique_tcp_dev_name_); + EXPECT_CALL(*mock_tcp_ta_, FindDevice(unique_tcp_dev_name_)) + .WillRepeatedly(Return(mockdev)); + const int app_handle = 1; + EXPECT_CALL(*mock_tcp_ta_, Connect(unique_tcp_dev_name_, app_handle)) + .Times(0); + EXPECT_CALL(*mock_tcp_ta_, Terminate()); +} + +void TestTransportManagerDefault::ExpectationsUSB_TA() { + // Expectations for Mock of USB transport adapter +#if defined(USB_SUPPORT) + EXPECT_CALL(*mock_usb_aoa_ta_, AddListener(_)); + EXPECT_CALL(*mock_usb_aoa_ta_, IsInitialised()).WillRepeatedly(Return(true)); + EXPECT_CALL(*mock_usb_aoa_ta_, Init()) + .WillRepeatedly(Return(TransportAdapter::OK)); + EXPECT_CALL(*mock_usb_aoa_ta_, Terminate()); +#endif +} - EXPECT_CALL(transport_manager_settings, use_last_state()) +void TestTransportManagerDefault::ExpectationsCloudWebsocket_TA() { + // Expectations for Mock of Cloud Websocket transport adapter +#if defined(CLOUD_APP_WEBSOCKET_TRANSPORT_SUPPORT) + EXPECT_CALL(*mock_cloud_websocket_ta_, AddListener(_)); + EXPECT_CALL(*mock_cloud_websocket_ta_, IsInitialised()) .WillRepeatedly(Return(true)); - EXPECT_CALL(transport_manager_settings, transport_manager_tcp_adapter_port()) - .WillRepeatedly(Return(12345u)); - std::string network_interface = ""; - EXPECT_CALL(transport_manager_settings, - transport_manager_tcp_adapter_network_interface()) - .WillRepeatedly(ReturnRef(network_interface)); - EXPECT_CALL(transport_manager_settings, bluetooth_uuid()) - .WillRepeatedly(Return(kBTUUID.data())); - transport_manager.Init(mock_last_state); - transport_manager.Stop(); + EXPECT_CALL(*mock_cloud_websocket_ta_, Init()) + .WillRepeatedly(Return(TransportAdapter::OK)); + EXPECT_CALL(*mock_cloud_websocket_ta_, Terminate()); +#endif } -TEST(TestTransportManagerDefault, Init_LastStateUsed_InvalidPort) { - MockTransportManagerSettings transport_manager_settings; - transport_manager::TransportManagerDefault transport_manager( - transport_manager_settings); +TEST_F(TestTransportManagerDefault, Init_LastStateNotUsed) { + const bool use_last_state = false; + ExpectationsSettings_TM(use_last_state); - NiceMock<MockLastState> mock_last_state; - Json::Value custom_dictionary; - Json::Value tcp_device; - tcp_device[kDeviceName] = "unique_tcp_device_name"; - tcp_device[kDeviceAddress] = "127.0.0.1"; - tcp_device[kDeviceApplications][0][kApplicationPort] = "1"; - Json::Value bluetooth_device; - bluetooth_device[kDeviceName] = "unique_bluetooth_device_name"; - bluetooth_device[kDeviceAddress] = "AB:CD:EF:GH:IJ:KL"; - bluetooth_device[kDeviceApplications][0][kApplicationRfcomm] = - kApplicationRfcommValue; - custom_dictionary[kTransportManager][kTcpAdapter][kDevices][0] = tcp_device; - custom_dictionary[kTransportManager][kBluetoothAdapter][kDevices][0] = - bluetooth_device; + ExpectationsBluetooth_TA(); + ExpectationsTCP_TA(); + ExpectationsUSB_TA(); + ExpectationsCloudWebsocket_TA(); - ON_CALL(mock_last_state, get_dictionary()) - .WillByDefault(ReturnRef(custom_dictionary)); + // Act + transport_manager_->Init(last_state_wrapper_); + transport_manager_->Stop(); +} - EXPECT_CALL(transport_manager_settings, use_last_state()) - .WillRepeatedly(Return(true)); - EXPECT_CALL(transport_manager_settings, transport_manager_tcp_adapter_port()) - .WillRepeatedly(Return(1u)); - std::string network_interface = ""; - EXPECT_CALL(transport_manager_settings, - transport_manager_tcp_adapter_network_interface()) - .WillRepeatedly(ReturnRef(network_interface)); - EXPECT_CALL(transport_manager_settings, bluetooth_uuid()) - .WillRepeatedly(Return(kBTUUID.data())); - transport_manager.Init(mock_last_state); - transport_manager.Stop(); +TEST_F(TestTransportManagerDefault, Init_LastStateUsed) { + const bool use_last_state = true; + ExpectationsSettings_TM(use_last_state); + + ExpectationsBluetooth_TA(); + ExpectationsTCP_TA(); + ExpectationsUSB_TA(); + ExpectationsCloudWebsocket_TA(); + + // Act + transport_manager_->Init(last_state_wrapper_); + transport_manager_->Stop(); } } // namespace transport_manager_test diff --git a/src/components/transport_manager/test/transport_manager_impl_test.cc b/src/components/transport_manager/test/transport_manager_impl_test.cc index ac9b801dbd..db4813be9a 100644 --- a/src/components/transport_manager/test/transport_manager_impl_test.cc +++ b/src/components/transport_manager/test/transport_manager_impl_test.cc @@ -35,6 +35,7 @@ #include "gtest/gtest.h" #include "protocol/raw_message.h" #include "resumption/last_state_impl.h" +#include "resumption/last_state_wrapper_impl.h" #include "transport_manager/common.h" #include "transport_manager/mock_telemetry_observer.h" #include "transport_manager/mock_transport_manager_impl.h" @@ -79,9 +80,11 @@ class TransportManagerImplTest : public ::testing::Test { device_handle_, mac_address_, device_name_, connection_type_) {} void SetUp() OVERRIDE { - resumption::LastStateImpl last_state_("app_storage_folder", - "app_info_storage"); - tm_.Init(last_state_); + std::shared_ptr<resumption::LastStateWrapperImpl> wrapper = + std::make_shared<resumption::LastStateWrapperImpl>( + std::make_shared<resumption::LastStateImpl>("app_storage_folder", + "app_info_storage")); + tm_.Init(wrapper); mock_adapter_ = new MockTransportAdapter(); tm_listener_ = std::make_shared<MockTransportManagerListener>(); diff --git a/src/components/transport_manager/test/websocket_connection_test.cc b/src/components/transport_manager/test/websocket_connection_test.cc index d096d351f5..a7ddb820a0 100644 --- a/src/components/transport_manager/test/websocket_connection_test.cc +++ b/src/components/transport_manager/test/websocket_connection_test.cc @@ -32,6 +32,7 @@ #include "gtest/gtest.h" #include "resumption/last_state_impl.h" +#include "resumption/last_state_wrapper_impl.h" #include "transport_manager/cloud/cloud_websocket_transport_adapter.h" #include "transport_manager/cloud/sample_websocket_server.h" #include "transport_manager/cloud/websocket_client_connection.h" @@ -99,7 +100,9 @@ class WebsocketConnectionTest : public ::testing::Test { protected: WebsocketConnectionTest() - : last_state_("app_storage_folder", "app_info_storage") {} + : last_state_(std::make_shared<resumption::LastStateWrapperImpl>( + std::make_shared<resumption::LastStateImpl>("app_storage_folder", + "app_info_storage"))) {} ~WebsocketConnectionTest() {} @@ -109,7 +112,7 @@ class WebsocketConnectionTest : public ::testing::Test { } NiceMock<MockTransportManagerSettings> transport_manager_settings; - resumption::LastStateImpl last_state_; + resumption::LastStateWrapperPtr last_state_; std::string dev_id; std::string uniq_id; std::shared_ptr<websocket::WSSession> ws_session; @@ -276,8 +279,7 @@ TEST_F(WebsocketConnectionTest, WSConnection_SUCCESS) { .hybrid_app_preference = "CLOUD"}; // Start server - std::thread t1(&WebsocketConnectionTest::StartWSServer, this, "/"); - usleep(5000); + StartWSServer("/"); // Start client InitWebsocketClient(properties, ws_client); @@ -294,7 +296,6 @@ TEST_F(WebsocketConnectionTest, WSConnection_SUCCESS) { // Stop server thread ws_session->Stop(); - t1.join(); } TEST_F(WebsocketConnectionTest, WSConnection_SUCCESS_ValidTarget) { @@ -308,8 +309,7 @@ TEST_F(WebsocketConnectionTest, WSConnection_SUCCESS_ValidTarget) { .hybrid_app_preference = "CLOUD"}; // Start server - std::thread t1(&WebsocketConnectionTest::StartWSServer, this, kPath); - usleep(5000); + StartWSServer(kPath); // Start client InitWebsocketClient(properties, ws_client); @@ -326,7 +326,6 @@ TEST_F(WebsocketConnectionTest, WSConnection_SUCCESS_ValidTarget) { // Stop server thread ws_session->Stop(); - t1.join(); } TEST_F(WebsocketConnectionTest, WSConnection_FAILURE_InvalidTarget) { @@ -340,8 +339,7 @@ TEST_F(WebsocketConnectionTest, WSConnection_FAILURE_InvalidTarget) { .hybrid_app_preference = "CLOUD"}; // Start server - std::thread t1(&WebsocketConnectionTest::StartWSServer, this, "/"); - usleep(5000); + StartWSServer("/"); // Start client InitWebsocketClient(properties, ws_client); @@ -358,7 +356,6 @@ TEST_F(WebsocketConnectionTest, WSConnection_FAILURE_InvalidTarget) { // Stop server thread ws_session->Stop(); - t1.join(); } TEST_F(WebsocketConnectionTest, WSSConnection_SUCCESS) { @@ -371,8 +368,7 @@ TEST_F(WebsocketConnectionTest, WSSConnection_SUCCESS) { .hybrid_app_preference = "CLOUD"}; // Start server - std::thread t1(&WebsocketConnectionTest::StartWSSServer, this, "/"); - usleep(5000); + StartWSSServer("/"); // Start client InitWebsocketClient(properties, ws_client); @@ -389,7 +385,6 @@ TEST_F(WebsocketConnectionTest, WSSConnection_SUCCESS) { // Stop server thread wss_session->Stop(); - t1.join(); } TEST_F(WebsocketConnectionTest, WSSConnection_SUCCESS_ValidTarget) { @@ -402,10 +397,7 @@ TEST_F(WebsocketConnectionTest, WSSConnection_SUCCESS_ValidTarget) { .hybrid_app_preference = "CLOUD"}; // Start server - std::thread t1(&WebsocketConnectionTest::StartWSSServer, - this, - (kPath + kQuery + kFragment)); - usleep(5000); + StartWSSServer((kPath + kQuery + kFragment)); // Start client InitWebsocketClient(properties, ws_client); @@ -422,7 +414,6 @@ TEST_F(WebsocketConnectionTest, WSSConnection_SUCCESS_ValidTarget) { // Stop server thread wss_session->Stop(); - t1.join(); } #ifdef ENABLE_SECURITY @@ -436,8 +427,7 @@ TEST_F(WebsocketConnectionTest, WSSConnection_FAILURE_InvalidTarget) { .hybrid_app_preference = "CLOUD"}; // Start server - std::thread t1(&WebsocketConnectionTest::StartWSSServer, this, kPath); - usleep(5000); + StartWSSServer(kPath); // Start client InitWebsocketClient(properties, ws_client); @@ -454,7 +444,6 @@ TEST_F(WebsocketConnectionTest, WSSConnection_FAILURE_InvalidTarget) { // Stop server thread wss_session->Stop(); - t1.join(); } TEST_F(WebsocketConnectionTest, WSSConnection_FAILURE_IncorrectCert) { @@ -467,8 +456,7 @@ TEST_F(WebsocketConnectionTest, WSSConnection_FAILURE_IncorrectCert) { .hybrid_app_preference = "CLOUD"}; // Start server - std::thread t1(&WebsocketConnectionTest::StartWSSServer, this, "/"); - usleep(5000); + StartWSSServer("/"); // Start client InitWebsocketClient(properties, ws_client); @@ -485,7 +473,6 @@ TEST_F(WebsocketConnectionTest, WSSConnection_FAILURE_IncorrectCert) { // Stop server thread wss_session->Stop(); - t1.join(); } #endif // ENABLE_SECURITY } // namespace transport_manager_test |