Goby v2
test.cpp
1 // Copyright 2009-2018 Toby Schneider (http://gobysoft.org/index.wt/people/toby)
2 // GobySoft, LLC (2013-)
3 // Massachusetts Institute of Technology (2007-2014)
4 //
5 //
6 // This file is part of the Goby Underwater Autonomy Project Binaries
7 // ("The Goby Binaries").
8 //
9 // The Goby Binaries are free software: you can redistribute them and/or modify
10 // them under the terms of the GNU General Public License as published by
11 // the Free Software Foundation, either version 2 of the License, or
12 // (at your option) any later version.
13 //
14 // The Goby Binaries are distributed in the hope that they will be useful,
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 // GNU General Public License for more details.
18 //
19 // You should have received a copy of the GNU General Public License
20 // along with Goby. If not, see <http://www.gnu.org/licenses/>.
21 
22 // tests IPC functionality of ZeroMQSerice
23 
24 #include "goby/common/zeromq_service.h"
25 
26 #include <boost/thread.hpp>
27 
28 void node_inbox(goby::common::MarshallingScheme marshalling_scheme, const std::string& identifier,
29  const std::string& data, int socket_id);
30 
31 const std::string identifier_ = "HI/";
32 int inbox_count_ = 0;
33 const char data_[] = {'h', 'i', '\0'};
34 
35 enum
36 {
37  SOCKET_SUBSCRIBE = 240,
38  SOCKET_PUBLISH = 211
39 };
40 
41 int main(int argc, char* argv[])
42 {
43  goby::glog.add_stream(goby::common::logger::DEBUG3, &std::cerr);
44  goby::glog.set_name(argv[0]);
45 
47  // must share context for ipc
48  goby::common::ZeroMQService node2(node1.zmq_context());
49 
50  goby::common::protobuf::ZeroMQServiceConfig publisher_cfg, subscriber_cfg;
51  {
53  subscriber_cfg.add_socket();
54  subscriber_socket->set_socket_type(
55  goby::common::protobuf::ZeroMQServiceConfig::Socket::SUBSCRIBE);
56  subscriber_socket->set_transport(goby::common::protobuf::ZeroMQServiceConfig::Socket::IPC);
57  subscriber_socket->set_connect_or_bind(
58  goby::common::protobuf::ZeroMQServiceConfig::Socket::CONNECT);
59 
60  subscriber_socket->set_socket_id(SOCKET_SUBSCRIBE);
61  subscriber_socket->set_socket_name("test3_ipc_socket");
62  std::cout << subscriber_socket->DebugString() << std::endl;
63  }
64 
65  {
67  publisher_cfg.add_socket();
68  publisher_socket->set_socket_type(
69  goby::common::protobuf::ZeroMQServiceConfig::Socket::PUBLISH);
70  publisher_socket->set_transport(goby::common::protobuf::ZeroMQServiceConfig::Socket::IPC);
71  publisher_socket->set_connect_or_bind(
72  goby::common::protobuf::ZeroMQServiceConfig::Socket::BIND);
73  publisher_socket->set_socket_name("test3_ipc_socket");
74  publisher_socket->set_socket_id(SOCKET_PUBLISH);
75  std::cout << publisher_socket->DebugString() << std::endl;
76  }
77 
78  node1.set_cfg(publisher_cfg);
79 
80  node2.set_cfg(subscriber_cfg);
81  node2.connect_inbox_slot(&node_inbox);
82  node2.subscribe_all(SOCKET_SUBSCRIBE);
83 
84  usleep(1e3);
85 
86  int test_count = 3;
87  for (int i = 0; i < test_count; ++i)
88  {
89  std::cout << "publishing " << data_ << std::endl;
90  node1.send(goby::common::MARSHALLING_CSTR, identifier_, std::string(data_), SOCKET_PUBLISH);
91  node2.poll(1e6);
92  }
93 
94  assert(inbox_count_ == test_count);
95 
96  std::cout << "all tests passed" << std::endl;
97 }
98 
99 void node_inbox(goby::common::MarshallingScheme marshalling_scheme, const std::string& identifier,
100  const std::string& data, int socket_id)
101 {
102  assert(identifier == identifier_);
103  assert(marshalling_scheme == goby::common::MARSHALLING_CSTR);
104  assert(!strcmp(data.c_str(), data_));
105  assert(socket_id == SOCKET_SUBSCRIBE);
106 
107  std::cout << "Received: " << data << std::endl;
108  ++inbox_count_;
109 }
void set_name(const std::string &s)
Set the name of the application that the logger is serving.
Definition: flex_ostream.h:67
common::FlexOstream glog
Access the Goby logger through this object.
void add_stream(logger::Verbosity verbosity=logger::VERBOSE, std::ostream *os=0)
Attach a stream object (e.g. std::cout, std::ofstream, ...) to the logger with desired verbosity...
Definition: flex_ostream.h:96