// Copyright (C) 2011 Davis E. King (davis@dlib.net)
// License: Boost Software License See LICENSE.txt for the full license.
#include <sstream>
#include <string>
#include <cstdlib>
#include <ctime>
#include <dlib/bridge.h>
#include <dlib/type_safe_union.h>
#include "tester.h"
namespace
{
using namespace test;
using namespace dlib;
using namespace std;
logger dlog("test.bridge");
const unsigned short testing_port = 41238;
void do_test1()
{
dlib::pipe<int> in(0), out(0);
bridge b1(connect_to_ip_and_port("127.0.0.1",testing_port), receive(in));
bridge b2(listen_on_port(testing_port), transmit(out));
for (int i = 0; i < 100; ++i)
{
int val = i;
out.enqueue(val);
val = 0;
in.dequeue(val);
DLIB_TEST(val == i);
}
}
void do_test2()
{
dlib::pipe<int> in(0), out(0), echo_pipe(0);
bridge b2(listen_on_port(testing_port), transmit(out), receive(in));
bridge echo(connect_to_ip_and_port("127.0.0.1",testing_port), receive(echo_pipe), transmit(echo_pipe));
for (int i = 0; i < 100; ++i)
{
int val = i;
out.enqueue(val);
val = 0;
in.dequeue(val);
DLIB_TEST(val == i);
}
}
void do_test3()
{
dlib::pipe<int> in(10), out(10), echo_pipe(10);
bridge b2(listen_on_port(testing_port), transmit(out), receive(in));
bridge echo(connect_to_ip_and_port("127.0.0.1",testing_port), receive(echo_pipe), transmit(echo_pipe));
b2.reconfigure(listen_on_port(testing_port), transmit(out), receive(in));
for (int i = 0; i < 100; ++i)
{
int val = i;
out.enqueue(val);
val = 0;
in.dequeue(val);
DLIB_TEST(val == i);
}
}
void do_test4()
{
dlib::pipe<int> in(0), out(0), echo_pipe(0);
bridge b2, echo;
b2.reconfigure(listen_on_port(testing_port), receive(in), transmit(out));
echo.reconfigure(connect_to_ip_and_port("127.0.0.1",testing_port), transmit(echo_pipe), receive(echo_pipe));
for (int i = 0; i < 100; ++i)
{
int val = i;
out.enqueue(val);
val = 0;
in.dequeue(val);
DLIB_TEST(val == i);
}
}
void do_test5(int pipe_size)
{
typedef type_safe_union<int, bridge_status> tsu_type;
dlib::pipe<tsu_type> out(pipe_size);
dlib::pipe<tsu_type> in(pipe_size);
dlib::pipe<bridge_status> out_status(pipe_size);
bridge b1(connect_to_ip_and_port("127.0.0.1",testing_port), receive(in));
tsu_type msg;
msg = b1.get_bridge_status();
DLIB_TEST(msg.contains<bridge_status>() == true);
DLIB_TEST(msg.get<bridge_status>().is_connected == false);
DLIB_TEST(msg.get<bridge_status>().foreign_ip == "");
DLIB_TEST(msg.get<bridge_status>().foreign_port == 0);
{
bridge b2(listen_on_port(testing_port), transmit(out), receive(out_status));
in.dequeue(msg);
DLIB_TEST(msg.contains<bridge_status>() == true);
DLIB_TEST(msg.get<bridge_status>().is_connected == true);
DLIB_TEST(msg.get<bridge_status>().foreign_ip == "127.0.0.1");
DLIB_TEST(msg.get<bridge_status>().foreign_port == testing_port);
msg = b1.get_bridge_status();
DLIB_TEST(msg.contains<bridge_status>() == true);
DLIB_TEST(msg.get<bridge_status>().is_connected == true);
DLIB_TEST(msg.get<bridge_status>().foreign_ip == "127.0.0.1");
DLIB_TEST(msg.get<bridge_status>().foreign_port == testing_port);
bridge_status temp;
out_status.dequeue(temp);
DLIB_TEST(temp.is_connected == true);
DLIB_TEST(temp.foreign_ip == "127.0.0.1");
for (int i = 0; i < 100; ++i)
{
msg = i;
out.enqueue(msg);
msg.get<int>() = 0;
in.dequeue(msg);
DLIB_TEST(msg.contains<int>() == true);
DLIB_TEST(msg.get<int>() == i);
}
}
in.dequeue(msg);
DLIB_TEST(msg.contains<bridge_status>() == true);
DLIB_TEST(msg.get<bridge_status>().is_connected == false);
DLIB_TEST(msg.get<bridge_status>().foreign_ip == "127.0.0.1");
DLIB_TEST(msg.get<bridge_status>().foreign_port == testing_port);
}
void do_test5_5(int pipe_size)
{
typedef type_safe_union<int, bridge_status> tsu_type;
dlib::pipe<tsu_type> out(pipe_size);
dlib::pipe<tsu_type> in(pipe_size);
dlib::pipe<bridge_status> out_status(pipe_size);
bridge b1(connect_to_ip_and_port("127.0.0.1",testing_port), receive(in));
tsu_type msg;
bridge b2(listen_on_port(testing_port), transmit(out), receive(out_status));
in.dequeue(msg);
DLIB_TEST(msg.contains<bridge_status>() == true);
DLIB_TEST(msg.get<bridge_status>().is_connected == true);
DLIB_TEST(msg.get<bridge_status>().foreign_ip == "127.0.0.1");
DLIB_TEST(msg.get<bridge_status>().foreign_port == testing_port);
bridge_status temp;
out_status.dequeue(temp);
DLIB_TEST(temp.is_connected == true);
DLIB_TEST(temp.foreign_ip == "127.0.0.1");
for (int i = 0; i < 100; ++i)
{
msg = i;
out.enqueue(msg);
msg.get<int>() = 0;
in.dequeue(msg);
DLIB_TEST(msg.contains<int>() == true);
DLIB_TEST(msg.get<int>() == i);
}
b2.clear();
msg = b2.get_bridge_status();
DLIB_TEST(msg.contains<bridge_status>() == true);
DLIB_TEST(msg.get<bridge_status>().is_connected == false);
DLIB_TEST(msg.get<bridge_status>().foreign_ip == "");
DLIB_TEST(msg.get<bridge_status>().foreign_port == 0);
in.dequeue(msg);
DLIB_TEST(msg.contains<bridge_status>() == true);
DLIB_TEST(msg.get<bridge_status>().is_connected == false);
DLIB_TEST(msg.get<bridge_status>().foreign_ip == "127.0.0.1");
DLIB_TEST(msg.get<bridge_status>().foreign_port == testing_port);
}
void do_test6()
{
dlib::pipe<int> in(0), out(300);
bridge b1(connect_to_ip_and_port("127.0.0.1",testing_port), receive(in));
bridge b2(listen_on_port(testing_port), transmit(out));
for (int i = 0; i < 100; ++i)
{
int val = i;
out.enqueue(val);
}
int val = 10;
in.dequeue(val);
DLIB_TEST(val == 0);
dlib::sleep(100);
in.dequeue(val);
DLIB_TEST(val == 1);
dlib::sleep(100);
}
class test_bridge : public tester
{
public:
test_bridge (
) :
tester ("test_bridge",
"Runs tests on the bridge component.")
{}
void perform_test (
)
{
dlog << LINFO << "testing bridge, using local port number of " << testing_port;
print_spinner();
do_test1();
print_spinner();
do_test2();
print_spinner();
do_test3();
print_spinner();
do_test4();
print_spinner();
for (int i = 0; i < 5; ++i)
do_test5(i);
do_test5_5(1);
print_spinner();
do_test6();
}
} a;
}