From d0613b56cea7eba0604e0548bddffd773a4eb554 Mon Sep 17 00:00:00 2001 From: Matteo Martincigh Date: Wed, 9 Oct 2019 16:47:04 +0100 Subject: IVGCVSW-3937 Improve the Connection Acknowledged Handler * The Connection Acknowledged Handler should report an error is it's called while in a wrong state * Stopping the threads in the ProfilingService before having to start them again * Updated the unit tests to check the changes * Removed unnecessary Packet.cpp file * Fixed memory leak Signed-off-by: Matteo Martincigh Change-Id: I8c4d33b4d97994df86fe6c9f8c659f880ec64c16 --- src/profiling/test/ProfilingTests.hpp | 200 ++++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 src/profiling/test/ProfilingTests.hpp (limited to 'src/profiling/test/ProfilingTests.hpp') diff --git a/src/profiling/test/ProfilingTests.hpp b/src/profiling/test/ProfilingTests.hpp new file mode 100644 index 0000000000..3e6cf63efe --- /dev/null +++ b/src/profiling/test/ProfilingTests.hpp @@ -0,0 +1,200 @@ +// +// Copyright © 2019 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include "SendCounterPacketTests.hpp" + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +namespace armnn +{ + +namespace profiling +{ + +struct LogLevelSwapper +{ +public: + LogLevelSwapper(armnn::LogSeverity severity) + { + // Set the new log level + armnn::ConfigureLogging(true, true, severity); + } + ~LogLevelSwapper() + { + // The default log level for unit tests is "Fatal" + armnn::ConfigureLogging(true, true, armnn::LogSeverity::Fatal); + } +}; + +struct CoutRedirect +{ +public: + CoutRedirect(std::streambuf* newStreamBuffer) + : m_Old(std::cout.rdbuf(newStreamBuffer)) {} + ~CoutRedirect() { std::cout.rdbuf(m_Old); } + +private: + std::streambuf* m_Old; +}; + +struct StreamRedirector +{ +public: + StreamRedirector(std::ostream& stream, std::streambuf* newStreamBuffer) + : m_Stream(stream) + , m_BackupBuffer(m_Stream.rdbuf(newStreamBuffer)) + {} + ~StreamRedirector() { m_Stream.rdbuf(m_BackupBuffer); } + +private: + std::ostream& m_Stream; + std::streambuf* m_BackupBuffer; +}; + +class TestProfilingConnectionBase : public IProfilingConnection +{ +public: + TestProfilingConnectionBase() = default; + ~TestProfilingConnectionBase() = default; + + bool IsOpen() const override { return true; } + + void Close() override {} + + bool WritePacket(const unsigned char* buffer, uint32_t length) override { return false; } + + Packet ReadPacket(uint32_t timeout) override + { + std::this_thread::sleep_for(std::chrono::milliseconds(timeout)); + + // Return connection acknowledged packet + std::unique_ptr packetData; + return Packet(65536, 0, packetData); + } +}; + +class TestProfilingConnectionTimeoutError : public TestProfilingConnectionBase +{ +public: + TestProfilingConnectionTimeoutError() + : m_ReadRequests(0) + {} + + Packet ReadPacket(uint32_t timeout) override + { + std::this_thread::sleep_for(std::chrono::milliseconds(timeout)); + + if (m_ReadRequests < 3) + { + m_ReadRequests++; + throw armnn::TimeoutException("Simulate a timeout error\n"); + } + + // Return connection acknowledged packet after three timeouts + std::unique_ptr packetData; + return Packet(65536, 0, packetData); + } + +private: + int m_ReadRequests; +}; + +class TestProfilingConnectionArmnnError : public TestProfilingConnectionBase +{ +public: + Packet ReadPacket(uint32_t timeout) override + { + std::this_thread::sleep_for(std::chrono::milliseconds(timeout)); + + throw armnn::Exception("Simulate a non-timeout error"); + } +}; + +class TestFunctorA : public CommandHandlerFunctor +{ +public: + using CommandHandlerFunctor::CommandHandlerFunctor; + + int GetCount() { return m_Count; } + + void operator()(const Packet& packet) override + { + m_Count++; + } + +private: + int m_Count = 0; +}; + +class TestFunctorB : public TestFunctorA +{ + using TestFunctorA::TestFunctorA; +}; + +class TestFunctorC : public TestFunctorA +{ + using TestFunctorA::TestFunctorA; +}; + +class MockProfilingConnectionFactory : public IProfilingConnectionFactory +{ +public: + IProfilingConnectionPtr GetProfilingConnection(const ExternalProfilingOptions& options) const override + { + return std::make_unique(); + } +}; + +class SwapProfilingConnectionFactoryHelper : public ProfilingService +{ +public: + using MockProfilingConnectionFactoryPtr = std::unique_ptr; + + SwapProfilingConnectionFactoryHelper() + : ProfilingService() + , m_MockProfilingConnectionFactory(new MockProfilingConnectionFactory()) + , m_BackupProfilingConnectionFactory(nullptr) + { + BOOST_CHECK(m_MockProfilingConnectionFactory); + SwapProfilingConnectionFactory(ProfilingService::Instance(), + m_MockProfilingConnectionFactory.get(), + m_BackupProfilingConnectionFactory); + BOOST_CHECK(m_BackupProfilingConnectionFactory); + } + ~SwapProfilingConnectionFactoryHelper() + { + BOOST_CHECK(m_BackupProfilingConnectionFactory); + IProfilingConnectionFactory* temp = nullptr; + SwapProfilingConnectionFactory(ProfilingService::Instance(), + m_BackupProfilingConnectionFactory, + temp); + } + + MockProfilingConnection* GetMockProfilingConnection() + { + IProfilingConnection* profilingConnection = GetProfilingConnection(ProfilingService::Instance()); + return boost::polymorphic_downcast(profilingConnection); + } + +private: + MockProfilingConnectionFactoryPtr m_MockProfilingConnectionFactory; + IProfilingConnectionFactory* m_BackupProfilingConnectionFactory; +}; + +} // namespace profiling + +} // namespace armnn -- cgit v1.2.1