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