1 /*
2 * dgramtest.cpp
3 * serp++
4 *
5 * Created by Victor Grishchenko on 3/13/09.
6 * Copyright 2009-2016 TECHNISCHE UNIVERSITEIT DELFT. All rights reserved.
7 *
8 */
9 #include <gtest/gtest.h>
10 //#include <glog/logging.h>
11 #include "swift.h" // Arno: for LibraryInit
12
13 using namespace swift;
14
15 struct event_base *evbase;
16 struct event evrecv;
17
ReceiveCallback(int fd,short event,void * arg)18 void ReceiveCallback(int fd, short event, void *arg)
19 {
20 }
21
TEST(Datagram,AddressTest)22 TEST(Datagram, AddressTest)
23 {
24 Address addr("127.0.0.1:1000");
25 EXPECT_EQ(INADDR_LOOPBACK,addr.ipv4());
26 EXPECT_EQ(1000,addr.port());
27 Address das2("node300.das2.ewi.tudelft.nl:20000");
28 Address das2b("130.161.211.200:20000");
29 EXPECT_EQ(das2.ipv4(),das2b.ipv4());
30 EXPECT_EQ(20000,das2.port());
31 }
32
33
TEST(Datagram,BinaryTest)34 TEST(Datagram, BinaryTest)
35 {
36 evutil_socket_t socket = Channel::Bind(Address("0.0.0.0",7001));
37 ASSERT_TRUE(socket>0);
38 Address destaddr("127.0.0.1",7001);
39 const char * text = "text";
40 const uint8_t num8 = 0xab;
41 const uint16_t num16 = 0xabcd;
42 const uint32_t num32 = 0xabcdef01;
43 const uint64_t num64 = 0xabcdefabcdeffULL;
44 char buf[1024];
45 int i;
46 struct evbuffer *snd = evbuffer_new();
47 evbuffer_add(snd, text, strlen(text));
48 evbuffer_add_8(snd, num8);
49 evbuffer_add_16be(snd, num16);
50 evbuffer_add_32be(snd, num32);
51 evbuffer_add_64be(snd, num64);
52 int datalen = evbuffer_get_length(snd);
53 unsigned char *data = evbuffer_pullup(snd, datalen);
54 for (i=0; i<datalen; i++)
55 sprintf(buf+i*2,"%02x",*(data+i));
56 buf[i*2] = 0;
57 EXPECT_STREQ("74657874ababcdabcdef01000abcdefabcdeff",buf);
58 ASSERT_EQ(datalen,Channel::SendTo(socket, destaddr, snd));
59 evbuffer_free(snd);
60 event_assign(&evrecv, evbase, socket, EV_READ, ReceiveCallback, NULL);
61 event_add(&evrecv, NULL);
62 event_base_dispatch(evbase);
63 struct evbuffer *rcv = evbuffer_new();
64 Address address;
65 ASSERT_EQ(datalen,Channel::RecvFrom(socket, address, rcv));
66 evbuffer_remove(rcv, buf, strlen(text));
67 buf[strlen(text)] = 0;
68 uint8_t rnum8 = evbuffer_remove_8(rcv);
69 uint16_t rnum16 = evbuffer_remove_16be(rcv);
70 uint32_t rnum32 = evbuffer_remove_32be(rcv);
71 uint64_t rnum64 = evbuffer_remove_64be(rcv);
72 EXPECT_STREQ("text",buf);
73 EXPECT_EQ(0xab,rnum8);
74 EXPECT_EQ(0xabcd,rnum16);
75 EXPECT_EQ(0xabcdef01,rnum32);
76 EXPECT_EQ(0xabcdefabcdeffULL,rnum64);
77 evbuffer_free(rcv);
78 Channel::CloseSocket(socket);
79 }
80
TEST(Datagram,TwoPortTest)81 TEST(Datagram,TwoPortTest)
82 {
83 int sock1 = Channel::Bind("0.0.0.0:10001");
84 int sock2 = Channel::Bind("0.0.0.0:10002");
85 ASSERT_TRUE(sock1>0);
86 ASSERT_TRUE(sock2>0);
87 /*struct sockaddr_in addr1, addr2;
88 addr1.sin_family = AF_INET;
89 addr1.sin_port = htons(10001);
90 addr1.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
91 addr2.sin_family = AF_INET;
92 addr2.sin_port = htons(10002);
93 addr2.sin_addr.s_addr = htonl(INADDR_LOOPBACK);*/
94 struct evbuffer *snd = evbuffer_new();
95 evbuffer_add_32be(snd, 1234);
96 Channel::SendTo(sock1,Address("127.0.0.1:10002"),snd);
97 evbuffer_free(snd);
98 event_assign(&evrecv, evbase, sock2, EV_READ, ReceiveCallback, NULL);
99 event_add(&evrecv, NULL);
100 event_base_dispatch(evbase);
101 struct evbuffer *rcv = evbuffer_new();
102 Address address;
103 Channel::RecvFrom(sock2, address, rcv);
104 uint32_t test = evbuffer_remove_32be(rcv);
105 ASSERT_EQ(1234,test);
106 evbuffer_free(rcv);
107 Channel::CloseSocket(sock1);
108 Channel::CloseSocket(sock2);
109 }
110
main(int argc,char ** argv)111 int main(int argc, char** argv)
112 {
113 swift::LibraryInit();
114 evbase = event_base_new();
115 testing::InitGoogleTest(&argc, argv);
116 return RUN_ALL_TESTS();
117 }
118