diff options
Diffstat (limited to 'src/Sockets/tests/x.cpp')
-rw-r--r-- | src/Sockets/tests/x.cpp | 298 |
1 files changed, 298 insertions, 0 deletions
diff --git a/src/Sockets/tests/x.cpp b/src/Sockets/tests/x.cpp new file mode 100644 index 0000000..2ca9b26 --- /dev/null +++ b/src/Sockets/tests/x.cpp @@ -0,0 +1,298 @@ +#include <SocketHandler.h> +#include <TcpSocket.h> +#include <StdoutLog.h> +#ifndef _WIN32 +#include <signal.h> +#endif +#include <IEventOwner.h> +#include <EventHandler.h> + +#define HOST "localhost" +#define PORT 2222 + +#define TIME_US 250000 + +#define DEB(x) x + + +static bool quit = false; +static EventHandler *ph = NULL; + +static int lc = 0; +static int l2c = 0; +static int l3c = 0; + + +#ifndef _WIN32 +void sighandler(int s) +{ + quit = true; + ph -> SetQuit(); +} + + +void sigpipe(int s) +{ +} +#endif + + +class evHandler : public EventHandler +{ +public: + evHandler() : EventHandler() {} + evHandler(StdLog *p) : EventHandler(p) {} + + void CloseAll() { + for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++) + { + Socket *p = it -> second; + p -> SetCloseAndDelete(); + } + } + +}; + + +class lSocket : public TcpSocket, public IEventOwner +{ +public: + lSocket(ISocketHandler& h, bool first = false) : TcpSocket(h), IEventOwner(static_cast<evHandler&>(h)), m_id(0), m_first(first) { + SetLineProtocol(); + lc++; + } + ~lSocket() { + } + + void OnConnect() { + if (!m_id) + { + m_id = AddEvent(0, TIME_US); + } + printf("."); + fflush(stdout); + } + void OnConnectFailed() { + printf("lSocket::OnConnectFailed\n"); + } + + void OnDelete() { + if (m_first) + printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n" + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n" + "@@@@@@@@@@@@@@ OnDelete() first @@@@@@@@@@@@@@@@@@\n" + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n" + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"); + } + + void OnEvent(int id) { + if (id != m_id) + { + printf("ID MISMATCH!\n"); + exit(-1); + } + if (!quit) + { + lSocket *p = new lSocket(Handler()); + p -> SetDeleteByHandler(); + p -> Open(HOST, PORT); + Handler().Add(p); + } + static_cast<evHandler&>(Handler()).SetQuit( quit ); + SetCloseAndDelete(); + } + +private: + int m_id; + bool m_first; +}; + + +class l2Socket : public TcpSocket, public IEventOwner +{ +public: + l2Socket(ISocketHandler& h, bool first = false) : TcpSocket(h), IEventOwner(static_cast<evHandler&>(h)), m_id(0), m_first(first) { + SetLineProtocol(); + l2c++; + } + ~l2Socket() { + } + + void OnConnect() { + printf("."); + fflush(stdout); + } + void OnConnectFailed() { + printf("l2Socket::OnConnectFailed\n"); + } + + void OnLine(const std::string& line) { + if (!m_id) + { + m_id = AddEvent(0, TIME_US); + } + } + + void OnDelete() { + if (m_first) + printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n" + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n" + "@@@@@@@@@@@@@@ OnDelete() first @@@@@@@@@@@@@@@@@@\n" + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n" + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"); + } + + void OnEvent(int id) { + if (id != m_id) + { + printf("ID MISMATCH!\n"); + exit(-1); + } + if (!quit) + { + l2Socket *p = new l2Socket(Handler()); + p -> SetDeleteByHandler(); + p -> Open(HOST, PORT); + Handler().Add(p); + } + static_cast<evHandler&>(Handler()).SetQuit( quit ); + SetCloseAndDelete(); + } + +private: + int m_id; + bool m_first; +}; + + +class l3Socket : public TcpSocket, public IEventOwner +{ +public: + l3Socket(ISocketHandler& h, bool first = false) : TcpSocket(h), IEventOwner(static_cast<evHandler&>(h)), m_ehlo(false), m_id(0), m_first(first) { + SetLineProtocol(); + l3c++; + } + ~l3Socket() { + } + + void OnConnect() { + printf("."); + fflush(stdout); + } + void OnConnectFailed() { + printf("l3Socket::OnConnectFailed\n"); + } + + void OnLine(const std::string& line) { + if (!m_ehlo) + { + Send("EHLO alhem.net\r\n"); + m_ehlo = true; + } + else + if (!m_id) + { + m_id = AddEvent(0, TIME_US); + } + } + + void OnDelete() { + if (m_first) + printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n" + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n" + "@@@@@@@@@@@@@@ OnDelete() first @@@@@@@@@@@@@@@@@@\n" + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n" + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"); + } + + void OnEvent(int id) { + if (id != m_id) + { + printf("ID MISMATCH!\n"); + exit(-1); + } + if (!quit) + { + l3Socket *p = new l3Socket(Handler()); + p -> SetDeleteByHandler(); + p -> Open(HOST, PORT); + Handler().Add(p); + } + static_cast<evHandler&>(Handler()).SetQuit( quit ); + Send("QUIT\r\n"); + } + +private: + bool m_ehlo; + int m_id; + bool m_first; +}; + + +int main(int argc, char *argv[]) +{ +#ifndef _WIN32 + signal(SIGHUP, sighandler); + signal(SIGINT, sighandler); + signal(SIGPIPE, sigpipe); +#endif + + time_t tstart = time(NULL); + { + StdoutLog log; + { + evHandler h(&log); + ph = &h; + { + lSocket sock(h, true); + sock.Open(HOST, PORT); + h.Add(&sock); + { + l2Socket sock2(h, true); + sock2.Open(HOST, PORT); + h.Add(&sock2); + { + l3Socket sock3(h, true); + sock3.Open(HOST, PORT); + h.Add(&sock3); + + h.EventLoop(); + h.CloseAll(); + + // %! one socket refuses to go away + while (h.GetCount() > 1) + { + h.Select(1, 0); + } + printf("Exiting 1...\n"); + fflush(stdout); + } + printf("Exiting 2...\n"); + fflush(stdout); + } + printf("Exiting 3...\n"); + fflush(stdout); + } + printf("Exiting 4...\n"); + fflush(stdout); + } + printf("Exiting 5...\n"); + fflush(stdout); + } + printf("Exiting 6...\n"); + fflush(stdout); + + time_t tstop = time(NULL); + + time_t total = tstop - tstart + 1; + + printf("lc: %d\n", lc); + printf("l2c: %d\n", l2c); + printf("l3c: %d\n", l3c); + + printf("lc: %f\n", (double)lc / (double)total); + printf("l2c: %f\n", (double)l2c / (double)total); + printf("l3c: %f\n", (double)l3c / (double)total); +} + + |