xref: /aosp_15_r20/kernel/tests/net/test/csocket_test.py (revision 2f2c4c7ab4226c71756b9c31670392fdd6887c4f)
1*2f2c4c7aSAndroid Build Coastguard Worker#!/usr/bin/python3
2*2f2c4c7aSAndroid Build Coastguard Worker#
3*2f2c4c7aSAndroid Build Coastguard Worker# Copyright 2016 The Android Open Source Project
4*2f2c4c7aSAndroid Build Coastguard Worker#
5*2f2c4c7aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
6*2f2c4c7aSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
7*2f2c4c7aSAndroid Build Coastguard Worker# You may obtain a copy of the License at
8*2f2c4c7aSAndroid Build Coastguard Worker#
9*2f2c4c7aSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0
10*2f2c4c7aSAndroid Build Coastguard Worker#
11*2f2c4c7aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
12*2f2c4c7aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
13*2f2c4c7aSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*2f2c4c7aSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
15*2f2c4c7aSAndroid Build Coastguard Worker# limitations under the License.
16*2f2c4c7aSAndroid Build Coastguard Worker
17*2f2c4c7aSAndroid Build Coastguard Worker"""Unit tests for csocket."""
18*2f2c4c7aSAndroid Build Coastguard Worker
19*2f2c4c7aSAndroid Build Coastguard Workerimport socket
20*2f2c4c7aSAndroid Build Coastguard Worker# pylint: disable=g-importing-member
21*2f2c4c7aSAndroid Build Coastguard Workerfrom socket import AF_INET
22*2f2c4c7aSAndroid Build Coastguard Workerfrom socket import AF_INET6
23*2f2c4c7aSAndroid Build Coastguard Workerfrom socket import inet_pton
24*2f2c4c7aSAndroid Build Coastguard Workerfrom socket import SOCK_DGRAM
25*2f2c4c7aSAndroid Build Coastguard Workerfrom socket import SOL_IP
26*2f2c4c7aSAndroid Build Coastguard Worker# pylint: enable=g-importing-member
27*2f2c4c7aSAndroid Build Coastguard Worker
28*2f2c4c7aSAndroid Build Coastguard Workerimport unittest
29*2f2c4c7aSAndroid Build Coastguard Worker
30*2f2c4c7aSAndroid Build Coastguard Workerimport csocket
31*2f2c4c7aSAndroid Build Coastguard Worker
32*2f2c4c7aSAndroid Build Coastguard Worker
33*2f2c4c7aSAndroid Build Coastguard WorkerLOOPBACK_IFINDEX = 1
34*2f2c4c7aSAndroid Build Coastguard WorkerSOL_IPV6 = 41
35*2f2c4c7aSAndroid Build Coastguard Worker
36*2f2c4c7aSAndroid Build Coastguard Worker
37*2f2c4c7aSAndroid Build Coastguard Workerclass CsocketTest(unittest.TestCase):
38*2f2c4c7aSAndroid Build Coastguard Worker
39*2f2c4c7aSAndroid Build Coastguard Worker  def _BuildSocket(self, family, addr):
40*2f2c4c7aSAndroid Build Coastguard Worker    s = socket.socket(family, SOCK_DGRAM, 0)
41*2f2c4c7aSAndroid Build Coastguard Worker    s.bind((addr, 0))
42*2f2c4c7aSAndroid Build Coastguard Worker    return s
43*2f2c4c7aSAndroid Build Coastguard Worker
44*2f2c4c7aSAndroid Build Coastguard Worker  def CheckRecvfrom(self, family, addr):
45*2f2c4c7aSAndroid Build Coastguard Worker    s = self._BuildSocket(family, addr)
46*2f2c4c7aSAndroid Build Coastguard Worker    addr = s.getsockname()
47*2f2c4c7aSAndroid Build Coastguard Worker    sockaddr = csocket.Sockaddr(addr)
48*2f2c4c7aSAndroid Build Coastguard Worker    s.sendto(b"foo", addr)
49*2f2c4c7aSAndroid Build Coastguard Worker    data, addr = csocket.Recvfrom(s, 4096, 0)
50*2f2c4c7aSAndroid Build Coastguard Worker    self.assertEqual(b"foo", data)
51*2f2c4c7aSAndroid Build Coastguard Worker    self.assertEqual(sockaddr, addr)
52*2f2c4c7aSAndroid Build Coastguard Worker
53*2f2c4c7aSAndroid Build Coastguard Worker    s.close()
54*2f2c4c7aSAndroid Build Coastguard Worker
55*2f2c4c7aSAndroid Build Coastguard Worker  def testRecvfrom(self):
56*2f2c4c7aSAndroid Build Coastguard Worker    self.CheckRecvfrom(AF_INET, "127.0.0.1")
57*2f2c4c7aSAndroid Build Coastguard Worker    self.CheckRecvfrom(AF_INET6, "::1")
58*2f2c4c7aSAndroid Build Coastguard Worker
59*2f2c4c7aSAndroid Build Coastguard Worker  def CheckRecvmsg(self, family, addr):
60*2f2c4c7aSAndroid Build Coastguard Worker    s = self._BuildSocket(family, addr)
61*2f2c4c7aSAndroid Build Coastguard Worker
62*2f2c4c7aSAndroid Build Coastguard Worker    if family == AF_INET:
63*2f2c4c7aSAndroid Build Coastguard Worker      s.setsockopt(SOL_IP, csocket.IP_PKTINFO, 1)
64*2f2c4c7aSAndroid Build Coastguard Worker      s.setsockopt(SOL_IP, csocket.IP_RECVTTL, 1)
65*2f2c4c7aSAndroid Build Coastguard Worker      pktinfo_addr = inet_pton(AF_INET, addr)
66*2f2c4c7aSAndroid Build Coastguard Worker      pktinfo = (SOL_IP, csocket.IP_PKTINFO,
67*2f2c4c7aSAndroid Build Coastguard Worker                 csocket.InPktinfo((LOOPBACK_IFINDEX,
68*2f2c4c7aSAndroid Build Coastguard Worker                                    pktinfo_addr, pktinfo_addr)))
69*2f2c4c7aSAndroid Build Coastguard Worker      ttl = (SOL_IP, csocket.IP_TTL, 64)
70*2f2c4c7aSAndroid Build Coastguard Worker    elif family == AF_INET6:
71*2f2c4c7aSAndroid Build Coastguard Worker      s.setsockopt(SOL_IPV6, csocket.IPV6_RECVPKTINFO, 1)
72*2f2c4c7aSAndroid Build Coastguard Worker      s.setsockopt(SOL_IPV6, csocket.IPV6_RECVHOPLIMIT, 1)
73*2f2c4c7aSAndroid Build Coastguard Worker      pktinfo_addr = inet_pton(AF_INET6, addr)
74*2f2c4c7aSAndroid Build Coastguard Worker      pktinfo = (SOL_IPV6, csocket.IPV6_PKTINFO,
75*2f2c4c7aSAndroid Build Coastguard Worker                 csocket.In6Pktinfo((pktinfo_addr, LOOPBACK_IFINDEX)))
76*2f2c4c7aSAndroid Build Coastguard Worker      ttl = (SOL_IPV6, csocket.IPV6_HOPLIMIT, 64)
77*2f2c4c7aSAndroid Build Coastguard Worker
78*2f2c4c7aSAndroid Build Coastguard Worker    addr = s.getsockname()
79*2f2c4c7aSAndroid Build Coastguard Worker    sockaddr = csocket.Sockaddr(addr)
80*2f2c4c7aSAndroid Build Coastguard Worker    s.sendto(b"foo", addr)
81*2f2c4c7aSAndroid Build Coastguard Worker    data, addr, cmsg = csocket.Recvmsg(s, 4096, 1024, 0)
82*2f2c4c7aSAndroid Build Coastguard Worker    self.assertEqual(b"foo", data)
83*2f2c4c7aSAndroid Build Coastguard Worker    self.assertEqual(sockaddr, addr)
84*2f2c4c7aSAndroid Build Coastguard Worker    self.assertEqual([pktinfo, ttl], cmsg)
85*2f2c4c7aSAndroid Build Coastguard Worker
86*2f2c4c7aSAndroid Build Coastguard Worker    s.close()
87*2f2c4c7aSAndroid Build Coastguard Worker
88*2f2c4c7aSAndroid Build Coastguard Worker  def testRecvmsg(self):
89*2f2c4c7aSAndroid Build Coastguard Worker    self.CheckRecvmsg(AF_INET, "127.0.0.1")
90*2f2c4c7aSAndroid Build Coastguard Worker    self.CheckRecvmsg(AF_INET6, "::1")
91*2f2c4c7aSAndroid Build Coastguard Worker
92*2f2c4c7aSAndroid Build Coastguard Worker
93*2f2c4c7aSAndroid Build Coastguard Workerif __name__ == "__main__":
94*2f2c4c7aSAndroid Build Coastguard Worker  unittest.main()
95