SocketCoreTest.cc 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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_SUITE_END();
  14. public:
  15. void setUp() {}
  16. void tearDown() {}
  17. void testWriteAndReadDatagram();
  18. void testGetSocketError();
  19. void testInetNtop();
  20. };
  21. CPPUNIT_TEST_SUITE_REGISTRATION(SocketCoreTest);
  22. void SocketCoreTest::testWriteAndReadDatagram()
  23. {
  24. try {
  25. SocketCore s(SOCK_DGRAM);
  26. s.bind(0);
  27. SocketCore c(SOCK_DGRAM);
  28. c.bind(0);
  29. std::pair<std::string, uint16_t> svaddr;
  30. s.getAddrInfo(svaddr);
  31. std::string message1 = "hello world.";
  32. c.writeData(message1.c_str(), message1.size(), "localhost", svaddr.second);
  33. std::string message2 = "chocolate coated pie";
  34. c.writeData(message2.c_str(), message2.size(), "localhost", svaddr.second);
  35. char readbuffer[100];
  36. std::pair<std::string, uint16_t> peer;
  37. {
  38. ssize_t rlength = s.readDataFrom(readbuffer, sizeof(readbuffer), peer);
  39. // commented out because ip address may vary
  40. //CPPUNIT_ASSERT_EQUAL(std::std::string("127.0.0.1"), peer.first);
  41. CPPUNIT_ASSERT_EQUAL((ssize_t)message1.size(), rlength);
  42. readbuffer[rlength] = '\0';
  43. CPPUNIT_ASSERT_EQUAL(message1, std::string(readbuffer));
  44. }
  45. {
  46. ssize_t rlength = s.readDataFrom(readbuffer, sizeof(readbuffer), peer);
  47. CPPUNIT_ASSERT_EQUAL((ssize_t)message2.size(), rlength);
  48. readbuffer[rlength] = '\0';
  49. CPPUNIT_ASSERT_EQUAL(message2, std::string(readbuffer));
  50. }
  51. } catch(Exception& e) {
  52. std::cerr << e.stackTrace() << std::endl;
  53. CPPUNIT_FAIL("exception thrown");
  54. }
  55. }
  56. void SocketCoreTest::testGetSocketError()
  57. {
  58. SocketCore s;
  59. s.bind(0);
  60. // See there is no error at this point
  61. CPPUNIT_ASSERT_EQUAL(std::string(""), s.getSocketError());
  62. }
  63. void SocketCoreTest::testInetNtop()
  64. {
  65. char dest[NI_MAXHOST];
  66. {
  67. std::string s = "192.168.0.1";
  68. addrinfo* res;
  69. CPPUNIT_ASSERT_EQUAL(0, callGetaddrinfo(&res, s.c_str(), 0, AF_INET,
  70. SOCK_STREAM, 0, 0));
  71. WSAAPI_AUTO_DELETE<struct addrinfo*> resDeleter(res, freeaddrinfo);
  72. sockaddr_in addr;
  73. memcpy(&addr, res->ai_addr, sizeof(addr));
  74. CPPUNIT_ASSERT_EQUAL(0, inetNtop(AF_INET, &addr.sin_addr,
  75. dest, sizeof(dest)));
  76. CPPUNIT_ASSERT_EQUAL(s, std::string(dest));
  77. }
  78. {
  79. std::string s = "2001:db8::2:1";
  80. addrinfo* res;
  81. CPPUNIT_ASSERT_EQUAL(0, callGetaddrinfo(&res, s.c_str(), 0, AF_INET6,
  82. SOCK_STREAM, 0, 0));
  83. WSAAPI_AUTO_DELETE<struct addrinfo*> resDeleter(res, freeaddrinfo);
  84. sockaddr_in6 addr;
  85. memcpy(&addr, res->ai_addr, sizeof(addr));
  86. CPPUNIT_ASSERT_EQUAL(0, inetNtop(AF_INET6, &addr.sin6_addr,
  87. dest, sizeof(dest)));
  88. CPPUNIT_ASSERT_EQUAL(s, std::string(dest));
  89. }
  90. }
  91. } // namespace aria2