5 * Created by Victor Grishchenko on 3/13/09.
6 * Copyright 2009-2012 TECHNISCHE UNIVERSITEIT DELFT. All rights reserved.
9 #include <gtest/gtest.h>
10 //#include <glog/logging.h>
11 #include "swift.h" // Arno: for LibraryInit
13 using namespace swift;
15 struct event_base *evbase;
18 void ReceiveCallback(int fd, short event, void *arg) {
21 TEST(Datagram, AddressTest) {
22 Address addr("127.0.0.1:1000");
23 EXPECT_EQ(INADDR_LOOPBACK,addr.ipv4());
24 EXPECT_EQ(1000,addr.port());
25 Address das2("node300.das2.ewi.tudelft.nl:20000");
26 Address das2b("130.161.211.200:20000");
27 EXPECT_EQ(das2.ipv4(),das2b.ipv4());
28 EXPECT_EQ(20000,das2.port());
32 TEST(Datagram, BinaryTest) {
33 evutil_socket_t socket = Channel::Bind(7001);
34 ASSERT_TRUE(socket>0);
35 struct sockaddr_in addr;
36 addr.sin_family = AF_INET;
37 addr.sin_port = htons(7001);
38 addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
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;
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));
57 EXPECT_STREQ("74657874ababcdabcdef01000abcdefabcdeff",buf);
58 ASSERT_EQ(datalen,Channel::SendTo(socket, addr, &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();
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);
78 Channel::CloseSocket(socket);
81 TEST(Datagram,TwoPortTest) {
82 int sock1 = Channel::Bind("0.0.0.0:10001");
83 int sock2 = Channel::Bind("0.0.0.0:10002");
86 /*struct sockaddr_in addr1, addr2;
87 addr1.sin_family = AF_INET;
88 addr1.sin_port = htons(10001);
89 addr1.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
90 addr2.sin_family = AF_INET;
91 addr2.sin_port = htons(10002);
92 addr2.sin_addr.s_addr = htonl(INADDR_LOOPBACK);*/
93 struct evbuffer *snd = evbuffer_new();
94 evbuffer_add_32be(snd, 1234);
95 Channel::SendTo(sock1,Address("127.0.0.1:10002"),&snd);
97 event_assign(&evrecv, evbase, sock2, EV_READ, ReceiveCallback, NULL);
98 event_add(&evrecv, NULL);
99 event_base_dispatch(evbase);
100 struct evbuffer *rcv = evbuffer_new();
102 Channel::RecvFrom(sock2, address, &rcv);
103 uint32_t test = evbuffer_remove_32be(rcv);
104 ASSERT_EQ(1234,test);
106 Channel::CloseSocket(sock1);
107 Channel::CloseSocket(sock2);
110 int main (int argc, char** argv) {
111 swift::LibraryInit();
112 evbase = event_base_new();
113 testing::InitGoogleTest(&argc, argv);
114 return RUN_ALL_TESTS();