1require 'test/unit'
2require 'socket'
3
4class TestSocketAncData < Test::Unit::TestCase
5  def test_int
6    ancdata = Socket::AncillaryData.int(0, 0, 0, 123)
7    assert_equal(123, ancdata.int)
8    assert_equal([123].pack("i"), ancdata.data)
9  end
10
11  def test_ip_pktinfo
12    addr = Addrinfo.ip("127.0.0.1")
13    ifindex = 0
14    spec_dst = Addrinfo.ip("127.0.0.2")
15    begin
16      ancdata = Socket::AncillaryData.ip_pktinfo(addr, ifindex, spec_dst)
17    rescue NotImplementedError
18      return
19    end
20    assert_equal(Socket::AF_INET, ancdata.family)
21    assert_equal(Socket::IPPROTO_IP, ancdata.level)
22    assert_equal(Socket::IP_PKTINFO, ancdata.type)
23    assert_equal(addr.ip_address, ancdata.ip_pktinfo[0].ip_address)
24    assert_equal(ifindex, ancdata.ip_pktinfo[1])
25    assert_equal(spec_dst.ip_address, ancdata.ip_pktinfo[2].ip_address)
26    assert(ancdata.cmsg_is?(:IP, :PKTINFO))
27    assert(ancdata.cmsg_is?("IP", "PKTINFO"))
28    assert(ancdata.cmsg_is?(Socket::IPPROTO_IP, Socket::IP_PKTINFO))
29    if defined? Socket::IPV6_PKTINFO
30      assert(!ancdata.cmsg_is?(:IPV6, :PKTINFO))
31    end
32    ancdata2 = Socket::AncillaryData.ip_pktinfo(addr, ifindex)
33    assert_equal(addr.ip_address, ancdata2.ip_pktinfo[2].ip_address)
34  end
35
36  def test_ipv6_pktinfo
37    addr = Addrinfo.ip("::1")
38    ifindex = 0
39    begin
40      ancdata = Socket::AncillaryData.ipv6_pktinfo(addr, ifindex)
41    rescue NotImplementedError
42      return
43    end
44    assert_equal(Socket::AF_INET6, ancdata.family)
45    assert_equal(Socket::IPPROTO_IPV6, ancdata.level)
46    assert_equal(Socket::IPV6_PKTINFO, ancdata.type)
47    assert_equal(addr.ip_address, ancdata.ipv6_pktinfo[0].ip_address)
48    assert_equal(ifindex, ancdata.ipv6_pktinfo[1])
49    assert_equal(addr.ip_address, ancdata.ipv6_pktinfo_addr.ip_address)
50    assert_equal(ifindex, ancdata.ipv6_pktinfo_ifindex)
51    assert(ancdata.cmsg_is?(:IPV6, :PKTINFO))
52    assert(ancdata.cmsg_is?("IPV6", "PKTINFO"))
53    assert(ancdata.cmsg_is?(Socket::IPPROTO_IPV6, Socket::IPV6_PKTINFO))
54    if defined? Socket::IP_PKTINFO
55      assert(!ancdata.cmsg_is?(:IP, :PKTINFO))
56    end
57  end
58
59  if defined?(Socket::SCM_RIGHTS) && defined?(Socket::SCM_TIMESTAMP)
60    def test_unix_rights
61      assert_raise(TypeError) {
62        Socket::AncillaryData.int(:UNIX, :SOL_SOCKET, :TIMESTAMP, 1).unix_rights
63      }
64    end
65  end
66end if defined? Socket::AncillaryData
67