io_service_unittest.cc 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. // Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
  2. //
  3. // Permission to use, copy, modify, and/or distribute this software for any
  4. // purpose with or without fee is hereby granted, provided that the above
  5. // copyright notice and this permission notice appear in all copies.
  6. //
  7. // THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
  8. // REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
  9. // AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
  10. // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  11. // LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
  12. // OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  13. // PERFORMANCE OF THIS SOFTWARE.
  14. #include <config.h>
  15. #include <gtest/gtest.h>
  16. #include <asio.hpp>
  17. #include <asiolink/asiolink.h>
  18. using namespace asiolink;
  19. const char* const TEST_SERVER_PORT = "53535";
  20. const char* const TEST_CLIENT_PORT = "53536";
  21. const char* const TEST_IPV6_ADDR = "::1";
  22. const char* const TEST_IPV4_ADDR = "127.0.0.1";
  23. TEST(IOServiceTest, badPort) {
  24. IOService io_service;
  25. EXPECT_THROW(DNSService(io_service, *"65536", true, false, NULL, NULL, NULL), IOError);
  26. EXPECT_THROW(DNSService(io_service, *"53210.0", true, false, NULL, NULL, NULL), IOError);
  27. EXPECT_THROW(DNSService(io_service, *"-1", true, false, NULL, NULL, NULL), IOError);
  28. EXPECT_THROW(DNSService(io_service, *"domain", true, false, NULL, NULL, NULL), IOError);
  29. }
  30. TEST(IOServiceTest, badAddress) {
  31. IOService io_service;
  32. EXPECT_THROW(DNSService(io_service, *TEST_SERVER_PORT, *"192.0.2.1.1", NULL, NULL, NULL), IOError);
  33. EXPECT_THROW(DNSService(io_service, *TEST_SERVER_PORT, *"2001:db8:::1", NULL, NULL, NULL), IOError);
  34. EXPECT_THROW(DNSService(io_service, *TEST_SERVER_PORT, *"localhost", NULL, NULL, NULL), IOError);
  35. }
  36. TEST(IOServiceTest, unavailableAddress) {
  37. IOService io_service;
  38. // These addresses should generally be unavailable as a valid local
  39. // address, although there's no guarantee in theory.
  40. EXPECT_THROW(DNSService(io_service, *TEST_SERVER_PORT, *"192.0.2.0", NULL, NULL, NULL), IOError);
  41. // Some OSes would simply reject binding attempt for an AF_INET6 socket
  42. // to an IPv4-mapped IPv6 address. Even if those that allow it, since
  43. // the corresponding IPv4 address is the same as the one used in the
  44. // AF_INET socket case above, it should at least show the same result
  45. // as the previous one.
  46. EXPECT_THROW(DNSService(io_service, *TEST_SERVER_PORT, *"::ffff:192.0.2.0", NULL, NULL, NULL), IOError);
  47. }
  48. TEST(IOServiceTest, duplicateBind_v6) {
  49. // In each sub test case, second attempt should fail due to duplicate bind
  50. IOService io_service;
  51. // IPv6, "any" address
  52. DNSService* dns_service = new DNSService(io_service, *TEST_SERVER_PORT, false, true, NULL, NULL, NULL);
  53. EXPECT_THROW(DNSService(io_service, *TEST_SERVER_PORT, false, true, NULL, NULL, NULL), IOError);
  54. delete dns_service;
  55. }
  56. TEST(IOServiceTest, duplicateBind_v6_address) {
  57. // In each sub test case, second attempt should fail due to duplicate bind
  58. IOService io_service;
  59. // IPv6, specific address
  60. DNSService* dns_service = new DNSService(io_service, *TEST_SERVER_PORT, *TEST_IPV6_ADDR, NULL, NULL, NULL);
  61. EXPECT_THROW(DNSService(io_service, *TEST_SERVER_PORT, *TEST_IPV6_ADDR, NULL, NULL, NULL), IOError);
  62. delete dns_service;
  63. }
  64. TEST(IOServiceTest, duplicateBind_v4) {
  65. // In each sub test case, second attempt should fail due to duplicate bind
  66. IOService io_service;
  67. // IPv4, "any" address
  68. DNSService* dns_service = new DNSService(io_service, *TEST_SERVER_PORT, true, false, NULL, NULL, NULL);
  69. EXPECT_THROW(DNSService(io_service, *TEST_SERVER_PORT, true, false, NULL, NULL, NULL), IOError);
  70. delete dns_service;
  71. }
  72. TEST(IOServiceTest, duplicateBind_v4_address) {
  73. // In each sub test case, second attempt should fail due to duplicate bind
  74. IOService io_service;
  75. // IPv4, specific address
  76. DNSService* dns_service = new DNSService(io_service, *TEST_SERVER_PORT, *TEST_IPV4_ADDR, NULL, NULL, NULL);
  77. EXPECT_THROW(DNSService(io_service, *TEST_SERVER_PORT, *TEST_IPV4_ADDR, NULL, NULL, NULL), IOError);
  78. delete dns_service;
  79. }
  80. // Disabled because IPv4-mapped addresses don't seem to be working with
  81. // the IOService constructor
  82. TEST(IOServiceTest, DISABLED_IPv4MappedDuplicateBind) {
  83. IOService io_service;
  84. // Duplicate bind on IPv4-mapped IPv6 address
  85. DNSService* dns_service = new DNSService(io_service, *TEST_SERVER_PORT, *"127.0.0.1", NULL, NULL, NULL);
  86. EXPECT_THROW(DNSService(io_service, *TEST_SERVER_PORT, *"::ffff:127.0.0.1", NULL, NULL, NULL), IOError);
  87. delete dns_service;
  88. // XXX:
  89. // Currently, this throws an "invalid argument" exception. I have
  90. // not been able to get IPv4-mapped addresses to work.
  91. dns_service = new DNSService(io_service, *TEST_SERVER_PORT, *"::ffff:127.0.0.1", NULL, NULL, NULL);
  92. EXPECT_THROW(DNSService(io_service, *TEST_SERVER_PORT, *"127.0.0.1", NULL, NULL, NULL), IOError);
  93. delete dns_service;
  94. }