diff options
author | Добрый Ээх <bukharaev@gmail.com> | 2016-10-14 11:36:10 +0300 |
---|---|---|
committer | Добрый Ээх <bukharaev@gmail.com> | 2016-10-19 15:51:02 +0300 |
commit | 5666583532d208c05d6194d1cb28a5b61ad9d75c (patch) | |
tree | f224f8c27a03b8104b558f7055921fccc95e64ff /platform | |
parent | a65d86ebcf216bd0480c7f576d0eff60df44a160 (diff) |
Pull request #4498 review fixes
Diffstat (limited to 'platform')
-rw-r--r-- | platform/platform.pro | 1 | ||||
-rw-r--r-- | platform/platform_tests_support/platform_tests_support.pro | 2 | ||||
-rw-r--r-- | platform/platform_tests_support/test_socket.cpp | 67 | ||||
-rw-r--r-- | platform/platform_tests_support/test_socket.hpp | 44 | ||||
-rw-r--r-- | platform/socket.cpp | 122 | ||||
-rw-r--r-- | platform/socket.hpp | 17 |
6 files changed, 113 insertions, 140 deletions
diff --git a/platform/platform.pro b/platform/platform.pro index c6fb2fd10e..d05cc1f1e4 100644 --- a/platform/platform.pro +++ b/platform/platform.pro @@ -105,4 +105,3 @@ SOURCES += \ preferred_languages.cpp \ servers_list.cpp \ settings.cpp \ - socket.cpp \ diff --git a/platform/platform_tests_support/platform_tests_support.pro b/platform/platform_tests_support/platform_tests_support.pro index f5456cad2c..8408a7bdbc 100644 --- a/platform/platform_tests_support/platform_tests_support.pro +++ b/platform/platform_tests_support/platform_tests_support.pro @@ -10,10 +10,12 @@ SOURCES += \ scoped_dir.cpp \ scoped_file.cpp \ scoped_mwm.cpp \ + test_socket.cpp \ writable_dir_changer.cpp \ HEADERS += \ scoped_dir.hpp \ scoped_file.hpp \ scoped_mwm.hpp \ + test_socket.hpp \ writable_dir_changer.hpp \ diff --git a/platform/platform_tests_support/test_socket.cpp b/platform/platform_tests_support/test_socket.cpp new file mode 100644 index 0000000000..3924da379c --- /dev/null +++ b/platform/platform_tests_support/test_socket.cpp @@ -0,0 +1,67 @@ +#include "test_socket.hpp" + +#include "base/assert.hpp" + +#include "std/algorithm.hpp" +#include "std/chrono.hpp" + +namespace platform +{ +namespace tests_support +{ +TestSocket::~TestSocket() { m_isConnected = false; } + +bool TestSocket::Open(string const & host, uint16_t port) +{ + if (m_isConnected) + return false; + + m_isConnected = true; + return true; +} + +void TestSocket::Close() { m_isConnected = false; } + +bool TestSocket::Read(uint8_t * data, uint32_t count) +{ + if (!m_isConnected) + return false; + + lock_guard<mutex> lg(m_inputMutex); + + if (m_input.size() < count) + return false; + + copy(m_input.begin(), m_input.end(), data); + m_input.erase(m_input.begin(), m_input.begin() + count); + return true; +} + +bool TestSocket::Write(uint8_t const * data, uint32_t count) +{ + if (!m_isConnected) + return false; + + { + lock_guard<mutex> lg(m_outputMutex); + m_output.insert(m_output.end(), data, data + count); + } + m_outputCondition.notify_one(); + return true; +} + +void TestSocket::SetTimeout(uint32_t milliseconds) { m_timeoutMs = milliseconds; } + +size_t TestSocket::ReadServer(vector<uint8_t> & destination) +{ + unique_lock<mutex> lock(m_outputMutex); + m_outputCondition.wait_for(lock, milliseconds(m_timeoutMs), + [this]() { return !m_output.empty(); }); + + size_t const outputSize = m_output.size(); + destination.insert(destination.end(), m_output.begin(), m_output.end()); + m_output.clear(); + return outputSize; +} +} // namespace tests_support +} // namespace platform diff --git a/platform/platform_tests_support/test_socket.hpp b/platform/platform_tests_support/test_socket.hpp new file mode 100644 index 0000000000..8d19071121 --- /dev/null +++ b/platform/platform_tests_support/test_socket.hpp @@ -0,0 +1,44 @@ +#pragma once + +#include "platform/socket.hpp" + +#include "std/atomic.hpp" +#include "std/condition_variable.hpp" +#include "std/cstdint.hpp" +#include "std/deque.hpp" +#include "std/mutex.hpp" +#include "std/vector.hpp" + +namespace platform +{ +namespace tests_support +{ +class TestSocket final : public Socket +{ +public: + // Socket overrides: + ~TestSocket(); + bool Open(string const & host, uint16_t port) override; + void Close() override; + bool Read(uint8_t * data, uint32_t count) override; + bool Write(uint8_t const * data, uint32_t count) override; + void SetTimeout(uint32_t milliseconds) override; + + // Simulates server reading. + // Waits for some data or timeout. + // Returns size of read data. + size_t ReadServer(vector<uint8_t> & destination); + +private: + atomic<bool> m_isConnected = {false}; + atomic<uint32_t> m_timeoutMs = {100}; + + deque<uint8_t> m_input; + mutex m_inputMutex; + + vector<uint8_t> m_output; + mutex m_outputMutex; + condition_variable m_outputCondition; +}; +} // namespace tests_support +} // namespace platform diff --git a/platform/socket.cpp b/platform/socket.cpp deleted file mode 100644 index 59eb1985a8..0000000000 --- a/platform/socket.cpp +++ /dev/null @@ -1,122 +0,0 @@ -#include "socket.hpp" - -#include "base/assert.hpp" - -#include "std/algorithm.hpp" -#include "std/deque.hpp" -#include "std/mutex.hpp" - -namespace -{ -class MockSocket final : public platform::Socket -{ -public: - // Socket overrides - bool Open(string const & host, uint16_t port) override { return false; } - void Close() override {} - bool Read(uint8_t * data, uint32_t count) override { return false; } - bool Write(uint8_t const * data, uint32_t count) override { return false; } - void SetTimeout(uint32_t milliseconds) override {} -}; - -class TestSocketImpl final : public platform::TestSocket -{ -public: - // Socket overrides - ~TestSocketImpl(); - bool Open(string const & host, uint16_t port) override; - void Close() override; - bool Read(uint8_t * data, uint32_t count) override; - bool Write(uint8_t const * data, uint32_t count) override; - void SetTimeout(uint32_t milliseconds) override; - - // TestSocket overrides - bool HasInput() const override; - bool HasOutput() const override; - void WriteServer(uint8_t const * data, uint32_t count) override; - size_t ReadServer(vector<uint8_t> & destination) override; - -private: - bool m_isConnected = false; - - deque<uint8_t> m_input; - mutable mutex m_inputMutex; - - vector<uint8_t> m_output; - mutable mutex m_outputMutex; -}; - -TestSocketImpl::~TestSocketImpl() { m_isConnected = false; } - -bool TestSocketImpl::Open(string const & host, uint16_t port) -{ - m_isConnected = true; - return true; -} - -void TestSocketImpl::Close() { m_isConnected = false; } -bool TestSocketImpl::Read(uint8_t * data, uint32_t count) -{ - if (!m_isConnected) - return false; - - lock_guard<mutex> lg(m_inputMutex); - - if (m_input.size() < count) - return false; - - copy(m_input.begin(), m_input.end(), data); - m_input.erase(m_input.begin(), m_input.begin() + count); - return true; -} - -bool TestSocketImpl::Write(uint8_t const * data, uint32_t count) -{ - if (!m_isConnected) - return false; - - lock_guard<mutex> lg(m_outputMutex); - m_output.insert(m_output.end(), data, data + count); - return true; -} - -void TestSocketImpl::SetTimeout(uint32_t milliseconds) {} -bool TestSocketImpl::HasInput() const -{ - lock_guard<mutex> lg(m_inputMutex); - return !m_input.empty(); -} - -bool TestSocketImpl::HasOutput() const -{ - lock_guard<mutex> lg(m_outputMutex); - return !m_output.empty(); -} - -void TestSocketImpl::WriteServer(uint8_t const * data, uint32_t count) -{ - ASSERT(m_isConnected, ()); - - lock_guard<mutex> lg(m_inputMutex); - m_input.insert(m_input.end(), data, data + count); -} - -size_t TestSocketImpl::ReadServer(vector<uint8_t> & destination) -{ - lock_guard<mutex> lg(m_outputMutex); - - size_t const outputSize = m_output.size(); - if (outputSize == 0) - return 0; - - destination.insert(destination.end(), m_output.begin(), m_output.end()); - m_output.clear(); - return outputSize; -} -} // namespace - -namespace platform -{ -unique_ptr<Socket> createMockSocket() { return make_unique<MockSocket>(); } -unique_ptr<TestSocket> createTestSocket() { return make_unique<TestSocketImpl>(); } -} // namespace platform diff --git a/platform/socket.hpp b/platform/socket.hpp index 41a0d7711e..43083630ee 100644 --- a/platform/socket.hpp +++ b/platform/socket.hpp @@ -2,7 +2,6 @@ #include "std/string.hpp" #include "std/unique_ptr.hpp" -#include "std/vector.hpp" namespace platform { @@ -26,21 +25,5 @@ public: virtual void SetTimeout(uint32_t milliseconds) = 0; }; -class TestSocket : public Socket -{ -public: - virtual bool HasInput() const = 0; - virtual bool HasOutput() const = 0; - - // Simulate server writing - virtual void WriteServer(uint8_t const * data, uint32_t count) = 0; - - // Simulate server reading - // returns size of read data - virtual size_t ReadServer(vector<uint8_t> & destination) = 0; -}; - unique_ptr<Socket> createSocket(); -unique_ptr<Socket> createMockSocket(); -unique_ptr<TestSocket> createTestSocket(); } // namespace platform |