Add the source files for the swift library.
[swifty.git] / src / libswift / tests / dgramtest.cpp
1 /*
2  *  dgramtest.cpp
3  *  serp++
4  *
5  *  Created by Victor Grishchenko on 3/13/09.
6  *  Copyright 2009-2012 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
18 void ReceiveCallback(int fd, short event, void *arg) {
19 }
20
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());
29 }
30
31
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;
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, addr, 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
81 TEST(Datagram,TwoPortTest) {
82         int sock1 = Channel::Bind("0.0.0.0:10001");
83         int sock2 = Channel::Bind("0.0.0.0:10002");
84         ASSERT_TRUE(sock1>0);
85         ASSERT_TRUE(sock2>0);
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);
96         evbuffer_free(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();
101         Address address;
102         Channel::RecvFrom(sock2, address, rcv);
103         uint32_t test = evbuffer_remove_32be(rcv);
104         ASSERT_EQ(1234,test);
105         evbuffer_free(rcv);
106         Channel::CloseSocket(sock1);
107         Channel::CloseSocket(sock2);
108 }
109
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();
115 }