1*4a64e381SAndroid Build Coastguard Worker#!/usr/bin/env python3 2*4a64e381SAndroid Build Coastguard Worker# 3*4a64e381SAndroid Build Coastguard Worker# Copyright (c) 2020, The OpenThread Authors. 4*4a64e381SAndroid Build Coastguard Worker# All rights reserved. 5*4a64e381SAndroid Build Coastguard Worker# 6*4a64e381SAndroid Build Coastguard Worker# Redistribution and use in source and binary forms, with or without 7*4a64e381SAndroid Build Coastguard Worker# modification, are permitted provided that the following conditions are met: 8*4a64e381SAndroid Build Coastguard Worker# 1. Redistributions of source code must retain the above copyright 9*4a64e381SAndroid Build Coastguard Worker# notice, this list of conditions and the following disclaimer. 10*4a64e381SAndroid Build Coastguard Worker# 2. Redistributions in binary form must reproduce the above copyright 11*4a64e381SAndroid Build Coastguard Worker# notice, this list of conditions and the following disclaimer in the 12*4a64e381SAndroid Build Coastguard Worker# documentation and/or other materials provided with the distribution. 13*4a64e381SAndroid Build Coastguard Worker# 3. Neither the name of the copyright holder nor the 14*4a64e381SAndroid Build Coastguard Worker# names of its contributors may be used to endorse or promote products 15*4a64e381SAndroid Build Coastguard Worker# derived from this software without specific prior written permission. 16*4a64e381SAndroid Build Coastguard Worker# 17*4a64e381SAndroid Build Coastguard Worker# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 18*4a64e381SAndroid Build Coastguard Worker# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19*4a64e381SAndroid Build Coastguard Worker# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20*4a64e381SAndroid Build Coastguard Worker# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 21*4a64e381SAndroid Build Coastguard Worker# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22*4a64e381SAndroid Build Coastguard Worker# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23*4a64e381SAndroid Build Coastguard Worker# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24*4a64e381SAndroid Build Coastguard Worker# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25*4a64e381SAndroid Build Coastguard Worker# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26*4a64e381SAndroid Build Coastguard Worker# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27*4a64e381SAndroid Build Coastguard Worker# POSSIBILITY OF SUCH DAMAGE. 28*4a64e381SAndroid Build Coastguard Worker# 29*4a64e381SAndroid Build Coastguard Worker 30*4a64e381SAndroid Build Coastguard Workerimport urllib.request 31*4a64e381SAndroid Build Coastguard Workerimport urllib.error 32*4a64e381SAndroid Build Coastguard Workerimport ipaddress 33*4a64e381SAndroid Build Coastguard Workerimport json 34*4a64e381SAndroid Build Coastguard Workerimport re 35*4a64e381SAndroid Build Coastguard Workerfrom threading import Thread 36*4a64e381SAndroid Build Coastguard Worker 37*4a64e381SAndroid Build Coastguard Workerrest_api_addr = "http://0.0.0.0:8081" 38*4a64e381SAndroid Build Coastguard Worker 39*4a64e381SAndroid Build Coastguard Worker 40*4a64e381SAndroid Build Coastguard Workerdef assert_is_ipv6_address(string): 41*4a64e381SAndroid Build Coastguard Worker assert (type(ipaddress.ip_address(string)) is ipaddress.IPv6Address) 42*4a64e381SAndroid Build Coastguard Worker 43*4a64e381SAndroid Build Coastguard Workerdef get_data_from_url(url, result, index): 44*4a64e381SAndroid Build Coastguard Worker response = urllib.request.urlopen(urllib.request.Request(url)) 45*4a64e381SAndroid Build Coastguard Worker body = response.read() 46*4a64e381SAndroid Build Coastguard Worker data = json.loads(body) 47*4a64e381SAndroid Build Coastguard Worker result[index] = data 48*4a64e381SAndroid Build Coastguard Worker 49*4a64e381SAndroid Build Coastguard Worker 50*4a64e381SAndroid Build Coastguard Workerdef get_error_from_url(url, result, index): 51*4a64e381SAndroid Build Coastguard Worker try: 52*4a64e381SAndroid Build Coastguard Worker urllib.request.urlopen(urllib.request.Request(url)) 53*4a64e381SAndroid Build Coastguard Worker assert False 54*4a64e381SAndroid Build Coastguard Worker 55*4a64e381SAndroid Build Coastguard Worker except urllib.error.HTTPError as e: 56*4a64e381SAndroid Build Coastguard Worker result[index] = e 57*4a64e381SAndroid Build Coastguard Worker 58*4a64e381SAndroid Build Coastguard Worker 59*4a64e381SAndroid Build Coastguard Workerdef create_multi_thread(func, url, thread_num, response_data): 60*4a64e381SAndroid Build Coastguard Worker threads = [None] * thread_num 61*4a64e381SAndroid Build Coastguard Worker 62*4a64e381SAndroid Build Coastguard Worker for i in range(thread_num): 63*4a64e381SAndroid Build Coastguard Worker threads[i] = Thread(target=func, args=(url, response_data, i)) 64*4a64e381SAndroid Build Coastguard Worker 65*4a64e381SAndroid Build Coastguard Worker for thread in threads: 66*4a64e381SAndroid Build Coastguard Worker thread.start() 67*4a64e381SAndroid Build Coastguard Worker 68*4a64e381SAndroid Build Coastguard Worker for thread in threads: 69*4a64e381SAndroid Build Coastguard Worker thread.join() 70*4a64e381SAndroid Build Coastguard Worker 71*4a64e381SAndroid Build Coastguard Worker 72*4a64e381SAndroid Build Coastguard Workerdef error404_check(data): 73*4a64e381SAndroid Build Coastguard Worker assert data is not None 74*4a64e381SAndroid Build Coastguard Worker 75*4a64e381SAndroid Build Coastguard Worker assert (data.code == 404) 76*4a64e381SAndroid Build Coastguard Worker 77*4a64e381SAndroid Build Coastguard Worker return True 78*4a64e381SAndroid Build Coastguard Worker 79*4a64e381SAndroid Build Coastguard Worker 80*4a64e381SAndroid Build Coastguard Workerdef diagnostics_check(data): 81*4a64e381SAndroid Build Coastguard Worker assert data is not None 82*4a64e381SAndroid Build Coastguard Worker 83*4a64e381SAndroid Build Coastguard Worker if len(data) == 0: 84*4a64e381SAndroid Build Coastguard Worker return 1 85*4a64e381SAndroid Build Coastguard Worker for diag in data: 86*4a64e381SAndroid Build Coastguard Worker expected_keys = [ 87*4a64e381SAndroid Build Coastguard Worker "ExtAddress", "Rloc16", "Mode", "Connectivity", "Route", 88*4a64e381SAndroid Build Coastguard Worker "LeaderData", "NetworkData", "IP6AddressList", "MACCounters", 89*4a64e381SAndroid Build Coastguard Worker "ChildTable", "ChannelPages" 90*4a64e381SAndroid Build Coastguard Worker ] 91*4a64e381SAndroid Build Coastguard Worker expected_value_type = [ 92*4a64e381SAndroid Build Coastguard Worker str, int, dict, dict, dict, dict, str, list, dict, list, 93*4a64e381SAndroid Build Coastguard Worker str 94*4a64e381SAndroid Build Coastguard Worker ] 95*4a64e381SAndroid Build Coastguard Worker expected_check_dict = dict(zip(expected_keys, expected_value_type)) 96*4a64e381SAndroid Build Coastguard Worker 97*4a64e381SAndroid Build Coastguard Worker for key, value in expected_check_dict.items(): 98*4a64e381SAndroid Build Coastguard Worker assert (key in diag) 99*4a64e381SAndroid Build Coastguard Worker assert (type(diag[key]) == value) 100*4a64e381SAndroid Build Coastguard Worker 101*4a64e381SAndroid Build Coastguard Worker assert (re.match(r'^[A-F0-9]{16}$', diag["ExtAddress"]) is not None) 102*4a64e381SAndroid Build Coastguard Worker 103*4a64e381SAndroid Build Coastguard Worker mode = diag["Mode"] 104*4a64e381SAndroid Build Coastguard Worker mode_expected_keys = [ 105*4a64e381SAndroid Build Coastguard Worker "RxOnWhenIdle", "DeviceType", "NetworkData" 106*4a64e381SAndroid Build Coastguard Worker ] 107*4a64e381SAndroid Build Coastguard Worker for key in mode_expected_keys: 108*4a64e381SAndroid Build Coastguard Worker assert (key in mode) 109*4a64e381SAndroid Build Coastguard Worker assert (type(mode[key]) == int) 110*4a64e381SAndroid Build Coastguard Worker 111*4a64e381SAndroid Build Coastguard Worker connectivity = diag["Connectivity"] 112*4a64e381SAndroid Build Coastguard Worker connectivity_expected_keys = [ 113*4a64e381SAndroid Build Coastguard Worker "ParentPriority", "LinkQuality3", "LinkQuality2", "LinkQuality1", 114*4a64e381SAndroid Build Coastguard Worker "LeaderCost", "IdSequence", "ActiveRouters", "SedBufferSize", 115*4a64e381SAndroid Build Coastguard Worker "SedDatagramCount" 116*4a64e381SAndroid Build Coastguard Worker ] 117*4a64e381SAndroid Build Coastguard Worker for key in connectivity_expected_keys: 118*4a64e381SAndroid Build Coastguard Worker assert (key in connectivity) 119*4a64e381SAndroid Build Coastguard Worker assert (type(connectivity[key]) == int) 120*4a64e381SAndroid Build Coastguard Worker 121*4a64e381SAndroid Build Coastguard Worker route = diag["Route"] 122*4a64e381SAndroid Build Coastguard Worker assert ("IdSequence" in route) 123*4a64e381SAndroid Build Coastguard Worker assert (type(route["IdSequence"]) == int) 124*4a64e381SAndroid Build Coastguard Worker 125*4a64e381SAndroid Build Coastguard Worker assert ("RouteData" in route) 126*4a64e381SAndroid Build Coastguard Worker route_routedata = route["RouteData"] 127*4a64e381SAndroid Build Coastguard Worker assert (type(route["RouteData"]) == list) 128*4a64e381SAndroid Build Coastguard Worker 129*4a64e381SAndroid Build Coastguard Worker routedata_expected_keys = [ 130*4a64e381SAndroid Build Coastguard Worker "RouteId", "LinkQualityOut", "LinkQualityIn", "RouteCost" 131*4a64e381SAndroid Build Coastguard Worker ] 132*4a64e381SAndroid Build Coastguard Worker 133*4a64e381SAndroid Build Coastguard Worker for item in route_routedata: 134*4a64e381SAndroid Build Coastguard Worker for key in routedata_expected_keys: 135*4a64e381SAndroid Build Coastguard Worker assert (key in item) 136*4a64e381SAndroid Build Coastguard Worker assert (type(item[key]) == int) 137*4a64e381SAndroid Build Coastguard Worker 138*4a64e381SAndroid Build Coastguard Worker leaderdata = diag["LeaderData"] 139*4a64e381SAndroid Build Coastguard Worker leaderdata_expected_keys = [ 140*4a64e381SAndroid Build Coastguard Worker "PartitionId", "Weighting", "DataVersion", "StableDataVersion", 141*4a64e381SAndroid Build Coastguard Worker "LeaderRouterId" 142*4a64e381SAndroid Build Coastguard Worker ] 143*4a64e381SAndroid Build Coastguard Worker 144*4a64e381SAndroid Build Coastguard Worker for key in leaderdata_expected_keys: 145*4a64e381SAndroid Build Coastguard Worker assert (key in leaderdata) 146*4a64e381SAndroid Build Coastguard Worker assert (type(leaderdata[key]) == int) 147*4a64e381SAndroid Build Coastguard Worker 148*4a64e381SAndroid Build Coastguard Worker assert (re.match(r'^[A-F0-9]{12}$', diag["NetworkData"]) is not None) 149*4a64e381SAndroid Build Coastguard Worker 150*4a64e381SAndroid Build Coastguard Worker ip6_address_list = diag["IP6AddressList"] 151*4a64e381SAndroid Build Coastguard Worker assert (type(ip6_address_list) == list) 152*4a64e381SAndroid Build Coastguard Worker 153*4a64e381SAndroid Build Coastguard Worker for ip6_address in ip6_address_list: 154*4a64e381SAndroid Build Coastguard Worker assert (type(ip6_address) == str) 155*4a64e381SAndroid Build Coastguard Worker assert_is_ipv6_address(ip6_address) 156*4a64e381SAndroid Build Coastguard Worker 157*4a64e381SAndroid Build Coastguard Worker mac_counters = diag["MACCounters"] 158*4a64e381SAndroid Build Coastguard Worker assert (type(mac_counters) == dict) 159*4a64e381SAndroid Build Coastguard Worker mac_counters_expected_keys = [ 160*4a64e381SAndroid Build Coastguard Worker "IfInUnknownProtos", "IfInErrors", "IfOutErrors", "IfInUcastPkts", 161*4a64e381SAndroid Build Coastguard Worker "IfInBroadcastPkts", "IfInDiscards", "IfOutUcastPkts", 162*4a64e381SAndroid Build Coastguard Worker "IfOutBroadcastPkts", "IfOutDiscards" 163*4a64e381SAndroid Build Coastguard Worker ] 164*4a64e381SAndroid Build Coastguard Worker for key in mac_counters_expected_keys: 165*4a64e381SAndroid Build Coastguard Worker assert (key in mac_counters) 166*4a64e381SAndroid Build Coastguard Worker assert (type(mac_counters[key]) == int) 167*4a64e381SAndroid Build Coastguard Worker 168*4a64e381SAndroid Build Coastguard Worker child_table = diag["ChildTable"] 169*4a64e381SAndroid Build Coastguard Worker assert (type(child_table) == list) 170*4a64e381SAndroid Build Coastguard Worker 171*4a64e381SAndroid Build Coastguard Worker for child in child_table: 172*4a64e381SAndroid Build Coastguard Worker assert ("ChildId" in child) 173*4a64e381SAndroid Build Coastguard Worker assert (type(child["ChildId"]) == int) 174*4a64e381SAndroid Build Coastguard Worker assert ("Timeout" in child) 175*4a64e381SAndroid Build Coastguard Worker assert (type(child["Timeout"]) == int) 176*4a64e381SAndroid Build Coastguard Worker assert ("Mode" in child) 177*4a64e381SAndroid Build Coastguard Worker mode = child["Mode"] 178*4a64e381SAndroid Build Coastguard Worker assert (type(mode) == dict) 179*4a64e381SAndroid Build Coastguard Worker for key in mode_expected_keys: 180*4a64e381SAndroid Build Coastguard Worker assert (key in mode) 181*4a64e381SAndroid Build Coastguard Worker assert (type(mode[key]) == int) 182*4a64e381SAndroid Build Coastguard Worker 183*4a64e381SAndroid Build Coastguard Worker assert (type(diag["ChannelPages"]) == str) 184*4a64e381SAndroid Build Coastguard Worker assert (re.match(r'^[A-F0-9]{2}$', diag["ChannelPages"]) is not None) 185*4a64e381SAndroid Build Coastguard Worker 186*4a64e381SAndroid Build Coastguard Worker return 2 187*4a64e381SAndroid Build Coastguard Worker 188*4a64e381SAndroid Build Coastguard Worker 189*4a64e381SAndroid Build Coastguard Workerdef node_check(data): 190*4a64e381SAndroid Build Coastguard Worker assert data is not None 191*4a64e381SAndroid Build Coastguard Worker 192*4a64e381SAndroid Build Coastguard Worker expected_keys = [ 193*4a64e381SAndroid Build Coastguard Worker "State", "NumOfRouter", "RlocAddress", "NetworkName", "ExtAddress", 194*4a64e381SAndroid Build Coastguard Worker "Rloc16", "LeaderData", "ExtPanId" 195*4a64e381SAndroid Build Coastguard Worker ] 196*4a64e381SAndroid Build Coastguard Worker expected_value_type = [ 197*4a64e381SAndroid Build Coastguard Worker str, int, str, str, str, int, dict, str 198*4a64e381SAndroid Build Coastguard Worker ] 199*4a64e381SAndroid Build Coastguard Worker expected_check_dict = dict(zip(expected_keys, expected_value_type)) 200*4a64e381SAndroid Build Coastguard Worker 201*4a64e381SAndroid Build Coastguard Worker for key, value in expected_check_dict.items(): 202*4a64e381SAndroid Build Coastguard Worker assert (key in data) 203*4a64e381SAndroid Build Coastguard Worker assert (type(data[key]) == value) 204*4a64e381SAndroid Build Coastguard Worker 205*4a64e381SAndroid Build Coastguard Worker assert_is_ipv6_address(data["RlocAddress"]) 206*4a64e381SAndroid Build Coastguard Worker 207*4a64e381SAndroid Build Coastguard Worker assert (re.match(r'^[A-F0-9]{16}$', data["ExtAddress"]) is not None) 208*4a64e381SAndroid Build Coastguard Worker assert (re.match(r'[A-F0-9]{16}', data["ExtPanId"]) is not None) 209*4a64e381SAndroid Build Coastguard Worker 210*4a64e381SAndroid Build Coastguard Worker leaderdata = data["LeaderData"] 211*4a64e381SAndroid Build Coastguard Worker leaderdata_expected_keys = [ 212*4a64e381SAndroid Build Coastguard Worker "PartitionId", "Weighting", "DataVersion", "StableDataVersion", 213*4a64e381SAndroid Build Coastguard Worker "LeaderRouterId" 214*4a64e381SAndroid Build Coastguard Worker ] 215*4a64e381SAndroid Build Coastguard Worker 216*4a64e381SAndroid Build Coastguard Worker for key in leaderdata_expected_keys: 217*4a64e381SAndroid Build Coastguard Worker assert (key in leaderdata) 218*4a64e381SAndroid Build Coastguard Worker assert (type(leaderdata[key]) == int) 219*4a64e381SAndroid Build Coastguard Worker 220*4a64e381SAndroid Build Coastguard Worker return True 221*4a64e381SAndroid Build Coastguard Worker 222*4a64e381SAndroid Build Coastguard Worker 223*4a64e381SAndroid Build Coastguard Workerdef node_rloc_check(data): 224*4a64e381SAndroid Build Coastguard Worker assert data is not None 225*4a64e381SAndroid Build Coastguard Worker 226*4a64e381SAndroid Build Coastguard Worker assert (type(data) == str) 227*4a64e381SAndroid Build Coastguard Worker 228*4a64e381SAndroid Build Coastguard Worker assert_is_ipv6_address(data) 229*4a64e381SAndroid Build Coastguard Worker 230*4a64e381SAndroid Build Coastguard Worker return True 231*4a64e381SAndroid Build Coastguard Worker 232*4a64e381SAndroid Build Coastguard Worker 233*4a64e381SAndroid Build Coastguard Workerdef node_rloc16_check(data): 234*4a64e381SAndroid Build Coastguard Worker assert data is not None 235*4a64e381SAndroid Build Coastguard Worker 236*4a64e381SAndroid Build Coastguard Worker assert (type(data) == int) 237*4a64e381SAndroid Build Coastguard Worker 238*4a64e381SAndroid Build Coastguard Worker return True 239*4a64e381SAndroid Build Coastguard Worker 240*4a64e381SAndroid Build Coastguard Worker 241*4a64e381SAndroid Build Coastguard Workerdef node_ext_address_check(data): 242*4a64e381SAndroid Build Coastguard Worker assert data is not None 243*4a64e381SAndroid Build Coastguard Worker 244*4a64e381SAndroid Build Coastguard Worker assert (type(data) == str) 245*4a64e381SAndroid Build Coastguard Worker assert (re.match(r'^[A-F0-9]{16}$', data) is not None) 246*4a64e381SAndroid Build Coastguard Worker 247*4a64e381SAndroid Build Coastguard Worker return True 248*4a64e381SAndroid Build Coastguard Worker 249*4a64e381SAndroid Build Coastguard Worker 250*4a64e381SAndroid Build Coastguard Workerdef node_state_check(data): 251*4a64e381SAndroid Build Coastguard Worker assert data is not None 252*4a64e381SAndroid Build Coastguard Worker 253*4a64e381SAndroid Build Coastguard Worker assert (type(data) == str) 254*4a64e381SAndroid Build Coastguard Worker 255*4a64e381SAndroid Build Coastguard Worker return True 256*4a64e381SAndroid Build Coastguard Worker 257*4a64e381SAndroid Build Coastguard Worker 258*4a64e381SAndroid Build Coastguard Workerdef node_network_name_check(data): 259*4a64e381SAndroid Build Coastguard Worker assert data is not None 260*4a64e381SAndroid Build Coastguard Worker 261*4a64e381SAndroid Build Coastguard Worker assert (type(data) == str) 262*4a64e381SAndroid Build Coastguard Worker 263*4a64e381SAndroid Build Coastguard Worker return True 264*4a64e381SAndroid Build Coastguard Worker 265*4a64e381SAndroid Build Coastguard Worker 266*4a64e381SAndroid Build Coastguard Workerdef node_leader_data_check(data): 267*4a64e381SAndroid Build Coastguard Worker assert data is not None 268*4a64e381SAndroid Build Coastguard Worker 269*4a64e381SAndroid Build Coastguard Worker assert (type(data) == dict) 270*4a64e381SAndroid Build Coastguard Worker 271*4a64e381SAndroid Build Coastguard Worker leaderdata_expected_keys = [ 272*4a64e381SAndroid Build Coastguard Worker "PartitionId", "Weighting", "DataVersion", "StableDataVersion", 273*4a64e381SAndroid Build Coastguard Worker "LeaderRouterId" 274*4a64e381SAndroid Build Coastguard Worker ] 275*4a64e381SAndroid Build Coastguard Worker 276*4a64e381SAndroid Build Coastguard Worker for key in leaderdata_expected_keys: 277*4a64e381SAndroid Build Coastguard Worker assert (key in data) 278*4a64e381SAndroid Build Coastguard Worker assert (type(data[key]) == int) 279*4a64e381SAndroid Build Coastguard Worker 280*4a64e381SAndroid Build Coastguard Worker return True 281*4a64e381SAndroid Build Coastguard Worker 282*4a64e381SAndroid Build Coastguard Worker 283*4a64e381SAndroid Build Coastguard Workerdef node_num_of_router_check(data): 284*4a64e381SAndroid Build Coastguard Worker assert data is not None 285*4a64e381SAndroid Build Coastguard Worker 286*4a64e381SAndroid Build Coastguard Worker assert (type(data) == int) 287*4a64e381SAndroid Build Coastguard Worker 288*4a64e381SAndroid Build Coastguard Worker return True 289*4a64e381SAndroid Build Coastguard Worker 290*4a64e381SAndroid Build Coastguard Worker 291*4a64e381SAndroid Build Coastguard Workerdef node_ext_panid_check(data): 292*4a64e381SAndroid Build Coastguard Worker assert data is not None 293*4a64e381SAndroid Build Coastguard Worker 294*4a64e381SAndroid Build Coastguard Worker assert (type(data) == str) 295*4a64e381SAndroid Build Coastguard Worker 296*4a64e381SAndroid Build Coastguard Worker return True 297*4a64e381SAndroid Build Coastguard Worker 298*4a64e381SAndroid Build Coastguard Worker 299*4a64e381SAndroid Build Coastguard Workerdef node_test(thread_num): 300*4a64e381SAndroid Build Coastguard Worker url = rest_api_addr + "/node" 301*4a64e381SAndroid Build Coastguard Worker 302*4a64e381SAndroid Build Coastguard Worker response_data = [None] * thread_num 303*4a64e381SAndroid Build Coastguard Worker 304*4a64e381SAndroid Build Coastguard Worker create_multi_thread(get_data_from_url, url, thread_num, response_data) 305*4a64e381SAndroid Build Coastguard Worker 306*4a64e381SAndroid Build Coastguard Worker valid = [node_check(data) for data in response_data].count(True) 307*4a64e381SAndroid Build Coastguard Worker 308*4a64e381SAndroid Build Coastguard Worker print(" /node : all {}, valid {} ".format(thread_num, valid)) 309*4a64e381SAndroid Build Coastguard Worker 310*4a64e381SAndroid Build Coastguard Worker 311*4a64e381SAndroid Build Coastguard Workerdef node_rloc_test(thread_num): 312*4a64e381SAndroid Build Coastguard Worker url = rest_api_addr + "/node/rloc" 313*4a64e381SAndroid Build Coastguard Worker 314*4a64e381SAndroid Build Coastguard Worker response_data = [None] * thread_num 315*4a64e381SAndroid Build Coastguard Worker 316*4a64e381SAndroid Build Coastguard Worker create_multi_thread(get_data_from_url, url, thread_num, response_data) 317*4a64e381SAndroid Build Coastguard Worker 318*4a64e381SAndroid Build Coastguard Worker valid = [node_rloc_check(data) for data in response_data].count(True) 319*4a64e381SAndroid Build Coastguard Worker 320*4a64e381SAndroid Build Coastguard Worker print(" /node/rloc : all {}, valid {} ".format(thread_num, valid)) 321*4a64e381SAndroid Build Coastguard Worker 322*4a64e381SAndroid Build Coastguard Worker 323*4a64e381SAndroid Build Coastguard Workerdef node_rloc16_test(thread_num): 324*4a64e381SAndroid Build Coastguard Worker url = rest_api_addr + "/node/rloc16" 325*4a64e381SAndroid Build Coastguard Worker 326*4a64e381SAndroid Build Coastguard Worker response_data = [None] * thread_num 327*4a64e381SAndroid Build Coastguard Worker 328*4a64e381SAndroid Build Coastguard Worker create_multi_thread(get_data_from_url, url, thread_num, response_data) 329*4a64e381SAndroid Build Coastguard Worker 330*4a64e381SAndroid Build Coastguard Worker valid = [node_rloc16_check(data) for data in response_data].count(True) 331*4a64e381SAndroid Build Coastguard Worker 332*4a64e381SAndroid Build Coastguard Worker print(" /node/rloc16 : all {}, valid {} ".format(thread_num, valid)) 333*4a64e381SAndroid Build Coastguard Worker 334*4a64e381SAndroid Build Coastguard Worker 335*4a64e381SAndroid Build Coastguard Workerdef node_ext_address_test(thread_num): 336*4a64e381SAndroid Build Coastguard Worker url = rest_api_addr + "/node/ext-address" 337*4a64e381SAndroid Build Coastguard Worker 338*4a64e381SAndroid Build Coastguard Worker response_data = [None] * thread_num 339*4a64e381SAndroid Build Coastguard Worker 340*4a64e381SAndroid Build Coastguard Worker create_multi_thread(get_data_from_url, url, thread_num, response_data) 341*4a64e381SAndroid Build Coastguard Worker 342*4a64e381SAndroid Build Coastguard Worker valid = [node_ext_address_check(data) for data in response_data].count(True) 343*4a64e381SAndroid Build Coastguard Worker 344*4a64e381SAndroid Build Coastguard Worker print(" /node/ext-address : all {}, valid {} ".format(thread_num, valid)) 345*4a64e381SAndroid Build Coastguard Worker 346*4a64e381SAndroid Build Coastguard Worker 347*4a64e381SAndroid Build Coastguard Workerdef node_state_test(thread_num): 348*4a64e381SAndroid Build Coastguard Worker url = rest_api_addr + "/node/state" 349*4a64e381SAndroid Build Coastguard Worker 350*4a64e381SAndroid Build Coastguard Worker response_data = [None] * thread_num 351*4a64e381SAndroid Build Coastguard Worker 352*4a64e381SAndroid Build Coastguard Worker create_multi_thread(get_data_from_url, url, thread_num, response_data) 353*4a64e381SAndroid Build Coastguard Worker 354*4a64e381SAndroid Build Coastguard Worker valid = [node_state_check(data) for data in response_data].count(True) 355*4a64e381SAndroid Build Coastguard Worker 356*4a64e381SAndroid Build Coastguard Worker print(" /node/state : all {}, valid {} ".format(thread_num, valid)) 357*4a64e381SAndroid Build Coastguard Worker 358*4a64e381SAndroid Build Coastguard Worker 359*4a64e381SAndroid Build Coastguard Workerdef node_network_name_test(thread_num): 360*4a64e381SAndroid Build Coastguard Worker url = rest_api_addr + "/node/network-name" 361*4a64e381SAndroid Build Coastguard Worker 362*4a64e381SAndroid Build Coastguard Worker response_data = [None] * thread_num 363*4a64e381SAndroid Build Coastguard Worker 364*4a64e381SAndroid Build Coastguard Worker create_multi_thread(get_data_from_url, url, thread_num, response_data) 365*4a64e381SAndroid Build Coastguard Worker 366*4a64e381SAndroid Build Coastguard Worker valid = [node_network_name_check(data) for data in response_data 367*4a64e381SAndroid Build Coastguard Worker ].count(True) 368*4a64e381SAndroid Build Coastguard Worker 369*4a64e381SAndroid Build Coastguard Worker print(" /node/network-name : all {}, valid {} ".format(thread_num, valid)) 370*4a64e381SAndroid Build Coastguard Worker 371*4a64e381SAndroid Build Coastguard Worker 372*4a64e381SAndroid Build Coastguard Workerdef node_leader_data_test(thread_num): 373*4a64e381SAndroid Build Coastguard Worker url = rest_api_addr + "/node/leader-data" 374*4a64e381SAndroid Build Coastguard Worker 375*4a64e381SAndroid Build Coastguard Worker response_data = [None] * thread_num 376*4a64e381SAndroid Build Coastguard Worker 377*4a64e381SAndroid Build Coastguard Worker create_multi_thread(get_data_from_url, url, thread_num, response_data) 378*4a64e381SAndroid Build Coastguard Worker 379*4a64e381SAndroid Build Coastguard Worker valid = [node_leader_data_check(data) for data in response_data].count(True) 380*4a64e381SAndroid Build Coastguard Worker 381*4a64e381SAndroid Build Coastguard Worker print(" /node/leader-data : all {}, valid {} ".format(thread_num, valid)) 382*4a64e381SAndroid Build Coastguard Worker 383*4a64e381SAndroid Build Coastguard Worker 384*4a64e381SAndroid Build Coastguard Workerdef node_num_of_router_test(thread_num): 385*4a64e381SAndroid Build Coastguard Worker url = rest_api_addr + "/node/num-of-router" 386*4a64e381SAndroid Build Coastguard Worker 387*4a64e381SAndroid Build Coastguard Worker response_data = [None] * thread_num 388*4a64e381SAndroid Build Coastguard Worker 389*4a64e381SAndroid Build Coastguard Worker create_multi_thread(get_data_from_url, url, thread_num, response_data) 390*4a64e381SAndroid Build Coastguard Worker 391*4a64e381SAndroid Build Coastguard Worker valid = [node_num_of_router_check(data) for data in response_data 392*4a64e381SAndroid Build Coastguard Worker ].count(True) 393*4a64e381SAndroid Build Coastguard Worker 394*4a64e381SAndroid Build Coastguard Worker print(" /v1/node/num-of-router : all {}, valid {} ".format(thread_num, valid)) 395*4a64e381SAndroid Build Coastguard Worker 396*4a64e381SAndroid Build Coastguard Worker 397*4a64e381SAndroid Build Coastguard Workerdef node_ext_panid_test(thread_num): 398*4a64e381SAndroid Build Coastguard Worker url = rest_api_addr + "/node/ext-panid" 399*4a64e381SAndroid Build Coastguard Worker 400*4a64e381SAndroid Build Coastguard Worker response_data = [None] * thread_num 401*4a64e381SAndroid Build Coastguard Worker 402*4a64e381SAndroid Build Coastguard Worker create_multi_thread(get_data_from_url, url, thread_num, response_data) 403*4a64e381SAndroid Build Coastguard Worker 404*4a64e381SAndroid Build Coastguard Worker valid = [node_ext_panid_check(data) for data in response_data].count(True) 405*4a64e381SAndroid Build Coastguard Worker 406*4a64e381SAndroid Build Coastguard Worker print(" /node/ext-panid : all {}, valid {} ".format(thread_num, valid)) 407*4a64e381SAndroid Build Coastguard Worker 408*4a64e381SAndroid Build Coastguard Worker 409*4a64e381SAndroid Build Coastguard Workerdef diagnostics_test(thread_num): 410*4a64e381SAndroid Build Coastguard Worker url = rest_api_addr + "/diagnostics" 411*4a64e381SAndroid Build Coastguard Worker 412*4a64e381SAndroid Build Coastguard Worker response_data = [None] * thread_num 413*4a64e381SAndroid Build Coastguard Worker 414*4a64e381SAndroid Build Coastguard Worker create_multi_thread(get_data_from_url, url, thread_num, response_data) 415*4a64e381SAndroid Build Coastguard Worker 416*4a64e381SAndroid Build Coastguard Worker valid = 0 417*4a64e381SAndroid Build Coastguard Worker has_content = 0 418*4a64e381SAndroid Build Coastguard Worker for data in response_data: 419*4a64e381SAndroid Build Coastguard Worker 420*4a64e381SAndroid Build Coastguard Worker ret = diagnostics_check(data) 421*4a64e381SAndroid Build Coastguard Worker if ret == 1: 422*4a64e381SAndroid Build Coastguard Worker valid += 1 423*4a64e381SAndroid Build Coastguard Worker elif ret == 2: 424*4a64e381SAndroid Build Coastguard Worker valid += 1 425*4a64e381SAndroid Build Coastguard Worker has_content += 1 426*4a64e381SAndroid Build Coastguard Worker 427*4a64e381SAndroid Build Coastguard Worker print(" /diagnostics : all {}, has content {}, valid {} ".format( 428*4a64e381SAndroid Build Coastguard Worker thread_num, has_content, valid)) 429*4a64e381SAndroid Build Coastguard Worker 430*4a64e381SAndroid Build Coastguard Worker 431*4a64e381SAndroid Build Coastguard Workerdef error_test(thread_num): 432*4a64e381SAndroid Build Coastguard Worker url = rest_api_addr + "/hello" 433*4a64e381SAndroid Build Coastguard Worker 434*4a64e381SAndroid Build Coastguard Worker response_data = [None] * thread_num 435*4a64e381SAndroid Build Coastguard Worker 436*4a64e381SAndroid Build Coastguard Worker create_multi_thread(get_error_from_url, url, thread_num, response_data) 437*4a64e381SAndroid Build Coastguard Worker 438*4a64e381SAndroid Build Coastguard Worker valid = [error404_check(data) for data in response_data].count(True) 439*4a64e381SAndroid Build Coastguard Worker 440*4a64e381SAndroid Build Coastguard Worker print(" /v1/hello : all {}, valid {} ".format(thread_num, valid)) 441*4a64e381SAndroid Build Coastguard Worker 442*4a64e381SAndroid Build Coastguard Worker 443*4a64e381SAndroid Build Coastguard Workerdef main(): 444*4a64e381SAndroid Build Coastguard Worker node_test(200) 445*4a64e381SAndroid Build Coastguard Worker node_rloc_test(200) 446*4a64e381SAndroid Build Coastguard Worker node_rloc16_test(200) 447*4a64e381SAndroid Build Coastguard Worker node_ext_address_test(200) 448*4a64e381SAndroid Build Coastguard Worker node_state_test(200) 449*4a64e381SAndroid Build Coastguard Worker node_network_name_test(200) 450*4a64e381SAndroid Build Coastguard Worker node_leader_data_test(200) 451*4a64e381SAndroid Build Coastguard Worker node_num_of_router_test(200) 452*4a64e381SAndroid Build Coastguard Worker node_ext_panid_test(200) 453*4a64e381SAndroid Build Coastguard Worker diagnostics_test(20) 454*4a64e381SAndroid Build Coastguard Worker error_test(10) 455*4a64e381SAndroid Build Coastguard Worker 456*4a64e381SAndroid Build Coastguard Worker return 0 457*4a64e381SAndroid Build Coastguard Worker 458*4a64e381SAndroid Build Coastguard Worker 459*4a64e381SAndroid Build Coastguard Workerif __name__ == '__main__': 460*4a64e381SAndroid Build Coastguard Worker exit(main()) 461