Home | History | Annotate | Download | only in net
      1 #
      2 #   Copyright 2018 - The Android Open Source Project
      3 #
      4 #   Licensed under the Apache License, Version 2.0 (the "License");
      5 #   you may not use this file except in compliance with the License.
      6 #   You may obtain a copy of the License at
      7 #
      8 #       http://www.apache.org/licenses/LICENSE-2.0
      9 #
     10 #   Unless required by applicable law or agreed to in writing, software
     11 #   distributed under the License is distributed on an "AS IS" BASIS,
     12 #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 #   See the License for the specific language governing permissions and
     14 #   limitations under the License.
     15 
     16 import queue
     17 import re
     18 import threading
     19 import time
     20 
     21 from acts.test_utils.net import connectivity_const as cconst
     22 from acts import asserts
     23 
     24 MSG = "Test message "
     25 PKTS = 5
     26 
     27 """ Methods for android.system.Os based sockets """
     28 def open_android_socket(ad, domain, sock_type, ip, port):
     29     """ Open TCP or UDP using android.system.Os class
     30 
     31     Args:
     32       1. ad - android device object
     33       2. domain - IPv4 or IPv6 type
     34       3. sock_type - UDP or TCP socket
     35       4. ip - IP addr on the device
     36       5. port - open socket on port
     37 
     38     Returns:
     39       File descriptor key
     40     """
     41     fd_key = ad.droid.openSocket(domain, sock_type, ip, port)
     42     ad.log.info("File descriptor: %s" % fd_key)
     43     asserts.assert_true(fd_key, "Failed to open socket")
     44     return fd_key
     45 
     46 def close_android_socket(ad, fd_key):
     47     """ Close socket
     48 
     49     Args:
     50       1. ad - android device object
     51       2. fd_key - file descriptor key
     52     """
     53     status = ad.droid.closeSocket(fd_key)
     54     asserts.assert_true(status, "Failed to close socket")
     55 
     56 def listen_accept_android_socket(client,
     57                                  server,
     58                                  client_fd,
     59                                  server_fd,
     60                                  server_ip,
     61                                  server_port):
     62     """ Listen, accept TCP sockets
     63 
     64     Args:
     65       1. client : ad object for client device
     66       2. server : ad object for server device
     67       3. client_fd : client's socket handle
     68       4. server_fd : server's socket handle
     69       5. server_ip : send data to this IP
     70       6. server_port : send data to this port
     71     """
     72     server.droid.listenSocket(server_fd)
     73     client.droid.connectSocket(client_fd, server_ip, server_port)
     74     sock = server.droid.acceptSocket(server_fd)
     75     asserts.assert_true(sock, "Failed to accept socket")
     76     return sock
     77 
     78 def send_recv_data_android_sockets(client,
     79                                    server,
     80                                    client_fd,
     81                                    server_fd,
     82                                    server_ip,
     83                                    server_port):
     84     """ Send TCP or UDP data over android os sockets from client to server.
     85         Verify that server received the data.
     86 
     87     Args:
     88       1. client : ad object for client device
     89       2. server : ad object for server device
     90       3. client_fd : client's socket handle
     91       4. server_fd : server's socket handle
     92       5. server_ip : send data to this IP
     93       6. server_port : send data to this port
     94     """
     95     send_list = []
     96     recv_list = []
     97 
     98     for _ in range(1, PKTS+1):
     99         msg = MSG + " %s" % _
    100         send_list.append(msg)
    101         client.log.info("Sending message: %s" % msg)
    102         client.droid.sendDataOverSocket(server_ip, server_port, msg, client_fd)
    103         recv_msg = server.droid.recvDataOverSocket(server_fd)
    104         server.log.info("Received message: %s" % recv_msg)
    105         recv_list.append(recv_msg)
    106 
    107     recv_list = [x.rstrip('\x00') if x else x for x in recv_list]
    108     asserts.assert_true(send_list and recv_list and send_list == recv_list,
    109                         "Send and recv information is incorrect")
    110 
    111 """ Methods for java.net.DatagramSocket based sockets """
    112 def open_datagram_socket(ad, ip, port):
    113     """ Open datagram socket
    114 
    115     Args:
    116       1. ad : android device object
    117       2. ip : IP addr on the device
    118       3. port : socket port
    119 
    120     Returns:
    121       Hash key of the datagram socket
    122     """
    123     socket_key = ad.droid.openDatagramSocket(ip, port)
    124     ad.log.info("Datagram socket: %s" % socket_key)
    125     asserts.assert_true(socket_key, "Failed to open datagram socket")
    126     return socket_key
    127 
    128 def close_datagram_socket(ad, socket_key):
    129     """ Close datagram socket
    130 
    131     Args:
    132       1. socket_key : hash key of datagram socket
    133     """
    134     status = ad.droid.closeDatagramSocket(socket_key)
    135     asserts.assert_true(status, "Failed to close datagram socket")
    136 
    137 def send_recv_data_datagram_sockets(client,
    138                                     server,
    139                                     client_sock,
    140                                     server_sock,
    141                                     server_ip,
    142                                     server_port):
    143     """ Send data over datagram socket from dut_a to dut_b.
    144         Verify that dut_b received the data.
    145 
    146     Args:
    147       1. client : ad object for client device
    148       2. server : ad object for server device
    149       3. client_sock : client's socket handle
    150       4. server_sock : server's socket handle
    151       5. server_ip : send data to this IP
    152       6. server_port : send data to this port
    153     """
    154     send_list = []
    155     recv_list = []
    156 
    157     for _ in range(1, PKTS+1):
    158         msg = MSG + " %s" % _
    159         send_list.append(msg)
    160         client.log.info("Sending message: %s" % msg)
    161         client.droid.sendDataOverDatagramSocket(client_sock,
    162                                                 msg,
    163                                                 server_ip,
    164                                                 server_port)
    165         recv_msg = server.droid.recvDataOverDatagramSocket(server_sock)
    166         server.log.info("Received message: %s" % recv_msg)
    167         recv_list.append(recv_msg)
    168 
    169     recv_list = [x.rstrip('\x00') if x else x for x in recv_list]
    170     asserts.assert_true(send_list and recv_list and send_list == recv_list,
    171                         "Send and recv information is incorrect")
    172 
    173 """ Utils methods for java.net.Socket based sockets """
    174 def _accept_socket(server, server_ip, server_port, server_sock, q):
    175     sock = server.droid.acceptTcpSocket(server_sock)
    176     server.log.info("Server socket: %s" % sock)
    177     q.put(sock)
    178 
    179 def _client_socket(client, server_ip, server_port, client_ip, client_port, q):
    180     time.sleep(0.5)
    181     sock = client.droid.openTcpSocket(server_ip,
    182                                       server_port,
    183                                       client_ip,
    184                                       client_port)
    185     client.log.info("Client socket: %s" % sock)
    186     q.put(sock)
    187 
    188 def open_connect_socket(client,
    189                         server,
    190                         client_ip,
    191                         server_ip,
    192                         client_port,
    193                         server_port,
    194                         server_sock):
    195     """ Open tcp socket and connect to server
    196 
    197     Args:
    198       1. client : ad object for client device
    199       2. server : ad object for server device
    200       3. client_ip : client's socket handle
    201       4. server_ip : send data to this IP
    202       5. client_port : port on client socket
    203       6. server_port : port on server socket
    204       7. server_sock : server socket
    205 
    206     Returns:
    207       client and server socket from successful connect
    208     """
    209     sq = queue.Queue()
    210     cq = queue.Queue()
    211     s = threading.Thread(target = _accept_socket,
    212                          args = (server, server_ip, server_port, server_sock,
    213                                  sq))
    214     c = threading.Thread(target = _client_socket,
    215                          args = (client, server_ip, server_port, client_ip,
    216                                  client_port, cq))
    217     s.start()
    218     c.start()
    219     c.join()
    220     s.join()
    221 
    222     client_sock = cq.get()
    223     server_sock = sq.get()
    224     asserts.assert_true(client_sock and server_sock, "Failed to open sockets")
    225 
    226     return client_sock, server_sock
    227 
    228 def open_server_socket(server, server_ip, server_port):
    229     """ Open tcp server socket
    230 
    231     Args:
    232       1. server : ad object for server device
    233       2. server_ip : send data to this IP
    234       3. server_port : send data to this port
    235     """
    236     sock = server.droid.openTcpServerSocket(server_ip, server_port)
    237     server.log.info("Server Socket: %s" % sock)
    238     asserts.assert_true(sock, "Failed to open server socket")
    239     return sock
    240 
    241 def close_socket(ad, socket):
    242     """ Close socket
    243 
    244     Args:
    245       1. ad - android device object
    246       2. socket - socket key
    247     """
    248     status = ad.droid.closeTcpSocket(socket)
    249     asserts.assert_true(status, "Failed to socket")
    250 
    251 def close_server_socket(ad, socket):
    252     """ Close server socket
    253 
    254     Args:
    255       1. ad - android device object
    256       2. socket - server socket key
    257     """
    258     status = ad.droid.closeTcpServerSocket(socket)
    259     asserts.assert_true(status, "Failed to socket")
    260 
    261 def send_recv_data_sockets(client, server, client_sock, server_sock):
    262     """ Send data over TCP socket from client to server.
    263         Verify that server received the data
    264 
    265     Args:
    266       1. client : ad object for client device
    267       2. server : ad object for server device
    268       3. client_sock : client's socket handle
    269       4. server_sock : server's socket handle
    270     """
    271     send_list = []
    272     recv_list = []
    273 
    274     for _ in range(1, PKTS+1):
    275         msg = MSG + " %s" % _
    276         send_list.append(msg)
    277         client.log.info("Sending message: %s" % msg)
    278         client.droid.sendDataOverTcpSocket(client_sock, msg)
    279         recv_msg = server.droid.recvDataOverTcpSocket(server_sock)
    280         server.log.info("Received message: %s" % recv_msg)
    281         recv_list.append(recv_msg)
    282 
    283     recv_list = [x.rstrip('\x00') if x else x for x in recv_list]
    284     asserts.assert_true(send_list and recv_list and send_list == recv_list,
    285                         "Send and recv information is incorrect")
    286