Add the source files for the swift library.
[swifty.git] / src / libswift / tests / dgramtest.cpp
diff --git a/src/libswift/tests/dgramtest.cpp b/src/libswift/tests/dgramtest.cpp
new file mode 100644 (file)
index 0000000..701b9c3
--- /dev/null
@@ -0,0 +1,115 @@
+/*
+ *  dgramtest.cpp
+ *  serp++
+ *
+ *  Created by Victor Grishchenko on 3/13/09.
+ *  Copyright 2009-2012 TECHNISCHE UNIVERSITEIT DELFT. All rights reserved.
+ *
+ */
+#include <gtest/gtest.h>
+//#include <glog/logging.h>
+#include "swift.h" // Arno: for LibraryInit
+
+using namespace swift;
+
+struct event_base *evbase;
+struct event evrecv;
+
+void ReceiveCallback(int fd, short event, void *arg) {
+}
+
+TEST(Datagram, AddressTest) {
+    Address addr("127.0.0.1:1000");
+    EXPECT_EQ(INADDR_LOOPBACK,addr.ipv4());
+    EXPECT_EQ(1000,addr.port());
+    Address das2("node300.das2.ewi.tudelft.nl:20000");
+    Address das2b("130.161.211.200:20000");
+    EXPECT_EQ(das2.ipv4(),das2b.ipv4());
+    EXPECT_EQ(20000,das2.port());
+}
+
+
+TEST(Datagram, BinaryTest) {
+       evutil_socket_t socket = Channel::Bind(7001);
+       ASSERT_TRUE(socket>0);
+       struct sockaddr_in addr;
+       addr.sin_family = AF_INET;
+       addr.sin_port = htons(7001);
+       addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+       const char * text = "text";
+       const uint8_t num8 = 0xab;
+       const uint16_t num16 = 0xabcd;
+       const uint32_t num32 = 0xabcdef01;
+       const uint64_t num64 = 0xabcdefabcdeffULL;
+       char buf[1024];
+       int i;
+       struct evbuffer *snd = evbuffer_new();
+       evbuffer_add(snd, text, strlen(text));
+       evbuffer_add_8(snd, num8);
+       evbuffer_add_16be(snd, num16);
+       evbuffer_add_32be(snd, num32);
+       evbuffer_add_64be(snd, num64);
+       int datalen = evbuffer_get_length(snd);
+       unsigned char *data = evbuffer_pullup(snd, datalen);
+       for(i=0; i<datalen; i++)
+           sprintf(buf+i*2,"%02x",*(data+i));
+       buf[i*2] = 0;
+       EXPECT_STREQ("74657874ababcdabcdef01000abcdefabcdeff",buf);
+       ASSERT_EQ(datalen,Channel::SendTo(socket, addr, snd));
+       evbuffer_free(snd);
+       event_assign(&evrecv, evbase, socket, EV_READ, ReceiveCallback, NULL);
+       event_add(&evrecv, NULL);
+       event_base_dispatch(evbase);
+       struct evbuffer *rcv = evbuffer_new();
+       Address address;
+       ASSERT_EQ(datalen,Channel::RecvFrom(socket, address, rcv));
+       evbuffer_remove(rcv, buf, strlen(text));
+       buf[strlen(text)] = 0;
+       uint8_t rnum8 = evbuffer_remove_8(rcv);
+       uint16_t rnum16 = evbuffer_remove_16be(rcv);
+       uint32_t rnum32 = evbuffer_remove_32be(rcv);
+       uint64_t rnum64 = evbuffer_remove_64be(rcv);
+       EXPECT_STREQ("text",buf);
+       EXPECT_EQ(0xab,rnum8);
+       EXPECT_EQ(0xabcd,rnum16);
+       EXPECT_EQ(0xabcdef01,rnum32);
+       EXPECT_EQ(0xabcdefabcdeffULL,rnum64);
+       evbuffer_free(rcv);
+       Channel::CloseSocket(socket);
+}
+
+TEST(Datagram,TwoPortTest) {
+       int sock1 = Channel::Bind("0.0.0.0:10001");
+       int sock2 = Channel::Bind("0.0.0.0:10002");
+       ASSERT_TRUE(sock1>0);
+       ASSERT_TRUE(sock2>0);
+       /*struct sockaddr_in addr1, addr2;
+       addr1.sin_family = AF_INET;
+       addr1.sin_port = htons(10001);
+       addr1.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+       addr2.sin_family = AF_INET;
+       addr2.sin_port = htons(10002);
+       addr2.sin_addr.s_addr = htonl(INADDR_LOOPBACK);*/
+       struct evbuffer *snd = evbuffer_new();
+       evbuffer_add_32be(snd, 1234);
+       Channel::SendTo(sock1,Address("127.0.0.1:10002"),snd);
+       evbuffer_free(snd);
+       event_assign(&evrecv, evbase, sock2, EV_READ, ReceiveCallback, NULL);
+       event_add(&evrecv, NULL);
+       event_base_dispatch(evbase);
+       struct evbuffer *rcv = evbuffer_new();
+       Address address;
+       Channel::RecvFrom(sock2, address, rcv);
+       uint32_t test = evbuffer_remove_32be(rcv);
+       ASSERT_EQ(1234,test);
+       evbuffer_free(rcv);
+       Channel::CloseSocket(sock1);
+       Channel::CloseSocket(sock2);
+}
+
+int main (int argc, char** argv) {
+       swift::LibraryInit();
+       evbase = event_base_new();
+       testing::InitGoogleTest(&argc, argv);
+       return RUN_ALL_TESTS();
+}