cmvr_head/packages/erpc-1.14.0/test/common/unit_test_tcp_server.cpp
2025-12-30 15:44:41 +08:00

161 lines
4.1 KiB
C++

/*
* Copyright (c) 2014-2016, Freescale Semiconductor, Inc.
* Copyright 2016-2020 NXP
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "erpc_basic_codec.hpp"
#include "erpc_simple_server.hpp"
#include "erpc_tcp_transport.hpp"
#include "Logging.hpp"
#include "c_test_unit_test_common_server.h"
#include "myAlloc.hpp"
#include "test_unit_test_common_server.hpp"
#include "unit_test.h"
////////////////////////////////////////////////////////////////////////////////
// DEFINITIONS
////////////////////////////////////////////////////////////////////////////////
#ifndef UNIT_TEST_TCP_HOST
#define UNIT_TEST_TCP_HOST "localhost"
#endif
#ifndef UNIT_TEST_TCP_PORT
#define UNIT_TEST_TCP_PORT 12345
#endif
////////////////////////////////////////////////////////////////////////////////
// CODE
////////////////////////////////////////////////////////////////////////////////
using namespace erpc;
using namespace erpcShim;
class MyMessageBufferFactory : public MessageBufferFactory
{
public:
virtual MessageBuffer create()
{
uint8_t *buf = new uint8_t[1024];
return MessageBuffer(buf, 1024);
}
virtual void dispose(MessageBuffer *buf)
{
erpc_assert(buf);
if (*buf)
{
delete[] buf->get();
}
}
};
TCPTransport g_transport(UNIT_TEST_TCP_HOST, UNIT_TEST_TCP_PORT, true);
MyMessageBufferFactory g_msgFactory;
BasicCodecFactory g_basicCodecFactory;
SimpleServer g_server;
Crc16 g_crc16;
int ::MyAlloc::allocated_ = 0;
Common_service *svc_common;
////////////////////////////////////////////////////////////////////////////////
// Code
////////////////////////////////////////////////////////////////////////////////
int main(int argc, const char *argv[])
{
// create logger instance
StdoutLogger *m_logger = new StdoutLogger();
m_logger->setFilterLevel(Logger::log_level_t::kInfo);
Log::setLogger(m_logger);
Log::info("Starting ERPC server on port %d...\n", UNIT_TEST_TCP_PORT);
erpc_status_t result = g_transport.open();
if (result)
{
Log::error("Failed to open connection\n");
return 1;
}
g_transport.setCrc16(&g_crc16);
g_server.setMessageBufferFactory(&g_msgFactory);
g_server.setTransport(&g_transport);
g_server.setCodecFactory(&g_basicCodecFactory);
add_services(&g_server);
add_common_service(&g_server);
// run server infinitely
erpc_status_t err = g_server.run();
if (err && err != kErpcStatus_ServerIsDown)
{
Log::error("Error occurred: %d\n", err);
return err;
}
// Thread::sleep(10000000);
free(m_logger);
g_transport.close();
return 0;
}
////////////////////////////////////////////////////////////////////////////////
// Common service implementations here
////////////////////////////////////////////////////////////////////////////////
void quit()
{
remove_common_service(&g_server);
remove_services(&g_server);
g_server.stop();
}
int32_t getServerAllocated()
{
int result = ::MyAlloc::allocated();
::MyAlloc::allocated(0);
return result;
}
class Common_server : public Common_interface
{
public:
void quit(void) { ::quit(); }
int32_t getServerAllocated(void)
{
int32_t result;
result = ::getServerAllocated();
return result;
}
};
////////////////////////////////////////////////////////////////////////////////
// Server helper functions
////////////////////////////////////////////////////////////////////////////////
void add_common_service(SimpleServer *server)
{
svc_common = new Common_service(new Common_server());
server->addService(svc_common);
}
void remove_common_service(SimpleServer *server)
{
server->removeService(svc_common);
delete svc_common->getHandler();
delete svc_common;
}
extern "C" void erpc_add_service_to_server(void *service) {}
extern "C" void erpc_remove_service_from_server(void *service) {}
////////////////////////////////////////////////////////////////////////////////
// EOF
////////////////////////////////////////////////////////////////////////////////