a9402938bf7d50a24163290e33729196f68ede7b
[swift-upb.git] / tests / dgramtest.cpp
1 /*
2  *  dgramtest.cpp
3  *  serp++
4  *
5  *  Created by Victor Grishchenko on 3/13/09.
6  *  Copyright 2009 Delft University of Technology. All rights reserved.
7  *
8  */
9 #include <gtest/gtest.h>
10 //#include <glog/logging.h>
11 #include "datagram.h"
12 #include "swift.h" // Arno: for LibraryInit
13
14 using namespace swift;
15
16 TEST(Datagram, AddressTest) {
17     Address addr("127.0.0.1:1000");
18     EXPECT_EQ(INADDR_LOOPBACK,addr.ipv4());
19     EXPECT_EQ(1000,addr.port());
20     Address das2("node300.das2.ewi.tudelft.nl:20000");
21     Address das2b("130.161.211.200:20000");
22     EXPECT_EQ(das2.ipv4(),das2b.ipv4());
23     EXPECT_EQ(20000,das2.port());
24 }
25
26
27 TEST(Datagram, BinaryTest) {
28         SOCKET socket = Datagram::Bind(7001);
29         ASSERT_TRUE(socket>0);
30         struct sockaddr_in addr;
31         addr.sin_family = AF_INET;
32         addr.sin_port = htons(7001);
33         addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
34         Datagram d(socket,addr); //Address(7001));
35         const char * text = "text";
36         const uint8_t num8 = 0xab;
37         const uint16_t num16 = 0xabcd;
38         const uint32_t num32 = 0xabcdef01;
39         const uint64_t num64 = 0xabcdefabcdeffULL;
40         d.PushString(text);
41         d.Push8(num8);
42         d.Push16(num16);
43         d.Push32(num32);
44         d.Push64(num64);
45         char buf[1024];
46         int i;
47         for(i=0; i<d.size(); i++)
48                 sprintf(buf+i*2,"%02x",*(unsigned char*)(*d+i));
49         buf[i*2] = 0;
50         EXPECT_STREQ("74657874ababcdabcdef01000abcdefabcdeff",buf);
51         int datalen = strlen(text)+1+2+4+8;
52         ASSERT_EQ(datalen,d.Send());
53     SOCKET socks[1] = {socket};
54     // Arno: timeout 0 gives undeterministic behaviour on win32
55         SOCKET waitsocket = Datagram::Wait(1000000);
56         ASSERT_EQ(socket,waitsocket);
57         Datagram rcv(waitsocket);
58         ASSERT_EQ(datalen,rcv.Recv());
59         char* rbuf;
60         int pl = rcv.Pull((uint8_t**)&rbuf,strlen(text));
61         memcpy(buf,rbuf,pl);
62         buf[pl]=0;
63         uint8_t rnum8 = rcv.Pull8();
64         uint16_t rnum16 = rcv.Pull16();
65         uint32_t rnum32 = rcv.Pull32();
66         uint64_t rnum64 = rcv.Pull64();
67         EXPECT_STREQ("text",buf);
68         EXPECT_EQ(0xab,rnum8);
69         EXPECT_EQ(0xabcd,rnum16);
70         EXPECT_EQ(0xabcdef01,rnum32);
71         EXPECT_EQ(0xabcdefabcdeffULL,rnum64);
72         Datagram::Close(socket);
73 }
74
75 TEST(Datagram,TwoPortTest) {
76         int sock1 = Datagram::Bind(10001);
77         int sock2 = Datagram::Bind(10002);
78         ASSERT_TRUE(sock1>0);
79         ASSERT_TRUE(sock2>0);
80         /*struct sockaddr_in addr1, addr2;
81         addr1.sin_family = AF_INET;
82         addr1.sin_port = htons(10001);
83         addr1.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
84         addr2.sin_family = AF_INET;
85         addr2.sin_port = htons(10002);
86         addr2.sin_addr.s_addr = htonl(INADDR_LOOPBACK);*/
87
88         Datagram send(sock1,Address(10002));
89         send.Push32(1234);
90         send.Send();
91
92     SOCKET socks[2] = {sock1,sock2};
93     // Arno: timeout 0 gives undeterministic behaviour on win32
94         EXPECT_EQ(sock2,Datagram::Wait(1000000));
95         Datagram recv(sock2);
96         recv.Recv();
97         uint32_t test = recv.Pull32();
98         ASSERT_EQ(1234,test);
99
100         Datagram::Close(sock1);
101         Datagram::Close(sock2);
102 }
103
104 int main (int argc, char** argv) {
105
106         swift::LibraryInit();
107
108         testing::InitGoogleTest(&argc, argv);
109         return RUN_ALL_TESTS();
110
111 }