summaryrefslogtreecommitdiff
path: root/tests/INET_Addr_Test.cpp
blob: f0d699072481360052824bf4d989d1db6df6dc74 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// $Id$

// ============================================================================
//
// = LIBRARY
//    tests
//
// = FILENAME
//    INET_Addr_Test.cpp
//
// = DESCRIPTION
//     Performs several tests on the ACE_INET_Addr class.  It creates several
//     IPv4 and IPv6 addresses and checks that the address formed by the
//     class is valid.
//
// = AUTHOR
//    John Aughey (jha@aughey.com)
//
// ============================================================================

#include "test_config.h"
#include "ace/OS.h"
#include "ace/INET_Addr.h"
#include "ace/Log_Msg.h"


int ACE_TMAIN (int argc, ACE_TCHAR *argv[])
{
  ACE_UNUSED_ARG (argc);
  ACE_UNUSED_ARG (argv);

  ACE_START_TEST (ACE_TEXT ("INET_Addr_Test"));

  int status = 0;     // Innocent until proven guilty

  const char *ipv4_addresses[] = {
    "127.0.0.1", "138.38.180.251", "64.219.54.121", "192.0.0.1", "10.0.0.1", 0
  };

  ACE_INET_Addr addr;

  for (int i=0; ipv4_addresses[i] != 0; i++) {
    struct in_addr addrv4;
    ACE_UINT32 addr32;

    ACE_OS::inet_pton (AF_INET, ipv4_addresses[i], &addrv4);

    ACE_OS::memcpy (&addr32, &addrv4, sizeof (addr32));

    addr.set (80, ipv4_addresses[i]);

    /*
    ** Now check to make sure get_ip_address matches and get_host_addr
    ** matches.
    */
    if (addr.get_ip_address () != ACE_HTONL (addr32))
      {
        ACE_ERROR ((LM_ERROR,
                    ACE_TEXT ("Error: %s failed get_ip_address() check\n")
                    ACE_TEXT ("0x%x != 0x%x\n"),
                    ipv4_addresses[i],
                    addr.get_ip_address (),
                    addr32));
        status = 1;
      }

    if (0 != ACE_OS::strcmp (addr.get_host_addr(), ipv4_addresses[i]))
      {
        ACE_ERROR ((LM_ERROR,
                    ACE_TEXT ("%s failed get_host_addr() check\n")
                    ACE_TEXT ("%s != %s\n"),
                    ipv4_addresses[i],
                    addr.get_host_addr (),
                    ipv4_addresses[i]));
        status = 1;
      }

    // Clear out the address by setting it to 1 and check
    addr.set (0, ACE_UINT32 (1), 1);
    if (addr.get_ip_address () != 1)
      {
        ACE_ERROR ((LM_ERROR, ACE_TEXT ("Failed to set address to 1\n")));
        status = 1;
      }

    // Now set the address using a 32 bit number and check that we get
    // the right string out of get_host_addr().
    addr.set (80, addr32, 0); // addr32 is already in network byte order
    if (0 != ACE_OS::strcmp (addr.get_host_addr (), ipv4_addresses[i]))
      {
        ACE_ERROR ((LM_ERROR,
                    ACE_TEXT ("%s failed second get_host_addr() check\n")
                    ACE_TEXT ("%s != %s\n"),
                    ipv4_addresses[i],
                    addr.get_host_addr (),
                    ipv4_addresses[i]));
        status = 1;
      }
  }

#if defined (ACE_HAS_IPV6)
  if (ACE_Sock_Connect::ipv6_enabled ())
    {
      const char *ipv6_addresses[] = {
        "1080::8:800:200c:417a", // unicast address
        "ff01::101",             // multicast address
        "::1",                   // loopback address
        "::",                    // unspecified addresses
        0
      };

      for (int i=0; ipv6_addresses[i] != 0; i++)
        {
          ACE_INET_Addr addr (80, ipv6_addresses[i]);

          if (0 != ACE_OS::strcmp (addr.get_host_addr (), ipv6_addresses[i]))
            {
              ACE_ERROR ((LM_ERROR,
                          ACE_TEXT ("IPv6 get_host_addr failed: %s != %s\n"),
                          addr.get_host_addr (),
                          ipv6_addresses[i]));
              status = 1;
            }
        }
    }

#endif

  ACE_END_TEST;

  return status;
}