SocketCoreTest.cc 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #include "SocketCore.h"
  2. #include <cstring>
  3. #include <iostream>
  4. #include <cppunit/extensions/HelperMacros.h>
  5. #include "a2functional.h"
  6. #include "Exception.h"
  7. namespace aria2 {
  8. class SocketCoreTest:public CppUnit::TestFixture {
  9. CPPUNIT_TEST_SUITE(SocketCoreTest);
  10. CPPUNIT_TEST(testWriteAndReadDatagram);
  11. CPPUNIT_TEST(testGetSocketError);
  12. CPPUNIT_TEST(testInetNtop);
  13. CPPUNIT_TEST(testGetBinAddr);
  14. CPPUNIT_TEST_SUITE_END();
  15. public:
  16. void setUp() {}
  17. void tearDown() {}
  18. void testWriteAndReadDatagram();
  19. void testGetSocketError();
  20. void testInetNtop();
  21. void testGetBinAddr();
  22. };
  23. CPPUNIT_TEST_SUITE_REGISTRATION(SocketCoreTest);
  24. void SocketCoreTest::testWriteAndReadDatagram()
  25. {
  26. try {
  27. SocketCore s(SOCK_DGRAM);
  28. s.bind(0);
  29. SocketCore c(SOCK_DGRAM);
  30. c.bind(0);
  31. std::pair<std::string, uint16_t> svaddr;
  32. s.getAddrInfo(svaddr);
  33. std::string message1 = "hello world.";
  34. c.writeData(message1.c_str(), message1.size(), "localhost", svaddr.second);
  35. std::string message2 = "chocolate coated pie";
  36. c.writeData(message2.c_str(), message2.size(), "localhost", svaddr.second);
  37. char readbuffer[100];
  38. std::pair<std::string, uint16_t> peer;
  39. {
  40. ssize_t rlength = s.readDataFrom(readbuffer, sizeof(readbuffer), peer);
  41. // commented out because ip address may vary
  42. //CPPUNIT_ASSERT_EQUAL(std::std::string("127.0.0.1"), peer.first);
  43. CPPUNIT_ASSERT_EQUAL((ssize_t)message1.size(), rlength);
  44. readbuffer[rlength] = '\0';
  45. CPPUNIT_ASSERT_EQUAL(message1, std::string(readbuffer));
  46. }
  47. {
  48. ssize_t rlength = s.readDataFrom(readbuffer, sizeof(readbuffer), peer);
  49. CPPUNIT_ASSERT_EQUAL((ssize_t)message2.size(), rlength);
  50. readbuffer[rlength] = '\0';
  51. CPPUNIT_ASSERT_EQUAL(message2, std::string(readbuffer));
  52. }
  53. } catch(Exception& e) {
  54. std::cerr << e.stackTrace() << std::endl;
  55. CPPUNIT_FAIL("exception thrown");
  56. }
  57. }
  58. void SocketCoreTest::testGetSocketError()
  59. {
  60. SocketCore s;
  61. s.bind(0);
  62. // See there is no error at this point
  63. CPPUNIT_ASSERT_EQUAL(std::string(""), s.getSocketError());
  64. }
  65. void SocketCoreTest::testInetNtop()
  66. {
  67. char dest[NI_MAXHOST];
  68. {
  69. std::string s = "192.168.0.1";
  70. addrinfo* res;
  71. CPPUNIT_ASSERT_EQUAL(0, callGetaddrinfo(&res, s.c_str(), 0, AF_INET,
  72. SOCK_STREAM, 0, 0));
  73. WSAAPI_AUTO_DELETE<struct addrinfo*> resDeleter(res, freeaddrinfo);
  74. sockaddr_in addr;
  75. memcpy(&addr, res->ai_addr, sizeof(addr));
  76. CPPUNIT_ASSERT_EQUAL(0, inetNtop(AF_INET, &addr.sin_addr,
  77. dest, sizeof(dest)));
  78. CPPUNIT_ASSERT_EQUAL(s, std::string(dest));
  79. }
  80. {
  81. std::string s = "2001:db8::2:1";
  82. addrinfo* res;
  83. CPPUNIT_ASSERT_EQUAL(0, callGetaddrinfo(&res, s.c_str(), 0, AF_INET6,
  84. SOCK_STREAM, 0, 0));
  85. WSAAPI_AUTO_DELETE<struct addrinfo*> resDeleter(res, freeaddrinfo);
  86. sockaddr_in6 addr;
  87. memcpy(&addr, res->ai_addr, sizeof(addr));
  88. CPPUNIT_ASSERT_EQUAL(0, inetNtop(AF_INET6, &addr.sin6_addr,
  89. dest, sizeof(dest)));
  90. CPPUNIT_ASSERT_EQUAL(s, std::string(dest));
  91. }
  92. }
  93. void SocketCoreTest::testGetBinAddr()
  94. {
  95. unsigned char dest[16];
  96. unsigned char ans1[] = { 192, 168, 0, 1 };
  97. CPPUNIT_ASSERT_EQUAL((size_t)4, net::getBinAddr(dest, "192.168.0.1"));
  98. CPPUNIT_ASSERT(std::equal(&dest[0], &dest[4], &ans1[0]));
  99. unsigned char ans2[] = { 0x20u, 0x01u, 0x0du, 0xb8u,
  100. 0x00u, 0x00u, 0x00u, 0x00u,
  101. 0x00u, 0x00u, 0x00u, 0x00u,
  102. 0x00u, 0x02u, 0x00u, 0x01u };
  103. CPPUNIT_ASSERT_EQUAL((size_t)16, net::getBinAddr(dest, "2001:db8::2:1"));
  104. CPPUNIT_ASSERT(std::equal(&dest[0], &dest[16], &ans2[0]));
  105. CPPUNIT_ASSERT_EQUAL((size_t)0, net::getBinAddr(dest, "localhost"));
  106. }
  107. } // namespace aria2