1#!/usr/bin/env python3 2# 3# Copyright (C) 2018 The Android Open Source Project 4# 5# Licensed under the Apache License, Version 2.0 (the "License"); you may not 6# use this file except in compliance with the License. You may obtain a copy of 7# the License at 8# 9# http://www.apache.org/licenses/LICENSE-2.0 10# 11# Unless required by applicable law or agreed to in writing, software 12# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 13# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 14# License for the specific language governing permissions and limitations under 15# the License. 16""" 17Script for exercising various ping scenarios 18 19""" 20 21import os 22import threading 23import uuid 24 25from acts import signals 26from acts.controllers.access_point import setup_ap 27from acts.controllers.ap_lib import hostapd_constants 28from acts_contrib.test_utils.abstract_devices.wlan_device import create_wlan_device 29from acts_contrib.test_utils.abstract_devices.wlan_device_lib.AbstractDeviceWlanDeviceBaseTest import AbstractDeviceWlanDeviceBaseTest 30from acts_contrib.test_utils.tel.tel_test_utils import setup_droid_properties 31from acts_contrib.test_utils.fuchsia import utils 32from acts.utils import rand_ascii_str 33 34 35class PingStressTest(AbstractDeviceWlanDeviceBaseTest): 36 # Timeout for ping thread in seconds 37 ping_thread_timeout_s = 60 * 5 38 39 # List to capture ping results 40 ping_threads_result = [] 41 42 # IP addresses used in pings 43 google_dns_1 = '8.8.8.8' 44 google_dns_2 = '8.8.4.4' 45 46 def setup_class(self): 47 super().setup_class() 48 49 self.ssid = rand_ascii_str(10) 50 self.dut = create_wlan_device(self.fuchsia_devices[0]) 51 self.access_point = self.access_points[0] 52 setup_ap(access_point=self.access_point, 53 profile_name='whirlwind', 54 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G, 55 ssid=self.ssid, 56 setup_bridge=True) 57 self.dut.associate(self.ssid) 58 59 def teardown_class(self): 60 self.dut.disconnect() 61 self.dut.reset_wifi() 62 self.download_ap_logs() 63 self.access_point.stop_all_aps() 64 65 def send_ping(self, 66 dest_ip, 67 count=3, 68 interval=1000, 69 timeout=1000, 70 size=25): 71 self.log.info('Attempting to ping %s...' % dest_ip) 72 ping_result = self.dut.can_ping(dest_ip, count, interval, timeout, 73 size) 74 if ping_result: 75 self.log.info('Ping was successful.') 76 else: 77 if '8.8' in dest_ip: 78 raise signals.TestFailure('Ping was unsuccessful. Consider ' 79 'possibility of server failure.') 80 else: 81 raise signals.TestFailure('Ping was unsuccessful.') 82 return True 83 84 def ping_thread(self, dest_ip): 85 self.log.info('Attempting to ping %s...' % dest_ip) 86 ping_result = self.dut.can_ping(dest_ip, count=10, size=50) 87 if ping_result: 88 self.log.info('Success pinging: %s' % dest_ip) 89 else: 90 self.log.info('Failure pinging: %s' % dest_ip) 91 92 self.ping_threads_result.append(ping_result) 93 94 def test_simple_ping(self): 95 return self.send_ping(self.google_dns_1) 96 97 def test_ping_local(self): 98 return self.send_ping('127.0.0.1') 99 100 def test_ping_AP(self): 101 return self.send_ping(self.access_point.ssh_settings.hostname) 102 103 def test_ping_with_params(self): 104 return self.send_ping(self.google_dns_1, 105 count=5, 106 interval=800, 107 size=50) 108 109 def test_long_ping(self): 110 return self.send_ping(self.google_dns_1, count=50) 111 112 def test_medium_packet_ping(self): 113 return self.send_ping(self.google_dns_1, size=64) 114 115 def test_medium_packet_long_ping(self): 116 return self.send_ping(self.google_dns_1, 117 count=50, 118 timeout=1500, 119 size=64) 120 121 def test_large_packet_ping(self): 122 return self.send_ping(self.google_dns_1, size=500) 123 124 def test_large_packet_long_ping(self): 125 return self.send_ping(self.google_dns_1, 126 count=50, 127 timeout=5000, 128 size=500) 129 130 def test_simultaneous_pings(self): 131 ping_urls = [ 132 self.google_dns_1, self.google_dns_2, self.google_dns_1, 133 self.google_dns_2 134 ] 135 ping_threads = [] 136 137 try: 138 # Start multiple ping at the same time 139 for index, url in enumerate(ping_urls): 140 self.log.info('Create and start thread %d.' % index) 141 t = threading.Thread(target=self.ping_thread, args=(url, )) 142 ping_threads.append(t) 143 t.start() 144 145 # Wait for all threads to complete or timeout 146 for t in ping_threads: 147 t.join(self.ping_thread_timeout_s) 148 149 finally: 150 is_alive = False 151 152 for index, t in enumerate(ping_threads): 153 if t.isAlive(): 154 t = None 155 is_alive = True 156 157 if is_alive: 158 raise signals.TestFailure('Thread %d timedout' % index) 159 160 for index in range(0, len(self.ping_threads_result)): 161 if not self.ping_threads_result[index]: 162 self.log.info("Ping failed for %d" % index) 163 raise signals.TestFailure('Thread %d failed to ping. ' 164 'Consider possibility of server ' 165 'failure' % index) 166 return True 167