summaryrefslogtreecommitdiff
path: root/test/components/transport_manager/TransportManagerTestWithMultipleDeviceAdapters.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/components/transport_manager/TransportManagerTestWithMultipleDeviceAdapters.cpp')
-rw-r--r--test/components/transport_manager/TransportManagerTestWithMultipleDeviceAdapters.cpp435
1 files changed, 0 insertions, 435 deletions
diff --git a/test/components/transport_manager/TransportManagerTestWithMultipleDeviceAdapters.cpp b/test/components/transport_manager/TransportManagerTestWithMultipleDeviceAdapters.cpp
deleted file mode 100644
index 2dd4f8cba..000000000
--- a/test/components/transport_manager/TransportManagerTestWithMultipleDeviceAdapters.cpp
+++ /dev/null
@@ -1,435 +0,0 @@
-//
-// Copyright (c) 2013, 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.
-//
-
-/*
- Tests Transport Manager functionality with multiple (256) device adapters that connects/disconnects/sents data
- */
-#include <algorithm>
-#include <pthread.h>
-#include <time.h>
-
-#include "gtest/gtest.h"
-#include "gmock/gmock.h"
-
-#include "TransportManager/ITransportManagerDataListener.hpp"
-#include "TransportManager/ITransportManagerDeviceListener.hpp"
-#include "../../../src/components/TransportManager/src/CTransportManager.hpp"
-#include "../../../src/components/TransportManager/src/ITransportAdapter.hpp"
-
-namespace test
-{
- namespace components
- {
- namespace TransportManager
- {
- namespace MultipleTransportAdaptersTest
- {
- const size_t cNumberOfMockTransportAdapters = 256u;
-
- class MockDataListener: public NsSmartDeviceLink::NsTransportManager::ITransportManagerDataListener
- {
- public:
- MockDataListener(pthread_mutex_t & Mutex);
-
- MOCK_METHOD3(onFrameReceived, void(NsSmartDeviceLink::NsTransportManager::tConnectionHandle ConnectionHandle, const uint8_t * Data, size_t DataSize));
- MOCK_METHOD3(onFrameSendCompleted, void(NsSmartDeviceLink::NsTransportManager::tConnectionHandle ConnectionHandle, int UserData, NsSmartDeviceLink::NsTransportManager::ESendStatus SendStatus));
-
- void unlockMutexAfterFrameReceived(NsSmartDeviceLink::NsTransportManager::tConnectionHandle, const uint8_t *, size_t);
- void unlockMutexAfterFrameSendCompleted(NsSmartDeviceLink::NsTransportManager::tConnectionHandle, int, NsSmartDeviceLink::NsTransportManager::ESendStatus);
-
- private:
- pthread_mutex_t & mMutex;
- };
-
- class MockDeviceListener: public NsSmartDeviceLink::NsTransportManager::ITransportManagerDeviceListener
- {
- public:
- MockDeviceListener(pthread_mutex_t & Mutex);
-
- MOCK_METHOD1(onDeviceListUpdated, void(const NsSmartDeviceLink::NsTransportManager::tDeviceList & DeviceList));
- MOCK_METHOD2(onApplicationConnected, void(const NsSmartDeviceLink::NsTransportManager::SDeviceInfo & ConnectedDevice, const NsSmartDeviceLink::NsTransportManager::tConnectionHandle Connection));
- MOCK_METHOD2(onApplicationDisconnected, void(const NsSmartDeviceLink::NsTransportManager::SDeviceInfo & DisconnectedDevice, const NsSmartDeviceLink::NsTransportManager::tConnectionHandle Connection));
-
- void unlockMutexAfterDeviceListUpdate(const NsSmartDeviceLink::NsTransportManager::tDeviceList &);
- void unlockMutexAfterApplicationConnectedDisconnected(const NsSmartDeviceLink::NsTransportManager::SDeviceInfo &, const NsSmartDeviceLink::NsTransportManager::tConnectionHandle);
-
- private:
- pthread_mutex_t & mMutex;
- };
-
- class MockTransportAdapter: public NsSmartDeviceLink::NsTransportManager::ITransportAdapter
- {
- public:
- MockTransportAdapter(pthread_mutex_t & Mutex);
- virtual NsSmartDeviceLink::NsTransportManager::EDeviceType GetDeviceType(void) const;
-
- MOCK_METHOD1(connectDevice, void (const NsSmartDeviceLink::NsTransportManager::tDeviceHandle DeviceHandle));
- MOCK_METHOD1(disconnectDevice, void (const NsSmartDeviceLink::NsTransportManager::tDeviceHandle DeviceHandle));
- MOCK_METHOD0(run, void());
- MOCK_METHOD0(scanForNewDevices, void());
- MOCK_METHOD4(sendFrame, void(NsSmartDeviceLink::NsTransportManager::tConnectionHandle ConnectionHandle, const uint8_t * Data, size_t DataSize, int UserData));
-
- void unlockMutexAfterSendFrame(NsSmartDeviceLink::NsTransportManager::tConnectionHandle, const uint8_t *, size_t, int UserData);
-
- NsSmartDeviceLink::NsTransportManager::SDeviceInfo mMockDeviceInfo;
- NsSmartDeviceLink::NsTransportManager::tConnectionHandle mMockConnectionHandle;
- int mMockUserData;
-
- private:
- pthread_mutex_t & mMutex;
- };
-
- class TestTransportManager: public NsSmartDeviceLink::NsTransportManager::CTransportManager
- {
- public:
- TestTransportManager(test::components::TransportManager::MultipleTransportAdaptersTest::MockTransportAdapter * (& TransportAdapters)[cNumberOfMockTransportAdapters]);
- ~TestTransportManager(void);
- protected:
- virtual void initializeTransportAdapters(void);
-
- private:
- MockTransportAdapter * (& mMockTransportAdapters)[cNumberOfMockTransportAdapters];
- };
-
- template <typename Type>
- struct TRemoveReference
- {
- typedef Type tType;
- };
-
- template <typename Type>
- struct TRemoveReference<Type &>
- {
- typedef Type tType;
- };
- }
- }
- }
-}
-
-test::components::TransportManager::MultipleTransportAdaptersTest::MockDataListener::MockDataListener(pthread_mutex_t & Mutex):
-mMutex(Mutex)
-{
-}
-
-void test::components::TransportManager::MultipleTransportAdaptersTest::MockDataListener::unlockMutexAfterFrameReceived(NsSmartDeviceLink::NsTransportManager::tConnectionHandle, const uint8_t *, size_t)
-{
- pthread_mutex_unlock(&mMutex);
-}
-
-void test::components::TransportManager::MultipleTransportAdaptersTest::MockDataListener::unlockMutexAfterFrameSendCompleted(NsSmartDeviceLink::NsTransportManager::tConnectionHandle, int, NsSmartDeviceLink::NsTransportManager::ESendStatus)
-{
- pthread_mutex_unlock(&mMutex);
-}
-
-test::components::TransportManager::MultipleTransportAdaptersTest::MockDeviceListener::MockDeviceListener(pthread_mutex_t & Mutex):
-mMutex(Mutex)
-{
-}
-
-void test::components::TransportManager::MultipleTransportAdaptersTest::MockDeviceListener::unlockMutexAfterDeviceListUpdate(const NsSmartDeviceLink::NsTransportManager::tDeviceList &)
-{
- pthread_mutex_unlock(&mMutex);
-}
-
-void test::components::TransportManager::MultipleTransportAdaptersTest::MockDeviceListener::unlockMutexAfterApplicationConnectedDisconnected(const NsSmartDeviceLink::NsTransportManager::SDeviceInfo &, const NsSmartDeviceLink::NsTransportManager::tConnectionHandle)
-{
- pthread_mutex_unlock(&mMutex);
-}
-
-test::components::TransportManager::MultipleTransportAdaptersTest::MockTransportAdapter::MockTransportAdapter(pthread_mutex_t & Mutex):
-mMockDeviceInfo(),
-mMockConnectionHandle(NsSmartDeviceLink::NsTransportManager::InvalidConnectionHandle),
-mMockUserData(-1),
-mMutex(Mutex)
-{
- mMockDeviceInfo.mDeviceHandle = NsSmartDeviceLink::NsTransportManager::InvalidDeviceHandle;
- mMockDeviceInfo.mDeviceType = NsSmartDeviceLink::NsTransportManager::DeviceBluetooth;
-}
-
-NsSmartDeviceLink::NsTransportManager::EDeviceType test::components::TransportManager::MultipleTransportAdaptersTest::MockTransportAdapter::GetDeviceType(void) const
-{
- return mMockDeviceInfo.mDeviceType;
-}
-
-void test::components::TransportManager::MultipleTransportAdaptersTest::MockTransportAdapter::unlockMutexAfterSendFrame(NsSmartDeviceLink::NsTransportManager::tConnectionHandle, const uint8_t *, size_t, int UserData)
-{
- pthread_mutex_unlock(&mMutex);
-}
-
-test::components::TransportManager::MultipleTransportAdaptersTest::TestTransportManager::TestTransportManager(test::components::TransportManager::MultipleTransportAdaptersTest::MockTransportAdapter * (& TransportAdapters)[test::components::TransportManager::MultipleTransportAdaptersTest::cNumberOfMockTransportAdapters]):
-CTransportManager(),
-mMockTransportAdapters(TransportAdapters)
-{
-}
-
-test::components::TransportManager::MultipleTransportAdaptersTest::TestTransportManager::~TestTransportManager(void)
-{
-}
-
-void test::components::TransportManager::MultipleTransportAdaptersTest::TestTransportManager::initializeTransportAdapters(void)
-{
- std::for_each(&mMockTransportAdapters[0], &mMockTransportAdapters[cNumberOfMockTransportAdapters], [this] (MockTransportAdapter * TransportAdapter) {addTransportAdapter(TransportAdapter);});
-}
-
-MATCHER_P(ContainsSameElements, value, "Matches two containers if they contain the same set of elements regardless of order")
-{
- bool result = false;
-
- typedef typename test::components::TransportManager::MultipleTransportAdaptersTest::TRemoveReference<arg_type>::tType::const_iterator tIteratorType;
-
- if (arg.size() == value.size())
- {
- std::set<tIteratorType> matchedValueIterators;
- tIteratorType ai;
-
- for (ai = arg.begin(); ai != arg.end(); ++ai)
- {
- tIteratorType vi;
-
- for (vi = value.begin(); vi != value.end(); ++vi)
- {
- if (matchedValueIterators.end() == matchedValueIterators.find(vi))
- {
- if (*vi == *ai)
- {
- matchedValueIterators.insert(vi);
- break;
- }
- }
- }
-
- if (value.end() == vi)
- {
- break;
- }
- }
-
- result = (arg.end() == ai);
- }
-
- return result;
-}
-
-MATCHER_P2(BuffersSame, buffer, size, "Matches two buffers contents")
-{
- bool result = false;
-
- if (size == std::tr1::get<1>(arg))
- {
- result = (0 == memcmp(buffer, std::tr1::get<0>(arg), size));
- }
-
- return result;
-}
-
-#define TRY_LOCK_AND_FAIL_ON_TIMEOUT(mutex) \
- { \
- timespec timeoutTime; \
- \
- clock_gettime(CLOCK_REALTIME, &timeoutTime); \
- timeoutTime.tv_sec += 1; \
- \
- if (0 != pthread_mutex_timedlock(&mutex, &timeoutTime)) \
- { \
- FAIL() << "Mutex lock timeout"; \
- } \
- }
-
-TEST(TransportManager, MultipleTransportAdapters)
-{
- pthread_mutex_t callbacksMutex; // Mutex restricting access to deviceList, mockDataListener and mockDeviceListener
-
- pthread_mutex_init(&callbacksMutex, 0);
-
- test::components::TransportManager::MultipleTransportAdaptersTest::MockTransportAdapter * mockTransportAdapters[test::components::TransportManager::MultipleTransportAdaptersTest::cNumberOfMockTransportAdapters];
- std::for_each(&mockTransportAdapters[0], &mockTransportAdapters[test::components::TransportManager::MultipleTransportAdaptersTest::cNumberOfMockTransportAdapters], [&callbacksMutex] (test::components::TransportManager::MultipleTransportAdaptersTest::MockTransportAdapter *& TransportAdapter) {TransportAdapter = new test::components::TransportManager::MultipleTransportAdaptersTest::MockTransportAdapter(callbacksMutex);});
-
- test::components::TransportManager::MultipleTransportAdaptersTest::MockDataListener mockDataListener(callbacksMutex);
- test::components::TransportManager::MultipleTransportAdaptersTest::MockDeviceListener mockDeviceListener(callbacksMutex);
- test::components::TransportManager::MultipleTransportAdaptersTest::TestTransportManager transportManager(mockTransportAdapters);
-
- std::for_each(&mockTransportAdapters[0], &mockTransportAdapters[test::components::TransportManager::MultipleTransportAdaptersTest::cNumberOfMockTransportAdapters], [] (test::components::TransportManager::MultipleTransportAdaptersTest::MockTransportAdapter * TransportAdapter) {EXPECT_CALL(*TransportAdapter, run()).Times(1);});
-
- transportManager.run();
-
- transportManager.addDeviceListener(&mockDeviceListener);
- transportManager.addDataListener(&mockDataListener);
-
- NsSmartDeviceLink::NsTransportManager::tDeviceHandle lastUsedDeviceHandle = 0;
- NsSmartDeviceLink::NsTransportManager::tConnectionHandle lastUsedConnectionHandle = 0;
-
- NsSmartDeviceLink::NsTransportManager::tDeviceList deviceList;
-
- EXPECT_CALL(mockDeviceListener, onDeviceListUpdated(::testing::_)).Times(0);
- EXPECT_CALL(mockDeviceListener, onApplicationConnected(::testing::_, ::testing::_)).Times(0);
- EXPECT_CALL(mockDeviceListener, onApplicationDisconnected(::testing::_, ::testing::_)).Times(0);
- EXPECT_CALL(mockDataListener, onFrameReceived(::testing::_, ::testing::_, ::testing::_)).Times(0);
- EXPECT_CALL(mockDataListener, onFrameSendCompleted(::testing::_, ::testing::_, ::testing::_)).Times(0);
-
- for (int i = 0; i < 10000; ++i)
- {
- size_t deviceAdapterIndex = static_cast<size_t>(rand()) % test::components::TransportManager::MultipleTransportAdaptersTest::cNumberOfMockTransportAdapters;
- test::components::TransportManager::MultipleTransportAdaptersTest::MockTransportAdapter & mockTransportAdapter = *mockTransportAdapters[deviceAdapterIndex];
-
- if (NsSmartDeviceLink::NsTransportManager::InvalidDeviceHandle == mockTransportAdapter.mMockDeviceInfo.mDeviceHandle)
- {
- mockTransportAdapter.mMockDeviceInfo.mDeviceHandle = ++lastUsedDeviceHandle;
-
- char deviceNumberString[16];
- sprintf(deviceNumberString, "%d", mockTransportAdapter.mMockDeviceInfo.mDeviceHandle);
-
- mockTransportAdapter.mMockDeviceInfo.mUniqueDeviceId = std::string("id-") + deviceNumberString;
- mockTransportAdapter.mMockDeviceInfo.mUserFriendlyName = std::string("Name ") + deviceNumberString;
-
- NsSmartDeviceLink::NsTransportManager::tInternalDeviceList internalDeviceList;
- internalDeviceList.push_back(NsSmartDeviceLink::NsTransportManager::SInternalDeviceInfo(mockTransportAdapter.mMockDeviceInfo.mDeviceHandle, mockTransportAdapter.mMockDeviceInfo.mUserFriendlyName, mockTransportAdapter.mMockDeviceInfo.mUniqueDeviceId));
-
- TRY_LOCK_AND_FAIL_ON_TIMEOUT(callbacksMutex);
-
- deviceList.push_back(mockTransportAdapter.mMockDeviceInfo);
-
- EXPECT_CALL(mockDeviceListener, onDeviceListUpdated(ContainsSameElements(deviceList)))
- .Times(1)
- .WillOnce(::testing::Invoke(&mockDeviceListener, &test::components::TransportManager::MultipleTransportAdaptersTest::MockDeviceListener::unlockMutexAfterDeviceListUpdate))
- .RetiresOnSaturation();
-
- transportManager.onDeviceListUpdated(&mockTransportAdapter, internalDeviceList);
- }
- else if (NsSmartDeviceLink::NsTransportManager::InvalidConnectionHandle == mockTransportAdapter.mMockConnectionHandle)
- {
- if (0 == rand() % 2)
- {
- TRY_LOCK_AND_FAIL_ON_TIMEOUT(callbacksMutex);
-
- for (auto i = deviceList.begin(); i != deviceList.end(); ++i)
- {
- if (i->mDeviceHandle == mockTransportAdapter.mMockDeviceInfo.mDeviceHandle)
- {
- deviceList.erase(i);
- break;
- }
- }
-
- mockTransportAdapter.mMockDeviceInfo.mDeviceHandle = NsSmartDeviceLink::NsTransportManager::InvalidDeviceHandle;
-
- NsSmartDeviceLink::NsTransportManager::tInternalDeviceList internalDeviceList;
-
- EXPECT_CALL(mockDeviceListener, onDeviceListUpdated(ContainsSameElements(deviceList)))
- .Times(1)
- .WillOnce(::testing::Invoke(&mockDeviceListener, &test::components::TransportManager::MultipleTransportAdaptersTest::MockDeviceListener::unlockMutexAfterDeviceListUpdate))
- .RetiresOnSaturation();
-
- transportManager.onDeviceListUpdated(&mockTransportAdapter, internalDeviceList);
- }
- else
- {
- mockTransportAdapter.mMockConnectionHandle = ++lastUsedConnectionHandle;
-
- TRY_LOCK_AND_FAIL_ON_TIMEOUT(callbacksMutex);
-
- EXPECT_CALL(mockDeviceListener, onApplicationConnected(mockTransportAdapter.mMockDeviceInfo, mockTransportAdapter.mMockConnectionHandle))
- .Times(1)
- .WillOnce(::testing::Invoke(&mockDeviceListener, &test::components::TransportManager::MultipleTransportAdaptersTest::MockDeviceListener::unlockMutexAfterApplicationConnectedDisconnected))
- .RetiresOnSaturation();
-
- transportManager.onApplicationConnected(&mockTransportAdapter, mockTransportAdapter.mMockDeviceInfo, mockTransportAdapter.mMockConnectionHandle);
- }
- }
- else
- {
- static const uint8_t frameData[16] = {0x11, 0x07, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08};
-
- if (0 == rand() % 2)
- {
- TRY_LOCK_AND_FAIL_ON_TIMEOUT(callbacksMutex);
-
- EXPECT_CALL(mockDataListener, onFrameReceived(mockTransportAdapter.mMockConnectionHandle, ::testing::_, ::testing::_))
- .With(::testing::Args<1, 2>(BuffersSame(frameData, sizeof(frameData))))
- .Times(1)
- .WillOnce(::testing::Invoke(&mockDataListener, &test::components::TransportManager::MultipleTransportAdaptersTest::MockDataListener::unlockMutexAfterFrameReceived))
- .RetiresOnSaturation();
-
- transportManager.onFrameReceived(&mockTransportAdapter, mockTransportAdapter.mMockConnectionHandle, frameData, sizeof(frameData));
- }
- else if (0 == rand() % 2)
- {
- TRY_LOCK_AND_FAIL_ON_TIMEOUT(callbacksMutex);
-
- mockTransportAdapter.mMockUserData = rand();
-
- EXPECT_CALL(mockTransportAdapter, sendFrame(mockTransportAdapter.mMockConnectionHandle, ::testing::_, ::testing::_, mockTransportAdapter.mMockUserData))
- .With(::testing::Args<1, 2>(BuffersSame(frameData, sizeof(frameData))))
- .Times(1)
- .WillOnce(::testing::Invoke(&mockTransportAdapter, &test::components::TransportManager::MultipleTransportAdaptersTest::MockTransportAdapter::unlockMutexAfterSendFrame))
- .RetiresOnSaturation();
-
- transportManager.sendFrame(mockTransportAdapter.mMockConnectionHandle, frameData, sizeof(frameData), mockTransportAdapter.mMockUserData);
-
- TRY_LOCK_AND_FAIL_ON_TIMEOUT(callbacksMutex);
-
- EXPECT_CALL(mockDataListener, onFrameSendCompleted(mockTransportAdapter.mMockConnectionHandle, mockTransportAdapter.mMockUserData, NsSmartDeviceLink::NsTransportManager::SendStatusOK))
- .Times(1)
- .WillOnce(::testing::Invoke(&mockDataListener, &test::components::TransportManager::MultipleTransportAdaptersTest::MockDataListener::unlockMutexAfterFrameSendCompleted))
- .RetiresOnSaturation();
-
- transportManager.onFrameSendCompleted(&mockTransportAdapter, mockTransportAdapter.mMockConnectionHandle, mockTransportAdapter.mMockUserData, NsSmartDeviceLink::NsTransportManager::SendStatusOK);
- }
- else
- {
- TRY_LOCK_AND_FAIL_ON_TIMEOUT(callbacksMutex);
-
- EXPECT_CALL(mockDeviceListener, onApplicationDisconnected(mockTransportAdapter.mMockDeviceInfo, mockTransportAdapter.mMockConnectionHandle))
- .Times(1)
- .WillOnce(::testing::Invoke(&mockDeviceListener, &test::components::TransportManager::MultipleTransportAdaptersTest::MockDeviceListener::unlockMutexAfterApplicationConnectedDisconnected))
- .RetiresOnSaturation();
-
- transportManager.onApplicationDisconnected(&mockTransportAdapter, mockTransportAdapter.mMockDeviceInfo, mockTransportAdapter.mMockConnectionHandle);
-
- mockTransportAdapter.mMockConnectionHandle = NsSmartDeviceLink::NsTransportManager::InvalidConnectionHandle;
- }
- }
- }
-
- pthread_mutex_destroy(&callbacksMutex);
-
- sleep(1);
-}
-
-int main(int argc, char **argv)
-{
- PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT("log4cplus_disabled.properties"));
-
- ::testing::InitGoogleMock(&argc, argv);
-
- return RUN_ALL_TESTS();
-}