Files
wlan-testing/libs/perfecto_interop/perfecto_interop.py

389 lines
16 KiB
Python

import importlib
import logging
import time
import warnings
from time import gmtime, strftime
from xml.etree import ElementTree as ET
import pytest
import requests
import urllib3
from perfecto import (PerfectoExecutionContext, PerfectoReportiumClient, TestContext, TestResultFactory)
from perfecto.model.model import Job, Project
android_tests = importlib.import_module("android_tests")
ios_tests = importlib.import_module("ios_tests")
class perfecto_interop:
dut_data = list()
security_token = None
perfecto_data = dict()
android_devices = {
"Galaxy S20": {
"platformName-android": "Android",
"model-android": "Galaxy S20",
"appPackage-android": "com.android.settings",
"bundleId-iOS-Settings": "com.apple.Preferences",
"bundleId-iOS-Safari": "com.apple.mobilesafari",
"jobName": "Interop-Galaxy-S20",
"jobNumber": 38
},
"Galaxy S10.*": {
"platformName-android": "Android",
"model-android": "Galaxy S10.*",
"appPackage-android": "com.android.settings",
"bundleId-iOS-Settings": "com.apple.Preferences",
"bundleId-iOS-Safari": "com.apple.mobilesafari",
"jobName": "Interop-Galaxy-S10",
"jobNumber": 38
},
"Galaxy S9": {
"platformName-android": "Android",
"model-android": "Galaxy S9",
"appPackage-android": "com.android.settings",
"bundleId-iOS-Settings": "com.apple.Preferences",
"bundleId-iOS-Safari": "com.apple.mobilesafari",
"jobName": "Interop-Galaxy-S9",
"jobNumber": 38
},
"Pixel 4": {
"platformName-android": "Android",
"model-android": "Pixel 4",
"appPackage-android": "com.android.settings",
"bundleId-iOS-Settings": "com.apple.Preferences",
"bundleId-iOS-Safari": "com.apple.mobilesafari",
"jobName": "Interop-pixel-4",
"jobNumber": 38
}
}
ios_devices = {
"iPhone-11": {
"model-iOS": "iPhone-11",
"bundleId-iOS": "com.apple.Preferences",
"platformName-iOS": "iOS",
"bundleId-iOS-Settings": "com.apple.Preferences",
"bundleId-iOS-Ping": "com.deftapps.ping",
"browserType-iOS": "Safari",
"bundleId-iOS-Safari": "com.apple.mobilesafari",
"platformName-android": "Android",
"appPackage-android": "com.android.settings",
"jobName": "Interop-iphone-11",
"jobNumber": 38
},
"iPhone-12": {
"model-iOS": "iPhone-12",
"bundleId-iOS": "com.apple.Preferences",
"platformName-iOS": "iOS",
"bundleId-iOS-Settings": "com.apple.Preferences",
"bundleId-iOS-Ping": "com.deftapps.ping",
"browserType-iOS": "Safari",
"bundleId-iOS-Safari": "com.apple.mobilesafari",
"platformName-android": "Android",
"appPackage-android": "com.android.settings",
"jobName": "Interop-iphone-12",
"jobNumber": 38
},
"iPhone-7": {
"model-iOS": "iPhone-7",
"bundleId-iOS": "com.apple.Preferences",
"platformName-iOS": "iOS",
"bundleId-iOS-Settings": "com.apple.Preferences",
"bundleId-iOS-Ping": "com.deftapps.ping",
"browserType-iOS": "Safari",
"bundleId-iOS-Safari": "com.apple.mobilesafari",
"platformName-android": "Android",
"appPackage-android": "com.android.settings",
"jobName": "Interop-iphone-7",
"jobNumber": 38
},
"iPhone-XR": {
"model-iOS": "iPhone-XR",
"bundleId-iOS": "com.apple.Preferences",
"platformName-iOS": "iOS",
"bundleId-iOS-Settings": "com.apple.Preferences",
"bundleId-iOS-Ping": "com.deftapps.ping",
"browserType-iOS": "Safari",
"bundleId-iOS-Safari": "com.apple.mobilesafari",
"platformName-android": "Android",
"appPackage-android": "com.android.settings",
"jobName": "Interop-iphone-XR",
"jobNumber": 38
}
}
def __init__(self, perfecto_data=None, dut_data=None):
if perfecto_data is None:
logging.error("Perfecto data is not provided")
pytest.exit("Perfecto data is not provided")
if dut_data is None:
logging.error("Device Under Test data is not provided")
pytest.exit("Device Under Test data is not provided")
self.perfecto_data = perfecto_data
self.dut_data = dut_data
def setup_metadata(self):
pass
def get_device_configuration(self):
return self.perfecto_data["iPhone-11"]
# def get_PassPointConniOS_data(self, get_device_configuration):
# passPoint_data = {
# "netAnalyzer-inter-Con-Xpath": "//*[@label='Network Connected']/parent::*/XCUIElementTypeButton",
# "bundleId-iOS-Settings": get_device_configuration["bundleId-iOS-Settings"],
# "bundleId-iOS-Ping": get_device_configuration["bundleId-iOS-Ping"]
# }
# yield passPoint_data
# def get_APToMobileDevice_data(get_device_configuration):
# passPoint_data = {
# "webURL": "https://www.google.com",
# "lblSearch": "//*[@class='gLFyf']",
# "elelSearch": "(//*[@class='sbic sb43'])[1]",
# "BtnRunSpeedTest": "//*[text()='RUN SPEED TEST']",
# "bundleId-iOS-Settings": get_device_configuration["bundleId-iOS-Settings"],
# "bundleId-iOS-Safari": get_device_configuration["bundleId-iOS-Safari"],
# "downloadMbps": "//*[@id='knowledge-verticals-internetspeedtest__download']/P[@class='spiqle']",
# "UploadMbps": "//*[@id='knowledge-verticals-internetspeedtest__upload']/P[@class='spiqle']",
# # Android
# "platformName-android": get_device_configuration["platformName-android"],
# "appPackage-android": get_device_configuration["appPackage-android"]
# }
# yield passPoint_data
# def get_AccessPointConn_data(get_device_configuration):
# passPoint_data = {
# "bundleId-iOS-Settings": get_device_configuration["bundleId-iOS-Settings"],
# "bundleId-iOS-Ping": get_device_configuration["bundleId-iOS-Ping"]
# }
# yield passPoint_data
def get_ToggleAirplaneMode_data(self, get_device_configuration):
passPoint_data = {
"webURL": "https://www.google.com",
"lblSearch": "//*[@class='gLFyf']",
"elelSearch": "(//*[@class='sbic sb43'])[1]",
"BtnRunSpeedTest": "//*[text()='RUN SPEED TEST']",
"bundleId-iOS-Settings": get_device_configuration["bundleId-iOS-Settings"],
"bundleId-iOS-Safari": get_device_configuration["bundleId-iOS-Safari"],
"downloadMbps": "//*[@id='knowledge-verticals-internetspeedtest__download']/P[@class='spiqle']",
"UploadMbps": "//*[@id='knowledge-verticals-internetspeedtest__upload']/P[@class='spiqle']",
# Android
"platformName-android": get_device_configuration["platformName-android"],
"appPackage-android": get_device_configuration["appPackage-android"]
}
return passPoint_data
# def get_ToggleWifiMode_data(get_device_configuration):
# passPoint_data = {
# # iOS
# "bundleId-iOS-Settings": get_device_configuration["bundleId-iOS-Settings"],
# # Android
# "platformName-android": get_device_configuration["platformName-android"],
# "appPackage-android": get_device_configuration["appPackage-android"]
# }
# yield passPoint_data
def report_client(self, value):
global reporting_client # declare a to be a global
reporting_client = value # this sets the global value of a
def reportPerfecto(testCaseName, testCaseStatus, testErrorMsg, reportURL):
global testCaseNameList # declare a to be a global
global testCaseStatusList
global testCaseErrorMsg
global testCaseReportURL
testCaseNameList.append(testCaseName)
testCaseStatusList.append(testCaseStatus)
testCaseErrorMsg.append(str(testErrorMsg))
testCaseReportURL.append(reportURL)
def setup_perfectoMobileWeb(self, get_device_configuration):
from selenium import webdriver
rdriver = None
reporting_client = None
warnings.simplefilter("ignore", ResourceWarning)
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
capabilities = {
'platformName': get_device_configuration["platformName-iOS"],
'model': get_device_configuration["model-iOS"],
'browserName': get_device_configuration["browserType-iOS"],
'securityToken': get_device_configuration["securityToken"],
}
if not self.is_device_available_timeout(capabilities['model']):
print("Unable to get device.")
pytest.exit("Exiting Pytest")
rdriver = webdriver.Remote(
'https://' + self.perfecto_data["perfectoURL"] + '.perfectomobile.com/nexperience/perfectomobile/wd/hub',
capabilities)
rdriver.implicitly_wait(2)
projectname = self.perfecto_data["projectName"]
projectversion = self.perfecto_data["projectVersion"]
jobname = get_device_configuration["jobName"]
jobnumber = get_device_configuration["jobNumber"]
tags = self.perfecto_data["reportTags"]
testCaseName = get_device_configuration["jobName"]
print("Setting Perfecto ReportClient....")
perfecto_execution_context = PerfectoExecutionContext(rdriver, tags, Job(jobname, jobnumber),
Project(projectname, projectversion))
reporting_client = PerfectoReportiumClient(perfecto_execution_context)
reporting_client.test_start(testCaseName, TestContext([], "Perforce"))
def teardown():
try:
print(" -- Tear Down --")
reporting_client.test_stop(TestResultFactory.create_success())
print('Report-Url: ' + reporting_client.report_url() + '\n')
rdriver.close()
except Exception as e:
print(" -- Exception Not Able To close --")
print(e.message)
finally:
try:
rdriver.quit()
except Exception as e:
print(" -- Exception Not Able To Quit --")
print(e.message)
# request.addfinalizer(teardown)
if rdriver is None:
yield -1
else:
yield rdriver, reporting_client
# Does HTTP GET request to Perfecto cloud and gets response and information related to a headset
def response_device(self, model):
securityToken = self.perfecto_data["securityToken"]
perfectoURL = self.perfecto_data["perfectoURL"]
url = f"https://{perfectoURL}.perfectomobile.com/services/handsets?operation=list&securityToken={securityToken}&model={model}"
resp = requests.get(url=url)
return ET.fromstring(resp.content)
# Get an attribute value from the handset response
def get_attribute_device(self, responseXml, attribute):
try:
return responseXml.find('handset').find(attribute).text
except:
print(f"Unable to get value of {attribute} from response")
return ""
# Checks to see if a particular handset is available
def is_device_available(self, model):
try:
responseXml = self.response_device(model)
except:
print("Unable to get response.")
raise Exception("Unable to get response.")
device_available = self.get_attribute_device(responseXml, 'available')
print("Result:" + device_available)
if device_available == 'true':
return True
else:
allocated_to = self.get_attribute_device(responseXml, 'allocatedTo')
print("The device is currently allocated to:" + allocated_to)
return False
# Checks whether the device is available or not.If the device is not available rechecks depending upon the
# Checks whether the device is available or not.If the device is not available rechecks depending upon the
# 'timerValue' and 'timerThreshold' values.With the current parameters it will check after:10,20,40,80 mins.
def is_device_Available_timeout(self, model):
device_available = self.is_device_available(model)
timerValue = 5
timerThreshold = 80
if not device_available:
while (timerValue <= timerThreshold):
print("Last checked at:" + strftime("%Y-%m-%d %H:%M:%S", gmtime()))
print(f"Waiting for: {timerValue} min(s)")
time.sleep(timerValue * 60)
print("Checking now at:" + strftime("%Y-%m-%d %H:%M:%S", gmtime()))
device_available = self.is_device_available(model)
if (device_available):
return True
else:
timerValue = timerValue + 5
if (timerValue > timerThreshold):
return False
else:
return True
else:
return True
def get_device_attribuites(self, model, attribute):
try:
responseXml = self.response_device(model)
except:
print("Unable to get response.")
raise Exception("Unable to get response.")
try:
attribute_value = self.get_attribute_device(responseXml, str(attribute))
except:
attribute_value = False
return attribute_value
if __name__ == '__main__':
perfecto_data = {
"securityToken": "eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI3NzkzZGM0Ni1jZmU4LTQ4ODMtYjhiOS02ZWFlZGU2OTc2MDkifQ.eyJpYXQiOjE2MzI4Mzc2NDEsImp0aSI6IjAwZGRiYWY5LWQwYjMtNDRjNS1hYjVlLTkyNzFlNzc5ZGUzNiIsImlzcyI6Imh0dHBzOi8vYXV0aDIucGVyZmVjdG9tb2JpbGUuY29tL2F1dGgvcmVhbG1zL3RpcC1wZXJmZWN0b21vYmlsZS1jb20iLCJhdWQiOiJodHRwczovL2F1dGgyLnBlcmZlY3RvbW9iaWxlLmNvbS9hdXRoL3JlYWxtcy90aXAtcGVyZmVjdG9tb2JpbGUtY29tIiwic3ViIjoiODNkNjUxMWQtNTBmZS00ZWM5LThkNzAtYTA0ZjBkNTdiZDUyIiwidHlwIjoiT2ZmbGluZSIsImF6cCI6Im9mZmxpbmUtdG9rZW4tZ2VuZXJhdG9yIiwibm9uY2UiOiI2ZjE1YzYxNy01YTU5LTQyOWEtODc2Yi1jOTQxMTQ1ZDFkZTIiLCJzZXNzaW9uX3N0YXRlIjoiYmRjZTFmYTMtMjlkYi00MmFmLWI5YWMtYjZjZmJkMDEyOTFhIiwic2NvcGUiOiJvcGVuaWQgcHJvZmlsZSBvZmZsaW5lX2FjY2VzcyBlbWFpbCJ9.5R85_1R38ZFXv_wIjjCIsj8NJm1p66dCsLJI5DBEmks",
"projectName": "TIP-PyTest-Execution",
"projectVersion": "1.0",
"reportTags": "TestTag",
"perfectoURL": "tip",
"iPhone-11": {
"model-iOS": "iPhone-11",
"bundleId-iOS": "com.apple.Preferences",
"platformName-iOS": "iOS",
"bundleId-iOS-Settings": "com.apple.Preferences",
"bundleId-iOS-Ping": "com.deftapps.ping",
"browserType-iOS": "Safari",
"bundleId-iOS-Safari": "com.apple.mobilesafari",
"platformName-android": "Android",
"appPackage-android": "com.android.settings",
"jobName": "Interop-iphone-11",
"jobNumber": 38
}
}
access_point = [{
"model": "edgecore_eap101",
"supported_bands": ["2G", "5G"],
"upstream_port": "1.1.eth1",
"supported_modes": ["BRIDGE", "NAT", "VLAN"],
"ssid": {
"2g-ssid": "OpenWifi",
"5g-ssid": "OpenWifi",
"6g-ssid": "candela6ghz",
"2g-password": "OpenWifi",
"5g-password": "OpenWifi",
"6g-password": "hello123",
"2g-encryption": "WPA2",
"5g-encryption": "open",
"6g-encryption": "WPA3",
"2g-bssid": "68:7d:b4:5f:5c:31 ",
"5g-bssid": "68:7d:b4:5f:5c:3c",
"6g-bssid": "68:7d:b4:5f:5c:38"
},
"mode": "wifi6",
"identifier": "903cb36ae255",
"serial_port": True,
"host_ip": "10.28.3.102",
"host_username": "lanforge",
"host_password": "pumpkin77",
"host_ssh_port": 22,
"serial_tty": "/dev/ttyAP5",
"firmware_version": "next-latest"
}]
obj = perfecto_interop(perfecto_data=perfecto_data, dut_data=access_point)
x = obj.get_device_configuration()
obj.setup_perfectoMobile_android()