diff --git a/.github/actions/build-and-push-docker/action.yml b/.github/actions/build-and-push-docker/action.yml new file mode 100644 index 000000000..78dc6a4fb --- /dev/null +++ b/.github/actions/build-and-push-docker/action.yml @@ -0,0 +1,45 @@ +name: build and push Docker image +description: build and push the wlan-testing Docker image + +inputs: + registry: + description: the registry to push to + required: true + registry_user: + description: the user to authenticate against the registry + required: true + registry_password: + description: the password to authenticate against the registry + required: true + +runs: + using: "composite" + steps: + - name: Checkout Testing repo + uses: actions/checkout@v2 + with: + path: wlan-testing + + - name: Checkout LANforge scripts + uses: actions/checkout@v2 + with: + path: wlan-lanforge-scripts + repository: Telecominfraproject/wlan-lanforge-scripts + + - name: import LANforge scripts + shell: bash + working-directory: wlan-testing + run: ./sync_repos.bash + + - name: docker login + shell: bash + run: docker login ${{ inputs.registry }} -u ${{ inputs.registry_user }} -p ${{ inputs.registry_password }} + + - name: build docker image + working-directory: wlan-testing + shell: bash + run: docker build -t ${{ inputs.registry }}/cloud-sdk-nightly:${{ github.run_id }} -f docker/Dockerfile . + + - name: push docker image + shell: bash + run: docker push ${{ inputs.registry }}/cloud-sdk-nightly:${{ github.run_id }} diff --git a/.github/actions/cleanup-docker/action.yml b/.github/actions/cleanup-docker/action.yml new file mode 100644 index 000000000..e66bdaf7d --- /dev/null +++ b/.github/actions/cleanup-docker/action.yml @@ -0,0 +1,17 @@ +name: build and push Docker image +description: build and push the wlan-testing Docker image + +inputs: + registry_user: + description: the user to authenticate against the registry + required: true + registry_password: + description: the password to authenticate against the registry + required: true + +runs: + using: "composite" + steps: + - name: cleanup Docker image + shell: bash + run: curl -u ${{ inputs.registry_user }}:${{ inputs.registry_password }} -X DELETE "https://tip.jfrog.io/artifactory/tip-wlan-cloud-docker-repo/cloud-sdk-nightly/${{ github.run_id }}" diff --git a/.github/workflows/advanced.yml b/.github/workflows/advanced.yml new file mode 100644 index 000000000..ae5342af5 --- /dev/null +++ b/.github/workflows/advanced.yml @@ -0,0 +1,285 @@ +name: advanced testing + +env: + ALLURE_CLI_VERSION: 2.14.0 + +on: + workflow_dispatch: + schedule: + - cron: '30 20 * * *' + +defaults: + run: + shell: bash + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: build and push Docker image + uses: ./.github/actions/build-and-push-docker + with: + registry: tip-tip-wlan-cloud-docker-repo.jfrog.io + registry_user: wlan-testing-cicd + registry_password: ${{ secrets.DOCKER_USER_PASSWORD }} + + test: + runs-on: [ self-hosted, small ] + needs: [ build ] + timeout-minutes: 1440 + env: + AWS_EKS_NAME: tip-wlan-main + AWS_DEFAULT_OUTPUT: json + AWS_DEFAULT_REGION: us-east-2 + AWS_ACCOUNT_ID: ${{ secrets.AWS_ACCOUNT_ID }} + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_CLIENT_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_CLIENT_KEY }} + + strategy: + fail-fast: false + matrix: + testbed: + - advanced-01 + - advanced-02 + + steps: + - name: install aws CLI tool + run: | + curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" + unzip awscliv2.zip + sudo ./aws/install + - name: install kubectl + run: | + curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" + sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl + + - name: get EKS access credentials + run: aws eks update-kubeconfig --name ${{ env.AWS_EKS_NAME }} + + - name: install Allure CLI tool + run: | + wget https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/${{ env.ALLURE_CLI_VERSION }}/allure-commandline-${{ env.ALLURE_CLI_VERSION }}.tgz + tar -xzf allure-commandline-${{ env.ALLURE_CLI_VERSION }}.tgz + + - name: set job name + id: job + run: echo "::set-output name=name::advanced-ci-${{ github.run_number }}" + + - name: prepare namespace + id: namespace + run: | + NAMESPACE="testing-${{ github.run_number }}-${{ matrix.testbed }}" + kubectl create ns $NAMESPACE + kubectl config set-context --current --namespace=$NAMESPACE + echo "::set-output name=name::${NAMESPACE}" + + - name: create configuration.py secret + run: | + cat << EOF > configuration.py + ${{ secrets.LAB_CONFIGURATION }} + EOF + kubectl create secret generic configuration --from-file=configuration=./configuration.py + + - name: run tests + run: | + cat </dev/null 2>&1 + done + echo "tests completed" + echo "downloading allure results..." + kubectl cp $podname:/tmp/allure-results allure-results >/dev/null 2>&1 + echo "waiting for pod to exit" + kubectl logs -f $podname >/dev/null 2>&1 + exit $(kubectl get pod $podname --output="jsonpath={.status.containerStatuses[].state.terminated.exitCode}") + + - name: upload Allure results as artifact + if: ${{ always() }} + uses: actions/upload-artifact@v2 + with: + name: allure-results-${{ matrix.testbed }} + path: allure-results + + - name: cleanup + if: ${{ always() }} + run: | + kubectl delete ns "${{ steps.namespace.outputs.name }}" --wait=true + + + report: + needs: [ test ] + if: always() + runs-on: ubuntu-latest + strategy: + fail-fast: false + max-parallel: 1 + matrix: + testbed: + - advanced-01 + - advanced-02 + steps: + - name: install Allure CLI tool + run: | + wget https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/${{ env.ALLURE_CLI_VERSION }}/allure-commandline-${{ env.ALLURE_CLI_VERSION }}.tgz + tar -xzf allure-commandline-${{ env.ALLURE_CLI_VERSION }}.tgz + + - uses: actions/download-artifact@v2 + with: + name: allure-results-${{ matrix.testbed }} + path: allure-results + + - name: checkout testing repo + uses: actions/checkout@v2 + with: + path: wlan-testing + + - name: get reports branch + uses: actions/checkout@v2 + continue-on-error: true + with: + ref: gh-pages + path: reports + + - name: copy history into results + run: | + if [ -e "reports/advanced/${{ matrix.testbed }}/latest" ] ; then + cp -r reports/advanced/${{ matrix.testbed }}/latest/history/ allure-results/history + fi + + - name: add report metadata + run: | + cat << EOF >> allure-results/environment.properties + Testbed=${{ matrix.testbed }} + Tests.CommitId=$(cd wlan-testing && git rev-parse --short HEAD) + CiRun.Id=${{ github.run_id }} + CiRun.Number=${{ github.run_number }} + CiRun.Url=https://github.com/${{github.repository}}/actions/runs/${{github.run_id}} + EOF + + - name: generate Allure report + run: allure-${{ env.ALLURE_CLI_VERSION }}/bin/allure generate allure-results + + - name: upload Allure report as artifact + uses: actions/upload-artifact@v2 + with: + name: allure-report-${{ matrix.testbed }} + path: allure-report + + # doing this to be able to aggregate multiple reports together later on + - name: copy results into report + run: | + mkdir -p allure-report/results + cp -r allure-results/* allure-report/results + + - name: copy new report + run: | + mkdir -p reports/advanced/${{ matrix.testbed }} + cp -Tr allure-report reports/advanced/${{ matrix.testbed }}/${{ github.run_number }} + + - name: update latest symlink + working-directory: reports/advanced/${{ matrix.testbed }} + run: ln -fns ${{ github.run_number }} latest + + - name: generate new index.html + run: python wlan-testing/.github/tools/generate_directory_index.py -r reports + + - name: commit reports update + working-directory: reports + run: | + git config --global user.name "github-actions[bot]" + git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" + + git add . + git commit -m "Automated deployment: $(date -u)" + + - name: push + if: github.ref == 'refs/heads/master' + uses: ad-m/github-push-action@v0.6.0 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + branch: gh-pages + directory: reports + + - name: upload to S3 + if: github.ref == 'refs/heads/master' + uses: ./wlan-testing/.github/actions/allure-report-to-s3 + with: + test_type: advanced + testbed: ${{ matrix.testbed }} + report_path: allure-report + s3_access_key_id: ${{ secrets.ALLURE_S3_ACCESS_KEY_ID }} + s3_access_key_secret: ${{ secrets.ALLURE_S3_ACCESS_KEY_SECRET }} + + cleanup: + needs: [ test ] + runs-on: ubuntu-latest + if: always() + steps: + - uses: actions/checkout@v2 + - name: cleanup Docker image + uses: ./.github/actions/cleanup-docker + with: + registry_user: wlan-testing-cicd + registry_password: ${{ secrets.DOCKER_USER_PASSWORD }} diff --git a/.github/workflows/interop.yml b/.github/workflows/interop.yml index 2f899defd..c8a038e38 100644 --- a/.github/workflows/interop.yml +++ b/.github/workflows/interop.yml @@ -184,12 +184,6 @@ jobs: kubectl logs -f $podname >/dev/null 2>&1 exit $(kubectl get pod $podname --output="jsonpath={.status.containerStatuses[].state.terminated.exitCode}") - - name: print logs - if: ${{ always() }} - run: | - podname=$(kubectl get pods --no-headers -o custom-columns=":metadata.name" -l job-name="${{ steps.job.outputs.name }}" | sed "s/pod\///") - kubectl logs $podname - - name: upload Allure results as artifact if: ${{ always() }} uses: actions/upload-artifact@v2 diff --git a/.github/workflows/ow_docker-compose.yml b/.github/workflows/ow_docker-compose.yml index 8a3e5c4e3..93662eb25 100644 --- a/.github/workflows/ow_docker-compose.yml +++ b/.github/workflows/ow_docker-compose.yml @@ -14,6 +14,8 @@ env: ALLURE_CLI_VERSION: 2.14.0 on: + repository_dispatch: + types: [openwifi-sdk-pr] workflow_dispatch: inputs: testbeds: @@ -27,27 +29,27 @@ on: owgw_version: default: 'master' description: 'OpenWIFI Gateway version to be deployed.' - required: true + required: false owgwui_version: default: 'main' description: 'OpenWIFI Web UI version to be deployed.' - required: true + required: false owsec_version: default: 'main' description: 'OpenWIFI Security version to be deployed.' - required: true + required: false owfms_version: default: 'main' description: 'OpenWIFI Firmware version to be deployed.' - required: true + required: false owprov_version: default: 'main' description: 'OpenWIFI Provisioning version to be deployed.' - required: true + required: false owprovui_version: default: 'main' description: 'OpenWIFI Provisioning Web UI version to be deployed.' - required: true + required: false defaults: run: @@ -262,17 +264,17 @@ jobs: - name: DOCKER_CERT_PATH value: "/certs/client" - name: OWGW_TAG - value: "${{ github.event.inputs.owgw_version }}" + value: "${{ github.event.inputs.owgw_version || github.event.client_payload.owgw_tag }}" - name: OWGWUI_TAG - value: "${{ github.event.inputs.owgwui_version }}" + value: "${{ github.event.inputs.owgwui_version || github.event.client_payload.owgwui_tag }}" - name: OWSEC_TAG - value: "${{ github.event.inputs.owsec_version }}" + value: "${{ github.event.inputs.owsec_version || github.event.client_payload.owsec_tag }}" - name: OWFMS_TAG - value: "${{ github.event.inputs.owfms_version }}" + value: "${{ github.event.inputs.owfms_version || github.event.client_payload.owfms_tag }}" - name: OWPROV_TAG - value: "${{ github.event.inputs.owprov_version }}" + value: "${{ github.event.inputs.owprov_version || github.event.client_payload.owprov_tag }}" - name: OWPROVUI_TAG - value: "${{ github.event.inputs.owprovui_version }}" + value: "${{ github.event.inputs.owprovui_version || github.event.client_payload.owprovui_tag }}" - name: INTERNAL_OWGW_HOSTNAME value: "owgw.wlan.local" - name: INTERNAL_OWSEC_HOSTNAME @@ -361,92 +363,9 @@ jobs: -e OWSEC_NEW_PASSWORD \ tip-tip-wlan-cloud-ucentral.jfrog.io/clustersysteminfo:main - generate-matrix: - name: generate testbed matrix - runs-on: ubuntu-latest - outputs: - matrix: ${{ steps.set-matrix.outputs.matrix }} - steps: - - name: generate-matrix - id: set-matrix - run: | - TESTBEDS="${{ github.event.inputs.testbeds || 'basic-05' }}" - TESTBEDS=$(echo $TESTBEDS | sed "s/,/\",\"/g" | sed 's/^/[\"/g' | sed 's/$/\"]/g') - TESTBEDS=$(echo "$TESTBEDS" | jq -c 'map({"testbed":.})') - echo "::set-output name=matrix::{\"include\":${TESTBEDS}}" - - set-redirector-url: - needs: [ deploy-controller, generate-matrix ] - if: github.event.inputs.marker_expression == 'uc_sanity' - strategy: - fail-fast: false - matrix: ${{ fromJson( needs.generate-matrix.outputs.matrix ) }} - runs-on: self-hosted - steps: - - name: checkout testing repo - uses: actions/checkout@v2 - with: - repository: Telecominfraproject/wlan-testing - path: wlan-testing - - - name: checkout pki cert scripts repo - uses: actions/checkout@v2 - with: - repository: Telecominfraproject/wlan-pki-cert-scripts - path: wlan-pki-cert-scripts - - - name: install dependencies - run: | - sudo apt-get install -y python3-pip - pip install paramiko scp allure-pytest - - - name: create configuration.py file - run: | - cat << EOF > configuration.py - ${{ secrets.LAB_CONFIGURATION }} - EOF - - - name: set redirector URL - env: - DIGICERT_API_KEY: ${{ secrets.DIGICERT_API_KEY }} - run: | - for id in $(echo -e 'from configuration import CONFIGURATION\nfor ap in CONFIGURATION["${{ matrix.testbed }}"]["access_point"]: print(ap["serial"])' | python3) - do - ./wlan-pki-cert-scripts/digicert-change-ap-redirector.sh $id "${{ needs.deploy-controller.outputs.gateway_url }}" - current_redirector=$(./wlan-pki-cert-scripts/digicert-get-ap-redirector.sh $id) - if [[ "$current_redirector" != "${{ needs.deploy-controller.outputs.gateway_url }}" ]]; then - echo "Current redirector in DigiCert ($current_redirector) is different from the required one (${{ needs.deploy-controller.outputs.gateway_url }})" - exit 1 - fi - done - - - name: factory reset APs - run: | - set -x - AP_LEN=$(echo -e "from configuration import CONFIGURATION\nprint(len(CONFIGURATION['${{ matrix.testbed }}']['access_point']) - 1)" | python3) - for index in $(seq 0 $AP_LEN) - do - HOST=$(echo -e "from configuration import CONFIGURATION\nprint(CONFIGURATION['${{ matrix.testbed }}']['access_point'][$index]['ip'])" | python3) - JUMPHOST=$(echo -e "from configuration import CONFIGURATION\nprint(CONFIGURATION['${{ matrix.testbed }}']['access_point'][$index]['jumphost'])" | python3) - TTY=$(echo -e "from configuration import CONFIGURATION\nprint(CONFIGURATION['${{ matrix.testbed }}']['access_point'][$index]['jumphost_tty'])" | python3) - PORT=$(echo -e "from configuration import CONFIGURATION\nprint(CONFIGURATION['${{ matrix.testbed }}']['access_point'][$index]['port'])" | python3) - USERNAME=$(echo -e "from configuration import CONFIGURATION\nprint(CONFIGURATION['${{ matrix.testbed }}']['access_point'][$index]['username'])" | python3) - PASSWORD=$(echo -e "from configuration import CONFIGURATION\nprint(CONFIGURATION['${{ matrix.testbed }}']['access_point'][$index]['password'])" | python3) - cd wlan-testing/tools - python3 ap_tools.py --host $HOST --jumphost $JUMPHOST --tty $TTY --port $PORT --username $USERNAME --password $PASSWORD --cmd "jffs2reset -y -r" - cd ../.. - done - - - name: wait for APs to come up again - run: sleep 300 - test: runs-on: ubuntu-latest - needs: [ build, generate-matrix, deploy-controller, set-redirector-url ] - if: always() - strategy: - fail-fast: false - matrix: ${{ fromJson( needs.generate-matrix.outputs.matrix ) }} + needs: [ build, deploy-controller ] steps: - name: get EKS access credentials run: aws eks update-kubeconfig --name ${{ env.AWS_EKS_NAME }} @@ -507,7 +426,7 @@ jobs: - -c - | cd tests - pytest -m "${{ github.event.inputs.marker_expression || 'sdk_restapi' }}" -s -vvv --testbed="${{ matrix.testbed }}" --alluredir=/tmp/allure-results + pytest -m "${{ github.event.inputs.marker_expression || 'sdk_restapi' }}" -s -vvv --testbed="${{ github.event.inputs.testbeds || 'basic-05' }}" --alluredir=/tmp/allure-results ret=\$? # sleep some time to be able to download the Allure results sleep 60 @@ -560,7 +479,7 @@ jobs: if: always() uses: actions/upload-artifact@v2 with: - name: allure-results-${{ matrix.testbed }} + name: allure-results-${{ github.event.inputs.testbeds || 'basic-05' }} path: allure-results - name: cleanup @@ -570,12 +489,8 @@ jobs: report: runs-on: ubuntu-latest - needs: [ test, generate-matrix ] + needs: [ test ] if: always() - strategy: - max-parallel: 1 - fail-fast: false - matrix: ${{ fromJson( needs.generate-matrix.outputs.matrix ) }} steps: - name: install Allure CLI tool run: | @@ -584,7 +499,7 @@ jobs: - uses: actions/download-artifact@v2 with: - name: allure-results-${{ matrix.testbed }} + name: allure-results-${{ github.event.inputs.testbeds || 'basic-05' }} path: allure-results - name: checkout testing repo @@ -601,14 +516,14 @@ jobs: - name: copy history into results run: | - if [ -e "reports/docker-compose/${{ github.event.inputs.marker_expression || 'sdk_restapi' }}/${{ matrix.testbed }}/latest" ] ; then - cp -r reports/docker-compose/${{ github.event.inputs.marker_expression || 'sdk_restapi' }}/${{ matrix.testbed }}/latest/history/ allure-results/history + if [ -e "reports/docker-compose/${{ github.event.inputs.marker_expression || 'sdk_restapi' }}/${{ github.event.inputs.testbeds || 'basic-05' }} /latest" ] ; then + cp -r reports/docker-compose/${{ github.event.inputs.marker_expression || 'sdk_restapi' }}/${{ github.event.inputs.testbeds || 'basic-05' }}/latest/history/ allure-results/history fi - name: add report metadata run: | cat << EOF >> allure-results/environment.properties - Testbed=${{ matrix.testbed }} + Testbed=${{ github.event.inputs.testbeds || 'basic-05' }} Tests.CommitId=$(cd wlan-testing && git rev-parse --short HEAD) CiRun.Id=${{ github.run_id }} CiRun.Number=${{ github.run_number }} @@ -621,7 +536,7 @@ jobs: - name: upload Allure report as artifact uses: actions/upload-artifact@v2 with: - name: allure-report-${{ matrix.testbed }} + name: allure-report-${{ github.event.inputs.testbeds || 'basic-05' }} path: allure-report # doing this to be able to aggregate multiple reports together later on @@ -630,11 +545,11 @@ jobs: - name: copy new report run: | - mkdir -p reports/docker-compose/${{ github.event.inputs.marker_expression || 'sdk_restapi' }}/${{ matrix.testbed }} - cp -Tr allure-report reports/docker-compose/${{ github.event.inputs.marker_expression || 'sdk_restapi' }}/${{ matrix.testbed }}/${{ github.run_number }} + mkdir -p reports/docker-compose/${{ github.event.inputs.marker_expression || 'sdk_restapi' }}/${{ github.event.inputs.testbeds || 'basic-05' }} + cp -Tr allure-report reports/docker-compose/${{ github.event.inputs.marker_expression || 'sdk_restapi' }}/${{ github.event.inputs.testbeds || 'basic-05' }}/${{ github.run_number }} - name: update latest symlink - working-directory: reports/docker-compose/${{ github.event.inputs.marker_expression || 'sdk_restapi' }}/${{ matrix.testbed }} + working-directory: reports/docker-compose/${{ github.event.inputs.marker_expression || 'sdk_restapi' }}/${{ github.event.inputs.testbeds || 'basic-05' }} run: ln -fns ${{ github.run_number }} latest - name: generate new index.html @@ -683,66 +598,3 @@ jobs: - name: Delete namespace run: kubectl delete ns --ignore-not-found=true "ow-docker-compose-${{ github.run_id }}" - - reset-redirector-url: - needs: [ test, generate-matrix ] - if: github.event.inputs.marker_expression == 'uc_sanity' && always() - strategy: - fail-fast: false - matrix: ${{ fromJson( needs.generate-matrix.outputs.matrix ) }} - runs-on: self-hosted - steps: - - name: checkout testing repo - uses: actions/checkout@v2 - with: - repository: Telecominfraproject/wlan-testing - path: wlan-testing - - - name: checkout pki cert scripts repo - uses: actions/checkout@v2 - with: - repository: Telecominfraproject/wlan-pki-cert-scripts - path: wlan-pki-cert-scripts - - - name: install dependencies - run: | - pip install paramiko scp allure-pytest - - - name: create configuration.py file - run: | - cat << EOF > configuration.py - ${{ secrets.LAB_CONFIGURATION }} - EOF - - - name: reset redirector URL - env: - DIGICERT_API_KEY: ${{ secrets.DIGICERT_API_KEY }} - run: | - for id in $(echo -e 'from configuration import CONFIGURATION\nfor ap in CONFIGURATION["${{ matrix.testbed }}"]["access_point"]: print(ap["serial"])' | python3) - do - ./wlan-pki-cert-scripts/digicert-change-ap-redirector.sh $id gw-qa01.cicd.lab.wlan.tip.build - current_redirector=$(./wlan-pki-cert-scripts/digicert-get-ap-redirector.sh $id) - if [[ "$current_redirector" != "gw-qa01.cicd.lab.wlan.tip.build" ]]; then - echo "Current redirector in DigiCert ($current_redirector) is different from the required one (gw-qa01.cicd.lab.wlan.tip.build)" - exit 1 - fi - done - - - name: factory reset APs - run: | - AP_LEN=$(echo -e "from configuration import CONFIGURATION\nprint(len(CONFIGURATION['${{ matrix.testbed }}']['access_point']) - 1)" | python3) - for index in $(seq 0 $AP_LEN) - do - HOST=$(echo -e "from configuration import CONFIGURATION\nprint(CONFIGURATION['${{ matrix.testbed }}']['access_point'][$index]['ip'])" | python3) - JUMPHOST=$(echo -e "from configuration import CONFIGURATION\nprint(CONFIGURATION['${{ matrix.testbed }}']['access_point'][$index]['jumphost'])" | python3) - TTY=$(echo -e "from configuration import CONFIGURATION\nprint(CONFIGURATION['${{ matrix.testbed }}']['access_point'][$index]['jumphost_tty'])" | python3) - PORT=$(echo -e "from configuration import CONFIGURATION\nprint(CONFIGURATION['${{ matrix.testbed }}']['access_point'][$index]['port'])" | python3) - USERNAME=$(echo -e "from configuration import CONFIGURATION\nprint(CONFIGURATION['${{ matrix.testbed }}']['access_point'][$index]['username'])" | python3) - PASSWORD=$(echo -e "from configuration import CONFIGURATION\nprint(CONFIGURATION['${{ matrix.testbed }}']['access_point'][$index]['password'])" | python3) - cd wlan-testing/tools - python3 ap_tools.py --host $HOST --jumphost $JUMPHOST --tty $TTY --port $PORT --username $USERNAME --password $PASSWORD --cmd "jffs2reset -y -r" - cd ../.. - done - - - name: wait for APs to come up again - run: sleep 300 diff --git a/.github/workflows/quali-basic-manual.yml b/.github/workflows/quali-basic-manual.yml new file mode 100644 index 000000000..9341a724f --- /dev/null +++ b/.github/workflows/quali-basic-manual.yml @@ -0,0 +1,563 @@ +name: manual pytest execution against basic lab +env: + # thirdparties + DOCKER_SERVER: tip-tip-wlan-cloud-docker-repo.jfrog.io + DOCKER_USER_NAME: wlan-testing-cicd + DOCKER_USER_PASSWORD: ${{ secrets.DOCKER_USER_PASSWORD }} + # AWS credentials + AWS_EKS_NAME: tip-wlan-main + AWS_DEFAULT_OUTPUT: json + AWS_DEFAULT_REGION: us-east-2 + AWS_ACCOUNT_ID: ${{ secrets.AWS_ACCOUNT_ID }} + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_CLIENT_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_CLIENT_KEY }} + # Cloud SDK certs + CACERT: ${{ secrets.CACERT }} + CAKEY: ${{ secrets.CAKEY }} + ALLURE_CLI_VERSION: 2.14.0 + +on: + workflow_dispatch: + inputs: + openwifi_revision: + required: true + default: 'main' + description: 'revision of the Open Wifi Helm chart' + openwifi_gw_revision: + required: true + default: 'master' + description: 'revision of the Open Wifi gateway service' + openwifi_sec_revision: + required: true + default: 'main' + description: 'revision of the Open Wifi security service' + openwifi_fms_revision: + required: true + default: 'main' + description: 'revision of the Open Wifi fms service' + openwifi_ui_revision: + required: true + default: 'main' + description: 'revision of the Open Wifi UI' + ap_model: + description: 'AP model to test, one of edgecore_ecw5410,edgecore_eap101,tp-link_ec420-g1,edgecore_ecw5211,cig_wf188n,edgecore_eap102,cig_wf194c,hfcl_ion4' + required: true + firmware: + default: 'next-latest' + description: 'Target firmware version to be specified -' + required: false + marker_expression: + description: "marker expression that will be passed to pytest's -m" + required: true + +defaults: + run: + shell: bash + +jobs: + build: + runs-on: ubuntu-latest + steps: + # checkout needed repositories + - name: Checkout Testing repo + uses: actions/checkout@v2 + with: + path: wlan-testing + + - name: Checkout LANforge scripts + uses: actions/checkout@v2 + with: + path: wlan-lanforge-scripts + repository: Telecominfraproject/wlan-lanforge-scripts + + - name: import LANforge scripts + working-directory: wlan-testing + run: ./sync_repos.bash + + # build and push docker image + - name: docker login + run: docker login ${{ env.DOCKER_SERVER }} -u ${{ env.DOCKER_USER_NAME }} -p ${{ env.DOCKER_USER_PASSWORD }} + - name: build docker image + working-directory: wlan-testing + run: docker build -t ${{ env.DOCKER_SERVER }}/cloud-sdk-nightly:${{ github.run_id }} -f docker/Dockerfile . + - name: push docker image + run: docker push ${{ env.DOCKER_SERVER }}/cloud-sdk-nightly:${{ github.run_id }} + + test: + runs-on: [ self-hosted, small ] + needs: [ build ] + + steps: + - uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.8' + + - name: install dependencies + run: pip install -r .quali/requirements.txt + + - name: start reservation + id: start + env: + CLOUDSHELL_URL: quali-cloudshell.lab.wlan.tip.build + CLOUDSHELL_USER: ${{ secrets.CLOUDSHELL_USER }} + CLOUDSHELL_PASSWORD: ${{ secrets.CLOUDSHELL_PASSWORD }} + run: | + RES_ID=$(python .quali/start_reservation.py --openwifi-version "${{ github.event.inputs.openwifi_revision }}" --openwifi-gw-version "${{ github.event.inputs.openwifi_gw_revision }}" --openwifi-sec-version "${{ github.event.inputs.openwifi_sec_revision }}" --openwifi-fms-version "${{ github.event.inputs.openwifi_fms_revision }}" --openwifi-ui-version "${{ github.event.inputs.openwifi_ui_revision }}" --ap-model "${{ github.event.inputs.ap_model }}") + echo ::set-output name=res_id::"$RES_ID" + + - name: set reservation identifier + id: reservation + run: echo ::set-output name=identifier::$(echo ${{ steps.start.outputs.res_id }} | cut -d "-" -f 1) + + - name: install JRE + run: | + sudo apt-get update + sudo apt-get install -y default-jre + + - name: install aws CLI tool + run: | + curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" + unzip awscliv2.zip + sudo ./aws/install + + - name: get EKS access credentials + run: aws eks update-kubeconfig --name ${{ env.AWS_EKS_NAME }} + + - name: install kubectl + run: | + curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" + sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl + + - name: install Allure CLI tool + run: | + wget https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/${{ env.ALLURE_CLI_VERSION }}/allure-commandline-${{ env.ALLURE_CLI_VERSION }}.tgz + tar -xzf allure-commandline-${{ env.ALLURE_CLI_VERSION }}.tgz + + - name: set job name + id: job + run: echo "::set-output name=name::manual-${{ github.run_id }}" + + - name: prepare namespace + id: namespace + run: | + NAMESPACE="testing-${{ github.run_id }}" + kubectl create ns $NAMESPACE + kubectl config set-context --current --namespace=$NAMESPACE + echo "::set-output name=name::${NAMESPACE}" + + - name: prepare configuration + env: + CLOUDSHELL_URL: quali-cloudshell.lab.wlan.tip.build + CLOUDSHELL_USER: ${{ secrets.CLOUDSHELL_USER }} + CLOUDSHELL_PASSWORD: ${{ secrets.CLOUDSHELL_PASSWORD }} + run: | + cat << EOF > configuration.py + Customer = "" + server = "" + CONFIGURATION = { + "basic": $(python .quali/get_configuration.py ${{ steps.start.outputs.res_id }}) + } + + open_flow = {} + + RADIUS_SERVER_DATA = { + "ip": "10.10.1.221", + "port": 1812, + "secret": "testing123", + "user": "user", + "password": "password", + "pk_password": "whatever" + } + + RADIUS_ACCOUNTING_DATA = { + "ip": "10.10.1.221", + "port": 1813, + "secret": "testing123", + "user": "user", + "password": "password", + "pk_password": "whatever" + } + + PASSPOINT_RADIUS_SERVER_DATA = { + "ip": "52.234.179.191", + "port": 11812, + "secret": "yeababy20!", + "user": "nolaradius", + "password": "nolastart", + "pk_password": "whatever" + } + + PASSPOINT_RADIUS_ACCOUNTING_SERVER_DATA = { + "ip": "52.234.179.191", + "port": 11813, + "secret": "yeababy20!" + } + + PASSPOINT_PROVIDER_INFO = { + "mcc": None, + "mnc": None, + "network": None, + "nai_realms": { + "domain": "oss.ameriband.com", + "encoding": 0, + "eap_map": {"EAP-TTLS with username/password": ["Credential Type:username/password", + "Non-EAP Inner Authentication Type:MSCHAPV2"]} + }, + "osu_nai_standalone": "anonymous@ameriband.com", + "osu_nai_shared": "anonymous@ameriband.com", + "roaming_oi": [] + } + + PASSPOINT_OPERATOR_INFO = { + "osen": "Disabled", + "domain_name_list": ["telecominfraproject.atlassian.net"], + "operator_names": [ + {"locale": "eng", "name": "Default friendly passpoint_operator name"}, + {"locale": "fra", "name": "Nom de l'opérateur convivial par défaut"} + ] + } + + PASSPOINT_VENUE_INFO = { + "venue_type": {"group": "Business", "type": "Police Station"}, + "venue_names": [ + {"locale": "eng", "name": "Example passpoint_venue", "url": "http://www.example.com/info-eng"}, + {"locale": "fra", "name": "Exemple de lieu", "url": "http://www.example.com/info-fra"} + ] + } + + PASSPOINT_PROFILE_INFO = { + "profile_download_url_ios": "https://onboard.almondlabs.net/ttls/AmeriBand-Profile.mobileconfig", + "profile_download_url_android": "https://onboard.almondlabs.net/ttls/androidconfig.cfg", + "profile_name_on_device": "AmeriBand", + "radius_configuration": { + "user_defined_nas_id": "FB001AP001", + "operator_id": "AmeribandTIP", + "radius_acounting_service_interval": 60 + }, + "interworking_hs2dot0": "Enabled", + "hessid": None, + "access_network": { + "Access Network Type": "Free Public Network", + "Authentication Type": "Acceptance of Terms & Conditions", + "Emergency Services Reachable": "Enabled", + "Unauthenticated Emergency Service": "Disabled", + }, + "ip_connectivity": { + "Internet Connectivity": "Enabled", + "IP Address Type": "Public IPv4 Address Available", + "Connection Capability": [{"status": "open", "protocol": "TCP", "port": 8888}], + "ANQP Domain ID": 1234, + "GAS Address 3 Behaviour": "P2P Spec Workaround From Request", + "Disable DGAF": False + } + } + + TEST_CASES = { + "ap_upgrade": 2233, + "5g_wpa2_bridge": 2236, + "2g_wpa2_bridge": 2237, + "5g_wpa_bridge": 2419, + "2g_wpa_bridge": 2420, + "2g_wpa_nat": 4323, + "5g_wpa_nat": 4324, + "2g_wpa2_nat": 4325, + "5g_wpa2_nat": 4326, + "2g_wpa2_eap_ttls_bridge": 5214, + "5g_wpa2_eap_ttls_bridge": 5215, + "2g_wpa2_eap_ttls_nat": 5216, + "5g_wpa2_eap_ttls_nat": 5217, + "cloud_connection": 5222, + "cloud_fw": 5247, + "5g_wpa2_vlan": 5248, + "5g_wpa_vlan": 5249, + "5g_wpa2_eap_ttls_vlan": 5250, + "2g_wpa2_vlan": 5251, + "2g_wpa_vlan": 5252, + "2g_wpa2_eap_ttls_vlan": 5253, + "cloud_ver": 5540, + "bridge_vifc": 5541, + "nat_vifc": 5542, + "vlan_vifc": 5543, + "bridge_vifs": 5544, + "nat_vifs": 5545, + "vlan_vifs": 5546, + "upgrade_api": 5547, + "create_fw": 5548, + "ap_profile_bridge": 5641, + "ap_profile_nat": 5642, + "ap_profile_vlan": 5643, + "ssid_2g_wpa2_eap_bridge": 5644, + "ssid_2g_wpa2_bridge": 5645, + "ssid_2g_wpa_bridge": 5646, + "ssid_5g_wpa2_eap_bridge": 5647, + "ssid_5g_wpa2_bridge": 5648, + "ssid_5g_wpa_bridge": 5649, + "ssid_2g_wpa2_eap_nat": 5650, + "ssid_2g_wpa2_nat": 5651, + "ssid_2g_wpa_nat": 5652, + "ssid_5g_wpa2_eap_nat": 5653, + "ssid_5g_wpa2_nat": 5654, + "ssid_5g_wpa_nat": 5655, + "ssid_2g_wpa2_eap_vlan": 5656, + "ssid_2g_wpa2_vlan": 5657, + "ssid_2g_wpa_vlan": 5658, + "ssid_5g_wpa2_eap_vlan": 5659, + "ssid_5g_wpa2_vlan": 5660, + "ssid_5g_wpa_vlan": 5661, + "radius_profile": 5808, + "bridge_ssid_update": 8742, + "nat_ssid_update": 8743, + "vlan_ssid_update": 8744, + "2g_wpa3_bridge": 9740, + "5g_wpa3_bridge": 9741, + "ssid_2g_wpa3_bridge": 9742, + "ssid_5g_wpa3_bridge": 9743, + "ssid_2g_wpa3_nat": 9744, + "ssid_5g_wpa3_nat": 9745, + "ssid_2g_wpa3_vlan": 9746, + "ssid_5g_wpa3_vlan": 9747, + "2g_wpa3_nat": 9748, + "5g_wpa3_nat": 9749, + "2g_wpa3_vlan": 9750, + "5g_wpa3_vlan": 9751, + "ssid_2g_wpa3_eap_bridge": 9752, + "ssid_5g_wpa3_eap_bridge": 9753, + "2g_wpa3_eap_ttls_bridge": 9754, + "5g_wpa3_eap_ttls_bridge": 9755, + "ssid_2g_wpa3_eap_nat": 9756, + "ssid_5g_wpa3_eap_nat": 9757, + "ssid_2g_wpa3_eap_vlan": 9758, + "ssid_5g_wpa3_eap_vlan": 9759, + "2g_wpa3_eap_ttls_nat": 9760, + "5g_wpa3_eap_ttls_nat": 9761, + "2g_wpa3_eap_ttls_vlan": 9762, + "5g_wpa3_eap_ttls_vlan": 9763, + "ssid_2g_wpa3_mixed_bridge": 9764, + "ssid_5g_wpa3_mixed_bridge": 9765, + "2g_wpa3_mixed_eap_ttls_wpa3_bridge": 9766, + "2g_wpa3_mixed_wpa3_bridge": 9767, + "5g_wpa3_mixed_eap_ttls_wpa3_bridge": 9768, + "5g_wpa3_mixed_wpa3_bridge": 9769, + "ssid_2g_wpa3_mixed_nat": 9770, + "ssid_5g_wpa3_mixed_nat": 9771, + "ssid_2g_wpa3_mixed_vlan": 9772, + "ssid_5g_wpa3_mixed_vlan": 9773, + # "2g_wpa3_mixed_wpa2_nat": 9774, + "2g_wpa3_mixed_wpa3_nat": 9775, + # "5g_wpa3_mixed_wpa2_nat": 9776, + "5g_wpa3_mixed_wpa3_nat": 9777, + # "2g_wpa3_mixed_wpa2_vlan": 9778, + "2g_wpa3_mixed_wpa3_vlan": 9779, + # "5g_wpa3_mixed_wpa2_vlan": 9780, + "5g_wpa3_mixed_wpa3_vlan": 9781, + "ssid_2g_wpa3_enterprise_mixed_bridge": 9782, + "ssid_5g_wpa3_enterprise_mixed_bridge": 9783, + "2g_wpa2_mixed_eap_wpa2_bridge": 9784, + "2g_wpa3_mixed_eap_wpa3_bridge": 9785, + "5g_wpa3_mixed_eap_wpa2_bridge": 9786, + "5g_wpa3_mixed_eap_wpa3_bridge": 9787, + "ssid_2g_wpa3_enterprise_mixed_nat": 9788, + "ssid_5g_wpa3_enterprise_mixed_nat": 9789, + "2g_wpa3_mixed_eap_wpa2_nat": 9790, + "2g_wpa3_mixed_eap_ttls_wpa3_nat": 9791, + "5g_wpa3_mixed_eap_wpa2_nat": 9792, + "5g_wpa3_mixed_eap_ttls_wpa3_nat": 9793, + "ssid_2g_wpa3_enterprise_mixed_vlan": 9794, + "ssid_5g_wpa3_enterprise_mixed_vlan": 9795, + "2g_wpa3_mixed_eap_wpa2_vlan": 9796, + "2g_wpa3_mixed_eap_ttls_wpa3_vlan": 9797, + "5g_wpa3_mixed_eap_wpa2_vlan": 9798, + "5g_wpa3_mixed_eap_ttls_wpa3_vlan": 9799, + "ssid_2g_open_bridge": 9805, + "ssid_5g_open_bridge": 9806, + "ssid_2g_open_nat": 9807, + "ssid_5g_open_nat": 9808, + "ssid_2g_open_vlan": 9809, + "ssid_5g_open_vlan": 9810, + "ssid_2g_wpa2_mixed_bridge": 9811, + "ssid_5g_wpa2_mixed_bridge": 9812, + "ssid_2g_wpa2_mixed_nat": 9813, + "ssid_5g_wpa2_mixed_nat": 9814, + "ssid_2g_wpa2_mixed_vlan": 9815, + "ssid_5g_wpa2_mixed_vlan": 9817, + "ssid_2g_wpa_wpa2_enterprise_mixed_bridge": 9818, + "ssid_5g_wpa_wpa2_enterprise_mixed_bridge": 9819, + "ssid_2g_wpa_wpa2_enterprise_mixed_nat": 9820, + "ssid_5g_wpa_wpa2_enterprise_mixed_nat": 9821, + "ssid_2g_wpa_wpa2_enterprise_mixed_vlan": 9822, + "ssid_5g_wpa_wpa2_enterprise_mixed_vlan": 9823, + "ssid_2g_wpa_eap_bridge": 9824, + "ssid_5g_wpa_eap_bridge": 9825, + # "ssid_2g_wpa2_eap_bridge": 9824, + # "ssid_5g_wpa2_eap_bridge": 9825, + "ssid_2g_wpa_eap_nat": 9826, + "ssid_5g_wpa_eap_nat": 9827, + "ssid_2g_wpa_eap_vlan": 9828, + "ssid_5g_wpa_eap_vlan": 9829, + # "ap_update_bridge": 9856, + # "ap_update_nat": 9857, + # "ap_update_vlan": 9858, + # "bridge_vifc_update": 9859, + # "nat_vifc_update": 9860, + # "vlan_vifc_update": 9861, + # "bridge_vifs_update": 9862, + # "nat_vifs_update": 9863, + # "vlan_vifs_update": 9864, + "2g_wpa_eap_ttls_bridge": 9867, + "5g_wpa_eap_ttls_bridge": 9768, + "2g_wpa_eap_ttls_nat": 9869, + "5g_wpa_eap_ttls_nat": 9770, + "2g_wpa_eap_ttls_vlan": 9871, + "5g_wpa_eap_ttls_vlan": 9872, + # "2g_wpa2_mixed_eap_wpa_bridge": 9873, + "2g_wpa2_mixed_eap_ttls_wpa2_bridge": 9874, + # "5g_wpa2_mixed_eap_wpa_bridge": 9875, + "5g_wpa2_mixed_eap_ttls_wpa2_bridge": 9876, + # "2g_wpa2_mixed_eap_wpa_nat": 9877, + "2g_wpa2_mixed_eap_ttls_wpa2_nat": 9878, + # "5g_wpa2_mixed_eap_wpa_nat": 9879, + "5g_wpa2_mixed_eap_ttls_wpa2_nat": 9880, + # "2g_wpa2_mixed_eap_wpa_vlan": 9881, + "2g_wpa2_mixed_eap_ttls_wpa2_vlan": 9882, + # "5g_wpa2_mixed_eap_wpa_vlan": 9883, + "5g_wpa2_mixed_eap_ttls_wpa2_vlan": 9884, + # "2g_wpa2_mixed_wpa_bridge": 9885, + "2g_wpa2_mixed_wpa2_bridge": 9886, + # "5g_wpa2_mixed_wpa_bridge": 9887, + "5g_wpa2_mixed_wpa2_bridge": 9888, + # "2g_wpa2_mixed_wpa_nat": 9889, + "2g_wpa2_mixed_wpa2_nat": 9890, + # "5g_wpa2_mixed_wpa_nat": 9891, + "5g_wpa2_mixed_wpa2_nat": 9892, + # "2g_wpa2_mixed_wpa_vlan": 9893, + "2g_wpa2_mixed_wpa2_vlan": 9894, + # "5g_wpa2_mixed_wpa_vlan": 9895, + "5g_wpa2_mixed_wpa2_vlan": 9896, + "2g_open_bridge": 2234, + "5g_open_bridge": 2235, + "2g_open_nat": 4321, + "5g_open_nat": 4322, + "2g_open_vlan": 9897, + "5g_open_vlan": 9898 + } + EOF + + kubectl create secret generic configuration --from-file=configuration=./configuration.py + + - name: run tests + run: | + cat <> /etc/hosts + echo "DNS record for \$HOST resolved successfully!" + done + + cd tests + pytest -m "${{ github.event.inputs.marker_expression }}" -s -vvv --testbed="basic" -o firmware="${{ github.event.inputs.firmware }}" --alluredir=/tmp/allure-results + ret=\$? + # sleep some time to be able to download the Allure results + sleep 60 + exit \$ret + volumeMounts: + - name: configuration + mountPath: "/wlan-testing/tests/configuration.py" + subPath: configuration + readOnly: true + nodeSelector: + env: tests + tolerations: + - key: "tests" + operator: "Exists" + effect: "NoSchedule" + imagePullSecrets: + - name: tip-docker-registry-key + restartPolicy: Never + volumes: + - name: configuration + secret: + secretName: configuration + backoffLimit: 0 + EOF + # wait for pod to spawn + sleep 1 + podname=$(kubectl get pods --no-headers -o custom-columns=":metadata.name" -l job-name="${{ steps.job.outputs.name }}" | sed "s/pod\///") + kubectl wait "pod/$podname" --for condition=ready --timeout=600s + kubectl logs -f $podname & + until [ -s test_everything.xml ] + do + sleep 10 + kubectl cp $podname:/wlan-testing/tests/test_everything.xml test_everything.xml >/dev/null 2>&1 + done + echo "tests completed" + echo "downloading allure results..." + kubectl cp $podname:/tmp/allure-results allure-results >/dev/null 2>&1 + echo "waiting for pod to exit" + kubectl logs -f $podname >/dev/null 2>&1 + exit $(kubectl get pod $podname --output="jsonpath={.status.containerStatuses[].state.terminated.exitCode}") + + - name: upload Allure results as artifact + if: always() + uses: actions/upload-artifact@v2 + with: + name: allure-results + path: allure-results + + - name: generate Allure report + run: allure-${{ env.ALLURE_CLI_VERSION }}/bin/allure generate allure-results + + - name: upload Allure report as artifact + uses: actions/upload-artifact@v2 + with: + name: allure-report + path: allure-report + + - name: cleanup + if: always() + run: | + kubectl delete ns "${{ steps.namespace.outputs.name }}" --wait=true + + - name: stop reservation + if: always() + run: python .quali/stop_reservation.py ${{ steps.start.outputs.res_id }} + env: + CLOUDSHELL_URL: quali-cloudshell.lab.wlan.tip.build + CLOUDSHELL_USER: ${{ secrets.CLOUDSHELL_USER }} + CLOUDSHELL_PASSWORD: ${{ secrets.CLOUDSHELL_PASSWORD }} + + cleanup: + needs: [ test ] + runs-on: ubuntu-latest + if: always() + steps: + - name: cleanup Docker image + run: curl -u${{ env.DOCKER_USER_NAME }}:${{ env.DOCKER_USER_PASSWORD }} -X DELETE "https://tip.jfrog.io/artifactory/tip-wlan-cloud-docker-repo/cloud-sdk-nightly/${{ github.run_id }}" diff --git a/.github/workflows/quali.yml b/.github/workflows/quali.yml index c4f861a41..4d3102538 100644 --- a/.github/workflows/quali.yml +++ b/.github/workflows/quali.yml @@ -41,7 +41,7 @@ on: description: 'revision of the Open Wifi UI' ap_models: required: true - default: 'ECW5410,EAP101,EC420,ECW5211,WF188N,EAP102,CIG194C' + default: 'edgecore_ecw5410,edgecore_eap101,tp-link_ec420-g1,edgecore_ecw5211,cig_wf188n,edgecore_eap102,cig_wf194c,hfcl_ion4' description: 'the AP models to test' ap_version: required: true @@ -71,12 +71,12 @@ jobs: - name: set variables id: vars run: | - echo ::set-output name=openwifi::$(echo "${{ github.event.inputs.openwifi_revision || 'main' }}") - echo ::set-output name=gw::$(echo "${{ github.event.inputs.openwifi_gw_revision || 'master' }}") - echo ::set-output name=sec::$(echo "${{ github.event.inputs.openwifi_sec_revision || 'main' }}") - echo ::set-output name=fms::$(echo "${{ github.event.inputs.openwifi_fms_revision || 'main' }}") - echo ::set-output name=ui::$(echo "${{ github.event.inputs.openwifi_ui_revision || 'main' }}") - echo ::set-output name=ap_models::$(echo "${{ github.event.inputs.ap_models || 'ECW5410,EAP101,EC420,ECW5211,WF188N,EAP102,CIG194C' }}") + echo ::set-output name=openwifi::$(echo "${{ github.event.inputs.openwifi_revision || 'v2.4.0-RC3' }}") + echo ::set-output name=gw::$(echo "${{ github.event.inputs.openwifi_gw_revision || 'v2.4.0-RC3' }}") + echo ::set-output name=sec::$(echo "${{ github.event.inputs.openwifi_sec_revision || 'v2.4.0-RC2' }}") + echo ::set-output name=fms::$(echo "${{ github.event.inputs.openwifi_fms_revision || 'v2.4.0-RC2' }}") + echo ::set-output name=ui::$(echo "${{ github.event.inputs.openwifi_ui_revision || 'v2.4.0-RC2' }}") + echo ::set-output name=ap_models::$(echo "${{ github.event.inputs.ap_models || 'edgecore_ecw5410,edgecore_eap101,tp-link_ec420-g1,edgecore_ecw5211,cig_wf188n,edgecore_eap102,cig_wf194c,hfcl_ion4' }}") echo ::set-output name=ap_version::$(echo "${{ github.event.inputs.ap_version || 'next-latest' }}") echo ::set-output name=marker_expression::$(echo "${{ github.event.inputs.marker_expression || 'uc_sanity' }}") @@ -169,7 +169,7 @@ jobs: - name: prepare namespace id: namespace run: | - NAMESPACE="testing-${{ github.run_id }}-$(echo ${{ matrix.ap_model }} | tr '[:upper:]' '[:lower:]')" + NAMESPACE="testing-${{ github.run_id }}-$(echo ${{ matrix.ap_model }} | tr '[:upper:]' '[:lower:]' | tr '_' '-')" kubectl create ns $NAMESPACE kubectl config set-context --current --namespace=$NAMESPACE echo "::set-output name=name::${NAMESPACE}" @@ -182,7 +182,9 @@ jobs: CONFIGURATION = { "basic": $(python .quali/get_configuration.py ${{ steps.start.outputs.res_id }}) } - + + open_flow = {} + RADIUS_SERVER_DATA = { "ip": "10.10.1.221", "port": 1812, @@ -465,6 +467,8 @@ jobs: } EOF + cat configuration.py + kubectl create secret generic configuration --from-file=configuration=./configuration.py - name: run tests @@ -495,12 +499,11 @@ jobs: - -x - -c - | - apt-get update - apt-get install -y dnsutils HOSTS="sec-${{ steps.reservation.outputs.identifier }}.cicd.lab.wlan.tip.build gw-${{ steps.reservation.outputs.identifier }}.cicd.lab.wlan.tip.build fms-${{ steps.reservation.outputs.identifier }}.cicd.lab.wlan.tip.build" for HOST in \$HOSTS; do - until sleep 1; getent hosts \$HOST; do :; done - getent hosts \$HOST >> /etc/hosts + HOST_ENTRY="" + until [[ ! -z "\$HOST_ENTRY" ]]; do sleep 1; HOST_ENTRY=\$(getent hosts \$HOST); done; + echo "\$HOST_ENTRY" >> /etc/hosts echo "DNS record for \$HOST resolved successfully!" done @@ -551,6 +554,22 @@ jobs: kubectl logs -f $podname >/dev/null 2>&1 exit $(kubectl get pod $podname --output="jsonpath={.status.containerStatuses[].state.terminated.exitCode}") + - name: show gw logs + if: failure() + run: kubectl -n openwifi-${{ steps.reservation.outputs.identifier }} logs deployment/owgw + + - name: show fms logs + if: failure() + run: kubectl -n openwifi-${{ steps.reservation.outputs.identifier }} logs deployment/owfms + + - name: show prov logs + if: failure() + run: kubectl -n openwifi-${{ steps.reservation.outputs.identifier }} logs deployment/owprov + + - name: show sec logs + if: failure() + run: kubectl -n openwifi-${{ steps.reservation.outputs.identifier }} logs deployment/owsec + - name: upload Allure results as artifact if: always() uses: actions/upload-artifact@v2 @@ -569,7 +588,7 @@ jobs: report: runs-on: ubuntu-latest - needs: [ test, generate-matrix ] + needs: [ test, vars, generate-matrix ] if: always() strategy: max-parallel: 1 @@ -625,13 +644,11 @@ jobs: run: cp -r allure-results allure-report/results - name: copy new report - if: ${{ (github.event.inputs.marker_expression || 'uc_sanity') == 'uc_sanity' }} run: | mkdir -p reports/sanity/${{ matrix.ap_model }} cp -Tr allure-report reports/sanity/${{ matrix.ap_model }}/${{ github.run_number }} - name: update latest symlink - if: ${{ (github.event.inputs.marker_expression || 'uc_sanity') == 'uc_sanity' }} working-directory: reports/sanity/${{ matrix.ap_model }} run: ln -fns ${{ github.run_number }} latest @@ -647,7 +664,7 @@ jobs: git commit -m "Automated deployment: $(date -u)" - name: push - if: github.ref == 'refs/heads/master' + if: github.ref == 'refs/heads/master' && needs.vars.outputs.marker_expression == 'uc_sanity' uses: ad-m/github-push-action@v0.6.0 with: github_token: ${{ secrets.GITHUB_TOKEN }} @@ -655,7 +672,7 @@ jobs: directory: reports - name: upload to S3 - if: github.ref == 'refs/heads/master' + if: github.ref == 'refs/heads/master' && needs.vars.outputs.marker_expression == 'uc_sanity' uses: ./wlan-testing/.github/actions/allure-report-to-s3 with: test_type: sanity diff --git a/.github/workflows/ucentralgw-dev-deployment.yaml b/.github/workflows/ucentralgw-dev-deployment.yaml index 489066273..8cadd6c4b 100644 --- a/.github/workflows/ucentralgw-dev-deployment.yaml +++ b/.github/workflows/ucentralgw-dev-deployment.yaml @@ -31,10 +31,10 @@ env: { "namespace": "dev01", "deploy_method": "git", - "chart_version": "v2.4.0-RC2", - "owgw_version": "v2.4.0-RC2", - "owsec_version": "v2.4.0-RC2", - "owfms_version": "v2.4.0-RC2", + "chart_version": "v2.4.0-RC6", + "owgw_version": "v2.4.0-RC5", + "owsec_version": "v2.4.0-RC4", + "owfms_version": "v2.4.0-RC4", "owprov_version": "main", "owgwui_version": "v2.4.0-RC2", "owprovui_version": "main" diff --git a/.github/workflows/ucentralgw-qa-deployment.yaml b/.github/workflows/ucentralgw-qa-deployment.yaml index f314630cd..c931b4906 100644 --- a/.github/workflows/ucentralgw-qa-deployment.yaml +++ b/.github/workflows/ucentralgw-qa-deployment.yaml @@ -31,10 +31,10 @@ env: { "namespace": "qa01", "deploy_method": "git", - "chart_version": "v2.4.0-RC2", - "owgw_version": "v2.4.0-RC2", - "owsec_version": "v2.4.0-RC2", - "owfms_version": "v2.4.0-RC2", + "chart_version": "v2.4.0-RC6", + "owgw_version": "v2.4.0-RC5", + "owsec_version": "v2.4.0-RC4", + "owfms_version": "v2.4.0-RC4", "owprov_version": "main", "owgwui_version": "v2.4.0-RC2", "owprovui_version": "main" diff --git a/.quali/start_reservation.py b/.quali/start_reservation.py index 90a87e680..672deb7da 100644 --- a/.quali/start_reservation.py +++ b/.quali/start_reservation.py @@ -1,7 +1,6 @@ -import json import os -from cloudshell.api.cloudshell_api import UpdateTopologyGlobalInputsRequest, UpdateTopologyRequirementsInputsRequest +from cloudshell.api.cloudshell_api import UpdateTopologyGlobalInputsRequest import argparse @@ -16,8 +15,8 @@ def main(): parser.add_argument('--openwifi-sec-version', default='main') parser.add_argument('--openwifi-fms-version', default='main') parser.add_argument('--openwifi-ui-version', default='main') - parser.add_argument('--ap-model', default='EC420') - parser.add_argument('--wifi-type', default='Wifi5') + parser.add_argument('--ap-model', default='[Any]') + parser.add_argument('--wifi-type', default='[Any]') args = parser.parse_args() session = get_session() diff --git a/helm/ucentral/.gitignore b/helm/ucentral/.gitignore new file mode 100644 index 000000000..11695a225 --- /dev/null +++ b/helm/ucentral/.gitignore @@ -0,0 +1 @@ +wlan-cloud-ucentral-deploy diff --git a/helm/ucentral/deploy.sh b/helm/ucentral/deploy.sh index dabb26320..c8b1e5f5f 100755 --- a/helm/ucentral/deploy.sh +++ b/helm/ucentral/deploy.sh @@ -9,13 +9,6 @@ usage () { echo "Required environment variables:" echo; echo "- NAMESPACE - namespace suffix that will used added for the Kubernetes environment (i.e. if you pass 'test', kubernetes namespace will be named 'ucentral-test')"; - echo "- OWGW_VERSION - OpenWIFI Gateway version to deploy (will be used for Docker image tag and git branch for Helm chart if git deployment is required)"; - echo "- OWGWUI_VERSION - OpenWIFI Web UI version to deploy (will be used for Docker image tag and git branch for Helm chart if git deployment is required)"; - echo "- OWSEC_VERSION - OpenWIFI Security version to deploy (will be used for Docker image tag and git branch for Helm chart if git deployment is required)"; - echo "- OWFMS_VERSION - OpenWIFI Firmware version to deploy (will be used for Docker image tag and git branch for Helm chart if git deployment is required)"; - echo "- OWPROV_VERSION - OpenWIFI Provisioning version to deploy (will be used for Docker image tag and git branch for Helm chart if git deployment is required)"; - echo "- OWPROVUI_VERSION - OpenWIFI Provisioning Web UI version to deploy (will be used for Docker image tag and git branch for Helm chart if git deployment is required)"; - echo; echo "- DEPLOY_METHOD - deployment method for the chart deployment (supported methods - 'git' (will use helm-git from assembly chart) and 'bundle' (will use chart stored in the Artifactory0"; echo "- CHART_VERSION - version of chart to be deployed from assembly chart (for 'git' method git ref may be passed, for 'bundle' method version of chart may be passed)"; echo; @@ -28,20 +21,44 @@ usage () { echo "- OWSEC_NEW_PASSWORD - password that should be set to default user instead of default password from properties"; echo "- CERT_LOCATION - path to certificate in PEM format that will be used for securing all endpoint in all services"; echo "- KEY_LOCATION - path to private key in PEM format that will be used for securing all endpoint in all services"; + echo; + echo "Following environmnet variables may be passed, but will be ignored if CHART_VERSION is set to release (i.e. v2.4.0):" + echo; + echo "- OWGW_VERSION - OpenWIFI Gateway version to deploy (will be used for Docker image tag and git branch for Helm chart if git deployment is required)"; + echo "- OWGWUI_VERSION - OpenWIFI Web UI version to deploy (will be used for Docker image tag and git branch for Helm chart if git deployment is required)"; + echo "- OWSEC_VERSION - OpenWIFI Security version to deploy (will be used for Docker image tag and git branch for Helm chart if git deployment is required)"; + echo "- OWFMS_VERSION - OpenWIFI Firmware version to deploy (will be used for Docker image tag and git branch for Helm chart if git deployment is required)"; + echo "- OWPROV_VERSION - OpenWIFI Provisioning version to deploy (will be used for Docker image tag and git branch for Helm chart if git deployment is required)"; + echo "- OWPROVUI_VERSION - OpenWIFI Provisioning Web UI version to deploy (will be used for Docker image tag and git branch for Helm chart if git deployment is required)"; +} + +# Helper functions +check_if_chart_version_is_release() { + PARSED_CHART_VERSION=$(echo $CHART_VERSION | grep -xP "v\d+\.\d+\.\d+.*") + if [[ -z "$PARSED_CHART_VERSION" ]]; then + return 1 + else + return 0 + fi } # Check if required environment variables were passed -## Environment specifics -[ -z ${NAMESPACE+x} ] && echo "NAMESPACE is unset" && usage && exit 1 -[ -z ${OWGW_VERSION+x} ] && echo "OWGW_VERSION is unset" && usage && exit 1 -[ -z ${OWGWUI_VERSION+x} ] && echo "OWGWUI_VERSION is unset" && usage && exit 1 -[ -z ${OWSEC_VERSION+x} ] && echo "OWSEC_VERSION is unset" && usage && exit 1 -[ -z ${OWFMS_VERSION+x} ] && echo "OWFMS_VERSION is unset" && usage && exit 1 -[ -z ${OWPROV_VERSION+x} ] && echo "OWPROV_VERSION is unset" && usage && exit 1 -[ -z ${OWPROVUI_VERSION+x} ] && echo "OWPROVUI_VERSION is unset" && usage && exit 1 ## Deployment specifics [ -z ${DEPLOY_METHOD+x} ] && echo "DEPLOY_METHOD is unset" && usage && exit 1 [ -z ${CHART_VERSION+x} ] && echo "CHART_VERSION is unset" && usage && exit 1 +if check_if_chart_version_is_release; then + echo "Chart version ($CHART_VERSION) is release version, ignoring services versions" +else + echo "Chart version ($CHART_VERSION) is not release version, checking if services versions are set" + [ -z ${OWGW_VERSION+x} ] && echo "OWGW_VERSION is unset" && usage && exit 1 + [ -z ${OWGWUI_VERSION+x} ] && echo "OWGWUI_VERSION is unset" && usage && exit 1 + [ -z ${OWSEC_VERSION+x} ] && echo "OWSEC_VERSION is unset" && usage && exit 1 + [ -z ${OWFMS_VERSION+x} ] && echo "OWFMS_VERSION is unset" && usage && exit 1 + [ -z ${OWPROV_VERSION+x} ] && echo "OWPROV_VERSION is unset" && usage && exit 1 + [ -z ${OWPROVUI_VERSION+x} ] && echo "OWPROVUI_VERSION is unset" && usage && exit 1 +fi +## Environment specifics +[ -z ${NAMESPACE+x} ] && echo "NAMESPACE is unset" && usage && exit 1 ## Variables specifics [ -z ${VALUES_FILE_LOCATION+x} ] && echo "VALUES_FILE_LOCATION is unset" && usage && exit 1 [ -z ${RTTY_TOKEN+x} ] && echo "RTTY_TOKEN is unset" && usage && exit 1 @@ -70,12 +87,14 @@ if [[ "$DEPLOY_METHOD" == "git" ]]; then cd wlan-cloud-ucentral-deploy git checkout $CHART_VERSION cd chart - sed -i '/wlan-cloud-ucentralgw@/s/ref=.*/ref='${OWGW_VERSION}'\"/g' Chart.yaml - sed -i '/wlan-cloud-ucentralgw-ui@/s/ref=.*/ref='${OWGWUI_VERSION}'\"/g' Chart.yaml - sed -i '/wlan-cloud-ucentralsec@/s/ref=.*/ref='${OWSEC_VERSION}'\"/g' Chart.yaml - sed -i '/wlan-cloud-ucentralfms@/s/ref=.*/ref='${OWFMS_VERSION}'\"/g' Chart.yaml - sed -i '/wlan-cloud-owprov@/s/ref=.*/ref='${OWPROV_VERSION}'\"/g' Chart.yaml - sed -i '/wlan-cloud-owprov-ui@/s/ref=.*/ref='${OWPROVUI_VERSION}'\"/g' Chart.yaml + if ! check_if_chart_version_is_release; then + sed -i '/wlan-cloud-ucentralgw@/s/ref=.*/ref='${OWGW_VERSION}'\"/g' Chart.yaml + sed -i '/wlan-cloud-ucentralgw-ui@/s/ref=.*/ref='${OWGWUI_VERSION}'\"/g' Chart.yaml + sed -i '/wlan-cloud-ucentralsec@/s/ref=.*/ref='${OWSEC_VERSION}'\"/g' Chart.yaml + sed -i '/wlan-cloud-ucentralfms@/s/ref=.*/ref='${OWFMS_VERSION}'\"/g' Chart.yaml + sed -i '/wlan-cloud-owprov@/s/ref=.*/ref='${OWPROV_VERSION}'\"/g' Chart.yaml + sed -i '/wlan-cloud-owprov-ui@/s/ref=.*/ref='${OWPROVUI_VERSION}'\"/g' Chart.yaml + fi helm repo add bitnami https://charts.bitnami.com/bitnami helm repo update helm dependency update @@ -143,10 +162,4 @@ helm upgrade --install --create-namespace --wait --timeout 60m \ --set-file owfms.certs."restapi-key\.pem"=$KEY_LOCATION \ --set-file owprov.certs."restapi-cert\.pem"=$CERT_LOCATION \ --set-file owprov.certs."restapi-key\.pem"=$KEY_LOCATION \ - --set owgw.images.owgw.tag=$OWGW_VERSION_TAG \ - --set owgwui.images.owgwui.tag=$OWGWUI_VERSION_TAG \ - --set owsec.images.owsec.tag=$OWSEC_VERSION_TAG \ - --set owfms.images.owfms.tag=$OWFMS_VERSION_TAG \ - --set owprov.images.owprov.tag=$OWPROV_VERSION_TAG \ - --set owprovui.images.owprov.tag=$OWPROVUI_VERSION_TAG \ tip-openwifi $DEPLOY_SOURCE diff --git a/helm/ucentral/values.ucentral-qa.yaml b/helm/ucentral/values.ucentral-qa.yaml index a791ffea9..a7e06d7a1 100644 --- a/helm/ucentral/values.ucentral-qa.yaml +++ b/helm/ucentral/values.ucentral-qa.yaml @@ -1,4 +1,11 @@ owgw: + # https://telecominfraproject.atlassian.net/browse/WIFI-5840 + checks: + owgw: + readiness: + exec: + command: ["true"] + services: owgw: type: LoadBalancer @@ -66,6 +73,13 @@ owgw: -----END CERTIFICATE----- owsec: + # https://telecominfraproject.atlassian.net/browse/WIFI-5840 + checks: + owsec: + readiness: + exec: + command: ["true"] + services: owsec: type: LoadBalancer @@ -176,6 +190,13 @@ owgwui: cluster-autoscaler.kubernetes.io/safe-to-evict: "false" owfms: + # https://telecominfraproject.atlassian.net/browse/WIFI-5840 + checks: + owfms: + readiness: + exec: + command: ["true"] + services: owfms: type: LoadBalancer @@ -225,6 +246,12 @@ owfms: -----END CERTIFICATE----- owprov: + checks: + owprov: + readiness: + exec: + command: ["true"] + services: owprov: type: LoadBalancer diff --git a/libs/apnos/apnos.py b/libs/apnos/apnos.py index 94aba65ee..daa3a41a1 100644 --- a/libs/apnos/apnos.py +++ b/libs/apnos/apnos.py @@ -582,6 +582,24 @@ class APNOS: pass return vlan_list + def get_ap_uci_show_ucentral(self): + try: + client = self.ssh_cli_connect() + cmd = "uci show ucentral" + if self.mode: + cmd = f"cd ~/cicd-git/ && ./openwrt_ctl.py {self.owrt_args} -t {self.tty} --action " \ + f"cmd --value \"{cmd}\" " + stdin, stdout, stderr = client.exec_command(cmd) + output = stdout.read() + status = output.decode('utf-8').splitlines() + for i in status: + if i.startswith("ucentral.config.server="): + status = i.split("=")[1] + client.close() + except Exception as e: + print(e) + status = "Error" + return status if __name__ == '__main__': obj = { diff --git a/libs/controller/controller_2x/controller.py b/libs/controller/controller_2x/controller.py index 8d0657a95..0d006ae5a 100644 --- a/libs/controller/controller_2x/controller.py +++ b/libs/controller/controller_2x/controller.py @@ -13,6 +13,7 @@ import allure import requests from operator import itemgetter from pathlib import Path +from configuration import open_flow from requests.adapters import HTTPAdapter import logging @@ -219,7 +220,7 @@ class FMSUtils: body=str(response.status_code) + "\n" + str(response.json()) + "\n" ) - + print(response) def ap_model_lookup(self, model=""): @@ -284,7 +285,7 @@ class FMSUtils: return "error" - + class UProfileUtility: @@ -385,6 +386,18 @@ class UProfileUtility: } self.mode = None + def set_express_wifi(self): + if self.mode == "NAT": + self.base_profile_config["interfaces"][0]["services"] = ["lldp", "ssh"] + self.base_profile_config["interfaces"][1]["services"] = ["ssh", "lldp", "open-flow"] + self.base_profile_config["interfaces"][1]["ipv4"]["subnet"] = "192.168.97.1/24" + self.base_profile_config["interfaces"][1]["ipv4"]["dhcp"]["lease-count"] = 100 + self.base_profile_config['services']["open-flow"] = open_flow + self.base_profile_config['services']['lldp']['describe'] = "OpenWiFi - expressWiFi" + self.base_profile_config['services']['lldp']['location'] = "Hotspot" + + + def encryption_lookup(self, encryption="psk"): encryption_mapping = { "none": "open", diff --git a/libs/lanforge/lf_tests.py b/libs/lanforge/lf_tests.py index b0bd57b07..78d994ae9 100644 --- a/libs/lanforge/lf_tests.py +++ b/libs/lanforge/lf_tests.py @@ -22,12 +22,13 @@ for folder in 'py-json', 'py-scripts': sys.path.append(f"../lanforge/lanforge-scripts/py-scripts/tip-cicd-sanity") sys.path.append(f'../libs') +sys.path.append(f'../tools') sys.path.append(f'../libs/lanforge/') from sta_connect2 import StaConnect2 import time import string import random - +from scp_util import SCP_File S = 12 # from eap_connect import EAPConnect from test_ipv4_ttls import TTLSTest @@ -50,6 +51,7 @@ class RunTest: def __init__(self, lanforge_data=None, local_report_path="../reports/", influx_params=None, debug=False): self.lanforge_ip = lanforge_data["ip"] self.lanforge_port = lanforge_data["port"] + self.lanforge_ssh_port = lanforge_data["ssh_port"] self.twog_radios = lanforge_data["2.4G-Radio"] self.fiveg_radios = lanforge_data["5G-Radio"] self.ax_radios = lanforge_data["AX-Radio"] @@ -129,6 +131,13 @@ class RunTest: print("test result: " + result) pytest.exit("Test Failed: Debug True") self.staConnect.cleanup() + supplicqant = "/home/lanforge/wifi/wpa_supplicant_log_" + self.staConnect.radio.split(".")[2] + ".txt" + obj = SCP_File(ip=self.lanforge_ip, port=self.lanforge_ssh_port, username="root", password="lanforge", + remote_path=supplicqant, + local_path=".") + obj.pull_file() + allure.attach.file(source="wpa_supplicant_log_" + self.staConnect.radio.split(".")[2] + ".txt", + name="supplicant_log") for result in run_results: print("test result: " + result) result = True @@ -215,6 +224,13 @@ class RunTest: # print(e) self.eap_connect.stop() + supplicqant = "/home/lanforge/wifi/wpa_supplicant_log_" + self.eap_connect.radio.split(".")[2] + ".txt" + obj = SCP_File(ip=self.lanforge_ip, port=self.lanforge_ssh_port, username="root", password="lanforge", + remote_path=supplicqant, + local_path=".") + obj.pull_file() + allure.attach.file(source="wpa_supplicant_log_" + self.eap_connect.radio.split(".")[2] + ".txt", + name="supplicant_log") if not self.eap_connect.passes(): if self.debug: print("test result: " + self.eap_connect.passes()) diff --git a/libs/lanforge/lf_tools.py b/libs/lanforge/lf_tools.py index 42b9ea802..f03e9e897 100644 --- a/libs/lanforge/lf_tools.py +++ b/libs/lanforge/lf_tools.py @@ -310,7 +310,7 @@ class ChamberView: if df.empty == True: return "empty" else: - result = df.to_string(index=False) + result = df[column_name].values.tolist() return result def read_csv_individual_station_throughput(self, dir_name, option): diff --git a/libs/lanforge/scp_util.py b/libs/lanforge/scp_util.py new file mode 100755 index 000000000..3b2c53177 --- /dev/null +++ b/libs/lanforge/scp_util.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +import argparse + +import paramiko +from scp import SCPClient + + +class SCP_File: + def __init__(self, ip="localhost", port=22, username="lanforge", password="lanforge", remote_path="/home/lanforge/", + local_path="."): + self.ip = ip + self.port = port + self.remote_path = remote_path + self.local_path = local_path + self.username = username + self.password = password + + def pull_file(self): + ssh = paramiko.SSHClient() + ssh.load_system_host_keys() + ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + ssh.connect(hostname=self.ip, username=self.username, password=self.password, port=self.port, allow_agent=False, + look_for_keys=False) + # ssh.close() + + with SCPClient(ssh.get_transport()) as scp: + scp.get(remote_path=self.remote_path, local_path=self.local_path, recursive=True) + scp.close() + + +def main(): + parser = argparse.ArgumentParser(prog="lf_utils", + formatter_class=argparse.RawTextHelpFormatter, + allow_abbrev=True, + epilog="About lf_tools.py", + description="Tools for LANforge System") + parser.add_argument('--host', type=str, help=' --host : IP Address f LANforge System', default="localhost") + parser.add_argument('--port', type=int, help='--passwd of dut', default=22) + parser.add_argument('--username', type=str, help='--username to use on LANforge', default="lanforge") + parser.add_argument('--password', type=str, help='--password to use on LANforge', default="lanforge") + parser.add_argument('--remote_path', type=str, help='--password to the given username', + default="/home/lanforge/lf_kinstall.pl") + parser.add_argument('--local_path', type=str, help='--action to perform' + 'reboot | run_cmd', default=".") + args = parser.parse_args() + lf_tools = SCP_File(ip=args.host, port=args.port, + username=args.username, password=args.password, + remote_path=args.remote_path, local_path=args.local_path) + lf_tools.pull_file() + + + + +if __name__ == '__main__': + main() diff --git a/libs/perfecto_libs/android_lib.py b/libs/perfecto_libs/android_lib.py index 2b6659414..81c138909 100644 --- a/libs/perfecto_libs/android_lib.py +++ b/libs/perfecto_libs/android_lib.py @@ -51,6 +51,7 @@ def closeApp(appName, setup_perfectoMobile): setup_perfectoMobile[1].step_start("Closing App: " + appName) params = {'identifier': appName} setup_perfectoMobile[0].execute_script('mobile:application:close', params) + print("Closed App") def scrollDown(setup_perfectoMobile): print("Scroll Down") @@ -59,9 +60,9 @@ def scrollDown(setup_perfectoMobile): params2["start"] = "50%,90%" params2["end"] = "50%,20%" params2["duration"] = "4" - time.sleep(5) + time.sleep(2) setup_perfectoMobile[0].execute_script('mobile:touch:swipe', params2) - time.sleep(5) + time.sleep(1) def getDeviceID(setup_perfectoMobile): @@ -114,6 +115,8 @@ def set_APconnMobileDevice_android(request, WifiName, WifiPass, setup_perfectoMo except NoSuchElementException: print("Exception: Verify Xpath - Update/check Xpath for Click Connections") + + try: print("Get Connected Wifi Name if any") report.step_start("Get Connected Wifi Name if any") @@ -143,6 +146,7 @@ def set_APconnMobileDevice_android(request, WifiName, WifiPass, setup_perfectoMo report.step_start("Clicking Wi-Fi") wifiElement = driver.find_element_by_xpath("//*[@text='Wi-Fi']") wifiElement.click() + Wifi_AP_Name="" if Wifi_AP_Name.__eq__(WifiName): print("Wifi Name Matches - Already Connected To: " + Wifi_AP_Name) @@ -581,7 +585,7 @@ def verifyUploadDownloadSpeed_android(request, setup_perfectoMobile, get_APToMob driver.switch_to.context('WEBVIEW_1') try: - print("Launching Safari") + print("Launching Chrome") report.step_start("Google Home Page") driver.get(connData["webURL"]) print("Enter Search Text") @@ -1060,7 +1064,7 @@ def check_if_no_internet_popup(driver):#To check and kill if any popups related print("**alert** popup **alert**") try: - driver.implicitly_wait(3) + driver.implicitly_wait(2) time.sleep(2) kill_popup = driver.find_element_by_xpath("//*[@resource-id='com.android.settings:id/keep_btn']") kill_popup.click() @@ -1572,7 +1576,7 @@ def wifi_connect(request, WifiName, WifiPass, setup_perfectoMobile, connData): print("Connect Button Not Enabled...Verify if Password is set properly ") check_if_no_internet_popup(driver) # ------------------------------------------------------- - + # //*[@resource-id='com.android.settings:id/summary' and @text="Sign in to the network."]/parent::*/android.widget.TextView[@text='XWF-OWF_DSx'] #Verify if WiFi is connected # ------------------------------------------------------- try: @@ -1604,11 +1608,16 @@ def wifi_connect(request, WifiName, WifiPass, setup_perfectoMobile, connData): ssid_with_internet = True print("Wifi Successfully Connected") #allure.attach(name=body=str("Wifi Successfully Connected")) - except NoSuchElementException: - print("Wifi Connection Error: " + WifiName) - #allure.attach(name=body=str("Wifi Connection Error: " + WifiName)) - closeApp(connData["appPackage-android"], setup_perfectoMobile) - return ssid_with_internet + except: + try: + report.step_start("Unknown WIFI status found") + ssid_with_internet = False + print("Unknown WIFI status found") + except NoSuchElementException: + print("Wifi Connection Error: " + WifiName) + #allure.attach(name=body=str("Wifi Connection Error: " + WifiName)) + closeApp(connData["appPackage-android"], setup_perfectoMobile) + return ssid_with_internet except NoSuchElementException: @@ -1776,8 +1785,8 @@ def wifi_disconnect_and_forget(request, WifiName, WifiPass, setup_perfectoMobile def get_all_available_ssids(driver): active_ssid_list = [] try: - time.sleep(8) - driver.implicitly_wait(10) + time.sleep(5) + driver.implicitly_wait(5) elements = driver.find_elements_by_xpath("//*[@resource-id='com.android.settings:id/title']") # print("elements: ", elements) print(len(elements)) @@ -2656,7 +2665,7 @@ def wifi_connect_eap(request, WifiName, User, ttls_passwd, setup_perfectoMobile, #allure.attach(name=body=str("Wifi Successfully Connected")) except NoSuchElementException: print("Wifi Connection Error: " + WifiName) - #allure.attach(name=body=str("Wifi Connection Error: " + WifiName)) + #allure.attach(name=body=str("Wifi Connection Error: " + WifiName)) closeApp(connData["appPackage-android"], setup_perfectoMobile) return ssid_with_internet @@ -2678,18 +2687,703 @@ def wifi_connect_eap(request, WifiName, User, ttls_passwd, setup_perfectoMobile, closeApp(connData["appPackage-android"], setup_perfectoMobile) return ssid_with_internet +#--------------------CAPTIVE PORTAL Android----------------------------------------- +def captive_portal_and(request, WifiName, WifiPass, setup_perfectoMobile, connData): + print("\n-------------------------------------") + print("Select Wifi/AccessPoint Connection") + print("-------------------------------------") + print("Verifying Wifi Connection Details....") + #allure.attach(name= body=str("\n-------------------------------------")) + report = setup_perfectoMobile[1] + driver = setup_perfectoMobile[0] + + ssid_with_internet = False + + report.step_start("Switching Driver Context") + print("Switching Context to Native") + contexts = driver.contexts + driver.switch_to.context(contexts[0]) + + # Open Settings Application + openApp(connData["appPackage-android"], setup_perfectoMobile) + deviceModelName = getDeviceModelName(setup_perfectoMobile) + print("Selected Device Model: " + deviceModelName) + #allure.attach(name= body=str("\Selected Device Model: " + deviceModelName)) + if deviceModelName != ("Pixel 4"): + report.step_start("Set Wifi Network to " + WifiName) + + + # -----------------To Open Connections page----------------------- + try: + print("Verifying Connected Wifi Connection") + report.step_start("Click Connections") + connElement = driver.find_element_by_xpath("//*[@text='Connections']") + connElement.click() + + + # ---------------------Open WIFI page------------------------------- + try: + report.step_start("Clicking Wi-Fi") + print("Clicking WIFI") + wifiElement = driver.find_element_by_xpath("//*[@text='Wi-Fi']") + wifiElement.click() + + + # --------------------To Turn on WIFi Switch if already OFF-------------------------------- + try: + driver.implicitly_wait(1) + get_switch_text_element = driver.find_element_by_xpath("//*[@resource-id='com.android.settings:id/switch_text']") + get_switch_text = get_switch_text_element.text + print("get_switch_text: ",get_switch_text) + print("Find wifi switch") + try: #To Turn on Wi-Fi Switch + if get_switch_text == "Off": + # driver.implicitly_wait(3) + get_switch_element = driver.find_element_by_xpath("//*[@resource-id='com.android.settings:id/switch_widget']") + driver.implicitly_wait(1) + get_switch_element.click() + driver.implicitly_wait(1) + i = 0 + for i in range(5): + if get_switch_text == "On": + print("WIFI Switch is ON") + break + else: + try: + get_switch_text_element = driver.find_element_by_xpath( + "//*[@resource-id='com.android.settings:id/switch_text']") + get_switch_text = get_switch_text_element.text + except: + pass + print("Sleeping for: ", i) + time.sleep(i) + pass + if get_switch_text == "Off": + print("Switch is Still OFF") + closeApp(connData["appPackage-android"], setup_perfectoMobile) + return ssid_with_internet + else: + print("Switch is already On") + check_if_no_internet_popup(driver) + except: + print("Couldn't turn on WIFI switch") + closeApp(connData["appPackage-android"], setup_perfectoMobile) + return ssid_with_internet + + #---------------------This is to Forget current connected SSID------------------------------- + try: #To deal with already connected SSID + check_if_no_internet_popup(driver) + network_category = driver.find_element_by_xpath( + "//*[@resource-id='com.android.settings:id/connected_network_category']") + try: #To forget exhisting ssid + print("To forget ssid") + check_if_no_internet_popup(driver) + additional_details_element = driver.find_element_by_xpath( + "//*[@resource-id='com.android.settings:id/layout_details']") + additional_details_element.click() + try: + check_if_no_internet_popup(driver) + forget_ssid = driver.find_element_by_xpath( + "//*[@resource-id='com.android.settings:id/forget_button']//*[@resource-id='com.android.settings:id/icon']") + forget_ssid.click() + print("Forget old ssid") + except: + print("Couldn't forget ssid") + closeApp(connData["appPackage-android"], setup_perfectoMobile) + return ssid_with_internet + except: + print("Couldn't get into additional details") + except: + print("No Connected SSIDS") + #----------------------This is to Forget current connected SSID-------------------------------- + + + print("Searching for Wifi: " + WifiName) + #allure.attach(name= body=str("Searching for Wifi: " + WifiName)) + time.sleep(2) + print("Selecting Wifi: " + WifiName) + ssid_found = False + available_ssids = False + # This is To get all available ssids + # ------------------------------------------------------ + try: + for check_for_all_ssids in range(2): + available_ssids = get_all_available_ssids(driver) + try: + if WifiName not in available_ssids: + scrollDown(setup_perfectoMobile) + time.sleep(2) + else: + ssid_found = True + print(WifiName + " : Found in Device") + #allure.attach(name= body=str(WifiName + " : Found in Device")) + break + except: + print("1538") + pass + if not ssid_found: + print("could not found" + WifiName + " in device") + #allure.attach(name= body=str("could not found" + WifiName + " in device")) + closeApp(connData["appPackage-android"], setup_perfectoMobile) + return ssid_with_internet + except: + closeApp(connData["appPackage-android"], setup_perfectoMobile) + return ssid_with_internet + # ------------------------------------------------------- + + + + #Selecting WIFI + # ------------------------------------------------------- + try: + report.step_start("Selecting Wifi: " + WifiName) + print("Click wifi") + wifi_selection_element = WebDriverWait(driver, 35).until( + EC.presence_of_element_located((MobileBy.XPATH, "//*[@text='" + WifiName + "']"))) + wifi_selection_element.click() + check_if_no_internet_popup(driver) + #allure.attach(name= body=str("Selecting Wifi: " + WifiName)) + except Exception as e: + print("Exception on Selecting Wifi Network. Please check wifi Name or signal") + #allure.attach(name= body=str("Exception on Selecting Wifi Network. Please check wifi Name or signal")) + request.config.cache.set(key="SelectingWifiFailed", value=str(e)) + closeApp(connData["appPackage-android"], setup_perfectoMobile) + return ssid_with_internet + # ------------------------------------------------------- + + + #Set password if Needed + # ------------------------------------------------------- + try: + time.sleep(2) + check_if_no_internet_popup(driver) + report.step_start("Set Wifi Password") + print("Enter Wifi password") + wifi_password_element = driver.find_element_by_xpath( + "//*[@resource-id='com.android.settings:id/edittext']") + wifi_password_element.send_keys(WifiPass) + except NoSuchElementException: + print("Password Page Not Loaded, password May be cached in the System") + check_if_no_internet_popup(driver) + # ------------------------------------------------------- + + #Click on connect button + # ------------------------------------------------------- + try: + time.sleep(2) + report.step_start("Click Connect Button") + print("Click Connect Button") + join_btn_element = driver.find_element_by_xpath("//*[@text='Connect']") + join_btn_element.click() + except NoSuchElementException: + print("Connect Button Not Enabled...Verify if Password is set properly ") + check_if_no_internet_popup(driver) + #---------------------Clicking on ssid for captive portal login-------- + try: + time.sleep(2) + report.step_start("Selecting Wifi: " + WifiName) + wifi_selection_element = WebDriverWait(driver, 35).until( + EC.presence_of_element_located((MobileBy.XPATH, "//*[@text='" + WifiName + "']"))) + wifi_selection_element.click() + except NoSuchElementException: + print("Not connected to Captive portal Ssid.. ") + try: + time.sleep(2) + report.step_start("Click Accept Terms Button") + print("Click Accept Terms Button") + join_btn_element = driver.find_element_by_xpath("//*[@text='Accept Terms of Service']") + join_btn_element.click() + except NoSuchElementException: + print(" Couldn't press Accept terms button") + try: + time.sleep(2) + report.step_start("Click Continue Button") + print("Click Continue Button") + join_btn_element = driver.find_element_by_xpath("//*[@text='Continue']") + join_btn_element.click() + except NoSuchElementException: + print(" Couldn't press Continue button") + try: + time.sleep(2) + report.step_start("Click Last Terms if needed") + print("Click Last Terms if needed") + join_btn_element = driver.find_element_by_xpath("//*[@text='Done']") + join_btn_element.click() + except NoSuchElementException: + print(" Couldn't find the last terms page") + + #Verify if WiFi is connected + # ------------------------------------------------------- + try: + report.step_start("Verify if Wifi is Connected") + WifiInternetErrMsg = WebDriverWait(driver, 35).until( + EC.presence_of_element_located((MobileBy.XPATH, + "//*[@resource-id='android:id/summary' and @text='Connected']/parent::*/android.widget.TextView[@text='" + WifiName + "']"))) + ssid_with_internet = True + print("Wifi Successfully Connected") + #allure.attach(name= body=str("Wifi Successfully Connected")) + # time.sleep(5) + check_if_no_internet_popup(driver) + except: + try: + check_if_no_internet_popup(driver) + WifiInternetErrMsg = WebDriverWait(driver, 35).until( + EC.presence_of_element_located((MobileBy.XPATH, + "//*[@resource-id='com.android.settings:id/summary' and @text='Connected without internet']/parent::*/android.widget.TextView[@text='" + + WifiName + "']"))) + print("Wifi Successfully Connected without internet") + #allure.attach(name= body=str("Wifi Successfully Connected without internet")) + check_if_no_internet_popup(driver) + except: + try: + report.step_start("Verify if Wifi is Connected") + WifiInternetErrMsg = WebDriverWait(driver, 60).until(EC.presence_of_element_located(( + MobileBy.XPATH, + "//*[@resource-id='com.android.settings:id/summary' and @text='Connected']/parent::*/android.widget.TextView[@text='" + WifiName + "']"))) + ssid_with_internet = True + print("Wifi Successfully Connected") + #allure.attach(name=body=str("Wifi Successfully Connected")) + except NoSuchElementException: + print("Wifi Connection Error: " + WifiName) + #allure.attach(name=body=str("Wifi Connection Error: " + WifiName)) + closeApp(connData["appPackage-android"], setup_perfectoMobile) + return ssid_with_internet + # ------------------------------------------------------- + # Get into Additional Details + # To Get an IP Address + # To Forget connection + # To turn off auto. connect + # ------------------------------------------------------- + try: + print("Into additional details") + time.sleep(2) + additional_details_element = driver.find_element_by_xpath( + "//*[@resource-id='com.android.settings:id/layout_details']") + additional_details_element.click() + try: + time.sleep(2) + ip_address_element = driver.find_element_by_xpath( + "//*[@text='IP address']/parent::*/android.widget.TextView[@resource-id='com.android.settings:id/summary']") + ip_address_element_text = ip_address_element.text + print("Device IP address is :", ip_address_element_text) + except: + try: + time.sleep(2) + ip_address_element = driver.find_element_by_xpath( + "//*[@text='IP address']/parent::*/android.widget.TextView[@resource-id='android:id/summary']") + ip_address_element_text = ip_address_element.text + print("Device IP address is :", ip_address_element_text) + except: + print("IP address element not found") + # allure.attach(name= body=str("IP address element not found")) + + # closeApp(connData["appPackage-android"], setup_perfectoMobile) + # return ip_address_element_text, ssid_with_internet + + try: + check_if_no_internet_popup(driver) + driver.implicitly_wait(3) + time.sleep(2) + auto_reconnect_off = driver.find("//*[@resource-id='android:id/switch_widget']") + auto_reconnect_off_text = auto_reconnect_off.text + if auto_reconnect_off_text != "Off": + auto_reconnect_off.click() + print("Auto reconnect turning off") + else: + print("Auto reconnect is already off") + except: + print("Couldn't find auto reconnect element") + except: + print("Couldn't get into Additional settings") + except NoSuchElementException: + print("No Switch element found") + #allure.attach(name= body=str("No Switch element found")) + # ---------------------To Turn on WIFi Switch if already OFF------------------------------- + + except NoSuchElementException: + print("Couldn't find wifi Button") + #allure.attach(name= body=str("Couldn't find wifi Button")) + # ------------------Open WIFI page---------------------------------- + + except NoSuchElementException: + print("Exception: Verify Xpath - Update/check Xpath for Click Connections") + #allure.attach(name= body=str("Exception: Verify Xpath - Update/check Xpath for Click Connections")) + # -----------------To Open Connections page--------------------------- + # --------------------Pixel 4 code--------------------------- + else: + report.step_start("Set Wifi Network to " + WifiName) + + # -----------------To Open Connections page----------------------- + try: + print("Verifying Connected Wifi Connection") + report.step_start("Click Network & internet in pixel4") + connElement = driver.find_element_by_xpath("//*[@text='Network & internet']") + connElement.click() + + # ---------------------Open WIFI page------------------------------- + try: + report.step_start("Clicking Wi-Fi") + print("Clicking WIFI") + time.sleep(3) + wifiElement = WebDriverWait(driver, 10).until( + EC.presence_of_element_located((MobileBy.XPATH, "//*[@text='Wi‑Fi']"))) + wifiElement.click() + + # --------------------To Turn on WIFi Switch if already OFF-------------------------------- + try: + driver.implicitly_wait(1) + report.step_start("Turn on WIFi Switch if already OFF") + get_switch_text_element = driver.find_element_by_xpath( + "//*[@resource-id='android:id/icon']") + get_switch_text = get_switch_text_element.click() + if get_switch_text is not None: + switch_text = "Off" + else: + switch_text = "On" + + print("get_switch_text: ", switch_text) + print("Find wifi switch") + try: # To Turn on Wi-Fi Switch + if switch_text == "Off": + # driver.implicitly_wait(3) + get_switch_element = driver.find_element_by_xpath( + "//*[@resource-id='com.android.settings:id/switch_widget']") + driver.implicitly_wait(1) + get_switch_element.click() + driver.implicitly_wait(1) + i = 0 + for i in range(5): + if switch_text == "On": + print("WIFI Switch is ON") + break + else: + try: + get_switch_text_element = driver.find_element_by_xpath( + "//*[@text='Add network']") + get_switch_text = get_switch_text_element.text + if get_switch_text == "Add network": + switch_text = "On" + else: + switch_text = "Off" + except NoSuchElementException: + print("Exception: Verify Xpath") + # Scroll Down + scrollDown(setup_perfectoMobile) + print("Sleeping for: ", i) + time.sleep(i) + pass + if switch_text == "Off": + print("Switch is Still OFF") + closeApp(connData["appPackage-android"], setup_perfectoMobile) + return ssid_with_internet + else: + print("Switch is already On") + check_if_no_internet_popup(driver) + except: + print("Couldn't turn on WIFI switch") + closeApp(connData["appPackage-android"], setup_perfectoMobile) + return ssid_with_internet + + # ---------------------This is to Forget current connected SSID------------------------------- + try: # To deal with already connected SSID + check_if_no_internet_popup(driver) + network_category = driver.find_element_by_xpath("//*[@text='Connected']") + try: # To forget existing ssid + print("To forget ssid") + report.step_start("To forget ssid") + check_if_no_internet_popup(driver) + additional_details_element = driver.find_element_by_xpath( + "//*[@resource-id='com.android.settings:id/settings_button_no_background']") + additional_details_element.click() + except: + print("Couldn't get into additional details") + try: + check_if_no_internet_popup(driver) + forget_ssid = driver.find_element_by_xpath( + "//*[@resource-id='com.android.settings:id/button1']") + forget_ssid.click() + print("Forget old ssid") + except: + print("Couldn't forget ssid") + closeApp(connData["appPackage-android"], setup_perfectoMobile) + return ssid_with_internet + except: + print("No Connected SSIDS") + # ----------------------This is to Forget current connected SSID-------------------------------- + + # time.sleep(2) + # print("Selecting Wifi: " + WifiName) + # ssid_found = False + # available_ssids = False + # This is To get all available ssids + # ------------------------------------------------------ + # try: + # for check_for_all_ssids in range(2): + # available_ssids = WifiName + # try: + # if WifiName not in available_ssids: + # scrollDown(setup_perfectoMobile) + # time.sleep(2) + # else: + # ssid_found = True + # print(WifiName + " : Found in Device") + # # allure.attach(name= body=str(WifiName + " : Found in Device")) + # break + # except: + # print("1538") + # pass + # if not ssid_found: + # print("could not found" + WifiName + " in device") + # # allure.attach(name= body=str("could not found" + WifiName + " in device")) + # closeApp(connData["appPackage-android"], setup_perfectoMobile) + # return ssid_with_internet + # except: + # closeApp(connData["appPackage-android"], setup_perfectoMobile) + # return ssid_with_internet + # # ------------------------------------------------------- + + # Selecting WIFI + # ------------------------------------------------------- + try: + report.step_start("Selecting Wifi: " + WifiName) + print("Click wifi") + wifi_selection_element = WebDriverWait(driver, 35).until( + EC.presence_of_element_located((MobileBy.XPATH, "//*[@text='" + WifiName + "']"))) + wifi_selection_element.click() + check_if_no_internet_popup(driver) + # allure.attach(name= body=str("Selecting Wifi: " + WifiName)) + except Exception as e: + print("Exception on Selecting Wifi Network") + # allure.attach(name= body=str("Exception on Selecting Wifi Network. Please check wifi Name or signal")) + request.config.cache.set(key="SelectingWifiFailed", value=str(e)) + closeApp(connData["appPackage-android"], setup_perfectoMobile) + return ssid_with_internet + # ------------------------------------------------------- + # Set password if Needed + # ------------------------------------------------------- + try: + check_if_no_internet_popup(driver) + report.step_start("Set Wifi Password") + print("Entering password") + wifiPasswordElement = driver.find_element_by_xpath( + "//*[@resource-id='com.android.settings:id/password']") + wifiPasswordElement.send_keys(WifiPass) + except NoSuchElementException: + print("Password Page Not Loaded, password May be cached in the System") + check_if_no_internet_popup(driver) + # ------------------------------------------------------- + + # Click on connect button + # ------------------------------------------------------- + try: + report.step_start("Click Connect Button") + joinBTNElement = driver.find_element_by_xpath("//*[@text='Connect']") + joinBTNElement.click() + except NoSuchElementException: + print("Connect Button Not Enabled...Verify if Password is set properly ") + check_if_no_internet_popup(driver) + # ------------------------------------------------------- + try: + report.step_start("Selecting Wifi: " + WifiName) + wifiSelectionElement = WebDriverWait(driver, 35).until( + EC.presence_of_element_located((MobileBy.XPATH, "//*[@text='" + WifiName + "']"))) + wifiSelectionElement.click() + check_if_no_internet_popup(driver) + except Exception as e: + print("Exception on Selecting Wifi Network. Please check wifi Name or signal") + try: + time.sleep(2) + report.step_start("Click Accept Terms Button") + print("Click Accept Terms Button") + join_btn_element = driver.find_element_by_xpath("//*[@text='Accept Terms of Service']") + join_btn_element.click() + except NoSuchElementException: + print(" Couldn't press Accept terms button") + try: + time.sleep(2) + report.step_start("Click Continue Button") + print("Click Continue Button") + join_btn_element = driver.find_element_by_xpath("//*[@text='Continue']") + join_btn_element.click() + except NoSuchElementException: + print(" Couldn't press Continue button") + try: + time.sleep(2) + report.step_start("Click Last Terms if needed") + print("Click Last Terms if needed") + join_btn_element = driver.find_element_by_xpath("//*[@text='Done']") + join_btn_element.click() + except NoSuchElementException: + print(" Couldn't find the last terms page") + + # Verify if WiFi is connected + # ------------------------------------------------------- + try: + report.step_start("Verify if Wifi is Connected") + WifiInternetErrMsg = WebDriverWait(driver, 35).until( + EC.presence_of_element_located((MobileBy.XPATH, + "//*[@resource-id='android:id/summary' and @text='Connected']/parent::*/android.widget.TextView[@text='" + WifiName + "']"))) + ssid_with_internet = True + print("Wifi Successfully Connected") + # time.sleep(5) + check_if_no_internet_popup(driver) + except: + try: + check_if_no_internet_popup(driver) + WifiInternetErrMsg = WebDriverWait(driver, 35).until( + EC.presence_of_element_located((MobileBy.XPATH, + "//*[@resource-id='com.android.settings:id/summary' and @text='Connected without internet']/parent::*/android.widget.TextView[@text='" + WifiName + "']"))) + print("Wifi Successfully Connected without internet") + check_if_no_internet_popup(driver) + except: + try: + report.step_start("Verify if Wifi is Connected") + WifiInternetErrMsg = WebDriverWait(driver, 60).until( + EC.presence_of_element_located(( + MobileBy.XPATH, + "//*[@resource-id='com.android.settings:id/summary' and @text='Connected']/parent::*/android.widget.TextView[@text='" + WifiName + "']"))) + ssid_with_internet = True + print("Wifi Successfully Connected") + except NoSuchElementException: + print("Wifi Connection Error: " + WifiName) + closeApp(connData["appPackage-android"], setup_perfectoMobile) + return ssid_with_internet + # ------------------------------------------------------- + + # Get into Additional Details + # To Get an IP Address + # To Forget connection + # To turn off auto. connect + # ------------------------------------------------------- + try: + print("Into additional details") + time.sleep(5) + report.step_start("Going for ip address") + additional_details_element = driver.find_element_by_xpath( + "//*[@resource-id='com.android.settings:id/settings_button_no_background']") + additional_details_element.click() + print("Entered ssid") + try: + time.sleep(10) + print("clicking Advanced") + report.step_start("clicking Advanced") + advanced_element = driver.find_element_by_xpath("//*[@text='Advanced']") + advanced_element.click() + print("clicked Advanced") + # print("Device IP address is :", ip_address_element_text) + except: + try: + time.sleep(5) + print("clicking Advanced2") + advanced_element = driver.find_element_by_xpath( + "//*[@resource-id='com.android.settings:id/recycler_view']/android.widget.FrameLayout[2]/android.widget.LinearLayout[1]/android.widget.RelativeLayout[1]") + advanced_element.click() + # print("Device IP address is :", ip_address_element_text) + except: + try: + time.sleep(5) + print("clicking Advanced2") + advanced_element = driver.find_element_by_xpath( + "//*[@resource-id='com.android.settings:id/recycler_view']/android.widget.LinearLayout[5]/android.widget.LinearLayout[1]/android.widget.ImageView[1]") + advanced_element.click() + except: + print("No advanced options") + # allure.attach(name= body=str("IP address element not found")) + + # closeApp(connData["appPackage-android"], setup_perfectoMobile) + # return ip_address_element_text, ssid_with_internet + # Scroll Down + scrollDown(setup_perfectoMobile) + try: + time.sleep(2) + ip_address_element = driver.find_element_by_xpath( + "//*[@text='IP address']/parent::*/android.widget.TextView[@resource-id='android:id/summary']") + ip_address_element_text = ip_address_element.text + print("Device IP address is :", ip_address_element_text) + except: + print("IP address element not found") + except: + print("Couldn't get into Additional settings") + # ------------------------------------------------------- + except: + print("No Switch element found") + # ---------------------To Turn on WIFi Switch if already OFF------------------------------- + + except: + print("Couldn't find wifi Button") + # ------------------Open WIFI page---------------------------------- + + except: + print("Exception: Verify Xpath - Update/check Xpath for Click Connections") + # -----------------To Open Connections page--------------------------- + + closeApp(connData["appPackage-android"], setup_perfectoMobile) + return ip_address_element_text, ssid_with_internet + def close_driver(driver): driver.close() driver.quit() -# def capture_start_har(setup_perfectoMobile): -# setup_perfectoMobile[1].step_start("Start HAR capture on Phone...") -# # params = {'generateHarFile', 'true'} -# params = {'generateHarFile' : 'true'} -# setup_perfectoMobile[0].execute_script('mobile:vnetwork:start', params) -# -# def capture_stop_har(setup_perfectoMobile): -# setup_perfectoMobile[1].step_start("Stop HAR capture on Phone...") -# params = {'generateHarFile' : 'true'} -# setup_perfectoMobile[0].execute_script('mobile:vnetwork:stop', params) \ No newline at end of file + +def expressWifi(request, WifiName, setup_perfectoMobile, connData): + print("\n-------------------------------------") + print("Express Wifi Verification") + print("-------------------------------------") + report = setup_perfectoMobile[1] + driver = setup_perfectoMobile[0] + + try: + click_on_ssid = WebDriverWait(driver, 10).until(EC.presence_of_element_located(( + MobileBy.XPATH, + "//*[@resource-id='com.android.settings:id/summary' and @text='Sign in to the network.']/parent::*/android.widget.TextView[@text='" + WifiName + "']"))) + click_on_ssid.click() + print("click on expresswifi SSID to open login page") + except: + print("Could not found expresswifi SSID") + + try: + print("Express Wifi Home Page Verification") + report.step_start("Express Wifi Home Page Verification") + driver.implicitly_wait(2) + ExpressWifiBytesLeft = driver.find_element_by_xpath("//*[@label='0KB left']") + except NoSuchElementException: + # driver.implicitly_wait(25) + #Add function to Toggle Wifi if Express Wifi Home Page not Triggerd + print("Express Wifi Page Not Logged In - ") + + try: + print("ExpressWifi Click on Menu Circle") + report.step_start("ExpressWifi Click on Menu Circle") + ExpressWifiMenu = driver.find_element_by_xpath("//*[@resource-id='dogfood-menu']") + ExpressWifiMenu.click() + except NoSuchElementException: + print("---- Exception ExpressWifi Click on Menu Circle") + + try: + print("ExpressWifi Click Run Tests!") + report.step_start("ExpressWifi Click Run Tests!") + ExpressWifiRunTests = driver.find_element_by_xpath("//*[@resource-id='run_tests']") + ExpressWifiRunTests.click() + time.sleep(20) + except NoSuchElementException: + print("Exception ExceptionExpressWifi Click Run Tests!") + + try: + print("Verify Results: ") + report.step_start("Verify Results") + + expressWifiOutputMsg = "//*[@resource-id='test_result']" + LogOut = driver.find_element_by_xpath(expressWifiOutputMsg) + print("----" + LogOut.text + "\n") + if 'test completed successfully' in LogOut.text: + closeApp(connData["appPackage-android"], setup_perfectoMobile) + return True + else: + closeApp(connData["appPackage-android"], setup_perfectoMobile) + return False + except NoSuchElementException: + print("Exception Verify Results") + closeApp(connData["appPackage-android"], setup_perfectoMobile) + + diff --git a/libs/perfecto_libs/iOS_lib.py b/libs/perfecto_libs/iOS_lib.py index 2ed1efc17..d324486db 100644 --- a/libs/perfecto_libs/iOS_lib.py +++ b/libs/perfecto_libs/iOS_lib.py @@ -21,18 +21,19 @@ from appium.webdriver.common.mobileby import MobileBy from selenium.webdriver.support import expected_conditions as EC import allure + def openApp(appName, setup_perfectoMobile): - #print("Refreshing App: " + appName) - setup_perfectoMobile[1].step_start("Opening App: " + appName) + setup_perfectoMobile[1].step_start("Opening App: " + appName) params = {'identifier': appName} - #Open/Close/Open Action is performed to ensure the app is back to its Original Settings + # Open/Close/Open Action is performed to ensure the app is back to its Original Settings setup_perfectoMobile[0].execute_script('mobile:application:open', params) setup_perfectoMobile[0].execute_script('mobile:application:close', params) setup_perfectoMobile[0].execute_script('mobile:application:open', params) + def scrollDown(setup_perfectoMobile): print("Scroll Down") - setup_perfectoMobile[1].step_start("Scroll Down") + setup_perfectoMobile[1].step_start("Scroll Down") params2 = {} params2["start"] = "50%,90%" params2["end"] = "50%,20%" @@ -40,104 +41,107 @@ def scrollDown(setup_perfectoMobile): time.sleep(5) setup_perfectoMobile[0].execute_script('mobile:touch:swipe', params2) time.sleep(5) - + + def closeApp(appName, setup_perfectoMobile): #print("Closing App.." + appName) - setup_perfectoMobile[1].step_start("Closing App: " + appName) + setup_perfectoMobile[1].step_start("Closing App: " + appName) params = {'identifier': appName} setup_perfectoMobile[0].execute_script('mobile:application:close', params) + def rebootPhone(setup_perfectoMobile): - #print("Closing App.." + appName) - setup_perfectoMobile[1].step_start("Rebooting Phone...") + setup_perfectoMobile[1].step_start("Rebooting Phone...") params = {} setup_perfectoMobile[0].execute_script('mobile:handset:reboot', params) + def set_APconnMobileDevice_iOS(request, WifiNameSSID, WifiPass, setup_perfectoMobile, connData): consoleOutput = "" print("\n-------------------------------------") print("Select Wifi/AccessPoint Connection") print("-------------------------------------") - + reportFlag = True - - print("Verifying Wifi/AP Connection Details....") - report = setup_perfectoMobile[1] + + print("Verifying Wifi/AP Connection Details....") + report = setup_perfectoMobile[1] driver = setup_perfectoMobile[0] - report.step_start("Switching Driver Context") + report.step_start("Switching Driver Context") print("Switching Context to Native") - #contexts = driver.contexts - #print(contexts) + # contexts = driver.contexts + # print(contexts) driver.switch_to.context('NATIVE_APP') - #driver.switch_to.context(contexts[0]) + # driver.switch_to.context(contexts[0]) print(WifiNameSSID) - report.step_start("Set Wifi Network to " + WifiNameSSID) - #Open Settings Application + report.step_start("Set Wifi Network to " + WifiNameSSID) + openApp(connData["bundleId-iOS-Settings"], setup_perfectoMobile) try: print("Verifying Connected Wifi Connection") - report.step_start("Verifying Connected Wifi Connection") + report.step_start("Verifying Connected Wifi Connection") element = driver.find_element_by_xpath("//XCUIElementTypeCell[@name='Wi-Fi']/XCUIElementTypeStaticText[2]") Wifi_AP_Name = element.text except NoSuchElementException: - print("Exception: Verify Xpath - UpdateXpath") - #NEED to fail if Wifi AP NAME isn't in the approved list AKA 5g & 2g. - #print("Wifi Name Matches - Already Connected To: " + Wifi_AP_Name) - #print("Wifi Name Matches - Already Connected To: " + WifiName) + print("Exception: Verify Xpath - UpdateXpath") + if Wifi_AP_Name.__eq__(WifiNameSSID): - print("Wifi Name Matches - Already Connected To: " + Wifi_AP_Name) - + print("Wifi Name Matches - Already Connected To: " + Wifi_AP_Name) + + #Verify if Ap is connected with Wifi - report.step_start("Verify Wifi Connection Status..") + report.step_start("Verify Wifi Connection Status..") #print("Click Wifi Connection..") element.click() - #Verifies if AP is connected to Wifi status - #print("Verify Wifi Connection Status..") + # Verifies if AP is connected to Wifi status + # print("Verify Wifi Connection Status..") try: report.step_start("Verify Wifi Connected Status") - WifiXpath = "//*[@label='selected']/parent::*/parent::*/XCUIElementTypeStaticText[@label='"+ Wifi_AP_Name + "']" + WifiXpath = "//*[@label='selected']/parent::*/parent::*/XCUIElementTypeStaticText[@label='" + Wifi_AP_Name + "']" elementWifName = driver.find_element_by_xpath(WifiXpath) except NoSuchElementException: reportFlag = False assert reportFlag - #Check AP Internet Error Msg + print("Checking Internet Connection Error..") report.step_start("Checking Internet Connection Error..") try: - #WifiInternetErrMsg = driver.find_element_by_xpath("//*[@label='No Internet Connection']").text - NoInternetConnectionMsg = WebDriverWait(driver, 30).until(EC.presence_of_element_located((MobileBy.XPATH, "//*[@label='No Internet Connection']"))) + # WifiInternetErrMsg = driver.find_element_by_xpath("//*[@label='No Internet Connection']").text + NoInternetConnectionMsg = WebDriverWait(driver, 30).until( + EC.presence_of_element_located((MobileBy.XPATH, "//*[@label='No Internet Connection']"))) except Exception as e: print("No Error with Wifi-AP Connection: " + Wifi_AP_Name) else: - print("Selecting Wifi: " + WifiNameSSID) - #consoleOutput+=str(WifiName)+ "\n" + print("Selecting Wifi: " + WifiNameSSID) + report.step_start("Selecting Wifi...: " + WifiNameSSID) element = driver.find_element_by_xpath("//XCUIElementTypeCell[@name='Wi-Fi']/XCUIElementTypeStaticText[2]") element.click() try: - wifiXpath2 = WebDriverWait(driver, 30).until(EC.presence_of_element_located((MobileBy.XPATH, "//*[@label='"+ WifiNameSSID + "']"))) + wifiXpath2 = WebDriverWait(driver, 30).until( + EC.presence_of_element_located((MobileBy.XPATH, "//*[@label='" + WifiNameSSID + "']"))) wifiXpath2.click() except Exception as e: print("Exception on Selecting Wifi Network. Please check wifi Name or signal") request.config.cache.set(key="SelectingWifiFailed", value=str(e)) - #allure.attach(name="Raj", body="hello world") + # allure.attach(name="Raj", body="hello world") assert False - #Set password if Needed + # Set password if Needed try: wifiPassword = driver.find_element_by_xpath("//*[@label='Password']") wifiPassword.send_keys(WifiPass) except NoSuchElementException: print("Enter Password Page Not Loaded") - + try: joinBTN = driver.find_element_by_xpath("//*[@label='Join']") joinBTN.click() @@ -145,61 +149,63 @@ def set_APconnMobileDevice_iOS(request, WifiNameSSID, WifiPass, setup_perfectoMo print("Join Button Not Enabled...Password may not be needed") try: - WifiInternetErrMsg2 = WebDriverWait(driver, 30).until(EC.presence_of_element_located((MobileBy.XPATH, "//*[@label='No Internet Connection']"))) - #= driver.find_element_by_xpath("//*[@label='No Internet Connection']").text + WifiInternetErrMsg2 = WebDriverWait(driver, 30).until( + EC.presence_of_element_located((MobileBy.XPATH, "//*[@label='No Internet Connection']"))) + # = driver.find_element_by_xpath("//*[@label='No Internet Connection']").text reportFlag = False except Exception as e: reportFlag = True print("No Wifi-AP Error Internet Error: " + WifiNameSSID) - #Need to add Wait for Selected Wifi Xpath + # Need to add Wait for Selected Wifi Xpath time.sleep(3) return reportFlag + def Toggle_AirplaneMode_iOS(request, setup_perfectoMobile, connData): print("\n-----------------------") print("Toggle Airplane Mode") print("-----------------------") - - report = setup_perfectoMobile[1] + + report = setup_perfectoMobile[1] driver = setup_perfectoMobile[0] currentResult = True - #Open Settings Application + # Open Settings Application openApp(connData["bundleId-iOS-Settings"], setup_perfectoMobile) - #Toggle Airplane Mode + # Toggle Airplane Mode print("Toggle Airplane Mode..") report.step_start("Toggle Airplane Mode") try: AirplaneMode = driver.find_element_by_xpath("//XCUIElementTypeSwitch[@label='Airplane Mode']") - #Toggle Airplane Mode + # Toggle Airplane Mode AirplaneMode.click() - #Verify Cellular Mode Text + # Verify Cellular Mode Text report.step_start("Verify Cellular Mode") try: CellularMsgEle = driver.find_element_by_xpath("//*[@name='Airplane Mode' and @value='Airplane Mode']") - #ssertEqual(CellularMsgEle.text, "Airplane Mode", "Airplane Mode Not Triggerd") + # ssertEqual(CellularMsgEle.text, "Airplane Mode", "Airplane Mode Not Triggerd") print("Verify Cellular Mode Text: Airplane Mode Success") except NoSuchElementException: currentResult = False - print("Cellular Mode Not in Airplane Mode: ERROR") + print("Cellular Mode Not in Airplane Mode: ERROR") - #Set Airplane Mode Back - AirplaneMode.click() + + AirplaneMode.click() except NoSuchElementException: currentResult = False print("Airplane Wifi Button not loaded...") - - #Verify No Sim Card Installed Msg Popup + + report.step_start("Verify No Sim Card Installed Msg Popup") print("Verify No Sim Card Installed Msg Popup..") try: NoSimCardErrorMsg = driver.find_element_by_xpath("//*[@value='No SIM Card Installed']") except NoSuchElementException: print("No Sim Card AlertMsg") - - #Click ok on No Sim Card Msg Popup + + print("Click ok on No Sim Card Msg Popup..") report.step_start("Click ok on No Sim Card Msg Popup") try: @@ -208,97 +214,99 @@ def Toggle_AirplaneMode_iOS(request, setup_perfectoMobile, connData): except NoSuchElementException: print("No Sim Card AlertMsg") - return currentResult + return currentResult + def verify_APconnMobileDevice_iOS(request, WifiName, setup_perfectoMobile, connData): print("\n-----------------------") print("Verify Connected Wifi Mode") print("-----------------------") - - report = setup_perfectoMobile[1] + + report = setup_perfectoMobile[1] driver = setup_perfectoMobile[0] - report.step_start("Verifying WifiName: " + WifiName) + report.step_start("Verifying WifiName: " + WifiName) - #Refresh Settings Application + # Refresh Settings Application openApp(connData["bundleId-iOS-Settings"], setup_perfectoMobile) - #Verifies if AP is connected to Wifi status + # Verifies if AP is connected to Wifi status try: print("Get Connected Wifi Name") - report.step_start("Get Connected Wifi Name") + report.step_start("Get Connected Wifi Name") + element = WebDriverWait(driver, 45).until(EC.presence_of_element_located((MobileBy.XPATH, "//XCUIElementTypeCell[@name='Wi-Fi']/XCUIElementTypeStaticText[2]"))) #element = driver.find_element_by_xpath("") + element.click() - + except Exception as e: print("SSID Not Connected Within allocated Time: " + WifiName) - report.step_start("SSID Not Connected: " + WifiName) + report.step_start("SSID Not Connected: " + WifiName) request.config.cache.set(key="SelectingWifiFailed", value=str(e)) reportFlag = False - assert reportFlag + assert reportFlag - #print("Verifying if SSID Wifi Shows up") - #report.step_start("Verifying if SSID Wifi Shows up") - #wifiXpath2 = WebDriverWait(driver, 45).until(EC.presence_of_element_located((MobileBy.XPATH, "//*[@label='"+ WifiName + "']"))) - #print("SSID is Present: " + WifiName) - #report.step_start("SSID is Present: " + WifiName) - try: + + try: print("Waiting for Auto Connection to: " + WifiName) - report.step_start("Waiting for Auto Connection to: " + WifiName) + report.step_start("Waiting for Auto Connection to: " + WifiName) + selectedWifiNetwork = "//*[@label='selected']/parent::*/parent::*/XCUIElementTypeStaticText[@label='"+ WifiName + "']/parent::*/XCUIElementTypeButton[@label='More Info']" passPointWifi = WebDriverWait(driver, 30).until(EC.presence_of_element_located((MobileBy.XPATH, selectedWifiNetwork))) except Exception as e: #Toggle Wifi Mode - Toggle_WifiMode_iOS(request, setup_perfectoMobile, connData) + Toggle_WifiMode_iOS(request, setup_perfectoMobile, connData) time.sleep(15) try: print("Waiting for Auto Connection After Toggling Wifi: " + WifiName) - selectedWifiNetwork2 = "//*[@label='selected']/parent::*/parent::*/XCUIElementTypeStaticText[@label='"+ WifiName + "']/parent::*/XCUIElementTypeButton[@label='More Info']" - passPointWifi = WebDriverWait(driver, 30).until(EC.presence_of_element_located((MobileBy.XPATH, selectedWifiNetwork2))) + selectedWifiNetwork2 = "//*[@label='selected']/parent::*/parent::*/XCUIElementTypeStaticText[@label='" + WifiName + "']/parent::*/XCUIElementTypeButton[@label='More Info']" + passPointWifi = WebDriverWait(driver, 30).until( + EC.presence_of_element_located((MobileBy.XPATH, selectedWifiNetwork2))) except Exception as e: print("SSID Not Connected Within allocated Time: " + WifiName) - report.step_start("SSID Not Connected: " + WifiName) + report.step_start("SSID Not Connected: " + WifiName) request.config.cache.set(key="SelectingWifiFailed", value=str(e)) reportFlag = False assert reportFlag return True + def ForgetWifiConnection(request, setup_perfectoMobile, wifiName, connData): print("\n-----------------------------") print("Forget Wifi/AP Connection") print("-----------------------------") - - report = setup_perfectoMobile[1] + + report = setup_perfectoMobile[1] driver = setup_perfectoMobile[0] - report.step_start("Switching Driver Context") + report.step_start("Switching Driver Context") print("Switching Context to Native") driver.switch_to.context('NATIVE_APP') - #contexts = driver.contexts - #print(contexts) + # contexts = driver.contexts + # print(contexts) - report.step_start("Forget Existing Wifi") + report.step_start("Forget Existing Wifi") openApp(connData["bundleId-iOS-Settings"], setup_perfectoMobile) try: - # print("Verifying Connected Wifi Connection") - report.step_start("Verifying Existing Connected Wifi Connection") + + report.step_start("Verifying Existing Connected Wifi Connection") element = driver.find_element_by_xpath("//XCUIElementTypeCell[@name='Wi-Fi']/XCUIElementTypeStaticText[2]") Wifi_AP_Name = element.text except NoSuchElementException: - print("Exception: Verify Xpath - UpdateXpath") + print("Exception: Verify Xpath - UpdateXpath") if Wifi_AP_Name.__eq__(wifiName): - print("Wifi Name Matches Connected To: " + Wifi_AP_Name) + print("Wifi Name Matches Connected To: " + Wifi_AP_Name) element.click() print("More Info on Wifi: " + Wifi_AP_Name) report.step_start("Click on More Info on Wifi") - WifiXpathMoreInfo = "//*[@label='selected']/parent::*/parent::*/XCUIElementTypeStaticText[@label='"+ Wifi_AP_Name + "']/parent::*/XCUIElementTypeButton[@label='More Info']" + WifiXpathMoreInfo = "//*[@label='selected']/parent::*/parent::*/XCUIElementTypeStaticText[@label='" + Wifi_AP_Name + "']/parent::*/XCUIElementTypeButton[@label='More Info']" elementMoreInfo = driver.find_element_by_xpath(WifiXpathMoreInfo) elementMoreInfo.click() @@ -315,77 +323,87 @@ def ForgetWifiConnection(request, setup_perfectoMobile, wifiName, connData): elementforgetWifi.click() else: - print("Connected To: " + Wifi_AP_Name) - print("Initial Wifi: " + wifiName) + print("Connected To: " + Wifi_AP_Name) + print("Initial Wifi: " + wifiName) element.click() - report.step_start("Click on More Info on Wifi") - WifiXpathMoreInfo = "//*[@label='selected']/parent::*/parent::*/XCUIElementTypeStaticText[@label='"+ wifiName + "']/parent::*/XCUIElementTypeButton[@label='More Info']" - elementMoreInfo = driver.find_element_by_xpath(WifiXpathMoreInfo) - elementMoreInfo.click() + try: + report.step_start("Click on More Info on Wifi") + WifiXpathMoreInfo = "//*[@label='selected']/parent::*/parent::*/XCUIElementTypeStaticText[@label='" + wifiName + "']/parent::*/XCUIElementTypeButton[@label='More Info']" + elementMoreInfo = driver.find_element_by_xpath(WifiXpathMoreInfo) + elementMoreInfo.click() - print("Forget Wifi Network " + wifiName) - report.step_start("Forget Wifi Network") - WifiXpathForgetWifi = "//*[@label='Forget This Network']" - elementforgetWifi = driver.find_element_by_xpath(WifiXpathForgetWifi) - elementforgetWifi.click() + print("Forget Wifi Network " + wifiName) + report.step_start("Forget Wifi Network") + WifiXpathForgetWifi = "//*[@label='Forget This Network']" + elementforgetWifi = driver.find_element_by_xpath(WifiXpathForgetWifi) + elementforgetWifi.click() + + report.step_start("Confirm Forget Wifi Network") + WifiXpathForgetWifi = "//*[@label='Forget']" + elementforgetWifi = driver.find_element_by_xpath(WifiXpathForgetWifi) + elementforgetWifi.click() + + except NoSuchElementException: + print("Initial Wifi Not Selected: " + wifiName) - report.step_start("Confirm Forget Wifi Network") - WifiXpathForgetWifi = "//*[@label='Forget']" - elementforgetWifi = driver.find_element_by_xpath(WifiXpathForgetWifi) - elementforgetWifi.click() def Toggle_WifiMode_iOS(request, setup_perfectoMobile, connData): print("\n-----------------------") print("Toggle Wifi Mode") print("-----------------------") - - report = setup_perfectoMobile[1] + + report = setup_perfectoMobile[1] driver = setup_perfectoMobile[0] - report.step_start("Toggle Wifi Mode") + report.step_start("Toggle Wifi Mode") print("Toggle Wifi Mode..") try: print("Disable Wifi Radio Btn") - report.step_start("Disable Wifi Radio Btn") + report.step_start("Disable Wifi Radio Btn") WifiMode = driver.find_element_by_xpath("//*[@label='Wi-Fi' and @value='1']") - #Toggle Wifi Mode + # Toggle Wifi Mode WifiMode.click() time.sleep(5) - #Verify Radio Button Mode + # Verify Radio Button Mode try: print("Enable Wifi Radio Btn") - report.step_start("Enable Wifi Radio Btn") + report.step_start("Enable Wifi Radio Btn") WifiDissconnected = driver.find_element_by_xpath("//*[@label='Wi-Fi' and @value='0']") - #self.assertEqual(WifiDissconnected.text, "Airplane Mode", "Airplane Mode Not Triggerd") + # self.assertEqual(WifiDissconnected.text, "Airplane Mode", "Airplane Mode Not Triggerd") print("Wifi Radio Button Toggled to Disable") except NoSuchElementException: - print("Wifi Radio Button Not Disabled...") - - #Set Airplane Mode Back - WifiDissconnected.click() - print("Wifi Radio Button Toggled to Enabled") + print("Wifi Radio Button Not Disabled...") + + + WifiDissconnected.click() + print("Wifi Radio Button Toggled to Enabled") except NoSuchElementException: print("Airplane Wifi Button not loaded...") + def get_WifiIPAddress_iOS(request, setup_perfectoMobile, connData, wifiName): + print("\n------------------------------------") + print("Get Wifi IP Address IOS") + print("--------------------------------------") + report = setup_perfectoMobile[1] driver = setup_perfectoMobile[0] openApp(connData["bundleId-iOS-Settings"], setup_perfectoMobile) try: - # print("Verifying Connected Wifi Connection") - report.step_start("Loading Wifi Page") + + report.step_start("Loading Wifi Page") element = driver.find_element_by_xpath("//XCUIElementTypeCell[@name='Wi-Fi']/XCUIElementTypeStaticText[2]") element.click() except NoSuchElementException: - print("Exception: Verify Xpath - unable to click on Wifi") + print("Exception: Verify Xpath - unable to click on Wifi") report.step_start("Wifi Page") - WifiXpath = "//*[@label='selected']/parent::*/parent::*/XCUIElementTypeStaticText[@label='"+ wifiName + "']" + WifiXpath = "//*[@label='selected']/parent::*/parent::*/XCUIElementTypeStaticText[@label='" + wifiName + "']" elementWifName = driver.find_element_by_xpath(WifiXpath) - #Check AP Internet Error Msg + print("Checking Internet Connection Error...") report.step_start("Checking Internet Connection Error..") @@ -394,22 +412,27 @@ def get_WifiIPAddress_iOS(request, setup_perfectoMobile, connData, wifiName): except NoSuchElementException: print("Wifi Connected without any errors: " + wifiName) - try: + try: + WifiInternetInfo=driver.find_element_by_xpath("(//XCUIElementTypeButton[@label='More Info'])[1]") + WifiInternetInfo.click() except NoSuchElementException: print("Wifi-AP Connected Successfully: " + wifiName) - try: + try: + WifiIPaddress= driver.find_element_by_xpath("(//*[@label='Router']/parent::*/XCUIElementTypeStaticText)[2]").text + return WifiIPaddress except NoSuchElementException: print("Wifi-AP Connected Successfully: " + wifiName) return None + def ping_deftapps_iOS(setup_perfectoMobile, AP_IPaddress): - report = setup_perfectoMobile[1] + report = setup_perfectoMobile[1] driver = setup_perfectoMobile[0] report.step_start("Pinging deftapps....") @@ -417,10 +440,10 @@ def ping_deftapps_iOS(setup_perfectoMobile, AP_IPaddress): pingHost = "//*[@value='']" element2 = driver.find_element_by_xpath(pingHost) element2.clear() - #element2.send_keys(AP_IPaddress) + # element2.send_keys(AP_IPaddress) element2.send_keys("8.8.8.8") - #Ping Enable + # Ping Enable report.step_start("Pingin Host") print("Pingin Host..") element3 = driver.find_element_by_xpath("//*[@label='go']") @@ -428,7 +451,7 @@ def ping_deftapps_iOS(setup_perfectoMobile, AP_IPaddress): time.sleep(10) - #handle any popup + # handle any popup report.step_start("Stop Ping Host") print("Stop Ping Host..") @@ -439,24 +462,28 @@ def ping_deftapps_iOS(setup_perfectoMobile, AP_IPaddress): report.step_start("Verifying Packet Loss..") print("Verifying Packet Loss..") try: - element5 = driver.find_element_by_xpath("//XCUIElementTypeStaticText[@label='0']") - #assertEqual(element5.text, "0", "Packet Loss Exist, Please Check Device") + element5 = driver.find_element_by_xpath("//XCUIElementTypeStaticText[@label='0']") + except NoSuchElementException: print("No Packet Loss Detected 1st Attempt") report.step_start("Verifying Packet Sent..") print("Verifying Packet Sent..") try: - packetSent = driver.find_element_by_xpath("//XCUIElementTypeStaticText[@label='Sent']/parent::*/XCUIElementTypeStaticText[2]").text + + packetSent = driver.find_element_by_xpath("//XCUIElementTypeStaticText[@label='Sent']/parent::*/XCUIElementTypeStaticText[2]").text #assertEqual(element5.text, "0", "Packet Loss Exist, Please Check Device") + except NoSuchElementException: print("-------Exception: Packet Sent Error, check object ID") report.step_start("Verifying Packet Received..") print("Verifying Packet Received..") try: - packetReceived = driver.find_element_by_xpath("//XCUIElementTypeStaticText[@label='Received']/parent::*/XCUIElementTypeStaticText[2]").text + + packetReceived = driver.find_element_by_xpath("//XCUIElementTypeStaticText[@label='Received']/parent::*/XCUIElementTypeStaticText[2]").text #assertEqual(element5.text, "0", "Packet Loss Exist, Please Check Device") + except NoSuchElementException: print("-------Exception: Packet Sent Error, check object ID") @@ -466,9 +493,11 @@ def ping_deftapps_iOS(setup_perfectoMobile, AP_IPaddress): print("Verifying No route to host Error Msg....") report.step_start("Verifying No route to host Error Msg..") try: - element7 = driver.find_element_by_xpath("(//XCUIElementTypeStaticText[@label='Sendto: No route to host'])[2]") + + element7 = driver.find_element_by_xpath("(//XCUIElementTypeStaticText[@label='Sendto: No route to host'])[2]") + print("Packet Loss Detected on AP!!!!!: " + AP_IPaddress) - #self.assertNotEqual(element7.text, "Sendto: No route to host", "Packet Loss Exist, Please Check Device AP: " + Wifi_AP_Name) + # self.assertNotEqual(element7.text, "Sendto: No route to host", "Packet Loss Exist, Please Check Device AP: " + Wifi_AP_Name) except NoSuchElementException: print("\nNo Packet Loss Detected on AP!!!!!: " + AP_IPaddress) @@ -477,43 +506,48 @@ def ping_deftapps_iOS(setup_perfectoMobile, AP_IPaddress): return None + def tearDown(setup_perfectoMobile): - report = setup_perfectoMobile[1] + report = setup_perfectoMobile[1] driver = setup_perfectoMobile[0] report.step_start("Exception Failure Tear Down....") try: - print(" -- Tear Down --") + print(" -- Tear Down --") report.test_stop(TestResultFactory.create_failure) print('Report-Url: ' + report.report_url() + '\n') driver.close() except Exception as e: - print(" -- Exception Not Able To close --") + print(" -- Exception Not Able To close --") + print (e) + finally: try: driver.quit() except Exception as e: - print(" -- Exception Not Able To Quit --") + print(" -- Exception Not Able To Quit --") + print (e) + def verifyUploadDownloadSpeediOS(request, setup_perfectoMobile, get_APToMobileDevice_data): print("\n-------------------------------------") print("Verify Upload & Download Speed") print("-------------------------------------") - - report = setup_perfectoMobile[1] + + report = setup_perfectoMobile[1] driver = setup_perfectoMobile[0] connData = get_APToMobileDevice_data currentResult = True contexts = driver.contexts - #print("Printing Context") - #print(contexts) + # print("Printing Context") + # print(contexts) driver.switch_to.context('WEBVIEW_1') - + try: print("Launching Safari") report.step_start("Google Home Page") @@ -543,12 +577,12 @@ def verifyUploadDownloadSpeediOS(request, setup_perfectoMobile, get_APToMobileDe driver.find_element_by_xpath(connData["BtnRunSpeedTest"]).click() except NoSuchElementException: currentResult = False - print("Run Speed Test Button element not found",NoSuchElementException) + print("Run Speed Test Button element not found", NoSuchElementException) return currentResult - #Get upload/Download Speed + # Get upload/Download Speed try: - report.step_start("Get upload/Download Speed") + report.step_start("Get upload/Download Speed") time.sleep(60) downloadMbps = driver.find_element_by_xpath(connData["downloadMbps"]) downloadSpeed = downloadMbps.text @@ -557,39 +591,41 @@ def verifyUploadDownloadSpeediOS(request, setup_perfectoMobile, get_APToMobileDe UploadMbps = driver.find_element_by_xpath(connData["UploadMbps"]) uploadSpeed = UploadMbps.text print("Upload: " + uploadSpeed + " Mbps") - allure.attach(name="Speed Test logs: ", body=str("Upload: " + uploadSpeed + " Mbps" + " Download: " + downloadSpeed + " Mbps")) + allure.attach(name="Speed Test logs: ", + body=str("Upload: " + uploadSpeed + " Mbps" + " Download: " + downloadSpeed + " Mbps")) print("Access Point Verification Completed Successfully") except NoSuchElementException: print("Access Point Verification NOT Completed, checking Connection....") currentResult = False - + return currentResult + def downloadInstallOpenRoamingProfile(request, profileDownloadURL, setup_perfectoMobile, get_APToMobileDevice_data): print("\n-------------------------------------") print("Download Open Roaming Profile") print("-------------------------------------") - + OpenRoamingWifiName = "" - report = setup_perfectoMobile[1] + report = setup_perfectoMobile[1] driver = setup_perfectoMobile[0] connData = get_APToMobileDevice_data currentResult = True contexts = driver.contexts - #print("Printing Context") - #print(contexts) + # print("Printing Context") + # print(contexts) driver.switch_to.context('WEBVIEW_1') - + print("Launching Safari with OpenRoaming Profile") - report.step_start("Open Roaming Download Page") - driver.get(profileDownloadURL) - + report.step_start("Open Roaming Download Page") + driver.get(profileDownloadURL) + try: print("Accept Popup") - report.step_start("Accept Popup") + report.step_start("Accept Popup") driver.switch_to.context('NATIVE_APP') WebDriverWait(driver, 40).until(EC.alert_is_present(), 'Time out confirmation popup to appear') alert = driver.switch_to.alert @@ -597,47 +633,49 @@ def downloadInstallOpenRoamingProfile(request, profileDownloadURL, setup_perfect print("Alert Accepted") except TimeoutException: print("no alert") - - #Open Settings Application + + openApp(connData["bundleId-iOS-Settings"], setup_perfectoMobile) try: print("Click on downloaded Profile") - report.step_start("Click on downloaded Profile") - downloadprofile = driver.find_element_by_xpath("//XCUIElementTypeStaticText[@label='Profile Downloaded']") + report.step_start("Click on downloaded Profile") + downloadprofile = driver.find_element_by_xpath("//XCUIElementTypeStaticText[@label='Profile Downloaded']") downloadprofile.click() except NoSuchElementException: print("Exception: Click Download Profile Button not showing up in settings") try: print("Install 1st Confirmation") - report.step_start("Install 1st Confirmation") - install1stConf = driver.find_element_by_xpath("//XCUIElementTypeButton[@label='Install']") + report.step_start("Install 1st Confirmation") + install1stConf = driver.find_element_by_xpath("//XCUIElementTypeButton[@label='Install']") install1stConf.click() except NoSuchElementException: print("Exception: Install 1st Confirmation") - + # //*[@label="The profile is not signed."] try: print("Install 2nd Confirmation") - report.step_start("Install 2nd Confirmation") - install2ndConf = driver.find_element_by_xpath("//XCUIElementTypeButton[@label='Install'] ") + report.step_start("Install 2nd Confirmation") + install2ndConf = driver.find_element_by_xpath("//XCUIElementTypeButton[@label='Install'] ") install2ndConf.click() except NoSuchElementException: print("Exception: Install 2nd Confirmation") try: print("Install 3rd Confirmation") - report.step_start("Install 3rd Confirmation") - install3rdConf = driver.find_element_by_xpath("//XCUIElementTypeButton[@label='Install']") + report.step_start("Install 3rd Confirmation") + install3rdConf = driver.find_element_by_xpath("//XCUIElementTypeButton[@label='Install']") install3rdConf.click() except NoSuchElementException: print("Exception: Install 3rd Confirmation") try: print("Verify Profile Installed") - report.step_start("Verify Profile Installed") + report.step_start("Verify Profile Installed") + elelSearch2 = WebDriverWait(driver, 30).until(EC.presence_of_element_located((MobileBy.XPATH, "//*[@label='Profile Installed']"))) + elelSearch2.click() except Exception as e: print("Profile Installed Message Error") @@ -646,8 +684,8 @@ def downloadInstallOpenRoamingProfile(request, profileDownloadURL, setup_perfect try: print("Click Done Button") - report.step_start("Click Done Button") - elelSearch = driver.find_element_by_xpath("//XCUIElementTypeButton[@label='Done']") + report.step_start("Click Done Button") + elelSearch = driver.find_element_by_xpath("//XCUIElementTypeButton[@label='Done']") elelSearch.click() except NoSuchElementException: print("Exception: Clicking on Done Button") @@ -657,97 +695,106 @@ def downloadInstallOpenRoamingProfile(request, profileDownloadURL, setup_perfect print("Switching Context to Webview") driver.switch_to.context('WEBVIEW_1') print("Launching Google to Reset Browser") - report.step_start("Launching Google to Reset Browser") - driver.get("https://www.google.com") + report.step_start("Launching Google to Reset Browser") + driver.get("https://www.google.com") print("Switching Context to Native") - report.step_start("Switching Driver Context Native") + report.step_start("Switching Driver Context Native") driver.switch_to.context('NATIVE_APP') closeApp(connData["bundleId-iOS-Safari"], setup_perfectoMobile) - #Open Settings Application - #openApp(connData["bundleId-iOS-Settings"], setup_perfectoMobile) + # Open Settings Application + # openApp(connData["bundleId-iOS-Settings"], setup_perfectoMobile) + + - # try: # print("Verifying OpenRoaming Connected Wifi") # time.sleep(3) - # report.step_start("Verifying Connected Wifi Name") + # report.step_start("Verifying Connected Wifi Name") # element = driver.find_element_by_xpath("//XCUIElementTypeCell[@name='Wi-Fi']/XCUIElementTypeStaticText[2]") # OpenRoamingWifiName = element.text # element.click() - + # except Exception as e: # OpenRoamingWifiName = "None" - # print("Wifi Not Connected to OpenRoaming Profile: ") + # print("Wifi Not Connected to OpenRoaming Profile: ") # request.config.cache.set(key="SelectingWifiFailed", value=str(e)) # assert False +# except Exception as e: +# OpenRoamingWifiName = "None" +# print("Wifi Not Connected to OpenRoaming Profile: ") +# request.config.cache.set(key="SelectingWifiFailed", value=str(e)) +# assert False - #try: - # report.step_start("Verify Wifi Connected Status") - # WifiXpath = "//*[@label='selected']/parent::*/parent::*/XCUIElementTypeStaticText[@label='"+ OpenRoamingWifiName + "']" - # elementWifName = driver.find_element_by_xpath(WifiXpath) - # OpenRoamingWifiName = elementWifName.text - # print ("Connected to: " + OpenRoamingWifiName) - #except NoSuchElementException: - # OpenRoamingWifiName = "None" - # reportFlag = False - # assert reportFlag +# try: +# report.step_start("Verify Wifi Connected Status") +# WifiXpath = "//*[@label='selected']/parent::*/parent::*/XCUIElementTypeStaticText[@label='"+ OpenRoamingWifiName + "']" +# elementWifName = driver.find_element_by_xpath(WifiXpath) +# OpenRoamingWifiName = elementWifName.text +# print ("Connected to: " + OpenRoamingWifiName) +# except NoSuchElementException: +# OpenRoamingWifiName = "None" +# reportFlag = False +# assert reportFlag - #return OpenRoamingWifiName +# return OpenRoamingWifiName def ForgetProfileWifiConnection(request, setup_perfectoMobile, installedProfileSSID, connData): print("\n-----------------------------") print("Forget All Wifi/AP Connection") print("-----------------------------") - - report = setup_perfectoMobile[1] + + report = setup_perfectoMobile[1] driver = setup_perfectoMobile[0] - report.step_start("Switching Driver Context") + report.step_start("Switching Driver Context") print("Switching Context to Native") driver.switch_to.context('NATIVE_APP') contexts = driver.contexts - #print(contexts) + # print(contexts) - report.step_start("Forget Existing Wifi") + report.step_start("Forget Existing Wifi") openApp(connData["bundleId-iOS-Settings"], setup_perfectoMobile) try: - #Also have to check with Connected Status xpath + # Also have to check with Connected Status xpath print("Verifying Connected Wifi Connection") - report.step_start("Verifying Existing Connected Wifi Connection") + report.step_start("Verifying Existing Connected Wifi Connection") element22 = driver.find_element_by_xpath("//XCUIElementTypeCell[@name='Wi-Fi']/XCUIElementTypeStaticText[2]") element22.click() - #WifiXpath2= "//*[@label='selected']/parent::*/parent::*/XCUIElementTypeStaticText[2]" - WifiXpath2 = WebDriverWait(driver, 20).until(EC.presence_of_element_located((MobileBy.XPATH, "//*[@label='selected']/parent::*/parent::*/XCUIElementTypeStaticText[2]"))) + # WifiXpath2= "//*[@label='selected']/parent::*/parent::*/XCUIElementTypeStaticText[2]" + WifiXpath2 = WebDriverWait(driver, 20).until(EC.presence_of_element_located( + (MobileBy.XPATH, "//*[@label='selected']/parent::*/parent::*/XCUIElementTypeStaticText[2]"))) elementMoreInfo = driver.find_element_by_xpath(WifiXpath2) Wifi_AP_Name = elementMoreInfo.text - print ("Connected to: " + Wifi_AP_Name) + print("Connected to: " + Wifi_AP_Name) except NoSuchElementException and TimeoutException: Wifi_AP_Name = "None" - print("Wifi Not Connected to anything") + print("Wifi Not Connected to anything") if Wifi_AP_Name.__eq__("Not Connected"): - print("Not Connected to any wifi") + print("Not Connected to any wifi") + #deleteOpenRoamingInstalledProfile(request, installedProfileSSID, setup_perfectoMobile, connData) elif Wifi_AP_Name.__eq__("None"): #deleteOpenRoamingInstalledProfile(request, installedProfileSSID, setup_perfectoMobile, connData) - print("Not Connected to any wifi Network/None") + + print("Not Connected to any wifi Network/None") elif Wifi_AP_Name.__eq__(installedProfileSSID): - deleteOpenRoamingInstalledProfile(request, installedProfileSSID, setup_perfectoMobile, connData) + deleteOpenRoamingInstalledProfile(request, installedProfileSSID, setup_perfectoMobile, connData) else: try: - #element22.click() + # element22.click() report.step_start("Click on More Info on Wifi") - WifiXpathMoreInfo = "//*[@label='selected']/parent::*/parent::*/XCUIElementTypeStaticText[@label='"+ Wifi_AP_Name + "']/parent::*/XCUIElementTypeButton[@label='More Info']" + WifiXpathMoreInfo = "//*[@label='selected']/parent::*/parent::*/XCUIElementTypeStaticText[@label='" + Wifi_AP_Name + "']/parent::*/XCUIElementTypeButton[@label='More Info']" elementMoreInfo = driver.find_element_by_xpath(WifiXpathMoreInfo) elementMoreInfo.click() @@ -763,30 +810,31 @@ def ForgetProfileWifiConnection(request, setup_perfectoMobile, installedProfileS elementforgetWifi.click() except NoSuchElementException: - + print("Exception General Menu Not found") assert False + def deleteOpenRoamingInstalledProfile(request, profileName, setup_perfectoMobile, connData): print("\n-----------------------------") print("Delete Open Roaming Profile") print("-----------------------------") - - report = setup_perfectoMobile[1] + + report = setup_perfectoMobile[1] driver = setup_perfectoMobile[0] - report.step_start("Switching Driver Context") + report.step_start("Switching Driver Context") print("Switching Context to Native") driver.switch_to.context('NATIVE_APP') contexts = driver.contexts - #print(contexts) + # print(contexts) - report.step_start("Forget Existing Wifi") + report.step_start("Forget Existing Wifi") openApp(connData["bundleId-iOS-Settings"], setup_perfectoMobile) try: print("Click General") - report.step_start("Click General") + report.step_start("Click General") element = driver.find_element_by_xpath("//*[@value='General']") element.click() except NoSuchElementException: @@ -799,14 +847,15 @@ def deleteOpenRoamingInstalledProfile(request, profileName, setup_perfectoMobile print("Verify if any Profile Installed ") try: print("Select Profile ") - report.step_start("Select Profile") + report.step_start("Select Profile") elementProfile = driver.find_element_by_xpath("//*[@name='ManagedConfigurationList' and @label='Profile']") elementProfile.click() except NoSuchElementException: - #Verify Multi Profiles + # Verify Multi Profiles print("Multiple Profiles Maybe Installed, Checking Profiles") try: - elementProfiles = driver.find_element_by_xpath("//*[@name='ManagedConfigurationList' and @label='Profiles']") + elementProfiles = driver.find_element_by_xpath( + "//*[@name='ManagedConfigurationList' and @label='Profiles']") elementProfiles.click() print("Exception Select Profile Button") @@ -815,7 +864,7 @@ def deleteOpenRoamingInstalledProfile(request, profileName, setup_perfectoMobile try: print("Click Configuration Profile ") - report.step_start("Click Configuration Profile ") + report.step_start("Click Configuration Profile ") element = driver.find_element_by_xpath("//XCUIElementTypeStaticText[@label='" + profileName + "']") element.click() except NoSuchElementException: @@ -824,16 +873,16 @@ def deleteOpenRoamingInstalledProfile(request, profileName, setup_perfectoMobile try: print("Remove Profile") - report.step_start("Remove Profile ") + report.step_start("Remove Profile ") element = driver.find_element_by_xpath("//*[@label='Remove Profile']") element.click() except NoSuchElementException: print("Exception Remove") assert False - + try: print("Click Remove Button") - report.step_start("Click Remove Button") + report.step_start("Click Remove Button") element = driver.find_element_by_xpath("//*[@label='Remove']") element.click() except Exception as e: @@ -842,14 +891,15 @@ def deleteOpenRoamingInstalledProfile(request, profileName, setup_perfectoMobile except Exception: print("Exception There may be No Profiles Installed") - report.step_start("Exception There may be No Profiles Installed") + report.step_start("Exception There may be No Profiles Installed") closeApp(connData["bundleId-iOS-Settings"], setup_perfectoMobile) -#To get an IP address + +# To get an IP address def get_ip_address_ios(request, WifiName, WifiPass, setup_perfectoMobile, connData): print("\n-------------------------------------") - print("Select Wifi/AccessPoint Connection") + print("Select Wifi/Get IP Address IOS Connection") print("-------------------------------------") reportFlag = True @@ -869,7 +919,6 @@ def get_ip_address_ios(request, WifiName, WifiPass, setup_perfectoMobile, connDa # Open Settings Application openApp(connData["bundleId-iOS-Settings"], setup_perfectoMobile) - try: time.sleep(2) driver.implicitly_wait(2) @@ -906,11 +955,12 @@ def get_ip_address_ios(request, WifiName, WifiPass, setup_perfectoMobile, connDa break else: try: - get_wifi_switch_element = driver.find_element_by_xpath("//*[@label='Wi-Fi' and @value='0']") + get_wifi_switch_element = driver.find_element_by_xpath( + "//*[@label='Wi-Fi' and @value='0']") get_wifi_switch_element_text = get_wifi_switch_element.text except: print("WIFi switch is ON") - if(get_wifi_switch_element_text == "0" or get_wifi_switch_element_text == 0): + if (get_wifi_switch_element_text == "0" or get_wifi_switch_element_text == 0): print("switch is still OFF") closeApp(connData["bundleId-iOS-Settings"], setup_perfectoMobile) return ip_address_element_text, is_internet @@ -954,7 +1004,6 @@ def get_ip_address_ios(request, WifiName, WifiPass, setup_perfectoMobile, connDa except: print("No connected SSID") - # ---------------------This is to Forget current connected SSID------------------------------- # ---------------------To get all available SSID------------------------------- @@ -1034,24 +1083,24 @@ def get_ip_address_ios(request, WifiName, WifiPass, setup_perfectoMobile, connDa # ---------------------Additional INFO------------------------------- try: - print("Selecting SSID: ",WifiName) + print("Selecting SSID: ", WifiName) report.step_start("Selecting SSID") - additional_details_element = WebDriverWait(driver, 30).until( + additional_details_element = WebDriverWait(driver, 30).until( EC.presence_of_element_located((MobileBy.XPATH, - "//*[@label='"+ WifiName+"']"))) + "//*[@label='" + WifiName + "']"))) # //*[@label='selected']/parent::*/parent::*/XCUIElementTypeButton[@label='More Info'] additional_details_element.click() try: print("Checking IP address") # (//*[@label="IP Address"]/parent::*/XCUIElementTypeStaticText)[2] - ip_address_element_text = driver.find_element_by_xpath("(//*[@label='IP Address']/parent::*/XCUIElementTypeStaticText)[2]").text + ip_address_element_text = driver.find_element_by_xpath( + "(//*[@label='IP Address']/parent::*/XCUIElementTypeStaticText)[2]").text print("ip_address_element_text: ", ip_address_element_text) except Exception as e: print("IP Address not Found") request.config.cache.set(key="select IP failed", value=str(e)) - try: time.sleep(2) driver.implicitly_wait(2) @@ -1119,8 +1168,13 @@ def get_ip_address_ios(request, WifiName, WifiPass, setup_perfectoMobile, connDa return ip_address_element_text, is_internet # ---------------------close app------------------------------- -#//XCUIElementTypeOther[2]/XCUIElementTypeOther[1]/XCUIElementTypeStaticText + +# //XCUIElementTypeOther[2]/XCUIElementTypeOther[1]/XCUIElementTypeStaticText def get_all_available_ssids(driver): + print("\n----------------------------") + print("Get All Available SSID") + print("------------------------------") + active_ssid_list = [] try: time.sleep(8) @@ -1129,16 +1183,17 @@ def get_all_available_ssids(driver): print(len(elements)) for i in range(len(elements)): active_ssid_list.append(elements[i].text) - print("active_ssid_list: ",active_ssid_list ) + print("active_ssid_list: ", active_ssid_list) except: print("No SSIDS available") return active_ssid_list -#Connect to WIFI + +# Connect to WIFI def wifi_connect(request, WifiName, WifiPass, setup_perfectoMobile, connData): print("\n-------------------------------------") - print("Select Wifi/AccessPoint Connection") + print("Select Wifi Connect Connection") print("-------------------------------------") reportFlag = True @@ -1317,17 +1372,98 @@ def wifi_connect(request, WifiName, WifiPass, setup_perfectoMobile, connData): # time.sleep(3) # ---------------------check if internet------------------------------- - # --------------------- close app------------------------------- closeApp(connData["bundleId-iOS-Settings"], setup_perfectoMobile) return is_internet # ---------------------close app------------------------------- -#To disconnect and forget network +def expressWifi(request, setup_perfectoMobile, connData): + print("\n-------------------------------------") + print("Express Wifi Verification") + print("-------------------------------------") + report = setup_perfectoMobile[1] + driver = setup_perfectoMobile[0] + + try: + print("Express Wifi Home Page Verification") + report.step_start("Express Wifi Home Page Verification") + driver.implicitly_wait(2) + ExpressWifiBytesLeft = driver.find_element_by_xpath("//*[@label='0KB left']") + except NoSuchElementException: + # driver.implicitly_wait(25) + # Add function to Toggle Wifi if Express Wifi Home Page not Triggerd + print("Express Wifi Page Not Logged In - ") + + try: + print("ExpressWifi Click on Menu Circle") + report.step_start("ExpressWifi Click on Menu Circle") + ExpressWifiMenu = driver.find_element_by_xpath("//*[@label='⚙️']") + ExpressWifiMenu.click() + except NoSuchElementException: + print("---- Exception ExpressWifi Click on Menu Circle") + + try: + print("ExpressWifi Click Run Tests!") + report.step_start("ExpressWifi Click Run Tests!") + ExpressWifiRunTests = driver.find_element_by_xpath("//*[@label='Run Tests!']") + ExpressWifiRunTests.click() + time.sleep(20) + except NoSuchElementException: + print("Exception ExceptionExpressWifi Click Run Tests!") + + try: + print("Verify Results: ") + report.step_start("Verify Results") + ExpressWifiLogMsgCount = driver.find_element_by_xpath( + "//*[@label='running test ...']/parent::*/XCUIElementTypeStaticText") + ExpressWifiLogMsg = [] + + for i in range(1, 12): + expressWifiOutputMsg = "//*[@label='running test ...']/parent::*/XCUIElementTypeStaticText[" + str(i) + "]" + LogOut = driver.find_element_by_xpath(expressWifiOutputMsg) + ExpressWifiLogMsg.append(LogOut.text) + print("----" + LogOut.text + "\n") + # print("ExpressWifiLog: ", ExpressWifiLogMsg) + + except NoSuchElementException: + print("Exception Verify Results") + + try: + print("ExpressWifi Verify Test Complete Msg") + report.step_start("ExpressWifi Verify Test Complete Msg") + ExpressWifiRunTests = driver.find_element_by_xpath("//*[contains (@label,'test completed successfully')]") + # closeApp(connData["bundleId-iOS-Settings"], setup_perfectoMobile) + return True + + except Exception: + # closeApp(connData["bundleId-iOS-Settings"], setup_perfectoMobile) + print(" !! ExpressWifi Failure Test Complete Msg") + return False + + # 2)Settings to Logout + + +# try: +# print("Express Wifi Home Page Verification") +## report.step_start("Express Wifi Home Page Verification") +# WifiDissconnected = driver.find_element_by_xpath("//XCUIElementTypeImage[@label='settings']") + +# except NoSuchElementException: +# print("Exception Express Wifi Home Page Verification") + +# 3) +# Logout button +# //*[@label="Log Out"] + +# 4) Confirm Logout +# //*[@label="Log Out All Devices"] + + +# To disconnect and forget network def wifi_disconnect_and_forget(request, WifiName, WifiPass, setup_perfectoMobile, connData): print("\n-------------------------------------") - print("Select Wifi/AccessPoint Connection") + print("Wifi Disconnect and Forget Connection") print("-------------------------------------") reportFlag = True @@ -1475,10 +1611,10 @@ def wifi_disconnect_and_forget(request, WifiName, WifiPass, setup_perfectoMobile closeApp(connData["bundleId-iOS-Settings"], setup_perfectoMobile) -#To get an IP address -def get_ip_address_eap_ios(request, WifiName ,User, ttls_passwd, setup_perfectoMobile, connData): +# To get an IP address +def get_ip_address_eap_ios(request, WifiName, User, ttls_passwd, setup_perfectoMobile, connData): print("\n-------------------------------------") - print("Select Wifi/AccessPoint Connection") + print("Get IP Address Enterprise IOS Connection") print("-------------------------------------") reportFlag = True @@ -1498,7 +1634,6 @@ def get_ip_address_eap_ios(request, WifiName ,User, ttls_passwd, setup_perfectoM # Open Settings Application openApp(connData["bundleId-iOS-Settings"], setup_perfectoMobile) - try: time.sleep(2) driver.implicitly_wait(2) @@ -1535,11 +1670,12 @@ def get_ip_address_eap_ios(request, WifiName ,User, ttls_passwd, setup_perfectoM break else: try: - get_wifi_switch_element = driver.find_element_by_xpath("//*[@label='Wi-Fi' and @value='0']") + get_wifi_switch_element = driver.find_element_by_xpath( + "//*[@label='Wi-Fi' and @value='0']") get_wifi_switch_element_text = get_wifi_switch_element.text except: print("WIFi switch is ON") - if(get_wifi_switch_element_text == "0" or get_wifi_switch_element_text == 0): + if (get_wifi_switch_element_text == "0" or get_wifi_switch_element_text == 0): print("switch is still OFF") closeApp(connData["bundleId-iOS-Settings"], setup_perfectoMobile) return ip_address_element_text, is_internet @@ -1583,7 +1719,6 @@ def get_ip_address_eap_ios(request, WifiName ,User, ttls_passwd, setup_perfectoM except: print("No connected SSID") - # ---------------------This is to Forget current connected SSID------------------------------- # ---------------------To get all available SSID------------------------------- @@ -1630,8 +1765,8 @@ def get_ip_address_eap_ios(request, WifiName ,User, ttls_passwd, setup_perfectoM closeApp(connData["bundleId-iOS-Settings"], setup_perfectoMobile) return ip_address_element_text, is_internet # ---------------------This is to Select SSID------------------------------- - # Set username - # ------------------------------------------------------- + # Set username + # ------------------------------------------------------- try: driver.implicitly_wait(5) report.step_start("Entering User") @@ -1652,7 +1787,7 @@ def get_ip_address_eap_ios(request, WifiName ,User, ttls_passwd, setup_perfectoM except NoSuchElementException: print("Enter Password Page Not Loaded") # ---------------------Set Password------------------------------- - # ------------------------------------------------------- + # ------------------------------------------------------- # ---------------------Click on join------------------------------- try: @@ -1664,8 +1799,8 @@ def get_ip_address_eap_ios(request, WifiName ,User, ttls_passwd, setup_perfectoM except Exception as e: print("Join Button Not Enabled...Password may not be needed") # ---------------------Click on join------------------------------- - # Selecting certificate - # ------------------------------------------------------- + # Selecting certificate + # ------------------------------------------------------- try: driver.implicitly_wait(3) report.step_start("Clicking Trust CA Cert") @@ -1690,11 +1825,11 @@ def get_ip_address_eap_ios(request, WifiName ,User, ttls_passwd, setup_perfectoM # ---------------------Additional INFO------------------------------- try: driver.implicitly_wait(5) - print("Selecting SSID: ",WifiName) + print("Selecting SSID: ", WifiName) report.step_start("Selecting SSID") - additional_details_element = WebDriverWait(driver, 35).until( + additional_details_element = WebDriverWait(driver, 35).until( EC.presence_of_element_located((MobileBy.XPATH, - "//*[@label='"+ WifiName+"']"))) + "//*[@label='" + WifiName + "']"))) # //*[@label='selected']/parent::*/parent::*/XCUIElementTypeButton[@label='More Info'] additional_details_element.click() @@ -1704,13 +1839,13 @@ def get_ip_address_eap_ios(request, WifiName ,User, ttls_passwd, setup_perfectoM report.step_start("Checking IP address") time.sleep(4) # (//*[@label="IP Address"]/parent::*/XCUIElementTypeStaticText)[2] - ip_address_element_text = driver.find_element_by_xpath("(//*[@label='IP Address']/parent::*/XCUIElementTypeStaticText)[2]").text + ip_address_element_text = driver.find_element_by_xpath( + "(//*[@label='IP Address']/parent::*/XCUIElementTypeStaticText)[2]").text print("ip_address_element_text: ", ip_address_element_text) except Exception as e: print("IP Address not Found") request.config.cache.set(key="select IP failed", value=str(e)) - try: time.sleep(2) driver.implicitly_wait(2) @@ -1778,9 +1913,10 @@ def get_ip_address_eap_ios(request, WifiName ,User, ttls_passwd, setup_perfectoM return ip_address_element_text, is_internet # ---------------------close app------------------------------- + def wifi_connect_eap(request, WifiName, User, ttls_passwd, setup_perfectoMobile, connData): print("\n-------------------------------------") - print("Select Wifi/AccessPoint Connection") + print("Wifi Connect Enterprise Connection") print("-------------------------------------") reportFlag = True @@ -1987,8 +2123,266 @@ def wifi_connect_eap(request, WifiName, User, ttls_passwd, setup_perfectoMobile, # time.sleep(3) # ---------------------check if internet------------------------------- - # --------------------- close app------------------------------- closeApp(connData["bundleId-iOS-Settings"], setup_perfectoMobile) return is_internet + # ---------------------close app------------------------------- + +#Captive Portal +def captive_portal_ios(request, WifiName, WifiPass, setup_perfectoMobile, connData): + print("\n-------------------------------------") + print("CaptivePortal Connection IOS") + print("-------------------------------------") + + reportFlag = True + is_internet = False + ip_address_element_text = False + + print("Verifying Wifi/AP Connection Details....") + report = setup_perfectoMobile[1] + driver = setup_perfectoMobile[0] + + report.step_start("Switching Driver Context") + print("Switching Context to Native") + driver.switch_to.context('NATIVE_APP') + # driver.switch_to.context(contexts[0]) + + report.step_start("Set Wifi Network to " + WifiName) + # Open Settings Application + openApp(connData["bundleId-iOS-Settings"], setup_perfectoMobile) + + try: + time.sleep(2) + driver.implicitly_wait(2) + try: + print("Verifying Connected Wifi Connection") + report.step_start("Loading Wifi Page") + element = driver.find_element_by_xpath("//XCUIElementTypeCell[@name='Wi-Fi']") + element.click() + except NoSuchElementException: + print("Exception: Verify Xpath - unable to click on Wifi") + + time.sleep(2) + driver.implicitly_wait(2) + # --------------------To Turn on WIFi Switch if already OFF-------------------------------- + try: + get_wifi_switch_element = driver.find_element_by_xpath("//*[@label='Wi-Fi' and @value='0']") + get_wifi_switch_element_text = get_wifi_switch_element.text + try: + if get_wifi_switch_element_text == "0" or get_wifi_switch_element_text == 0: + get_wifi_switch_element = driver.find_element_by_xpath("//*[@label='Wi-Fi' and @value='0']") + driver.implicitly_wait(1) + get_wifi_switch_element.click() + driver.implicitly_wait(1) + i = 0 + for i in range(5): + try: + get_wifi_switch_element = driver.find_element_by_xpath("//*[@label='Wi-Fi' and @value='1']") + get_wifi_switch_element_text = get_wifi_switch_element.text + except: + print("switch is OFF") + + if get_wifi_switch_element_text == "1" or get_wifi_switch_element_text == 1: + print("WIFI Switch is ON") + break + else: + try: + get_wifi_switch_element = driver.find_element_by_xpath( + "//*[@label='Wi-Fi' and @value='0']") + get_wifi_switch_element_text = get_wifi_switch_element.text + except: + print("WIFi switch is ON") + if (get_wifi_switch_element_text == "0" or get_wifi_switch_element_text == 0): + print("switch is still OFF") + closeApp(connData["bundleId-iOS-Settings"], setup_perfectoMobile) + #return is_internet + else: + print("Switch is Still OFF") + closeApp(connData["bundleId-iOS-Settings"], setup_perfectoMobile) + #return is_internet + except: + print("No switch element found") + except: + print("get_wifi_switch_element is ON") + # --------------------To Turn on WIFi Switch if already OFF-------------------------------- + + except: + print("Cannot find WIFI element") + closeApp(connData["bundleId-iOS-Settings"], setup_perfectoMobile) + #return is_internet + + # ---------------------This is to Forget current connected SSID------------------------------- + + try: + print("getting in to Additional details") + additional_details_element = driver.find_element_by_xpath( + "//*[@label='selected']/parent::*/parent::*/XCUIElementTypeButton[@label='More Info']") + additional_details_element.click() + try: + print("Forget Connected Network") + forget_ssid = driver.find_element_by_xpath("//*[@label='Forget This Network']") + forget_ssid.click() + print("Forget old ssid") + try: + report.step_start("Forget SSID popup1") + forget_ssid_popup = driver.find_element_by_xpath("//*[@label='Forget']") + forget_ssid_popup.click() + + print("**alert** Forget SSID popup killed **alert**") + except: + print("Forget SSID popup not found") + except: + print("couldn't find forget ssid element") + except: + print("No connected SSID") + + # ---------------------This is to Forget current connected SSID------------------------------- + + # ---------------------To get all available SSID------------------------------- + print("Searching for Wifi: " + WifiName) + # allure.attach(name= body=str("Searching for Wifi: " + WifiName)) + time.sleep(2) + print("Selecting Wifi: " + WifiName) + ssid_found = False + available_ssids = False + + try: + for check_for_all_ssids in range(2): + available_ssids = get_all_available_ssids(driver) + try: + if WifiName not in available_ssids: + scrollDown(setup_perfectoMobile) + time.sleep(2) + else: + ssid_found = True + print(WifiName + " : Found in Device") + # allure.attach(name= body=str(WifiName + " : Found in Device")) + break + except: + pass + + if not ssid_found: + print("could not found " + WifiName + " in device") + closeApp(connData["bundleId-iOS-Settings"], setup_perfectoMobile) + return is_internet + except: + pass + # ---------------------To get all available SSID------------------------------- + + # ---------------------This is to Select SSID------------------------------- + try: + wifiSelectionElement = WebDriverWait(driver, 30).until( + EC.presence_of_element_located((MobileBy.XPATH, "//*[@label='" + WifiName + "']"))) + wifiSelectionElement.click() + print("Selecting SSID") + except Exception as e: + print("couldn't connect to " + WifiName) + request.config.cache.set(key="SelectingWifiFailed", value=str(e)) + closeApp(connData["bundleId-iOS-Settings"], setup_perfectoMobile) + return is_internet + # ---------------------This is to Select SSID------------------------------- + + # ---------------------Set Password------------------------------- + try: + wifiPassword = driver.find_element_by_xpath("//*[@label='Password']") + wifiPassword.send_keys(WifiPass) + except NoSuchElementException: + print("Enter Password Page Not Loaded") + # ---------------------Set Password------------------------------- + + # ---------------------Click on join------------------------------- + try: + joinBTN = driver.find_element_by_xpath("//*[@label='Join']") + joinBTN.click() + except Exception as e: + print("Join Button Not Enabled...Password may not be needed") + # ---------------------Click on join------------------------------- + + try: + time.sleep(4) + driver.implicitly_wait(4) + try: + time.sleep(8) + driver.implicitly_wait(2) + print("Acceptiong terms and Services") + report.step_start("loading Terms Page") + element = driver.find_element_by_xpath("//*[@label='Accept Terms of Service']") + element.click() + except NoSuchElementException: + print("Exception: Accept Terms of Service Button Not Found") + reportFlag = False + assert reportFlag + try: + time.sleep(2) + driver.implicitly_wait(2) + print("Continue to connect the services") + report.step_start("Continiue Terms and Services Page") + element = driver.find_element_by_xpath("//*[@label='Continue']") + element.click() + except NoSuchElementException: + print("Exception: Continue to connect Terms of Service Button Not Found") + try: + time.sleep(2) + driver.implicitly_wait(2) + print("Continue to the services") + report.step_start("Continue to use captive portal services") + element = driver.find_element_by_xpath("//*[@label='Continue']") + element.click() + except NoSuchElementException: + print("Exception: Continue to use captive portal services not found") + try: + time.sleep(2) + driver.implicitly_wait(2) + print("Final Result Page") + report.step_start("Final Confirmation Page for Captive Portal Login") + time.sleep(2) + driver.implicitly_wait(2) + element = driver.find_element_by_xpath("//*[@label='Done']") + element.click() + # if element == driver.find_element_by_xpath("//XCUIElementTypeOther[@label='Success']"): + # element1 = driver.find_element_by_xpath("//*[@label='Done']") + # element1.click() + # else: + # print("Failed to log in to captive portal") + except NoSuchElementException: + print("Exception: final Page for Captive Portal Not Found") + + + except NoSuchElementException: + print("No Splash Page Found") + + +# ---------------------Additional INFO------------------------------- + try: + time.sleep(4) + print("Selecting SSID: ",WifiName) + report.step_start("Selecting SSID") + additional_details_element = WebDriverWait(driver, 30).until( + EC.presence_of_element_located((MobileBy.XPATH, + "//*[@label='"+ WifiName+"']"))) + # //*[@label='selected']/parent::*/parent::*/XCUIElementTypeButton[@label='More Info'] + additional_details_element.click() + + try: + print("Checking IP address") + # (//*[@label="IP Address"]/parent::*/XCUIElementTypeStaticText)[2] + ip_address_element_text = driver.find_element_by_xpath("(//*[@label='IP Address']/parent::*/XCUIElementTypeStaticText)[2]").text + print("ip_address_element_text: ", ip_address_element_text) + # is_internet=True + except Exception as e: + print("IP Address not Found") + request.config.cache.set(key="select IP failed", value=str(e)) + try: + WifiInternetErrMsg2 = WebDriverWait(driver, 30).until( + EC.presence_of_element_located((MobileBy.XPATH, "//*[@label='No Internet Connection']"))) + except Exception as e: + is_internet = True + print("No Wifi-AP Error Internet Error: " + WifiName) + except Exception as e: + request.config.cache.set(key="select additional info failed", value=str(e)) + # ---------------------Additional INFO------------------------------- + + # --------------------- close app------------------------------- + #closeApp(connData["bundleId-iOS-Settings"], setup_perfectoMobile) + return ip_address_element_text, is_internet diff --git a/requirements.txt b/requirements.txt index 5d016dd98..b8b8e34fa 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ allure-pytest -Appium-Python-Client +Appium-Python-Client==1.2.0 bs4 influxdb influxdb-client diff --git a/tests/conftest.py b/tests/conftest.py index 31e663f25..db23806db 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -42,7 +42,6 @@ from LANforge.LFUtils import * if 'py-json' not in sys.path: sys.path.append('../py-scripts') from apnos.apnos import APNOS -from controller.controller_1x.controller import Controller from controller.controller_1x.controller import FirmwareUtility import pytest from lanforge.lf_tests import RunTest @@ -50,11 +49,10 @@ from cv_test_manager import cv_test from configuration import CONFIGURATION from configuration import RADIUS_SERVER_DATA from configuration import RADIUS_ACCOUNTING_DATA - +from lanforge.scp_util import SCP_File from testrails.testrail_api import APIClient from testrails.reporting import Reporting from lf_tools import ChamberView -from sta_connect2 import StaConnect2 from os import path from typing import Any, Callable, Optional @@ -266,6 +264,11 @@ def get_sdk_version(fixtures_ver): version = fixtures_ver.get_sdk_version() yield version +@pytest.fixture(scope="session") +def get_uci_show(fixtures_ver, get_apnos, get_configuration): + uci_show = fixtures_ver.get_uci_show(get_apnos, get_configuration) + yield uci_show + @pytest.fixture(scope="session") def skip_lf(request): @@ -524,6 +527,12 @@ def test_access_point(fixtures_ver, request, get_configuration, get_apnos): yield status +@pytest.fixture(scope="session") +def test_ap_connection_status(fixtures_ver, request, get_configuration, get_apnos): + """used to check the manager status of AP, should be used as a setup to verify if ap can reach cloud""" + connection, redirector_value = fixtures_ver.get_ap_status_logs(get_configuration, get_apnos) + yield connection, redirector_value + @pytest.fixture(scope="session") def traffic_generator_connectivity(testbed, get_configuration): """Verify if traffic generator is reachable""" @@ -679,3 +688,25 @@ def get_ap_logs(request, get_apnos, get_configuration): pass request.addfinalizer(collect_logs) + + +@pytest.fixture(scope="function") +def get_lf_logs(request, get_apnos, get_configuration): + ip = get_configuration["traffic_generator"]["details"]["ip"] + port = get_configuration["traffic_generator"]["details"]["ssh_port"] + + def collect_logs_lf(): + log_0 = "/home/lanforge/lanforge_log_0.txt" + log_1 = "/home/lanforge/lanforge_log_1.txt" + obj = SCP_File(ip=ip, port=port, username="root", password="lanforge", remote_path=log_0, + local_path=".") + obj.pull_file() + allure.attach.file(source="lanforge_log_0.txt", + name="lanforge_log_0") + obj = SCP_File(ip=ip, port=port, username="root", password="lanforge", remote_path=log_1, + local_path=".") + obj.pull_file() + allure.attach.file(source="lanforge_log_1.txt", + name="lanforge_log_1") + + request.addfinalizer(collect_logs_lf) diff --git a/tests/e2e/advanced/receiver_sensitivity/test_bridge_rxsensitivity.py b/tests/e2e/advanced/receiver_sensitivity/test_bridge_rxsensitivity.py new file mode 100644 index 000000000..4b9a0698d --- /dev/null +++ b/tests/e2e/advanced/receiver_sensitivity/test_bridge_rxsensitivity.py @@ -0,0 +1,125 @@ +""" + + Performance Test: Receiver Sensitivity Test: bridge Mode + pytest -m "rxsensitivity and bridge" + +""" +import os +import pytest +import allure + +pytestmark = [pytest.mark.advance, pytest.mark.rxsensitivity, pytest.mark.bridge] + +setup_params_general = { + "mode": "BRIDGE", + "ssid_modes": { + "wpa2_personal": [ + {"ssid_name": "ssid_wpa2_2g", "appliedRadios": ["2G"], "security_key": "something"}, + {"ssid_name": "ssid_wpa2_5g", "appliedRadios": ["5G"], "security_key": "something"} + ] + }, + "rf": {}, + "radius": False +} + +@allure.feature("BRIDGE MODE RECEIVER SENSITIVITY TEST") +@pytest.mark.parametrize( + 'setup_profiles', + [setup_params_general], + indirect=True, + scope="class" +) +@pytest.mark.usefixtures("setup_profiles") +class TestRxSensitivityBridge(object): + + + @allure.testcase(url="https://telecominfraproject.atlassian.net/browse/WIFI-2445", name="WIFI-2445") + @pytest.mark.wpa2_personal + @pytest.mark.fiveg + @pytest.mark.all_mcs + def test_client_wpa2_personal_bridge_all_mcs_5g(self, lf_test, lf_tools, station_names_fiveg, create_lanforge_chamberview_dut, + get_configuration): + """ + Receiver Sensitivity Bridge Mode + """ + profile_data = setup_params_general["ssid_modes"]["wpa2_personal"][1] + ssid_name = profile_data["ssid_name"] + security_key = profile_data["security_key"] + security = "wpa2" + mode = "BRIDGE" + band = "fiveg" + vlan = 1 + dut_name = create_lanforge_chamberview_dut + ser_no = lf_test.attenuator_serial() + print(ser_no) + raw_lines = [['txo_preamble: VHT'], + ['txo_mcs: 0 CCK, OFDM, HT, VHT;1 CCK, OFDM, HT, VHT;2 CCK, OFDM, HT, VHT;3 CCK, OFDM, HT, VHT;' + '4 OFDM, HT, VHT;5 OFDM, HT, VHT;6 OFDM, HT, VHT;7 OFDM, HT, VHT;8 VHT;9 VHT'], + ['spatial_streams: 2'], ['bandw_options: 80'], ['txo_sgi: OFF'], + ['txo_retries: No Retry'], ['attenuator: ' + str(ser_no[0])], ['attenuator2: ' + str(ser_no[1])], + ['attenuations: 0..+50..800'], ['attenuations2: 0..+50..800'], + ["show_3s: 1"], ['txo_txpower: 17'], + ["show_ll_graphs: 1"], ["show_log: 1"]] + + station = lf_test.Client_Connect(ssid=ssid_name, security=security, + passkey=security_key, mode=mode, band=band, + station_name=station_names_fiveg, vlan_id=vlan) + + if station: + obj = lf_test.rx_sensitivity(station_name=station_names_fiveg, mode=mode, + instance_name="RECEIVER_SENSITIVITY_BRIDGE_5G", + vlan_id=vlan, dut_name=dut_name, raw_lines=raw_lines) + report_name = obj.report_name[0]['LAST']["response"].split(":::")[1].split("/")[-1] + entries = os.listdir("../reports/" + report_name + '/') + lf_tools.attach_report_graphs(report_name=report_name, pdf_name="Receiver sensitivity test") + print("Test Completed... Cleaning up Stations") + lf_test.Client_disconnect(station_name=station_names_fiveg) + assert station + else: + assert False + + @allure.testcase(url="https://telecominfraproject.atlassian.net/browse/WIFI-2445", name="WIFI-2445") + @pytest.mark.wpa2_personal + @pytest.mark.twog + @pytest.mark.all_mcs + def test_client_wpa2_personal_bridge_all_mcs_2g(self, lf_test, lf_tools, station_names_twog, + create_lanforge_chamberview_dut, + get_configuration): + """ + Receiver Sensitivity Bridge Mode + """ + profile_data = setup_params_general["ssid_modes"]["wpa2_personal"][0] + ssid_name = profile_data["ssid_name"] + security_key = profile_data["security_key"] + security = "wpa2" + mode = "BRIDGE" + band = "twog" + vlan = 1 + dut_name = create_lanforge_chamberview_dut + ser_no = lf_test.attenuator_serial() + print(ser_no) + raw_lines = [['txo_preamble: VHT'], + ['txo_mcs: 0 CCK, OFDM, HT, VHT;1 CCK, OFDM, HT, VHT;2 CCK, OFDM, HT, VHT;3 CCK, OFDM, HT, VHT;' + '4 OFDM, HT, VHT;5 OFDM, HT, VHT;6 OFDM, HT, VHT;7 OFDM, HT, VHT;8 VHT;9 VHT'], + ['spatial_streams: 2'], ['bandw_options: 80'], ['txo_sgi: OFF'], + ['txo_retries: No Retry'], ['attenuator: ' + str(ser_no[0])], ['attenuator2: ' + str(ser_no[1])], + ['attenuations: 0..+50..800'], ['attenuations2: 0..+50..800'], + ["show_3s: 1"], ['txo_txpower: 17'], + ["show_ll_graphs: 1"], ["show_log: 1"]] + + station = lf_test.Client_Connect(ssid=ssid_name, security=security, + passkey=security_key, mode=mode, band=band, + station_name=station_names_twog, vlan_id=vlan) + + if station: + obj = lf_test.rx_sensitivity(station_name=station_names_twog, mode=mode, + instance_name="RECEIVER_SENSITIVITY_BRIDGE_2G", + vlan_id=vlan, dut_name=dut_name, raw_lines=raw_lines) + report_name = obj.report_name[0]['LAST']["response"].split(":::")[1].split("/")[-1] + entries = os.listdir("../reports/" + report_name + '/') + lf_tools.attach_report_graphs(report_name=report_name, pdf_name="Receiver sensitivity test") + print("Test Completed... Cleaning up Stations") + lf_test.Client_disconnect(station_name=station_names_twog) + assert station + else: + assert False diff --git a/tests/e2e/advanced/spatial_consistency/wpa2_personal/test_bridge_spatial.py b/tests/e2e/advanced/spatial_consistency/wpa2_personal/test_bridge_spatial.py index 24df45c83..79570f496 100644 --- a/tests/e2e/advanced/spatial_consistency/wpa2_personal/test_bridge_spatial.py +++ b/tests/e2e/advanced/spatial_consistency/wpa2_personal/test_bridge_spatial.py @@ -72,17 +72,14 @@ class Test_SpatialConsistency_Bridge(object): kpi_val = lf_tools.read_kpi_file(column_name=["numeric-score"], dir_name=report_name) print(type(kpi_val)) - print(str(kpi_val)) - val = kpi_val.split(" ") - print(val) - #print(type(val)) - print(val[5]) + print(kpi_val) + print(str(kpi_val[0])[1:-1]) if str(kpi_val) == "empty": print("kpi is empty, station did not got ip, Test failed") allure.attach(name="Kpi Data", body="station did not got ip Test failed.") assert False else: - if float(val[5]) > float(60): + if float(str(kpi_val[0])[1:-1]) > float(60): print("Test passed successfully") allure.attach(name="Kpi Data", body=str(kpi_val)) assert True @@ -141,17 +138,14 @@ class Test_SpatialConsistency_Bridge(object): kpi_val = lf_tools.read_kpi_file(column_name=["numeric-score"], dir_name=report_name) print(type(kpi_val)) - print(str(kpi_val)) - val = kpi_val.split(" ") - print(val) - # print(type(val)) - print(val[5]) + print(kpi_val) + print(str(kpi_val[0])[1:-1]) if str(kpi_val) == "empty": print("kpi is empty, station did not got ip, Test failed") allure.attach(name="Kpi Data", body="station did not got ip Test failed.") assert False else: - if float(val[5]) > float(90): + if float(str(kpi_val[0])[1:-1]) > float(90): print("Test passed successfully") allure.attach(name="Kpi Data", body=str(kpi_val)) assert True @@ -210,17 +204,14 @@ class Test_SpatialConsistency_Bridge(object): kpi_val = lf_tools.read_kpi_file(column_name=["numeric-score"], dir_name=report_name) print(type(kpi_val)) - print(str(kpi_val)) - val = kpi_val.split(" ") - print(val) - # print(type(val)) - print(val[5]) + print(kpi_val) + print(str(kpi_val[0])[1:-1]) if str(kpi_val) == "empty": print("kpi is empty, station did not got ip, Test failed") allure.attach(name="Kpi Data", body="station did not got ip Test failed.") assert False else: - if float(val[5]) > float(45): + if float(str(kpi_val[0])[1:-1]) > float(45): print("Test passed successfully") allure.attach(name="Kpi Data", body=str(kpi_val)) assert True @@ -279,17 +270,14 @@ class Test_SpatialConsistency_Bridge(object): kpi_val = lf_tools.read_kpi_file(column_name=["numeric-score"], dir_name=report_name) print(type(kpi_val)) - print(str(kpi_val)) - val = kpi_val.split(" ") - print(val) - # print(type(val)) - print(val[5]) + print(kpi_val) + print(str(kpi_val[0])[1:-1]) if str(kpi_val) == "empty": print("kpi is empty, station did not got ip, Test failed") allure.attach(name="Kpi Data", body="station did not got ip Test failed.") assert False else: - if float(val[5]) > float(90): + if float(str(kpi_val[0])[1:-1]) > float(90): print("Test passed successfully") allure.attach(name="Kpi Data", body=str(kpi_val)) assert True @@ -348,17 +336,14 @@ class Test_SpatialConsistency_Bridge(object): kpi_val = lf_tools.read_kpi_file(column_name=["numeric-score"], dir_name=report_name) print(type(kpi_val)) - print(str(kpi_val)) - val = kpi_val.split(" ") - print(val) - # print(type(val)) - print(val[5]) + print(kpi_val) + print(str(kpi_val[0])[1:-1]) if str(kpi_val) == "empty": print("kpi is empty, station did not got ip, Test failed") allure.attach(name="Kpi Data", body="station did not got ip Test failed.") assert False else: - if float(val[5]) > float(250): + if float(str(kpi_val[0])[1:-1]) > float(250): print("Test passed successfully") allure.attach(name="Kpi Data", body=str(kpi_val)) assert True @@ -417,17 +402,14 @@ class Test_SpatialConsistency_Bridge(object): kpi_val = lf_tools.read_kpi_file(column_name=["numeric-score"], dir_name=report_name) print(type(kpi_val)) - print(str(kpi_val)) - val = kpi_val.split(" ") - print(val) - # print(type(val)) - print(val[5]) + print(kpi_val) + print(str(kpi_val[0])[1:-1]) if str(kpi_val) == "empty": print("kpi is empty, station did not got ip, Test failed") allure.attach(name="Kpi Data", body="station did not got ip Test failed.") assert False else: - if float(val[5]) > float(500): + if float(str(kpi_val[0])[1:-1]) > float(500): print("Test passed successfully") allure.attach(name="Kpi Data", body=str(kpi_val)) assert True @@ -486,17 +468,14 @@ class Test_SpatialConsistency_Bridge(object): kpi_val = lf_tools.read_kpi_file(column_name=["numeric-score"], dir_name=report_name) print(type(kpi_val)) - print(str(kpi_val)) - val = kpi_val.split(" ") - print(val) - # print(type(val)) - print(val[5]) + print(kpi_val) + print(str(kpi_val[0])[1:-1]) if str(kpi_val) == "empty": print("kpi is empty, station did not got ip, Test failed") allure.attach(name="Kpi Data", body="station did not got ip Test failed.") assert False else: - if float(val[5]) > float(250): + if float(str(kpi_val[0])[1:-1]) > float(250): print("Test passed successfully") allure.attach(name="Kpi Data", body=str(kpi_val)) assert True @@ -555,17 +534,14 @@ class Test_SpatialConsistency_Bridge(object): kpi_val = lf_tools.read_kpi_file(column_name=["numeric-score"], dir_name=report_name) print(type(kpi_val)) - print(str(kpi_val)) - val = kpi_val.split(" ") - print(val) - # print(type(val)) - print(val[5]) + print(kpi_val) + print(str(kpi_val[0])[1:-1]) if str(kpi_val) == "empty": print("kpi is empty, station did not got ip, Test failed") allure.attach(name="Kpi Data", body="station did not got ip Test failed.") assert False else: - if float(val[5]) > float(500): + if float(str(kpi_val[0])[1:-1]) > float(500): print("Test passed successfully") allure.attach(name="Kpi Data", body=str(kpi_val)) assert True @@ -624,17 +600,14 @@ class Test_SpatialConsistency_Bridge(object): kpi_val = lf_tools.read_kpi_file(column_name=["numeric-score"], dir_name=report_name) print(type(kpi_val)) - print(str(kpi_val)) - val = kpi_val.split(" ") - print(val) - # print(type(val)) - print(val[5]) + print(kpi_val) + print(str(kpi_val[0])[1:-1]) if str(kpi_val) == "empty": print("kpi is empty, station did not got ip, Test failed") allure.attach(name="Kpi Data", body="station did not got ip Test failed.") assert False else: - if float(val[5]) > float(45): + if float(str(kpi_val[0])[1:-1]) > float(45): print("Test passed successfully") allure.attach(name="Kpi Data", body=str(kpi_val)) assert True @@ -693,17 +666,14 @@ class Test_SpatialConsistency_Bridge(object): kpi_val = lf_tools.read_kpi_file(column_name=["numeric-score"], dir_name=report_name) print(type(kpi_val)) - print(str(kpi_val)) - val = kpi_val.split(" ") - print(val) - # print(type(val)) - print(val[5]) + print(kpi_val) + print(str(kpi_val[0])[1:-1]) if str(kpi_val) == "empty": print("kpi is empty, station did not got ip, Test failed") allure.attach(name="Kpi Data", body="station did not got ip Test failed.") assert False else: - if float(val[5]) > float(90): + if float(str(kpi_val[0])[1:-1]) > float(90): print("Test passed successfully") allure.attach(name="Kpi Data", body=str(kpi_val)) assert True @@ -762,17 +732,14 @@ class Test_SpatialConsistency_Bridge(object): kpi_val = lf_tools.read_kpi_file(column_name=["numeric-score"], dir_name=report_name) print(type(kpi_val)) - print(str(kpi_val)) - val = kpi_val.split(" ") - print(val) - # print(type(val)) - print(val[5]) + print(kpi_val) + print(str(kpi_val[0])[1:-1]) if str(kpi_val) == "empty": print("kpi is empty, station did not got ip, Test failed") allure.attach(name="Kpi Data", body="station did not got ip Test failed.") assert False else: - if float(val[5]) > float(45): + if float(str(kpi_val[0])[1:-1]) > float(45): print("Test passed successfully") allure.attach(name="Kpi Data", body=str(kpi_val)) assert True @@ -831,17 +798,14 @@ class Test_SpatialConsistency_Bridge(object): kpi_val = lf_tools.read_kpi_file(column_name=["numeric-score"], dir_name=report_name) print(type(kpi_val)) - print(str(kpi_val)) - val = kpi_val.split(" ") - print(val) - # print(type(val)) - print(val[5]) + print(kpi_val) + print(str(kpi_val[0])[1:-1]) if str(kpi_val) == "empty": print("kpi is empty, station did not got ip, Test failed") allure.attach(name="Kpi Data", body="station did not got ip Test failed.") assert False else: - if float(val[5]) > float(90): + if float(str(kpi_val[0])[1:-1]) > float(90): print("Test passed successfully") allure.attach(name="Kpi Data", body=str(kpi_val)) assert True @@ -900,17 +864,14 @@ class Test_SpatialConsistency_Bridge(object): kpi_val = lf_tools.read_kpi_file(column_name=["numeric-score"], dir_name=report_name) print(type(kpi_val)) - print(str(kpi_val)) - val = kpi_val.split(" ") - print(val) - # print(type(val)) - print(val[5]) + print(kpi_val) + print(str(kpi_val[0])[1:-1]) if str(kpi_val) == "empty": print("kpi is empty, station did not got ip, Test failed") allure.attach(name="Kpi Data", body="station did not got ip Test failed.") assert False else: - if float(val[5]) > float(250): + if float(str(kpi_val[0])[1:-1]) > float(250): print("Test passed successfully") allure.attach(name="Kpi Data", body=str(kpi_val)) assert True @@ -969,17 +930,14 @@ class Test_SpatialConsistency_Bridge(object): kpi_val = lf_tools.read_kpi_file(column_name=["numeric-score"], dir_name=report_name) print(type(kpi_val)) - print(str(kpi_val)) - val = kpi_val.split(" ") - print(val) - # print(type(val)) - print(val[5]) + print(kpi_val) + print(str(kpi_val[0])[1:-1]) if str(kpi_val) == "empty": print("kpi is empty, station did not got ip, Test failed") allure.attach(name="Kpi Data", body="station did not got ip Test failed.") assert False else: - if float(val[5]) > float(500): + if float(str(kpi_val[0])[1:-1]) > float(500): print("Test passed successfully") allure.attach(name="Kpi Data", body=str(kpi_val)) assert True @@ -1038,17 +996,14 @@ class Test_SpatialConsistency_Bridge(object): kpi_val = lf_tools.read_kpi_file(column_name=["numeric-score"], dir_name=report_name) print(type(kpi_val)) - print(str(kpi_val)) - val = kpi_val.split(" ") - print(val) - # print(type(val)) - print(val[5]) + print(kpi_val) + print(str(kpi_val[0])[1:-1]) if str(kpi_val) == "empty": print("kpi is empty, station did not got ip, Test failed") allure.attach(name="Kpi Data", body="station did not got ip Test failed.") assert False else: - if float(val[5]) > float(500): + if float(str(kpi_val[0])[1:-1]) > float(500): print("Test passed successfully") allure.attach(name="Kpi Data", body=str(kpi_val)) assert True @@ -1107,17 +1062,14 @@ class Test_SpatialConsistency_Bridge(object): kpi_val = lf_tools.read_kpi_file(column_name=["numeric-score"], dir_name=report_name) print(type(kpi_val)) - print(str(kpi_val)) - val = kpi_val.split(" ") - print(val) - # print(type(val)) - print(val[5]) + print(kpi_val) + print(str(kpi_val[0])[1:-1]) if str(kpi_val) == "empty": print("kpi is empty, station did not got ip, Test failed") allure.attach(name="Kpi Data", body="station did not got ip Test failed.") assert False else: - if float(val[5]) > float(45): + if float(str(kpi_val[0])[1:-1]) > float(45): print("Test passed successfully") allure.attach(name="Kpi Data", body=str(kpi_val)) assert True @@ -1176,17 +1128,14 @@ class Test_SpatialConsistency_Bridge(object): kpi_val = lf_tools.read_kpi_file(column_name=["numeric-score"], dir_name=report_name) print(type(kpi_val)) - print(str(kpi_val)) - val = kpi_val.split(" ") - print(val) - # print(type(val)) - print(val[5]) + print(kpi_val) + print(str(kpi_val[0])[1:-1]) if str(kpi_val) == "empty": print("kpi is empty, station did not got ip, Test failed") allure.attach(name="Kpi Data", body="station did not got ip Test failed.") assert False else: - if float(val[5]) > float(45): + if float(str(kpi_val[0])[1:-1]) > float(45): print("Test passed successfully") allure.attach(name="Kpi Data", body=str(kpi_val)) assert True @@ -1245,17 +1194,14 @@ class Test_SpatialConsistency_Bridge(object): kpi_val = lf_tools.read_kpi_file(column_name=["numeric-score"], dir_name=report_name) print(type(kpi_val)) - print(str(kpi_val)) - val = kpi_val.split(" ") - print(val) - # print(type(val)) - print(val[5]) + print(kpi_val) + print(str(kpi_val[0])[1:-1]) if str(kpi_val) == "empty": print("kpi is empty, station did not got ip, Test failed") allure.attach(name="Kpi Data", body="station did not got ip Test failed.") assert False else: - if float(val[5]) > float(250): + if float(str(kpi_val[0])[1:-1]) > float(250): print("Test passed successfully") allure.attach(name="Kpi Data", body=str(kpi_val)) assert True @@ -1314,17 +1260,14 @@ class Test_SpatialConsistency_Bridge(object): kpi_val = lf_tools.read_kpi_file(column_name=["numeric-score"], dir_name=report_name) print(type(kpi_val)) - print(str(kpi_val)) - val = kpi_val.split(" ") - print(val) - # print(type(val)) - print(val[5]) + print(kpi_val) + print(str(kpi_val[0])[1:-1]) if str(kpi_val) == "empty": print("kpi is empty, station did not got ip, Test failed") allure.attach(name="Kpi Data", body="station did not got ip Test failed.") assert False else: - if float(val[5]) > float(500): + if float(str(kpi_val[0])[1:-1]) > float(500): print("Test passed successfully") allure.attach(name="Kpi Data", body=str(kpi_val)) assert True diff --git a/tests/e2e/basic/conftest.py b/tests/e2e/basic/conftest.py index 369a60b09..8beea193f 100644 --- a/tests/e2e/basic/conftest.py +++ b/tests/e2e/basic/conftest.py @@ -71,6 +71,7 @@ def setup_profiles(request, setup_controller, testbed, get_equipment_ref, fixtur if vlan_list[i] > 4095 or vlan_list[i] < 1: vlan_list.pop(i) if request.param["mode"] == "VLAN": + lf_tools.reset_scenario() lf_tools.add_vlan(vlan_ids=vlan_list) # call this, if 1.x diff --git a/tests/e2e/basic/validation_of_operating_modes/bridge_mode/client_connectivity/test_enterprise_ttls.py b/tests/e2e/basic/validation_of_operating_modes/bridge_mode/client_connectivity/test_enterprise_ttls.py index aac865b2b..6d2683a34 100644 --- a/tests/e2e/basic/validation_of_operating_modes/bridge_mode/client_connectivity/test_enterprise_ttls.py +++ b/tests/e2e/basic/validation_of_operating_modes/bridge_mode/client_connectivity/test_enterprise_ttls.py @@ -46,7 +46,7 @@ class TestBridgeModeEnterpriseTTLSSuiteA(object): @pytest.mark.wpa_enterprise @pytest.mark.twog - def test_wpa_enterprise_2g(self, get_vif_state, get_ap_logs, + def test_wpa_enterprise_2g(self, get_vif_state, get_ap_logs, get_lf_logs, station_names_twog, setup_profiles, lf_test, update_report, test_cases, radius_info, exit_on_fail): """ wpa enterprise 2g @@ -73,7 +73,7 @@ class TestBridgeModeEnterpriseTTLSSuiteA(object): @pytest.mark.wpa_enterprise @pytest.mark.fiveg - def test_wpa_enterprise_5g(self, station_names_fiveg, get_ap_logs, + def test_wpa_enterprise_5g(self, station_names_fiveg, get_ap_logs, get_lf_logs, setup_profiles, lf_test, update_report, test_cases, radius_info, exit_on_fail): """ wpa enterprise 5g @@ -98,7 +98,7 @@ class TestBridgeModeEnterpriseTTLSSuiteA(object): @pytest.mark.sanity_light @pytest.mark.wpa2_enterprise @pytest.mark.twog - def test_wpa2_enterprise_2g(self, get_vif_state, get_ap_logs, + def test_wpa2_enterprise_2g(self, get_vif_state, get_ap_logs, get_lf_logs, station_names_twog, setup_profiles, lf_test, update_report, test_cases, radius_info, exit_on_fail): """ wpa enterprise 2g @@ -126,7 +126,7 @@ class TestBridgeModeEnterpriseTTLSSuiteA(object): @pytest.mark.sanity_light @pytest.mark.wpa2_enterprise @pytest.mark.fiveg - def test_wpa2_enterprise_5g(self, get_vif_state, get_ap_logs, + def test_wpa2_enterprise_5g(self, get_vif_state, get_ap_logs, get_lf_logs, station_names_fiveg, setup_profiles, lf_test, update_report, test_cases, radius_info, exit_on_fail): """ wpa enterprise 2g @@ -154,7 +154,7 @@ class TestBridgeModeEnterpriseTTLSSuiteA(object): @pytest.mark.wpa3_enterprise @pytest.mark.twog - def test_wpa3_enterprise_2g(self, get_vif_state, get_ap_logs, + def test_wpa3_enterprise_2g(self, get_vif_state, get_ap_logs, get_lf_logs, station_names_twog, setup_profiles, lf_test, update_report, test_cases, radius_info, exit_on_fail): """ wpa enterprise 2g @@ -181,7 +181,7 @@ class TestBridgeModeEnterpriseTTLSSuiteA(object): @pytest.mark.wpa3_enterprise @pytest.mark.fiveg - def test_wpa3_enterprise_5g(self, get_vif_state, get_ap_logs, + def test_wpa3_enterprise_5g(self, get_vif_state, get_ap_logs, get_lf_logs, station_names_fiveg, setup_profiles, lf_test, update_report, test_cases, radius_info, exit_on_fail): """ wpa enterprise 2g @@ -239,7 +239,7 @@ class TestBridgeModeEnterpriseTTLSSuiteTwo(object): @pytest.mark.wpa_wpa2_enterprise_mixed @pytest.mark.twog - def test_wpa_wpa2_enterprise_2g(self, get_vif_state, get_ap_logs, + def test_wpa_wpa2_enterprise_2g(self, get_vif_state, get_ap_logs, get_lf_logs, station_names_twog, setup_profiles, lf_test, update_report, test_cases, radius_info, exit_on_fail): """ wpa enterprise 2g @@ -267,7 +267,7 @@ class TestBridgeModeEnterpriseTTLSSuiteTwo(object): @pytest.mark.wpa_wpa2_enterprise_mixed @pytest.mark.fiveg - def test_wpa_wpa2_enterprise_5g(self, get_vif_state, get_ap_logs, + def test_wpa_wpa2_enterprise_5g(self, get_vif_state, get_ap_logs, get_lf_logs, station_names_fiveg, setup_profiles, lf_test, update_report, test_cases, radius_info, exit_on_fail): """ wpa enterprise 2g @@ -295,7 +295,7 @@ class TestBridgeModeEnterpriseTTLSSuiteTwo(object): @pytest.mark.wpa3_enterprise_mixed @pytest.mark.twog - def test_wpa3_enterprise_mixed_2g(self, get_vif_state, get_ap_logs, + def test_wpa3_enterprise_mixed_2g(self, get_vif_state, get_ap_logs, get_lf_logs, station_names_twog, setup_profiles, lf_test, update_report, test_cases, radius_info, exit_on_fail): """ wpa enterprise 2g @@ -322,7 +322,7 @@ class TestBridgeModeEnterpriseTTLSSuiteTwo(object): @pytest.mark.wpa3_enterprise_mixed @pytest.mark.fiveg - def test_wpa3_enterprise_mixed_5g(self, get_vif_state, get_ap_logs, + def test_wpa3_enterprise_mixed_5g(self, get_vif_state, get_ap_logs, get_lf_logs, station_names_fiveg, setup_profiles, lf_test, update_report, exit_on_fail, test_cases, radius_info): diff --git a/tests/e2e/basic/validation_of_operating_modes/bridge_mode/client_connectivity/test_general_security_modes.py b/tests/e2e/basic/validation_of_operating_modes/bridge_mode/client_connectivity/test_general_security_modes.py index b97121a4d..20ac2762c 100644 --- a/tests/e2e/basic/validation_of_operating_modes/bridge_mode/client_connectivity/test_general_security_modes.py +++ b/tests/e2e/basic/validation_of_operating_modes/bridge_mode/client_connectivity/test_general_security_modes.py @@ -50,7 +50,8 @@ class TestBridgeModeConnectivitySuiteA(object): @pytest.mark.open @pytest.mark.twog @allure.testcase(url="https://telecominfraproject.atlassian.net/browse/WIFI-2809", name="JIRA LINK") - def test_open_ssid_2g(self, get_vif_state, get_ap_logs, setup_profiles, lf_test, update_report, + def test_open_ssid_2g(self, get_vif_state, get_ap_logs, get_lf_logs, setup_profiles, lf_test, + update_report, station_names_twog, test_cases): """Client Connectivity open ssid 2.4G @@ -76,7 +77,7 @@ class TestBridgeModeConnectivitySuiteA(object): @pytest.mark.open @pytest.mark.fiveg @allure.testcase(url="https://telecominfraproject.atlassian.net/browse/WIFI-2801", name="JIRA LINK") - def test_open_ssid_5g(self, get_vif_state, get_ap_logs, lf_test, test_cases, station_names_fiveg, + def test_open_ssid_5g(self, get_vif_state, get_ap_logs, lf_test, test_cases, station_names_fiveg, get_lf_logs, update_report): """Client Connectivity open ssid 5G pytest -m "client_connectivity and bridge and general and open and fiveg" @@ -103,7 +104,7 @@ class TestBridgeModeConnectivitySuiteA(object): @pytest.mark.twog @allure.story('wpa 2.4 GHZ Band') @allure.testcase(url="https://telecominfraproject.atlassian.net/browse/WIFI-2801", name="JIRA LINK") - def test_wpa_ssid_2g(self, get_vif_state, get_ap_logs, update_report, + def test_wpa_ssid_2g(self, get_vif_state, get_ap_logs, update_report, get_lf_logs, lf_test, test_cases, station_names_twog): """Client Connectivity wpa ssid 2.4G pytest -m "client_connectivity and bridge and general and wpa and twog" @@ -129,7 +130,8 @@ class TestBridgeModeConnectivitySuiteA(object): @pytest.mark.wpa @pytest.mark.fiveg @allure.story('wpa 5 GHZ Band') - def test_wpa_ssid_5g(self, get_vif_state, get_ap_logs, lf_test, update_report, test_cases, station_names_fiveg): + def test_wpa_ssid_5g(self, get_vif_state, get_ap_logs, lf_test, update_report, get_lf_logs, + test_cases, station_names_fiveg): """Client Connectivity wpa ssid 5G pytest -m "client_connectivity and bridge and general and wpa and fiveg" """ @@ -154,7 +156,8 @@ class TestBridgeModeConnectivitySuiteA(object): @pytest.mark.wpa2_personal @pytest.mark.twog @allure.story('wpa2_personal 2.4 GHZ Band') - def test_wpa2_personal_ssid_2g(self, get_vif_state, get_ap_logs, lf_test, update_report, test_cases, + def test_wpa2_personal_ssid_2g(self, get_vif_state, get_ap_logs, get_lf_logs, + lf_test, update_report, test_cases, station_names_twog): """Client Connectivity wpa2_personal ssid 2.4G pytest -m "client_connectivity and bridge and general and wpa2_personal and twog" @@ -181,7 +184,7 @@ class TestBridgeModeConnectivitySuiteA(object): @pytest.mark.fiveg @allure.story('wpa2_personal 5 GHZ Band') def test_wpa2_personal_ssid_5g(self, get_vif_state, get_ap_logs, update_report, test_cases, - station_names_fiveg, + station_names_fiveg, get_lf_logs, lf_test): """Client Connectivity wpa2_personal ssid 5G pytest -m "client_connectivity and bridge and general and wpa2_personal and fiveg" @@ -270,7 +273,8 @@ class TestBridgeModeConnectivitySuiteTwo(object): @pytest.mark.wpa3_personal @pytest.mark.fiveg @allure.story('open 5 GHZ Band') - def test_wpa3_personal_ssid_5g(self, get_vif_state, get_ap_logs, station_names_fiveg, lf_test, test_cases, + def test_wpa3_personal_ssid_5g(self, get_vif_state, get_ap_logs, station_names_fiveg, + lf_test, test_cases, get_lf_logs, update_report): """Client Connectivity open ssid 2.4G pytest -m "client_connectivity and bridge and general and wpa3_personal and fiveg" @@ -296,7 +300,7 @@ class TestBridgeModeConnectivitySuiteTwo(object): @pytest.mark.twog @allure.story('open 2.4 GHZ Band') def test_wpa3_personal_mixed_ssid_2g(self, get_vif_state, get_ap_logs, station_names_twog, setup_profiles, - lf_test, + lf_test, get_lf_logs, update_report, test_cases): """Client Connectivity open ssid 2.4G @@ -323,7 +327,7 @@ class TestBridgeModeConnectivitySuiteTwo(object): @pytest.mark.fiveg @allure.story('open 5 GHZ Band') def test_wpa3_personal_mixed_ssid_5g(self, get_vif_state, get_ap_logs, station_names_fiveg, lf_test, - test_cases, + test_cases, get_lf_logs, update_report): """Client Connectivity open ssid 2.4G pytest -m "client_connectivity and bridge and general and wpa3_personal_mixed and fiveg" @@ -349,7 +353,7 @@ class TestBridgeModeConnectivitySuiteTwo(object): @pytest.mark.twog @allure.story('wpa wpa2 personal mixed 2.4 GHZ Band') def test_wpa_wpa2_personal_ssid_2g(self, get_vif_state, get_ap_logs, station_names_twog, setup_profiles, - lf_test, + lf_test, get_lf_logs, update_report, test_cases): """Client Connectivity open ssid 2.4G @@ -376,7 +380,8 @@ class TestBridgeModeConnectivitySuiteTwo(object): @pytest.mark.wpa_wpa2_personal_mixed @pytest.mark.fiveg @allure.story('wpa wpa2 personal mixed 5 GHZ Band') - def test_wpa_wpa2_personal_ssid_5g(self, get_vif_state, get_ap_logs, station_names_fiveg, lf_test, test_cases, + def test_wpa_wpa2_personal_ssid_5g(self, get_vif_state, get_ap_logs, station_names_fiveg, get_lf_logs, + lf_test, test_cases, update_report): """Client Connectivity open ssid 2.4G pytest -m "client_connectivity and bridge and general and wpa_wpa2_personal_mixed and fiveg" diff --git a/tests/e2e/basic/validation_of_operating_modes/nat_mode/client_connectivity/test_enterprise_ttls.py b/tests/e2e/basic/validation_of_operating_modes/nat_mode/client_connectivity/test_enterprise_ttls.py index d88ed1823..c5b35b0e2 100644 --- a/tests/e2e/basic/validation_of_operating_modes/nat_mode/client_connectivity/test_enterprise_ttls.py +++ b/tests/e2e/basic/validation_of_operating_modes/nat_mode/client_connectivity/test_enterprise_ttls.py @@ -34,7 +34,7 @@ class TestNATModeEnterpriseTTLSSuiteOne(object): @pytest.mark.wpa_enterprise @pytest.mark.twog - def test_wpa_enterprise_2g(self, get_vif_state, get_ap_logs, + def test_wpa_enterprise_2g(self, get_vif_state, get_ap_logs, get_lf_logs, station_names_twog, setup_profiles, lf_test, update_report, test_cases, radius_info, exit_on_fail): profile_data = setup_params_enterprise["ssid_modes"]["wpa_enterprise"][0] @@ -59,7 +59,7 @@ class TestNATModeEnterpriseTTLSSuiteOne(object): @pytest.mark.wpa_enterprise @pytest.mark.fiveg - def test_wpa_enterprise_5g(self, get_vif_state, get_ap_logs, + def test_wpa_enterprise_5g(self, get_vif_state, get_ap_logs, get_lf_logs, station_names_fiveg, setup_profiles, lf_test, update_report, test_cases, radius_info, exit_on_fail): profile_data = setup_params_enterprise["ssid_modes"]["wpa_enterprise"][1] @@ -85,7 +85,7 @@ class TestNATModeEnterpriseTTLSSuiteOne(object): @pytest.mark.sanity_light @pytest.mark.wpa2_enterprise @pytest.mark.twog - def test_wpa2_enterprise_2g(self, get_vif_state, get_ap_logs, + def test_wpa2_enterprise_2g(self, get_vif_state, get_ap_logs, get_lf_logs, station_names_twog, setup_profiles, lf_test, update_report, test_cases, radius_info, exit_on_fail): profile_data = setup_params_enterprise["ssid_modes"]["wpa2_enterprise"][0] @@ -111,7 +111,7 @@ class TestNATModeEnterpriseTTLSSuiteOne(object): @pytest.mark.sanity_light @pytest.mark.wpa2_enterprise @pytest.mark.fiveg - def test_wpa2_enterprise_5g(self, get_vif_state, get_ap_logs, + def test_wpa2_enterprise_5g(self, get_vif_state, get_ap_logs, get_lf_logs, station_names_fiveg, setup_profiles, lf_test, update_report, test_cases, radius_info, exit_on_fail): profile_data = setup_params_enterprise["ssid_modes"]["wpa2_enterprise"][1] @@ -136,7 +136,7 @@ class TestNATModeEnterpriseTTLSSuiteOne(object): @pytest.mark.wpa3_enterprise @pytest.mark.twog - def test_wpa3_enterprise_2g(self, get_vif_state, get_ap_logs, + def test_wpa3_enterprise_2g(self, get_vif_state, get_ap_logs, get_lf_logs, station_names_twog, setup_profiles, lf_test, update_report, test_cases, radius_info, exit_on_fail): profile_data = setup_params_enterprise["ssid_modes"]["wpa3_enterprise"][0] @@ -160,7 +160,7 @@ class TestNATModeEnterpriseTTLSSuiteOne(object): @pytest.mark.wpa3_enterprise @pytest.mark.fiveg - def test_wpa3_enterprise_5g(self, get_vif_state,station_names_fiveg, get_ap_logs, + def test_wpa3_enterprise_5g(self, get_vif_state,station_names_fiveg, get_ap_logs, get_lf_logs, setup_profiles, lf_test, update_report, test_cases, radius_info, exit_on_fail): profile_data = setup_params_enterprise["ssid_modes"]["wpa3_enterprise"][1] @@ -210,7 +210,7 @@ class TestNATModeEnterpriseTTLSSuiteTwo(object): @pytest.mark.wpa_wpa2_enterprise_mixed @pytest.mark.twog - def test_wpa_wpa2_enterprise_2g(self, get_vif_state, get_ap_logs, + def test_wpa_wpa2_enterprise_2g(self, get_vif_state, get_ap_logs, get_lf_logs, station_names_twog, setup_profiles, lf_test, update_report, test_cases, radius_info, exit_on_fail): profile_data = setup_params_enterprise_two["ssid_modes"]["wpa_wpa2_enterprise_mixed"][0] @@ -235,7 +235,7 @@ class TestNATModeEnterpriseTTLSSuiteTwo(object): @pytest.mark.wpa_wpa2_enterprise_mixed @pytest.mark.fiveg - def test_wpa_wpa2_enterprise_5g(self, get_vif_state, get_ap_logs, + def test_wpa_wpa2_enterprise_5g(self, get_vif_state, get_ap_logs, get_lf_logs, station_names_fiveg, setup_profiles, lf_test, update_report, test_cases, radius_info, exit_on_fail): profile_data = setup_params_enterprise_two["ssid_modes"]["wpa_wpa2_enterprise_mixed"][1] @@ -260,7 +260,7 @@ class TestNATModeEnterpriseTTLSSuiteTwo(object): @pytest.mark.wpa3_enterprise_mixed @pytest.mark.twog - def test_wpa3_enterprise_mixed_2g(self, get_vif_state, get_ap_logs, + def test_wpa3_enterprise_mixed_2g(self, get_vif_state, get_ap_logs, get_lf_logs, station_names_twog, setup_profiles, lf_test, update_report, test_cases, radius_info, exit_on_fail): profile_data = setup_params_enterprise_two["ssid_modes"]["wpa3_enterprise_mixed"][0] @@ -284,8 +284,8 @@ class TestNATModeEnterpriseTTLSSuiteTwo(object): @pytest.mark.wpa3_enterprise_mixed @pytest.mark.fiveg - def test_wpa3_enterprise_mixed_5g(self, get_vif_state, get_ap_logs, - station_names_fiveg, setup_profiles, lf_test, + def test_wpa3_enterprise_mixed_5g(self, get_vif_state, get_ap_logs, get_lf_logs, + station_names_fiveg, setup_profiles, lf_test, update_report, exit_on_fail, test_cases, radius_info): profile_data = setup_params_enterprise_two["ssid_modes"]["wpa3_enterprise_mixed"][1] diff --git a/tests/e2e/basic/validation_of_operating_modes/nat_mode/client_connectivity/test_general_security_modes.py b/tests/e2e/basic/validation_of_operating_modes/nat_mode/client_connectivity/test_general_security_modes.py index 32da13361..311411d1d 100644 --- a/tests/e2e/basic/validation_of_operating_modes/nat_mode/client_connectivity/test_general_security_modes.py +++ b/tests/e2e/basic/validation_of_operating_modes/nat_mode/client_connectivity/test_general_security_modes.py @@ -48,7 +48,7 @@ class TestNATModeConnectivitySuiteA(object): @pytest.mark.open @pytest.mark.twog @allure.story('open 2.4 GHZ Band') - def test_open_ssid_2g(self, get_vif_state, get_ap_logs, + def test_open_ssid_2g(self, get_vif_state, get_ap_logs, get_lf_logs, setup_profiles, lf_test, update_report, station_names_twog, test_cases): @@ -77,7 +77,7 @@ class TestNATModeConnectivitySuiteA(object): @pytest.mark.open @pytest.mark.fiveg @allure.story('open 5 GHZ Band') - def test_open_ssid_5g(self, get_vif_state, get_ap_logs, + def test_open_ssid_5g(self, get_vif_state, get_ap_logs, get_lf_logs, lf_test, test_cases, station_names_fiveg, update_report): """Client Connectivity open ssid 5G @@ -104,7 +104,7 @@ class TestNATModeConnectivitySuiteA(object): @pytest.mark.wpa @pytest.mark.twog @allure.story('wpa 2.4 GHZ Band') - def test_wpa_ssid_2g(self, get_vif_state, get_ap_logs, update_report, + def test_wpa_ssid_2g(self, get_vif_state, get_ap_logs, update_report, get_lf_logs, lf_test, test_cases, station_names_twog): """Client Connectivity wpa ssid 2.4G pytest -m "client_connectivity and NAT and general and wpa and twog" @@ -129,7 +129,7 @@ class TestNATModeConnectivitySuiteA(object): @pytest.mark.wpa @pytest.mark.fiveg @allure.story('wpa 5 GHZ Band') - def test_wpa_ssid_5g(self, get_vif_state, get_ap_logs, + def test_wpa_ssid_5g(self, get_vif_state, get_ap_logs, get_lf_logs, lf_test, update_report, test_cases, station_names_fiveg): """Client Connectivity wpa ssid 5G pytest -m "client_connectivity and NAT and general and wpa and fiveg" @@ -155,7 +155,7 @@ class TestNATModeConnectivitySuiteA(object): @pytest.mark.wpa2_personal @pytest.mark.twog @allure.story('wpa2_personal 2.4 GHZ Band') - def test_wpa2_personal_ssid_2g(self, get_vif_state, get_ap_logs, + def test_wpa2_personal_ssid_2g(self, get_vif_state, get_ap_logs, get_lf_logs, lf_test, update_report, test_cases, station_names_twog): """Client Connectivity wpa2_personal ssid 2.4G @@ -182,7 +182,7 @@ class TestNATModeConnectivitySuiteA(object): @pytest.mark.wpa2_personal @pytest.mark.fiveg @allure.story('wpa2_personal 5 GHZ Band') - def test_wpa2_personal_ssid_5g(self, get_vif_state, get_ap_logs, + def test_wpa2_personal_ssid_5g(self, get_vif_state, get_ap_logs, get_lf_logs, update_report, test_cases, station_names_fiveg, lf_test): @@ -245,7 +245,7 @@ class TestNATModeConnectivitySuiteB(object): @pytest.mark.wpa3_personal @pytest.mark.twog @allure.story('open 2.4 GHZ Band') - def test_wpa3_personal_ssid_2g(self, get_vif_state, get_ap_logs, + def test_wpa3_personal_ssid_2g(self, get_vif_state, get_ap_logs, get_lf_logs, station_names_twog, setup_profiles, lf_test, update_report, test_cases): @@ -272,7 +272,7 @@ class TestNATModeConnectivitySuiteB(object): @pytest.mark.wpa3_personal @pytest.mark.fiveg @allure.story('open 5 GHZ Band') - def test_wpa3_personal_ssid_5g(self, get_vif_state, get_ap_logs, + def test_wpa3_personal_ssid_5g(self, get_vif_state, get_ap_logs, get_lf_logs, station_names_fiveg, lf_test, test_cases, update_report): """Client Connectivity open ssid 2.4G @@ -300,7 +300,7 @@ class TestNATModeConnectivitySuiteB(object): @allure.story('open 2.4 GHZ Band') def test_wpa3_personal_mixed_ssid_2g(self, get_vif_state, get_ap_logs, station_names_twog, setup_profiles, - lf_test, + lf_test, get_lf_logs, update_report, test_cases): """Client Connectivity open ssid 2.4G @@ -326,7 +326,7 @@ class TestNATModeConnectivitySuiteB(object): @pytest.mark.wpa3_personal_mixed @pytest.mark.fiveg @allure.story('open 5 GHZ Band') - def test_wpa3_personal_mixed_ssid_5g(self, get_vif_state, get_ap_logs, + def test_wpa3_personal_mixed_ssid_5g(self, get_vif_state, get_ap_logs, get_lf_logs, station_names_fiveg, lf_test, test_cases, update_report): @@ -353,7 +353,7 @@ class TestNATModeConnectivitySuiteB(object): @pytest.mark.wpa_wpa2_personal_mixed @pytest.mark.twog @allure.story('wpa wpa2 personal mixed 2.4 GHZ Band') - def test_wpa_wpa2_personal_ssid_2g(self, get_vif_state, get_ap_logs, + def test_wpa_wpa2_personal_ssid_2g(self, get_vif_state, get_ap_logs, get_lf_logs, station_names_twog, setup_profiles, lf_test, update_report, @@ -382,7 +382,7 @@ class TestNATModeConnectivitySuiteB(object): @pytest.mark.wpa_wpa2_personal_mixed @pytest.mark.fiveg @allure.story('wpa wpa2 personal mixed 5 GHZ Band') - def test_wpa_wpa2_personal_ssid_5g(self, get_vif_state, get_ap_logs, + def test_wpa_wpa2_personal_ssid_5g(self, get_vif_state, get_ap_logs, get_lf_logs, station_names_fiveg, lf_test, test_cases, update_report): """Client Connectivity open ssid 2.4G diff --git a/tests/e2e/basic/validation_of_operating_modes/vlan_mode/client_connectivity/test_enterprise_ttls.py b/tests/e2e/basic/validation_of_operating_modes/vlan_mode/client_connectivity/test_enterprise_ttls.py index 5b2ade4eb..748202f50 100644 --- a/tests/e2e/basic/validation_of_operating_modes/vlan_mode/client_connectivity/test_enterprise_ttls.py +++ b/tests/e2e/basic/validation_of_operating_modes/vlan_mode/client_connectivity/test_enterprise_ttls.py @@ -34,7 +34,7 @@ class TestVLANModeEnterpriseTTLSSuiteOne(object): @pytest.mark.wpa_enterprise @pytest.mark.twog - def test_wpa_enterprise_2g(self, get_vif_state, get_ap_logs, + def test_wpa_enterprise_2g(self, get_vif_state, get_ap_logs, get_lf_logs, station_names_twog, setup_profiles, lf_test, update_report, test_cases, radius_info, exit_on_fail): @@ -60,7 +60,7 @@ class TestVLANModeEnterpriseTTLSSuiteOne(object): @pytest.mark.wpa_enterprise @pytest.mark.fiveg - def test_wpa_enterprise_5g(self, get_vif_state, get_ap_logs, + def test_wpa_enterprise_5g(self, get_vif_state, get_ap_logs, get_lf_logs, station_names_fiveg, setup_profiles, lf_test, update_report, test_cases, radius_info, exit_on_fail): @@ -87,7 +87,7 @@ class TestVLANModeEnterpriseTTLSSuiteOne(object): @pytest.mark.sanity_light @pytest.mark.wpa2_enterprise @pytest.mark.twog - def test_wpa2_enterprise_2g(self, get_vif_state, get_ap_logs, + def test_wpa2_enterprise_2g(self, get_vif_state, get_ap_logs, get_lf_logs, station_names_twog, setup_profiles, lf_test, update_report, test_cases, radius_info, exit_on_fail): @@ -114,7 +114,7 @@ class TestVLANModeEnterpriseTTLSSuiteOne(object): @pytest.mark.sanity_light @pytest.mark.wpa2_enterprise @pytest.mark.fiveg - def test_wpa2_enterprise_5g(self, get_vif_state, get_ap_logs, + def test_wpa2_enterprise_5g(self, get_vif_state, get_ap_logs, get_lf_logs, station_names_fiveg, setup_profiles, lf_test, update_report, test_cases, radius_info, exit_on_fail): @@ -140,7 +140,7 @@ class TestVLANModeEnterpriseTTLSSuiteOne(object): @pytest.mark.wpa3_enterprise @pytest.mark.twog - def test_wpa3_enterprise_2g(self, get_vif_state, get_ap_logs, + def test_wpa3_enterprise_2g(self, get_vif_state, get_ap_logs, get_lf_logs, station_names_twog, setup_profiles, lf_test, update_report, test_cases, radius_info, exit_on_fail): @@ -165,7 +165,7 @@ class TestVLANModeEnterpriseTTLSSuiteOne(object): @pytest.mark.wpa3_enterprise @pytest.mark.fiveg - def test_wpa3_enterprise_5g(self, get_vif_state, get_ap_logs, + def test_wpa3_enterprise_5g(self, get_vif_state, get_ap_logs, get_lf_logs, station_names_fiveg, setup_profiles, lf_test, update_report, test_cases, radius_info, exit_on_fail): @@ -216,7 +216,7 @@ class TestVLANModeEnterpriseTTLSSuiteTwo(object): @pytest.mark.wpa_wpa2_enterprise_mixed @pytest.mark.twog - def test_wpa_wpa2_enterprise_2g(self, get_vif_state, get_ap_logs, + def test_wpa_wpa2_enterprise_2g(self, get_vif_state, get_ap_logs, get_lf_logs, station_names_twog, setup_profiles, lf_test, update_report, test_cases, radius_info, exit_on_fail): @@ -244,7 +244,7 @@ class TestVLANModeEnterpriseTTLSSuiteTwo(object): @pytest.mark.fiveg def test_wpa_wpa2_enterprise_5g(self, get_vif_state, get_ap_logs, station_names_fiveg, setup_profiles, - lf_test, + lf_test, get_lf_logs, update_report, test_cases, radius_info, exit_on_fail): profile_data = setup_params_enterprise_two["ssid_modes"]["wpa_wpa2_enterprise_mixed"][1] ssid_name = profile_data["ssid_name"] @@ -268,7 +268,7 @@ class TestVLANModeEnterpriseTTLSSuiteTwo(object): @pytest.mark.wpa3_enterprise_mixed @pytest.mark.twog - def test_wpa3_enterprise_mixed_2g(self, get_vif_state, get_ap_logs, + def test_wpa3_enterprise_mixed_2g(self, get_vif_state, get_ap_logs, get_lf_logs, station_names_twog, setup_profiles, lf_test, update_report, test_cases, radius_info, exit_on_fail): @@ -293,7 +293,7 @@ class TestVLANModeEnterpriseTTLSSuiteTwo(object): @pytest.mark.wpa3_enterprise_mixed @pytest.mark.fiveg - def test_wpa3_enterprise_mixed_5g(self, get_vif_state, get_ap_logs, + def test_wpa3_enterprise_mixed_5g(self, get_vif_state, get_ap_logs, get_lf_logs, station_names_fiveg, setup_profiles, lf_test, update_report, exit_on_fail, diff --git a/tests/e2e/basic/validation_of_operating_modes/vlan_mode/client_connectivity/test_general_security_modes.py b/tests/e2e/basic/validation_of_operating_modes/vlan_mode/client_connectivity/test_general_security_modes.py index 021096dfb..097703e20 100644 --- a/tests/e2e/basic/validation_of_operating_modes/vlan_mode/client_connectivity/test_general_security_modes.py +++ b/tests/e2e/basic/validation_of_operating_modes/vlan_mode/client_connectivity/test_general_security_modes.py @@ -46,8 +46,8 @@ class TestvlanModeConnectivitySuiteA(object): @pytest.mark.open @pytest.mark.twog @allure.story('open 2.4 GHZ Band') - def test_open_ssid_2g(self, get_vif_state, get_ap_logs, - setup_profiles, lf_test, update_report, + def test_open_ssid_2g(self, get_vif_state, get_ap_logs, get_lf_logs, + setup_profiles, lf_test, update_report, station_names_twog, test_cases): """Client Connectivity open ssid 2.4G @@ -72,8 +72,8 @@ class TestvlanModeConnectivitySuiteA(object): @pytest.mark.open @pytest.mark.fiveg @allure.story('open 5 GHZ Band') - def test_open_ssid_5g(self, get_vif_state, get_ap_logs, - lf_test, test_cases, station_names_fiveg, + def test_open_ssid_5g(self, get_vif_state, get_ap_logs, get_lf_logs, + lf_test, test_cases, station_names_fiveg, update_report): """Client Connectivity open ssid 5G pytest -m "client_connectivity and vlan and general and open and fiveg" @@ -100,7 +100,7 @@ class TestvlanModeConnectivitySuiteA(object): @pytest.mark.twog @allure.story('wpa 2.4 GHZ Band') def test_wpa_ssid_2g(self, get_vif_state, get_ap_logs, - update_report, + update_report, get_lf_logs, lf_test, test_cases, station_names_twog): """Client Connectivity wpa ssid 2.4G pytest -m "client_connectivity and vlan and general and wpa and twog" @@ -126,7 +126,7 @@ class TestvlanModeConnectivitySuiteA(object): @pytest.mark.wpa @pytest.mark.fiveg @allure.story('wpa 5 GHZ Band') - def test_wpa_ssid_5g(self, get_vif_state, get_ap_logs, + def test_wpa_ssid_5g(self, get_vif_state, get_ap_logs, get_lf_logs, lf_test, update_report, test_cases, station_names_fiveg): """Client Connectivity wpa ssid 5G pytest -m "client_connectivity and vlan and general and wpa and fiveg" @@ -152,8 +152,8 @@ class TestvlanModeConnectivitySuiteA(object): @pytest.mark.wpa2_personal @pytest.mark.twog @allure.story('wpa2_personal 2.4 GHZ Band') - def test_wpa2_personal_ssid_2g(self, get_vif_state, get_ap_logs, - lf_test, update_report, test_cases, + def test_wpa2_personal_ssid_2g(self, get_vif_state, get_ap_logs, get_lf_logs, + lf_test, update_report, test_cases, station_names_twog): """Client Connectivity wpa2_personal ssid 2.4G pytest -m "client_connectivity and vlan and general and wpa2_personal and twog" @@ -179,8 +179,8 @@ class TestvlanModeConnectivitySuiteA(object): @pytest.mark.wpa2_personal @pytest.mark.fiveg @allure.story('wpa2_personal 5 GHZ Band') - def test_wpa2_personal_ssid_5g(self, get_vif_state, get_ap_logs, - update_report, test_cases, + def test_wpa2_personal_ssid_5g(self, get_vif_state, get_ap_logs, get_lf_logs, + update_report, test_cases, station_names_fiveg, lf_test): """Client Connectivity wpa2_personal ssid 5G @@ -243,8 +243,8 @@ class TestvlanModeConnectivitySuiteTwo(object): @pytest.mark.wpa3_personal @pytest.mark.twog @allure.story('open 2.4 GHZ Band') - def test_wpa3_personal_ssid_2g(self, get_vif_state, get_ap_logs, - station_names_twog, setup_profiles, lf_test, + def test_wpa3_personal_ssid_2g(self, get_vif_state, get_ap_logs, get_lf_logs, + station_names_twog, setup_profiles, lf_test, update_report, test_cases): """Client Connectivity open ssid 2.4G @@ -271,8 +271,8 @@ class TestvlanModeConnectivitySuiteTwo(object): @pytest.mark.wpa3_personal @pytest.mark.fiveg @allure.story('open 5 GHZ Band') - def test_wpa3_personal_ssid_5g(self, get_vif_state, get_ap_logs, - station_names_fiveg, lf_test, test_cases, + def test_wpa3_personal_ssid_5g(self, get_vif_state, get_ap_logs, get_lf_logs, + station_names_fiveg, lf_test, test_cases, update_report): """Client Connectivity open ssid 2.4G pytest -m "client_connectivity and vlan and general and wpa3_personal and fiveg" @@ -298,8 +298,8 @@ class TestvlanModeConnectivitySuiteTwo(object): @pytest.mark.twog @allure.story('open 2.4 GHZ Band') def test_wpa3_personal_mixed_ssid_2g(self, get_vif_state, get_ap_logs, - station_names_twog, setup_profiles, - lf_test, + station_names_twog, setup_profiles, + lf_test, get_lf_logs, update_report, test_cases): """Client Connectivity open ssid 2.4G @@ -326,8 +326,8 @@ class TestvlanModeConnectivitySuiteTwo(object): @pytest.mark.fiveg @allure.story('open 5 GHZ Band') def test_wpa3_personal_mixed_ssid_5g(self, get_vif_state, get_ap_logs, - station_names_fiveg, lf_test, - test_cases, + station_names_fiveg, lf_test, + test_cases, get_lf_logs, update_report): """Client Connectivity open ssid 2.4G pytest -m "client_connectivity and vlan and general and wpa3_personal_mixed and fiveg" @@ -353,8 +353,8 @@ class TestvlanModeConnectivitySuiteTwo(object): @pytest.mark.twog @allure.story('wpa wpa2 personal mixed 2.4 GHZ Band') def test_wpa_wpa2_personal_ssid_2g(self, get_vif_state, get_ap_logs, - station_names_twog, setup_profiles, - lf_test, + station_names_twog, setup_profiles, + lf_test, get_lf_logs, update_report, test_cases): """Client Connectivity open ssid 2.4G @@ -381,8 +381,8 @@ class TestvlanModeConnectivitySuiteTwo(object): @pytest.mark.wpa_wpa2_personal_mixed @pytest.mark.fiveg @allure.story('wpa wpa2 personal mixed 5 GHZ Band') - def test_wpa_wpa2_personal_ssid_5g(self, get_vif_state, get_ap_logs, - station_names_fiveg, lf_test, test_cases, + def test_wpa_wpa2_personal_ssid_5g(self, get_vif_state, get_ap_logs, get_lf_logs, + station_names_fiveg, lf_test, test_cases, update_report): """Client Connectivity open ssid 2.4G pytest -m "client_connectivity and vlan and general and wpa_wpa2_personal_mixed and fiveg" diff --git a/tests/e2e/interOp/Express_WiFi/__init__.py b/tests/e2e/interOp/Express_WiFi/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/e2e/interOp/Express_WiFi/android/__init__.py b/tests/e2e/interOp/Express_WiFi/android/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/e2e/interOp/Express_WiFi/android/test_ExpressWifi_and.py b/tests/e2e/interOp/Express_WiFi/android/test_ExpressWifi_and.py new file mode 100644 index 000000000..352d536df --- /dev/null +++ b/tests/e2e/interOp/Express_WiFi/android/test_ExpressWifi_and.py @@ -0,0 +1,68 @@ +from logging import exception +import unittest +import warnings +from perfecto.test import TestResultFactory +import pytest +import sys +import time +from selenium.common.exceptions import NoSuchElementException +from selenium.webdriver.common.by import By +from appium import webdriver +from selenium.common.exceptions import NoSuchElementException + +import sys +import allure + +if 'perfecto_libs' not in sys.path: + sys.path.append(f'../libs/perfecto_libs') + +pytestmark = [pytest.mark.sanity, pytest.mark.interop, pytest.mark.android, pytest.mark.interop_android, pytest.mark.expressWifiConnection] + +from android_lib import set_APconnMobileDevice_android, ForgetWifiConnection, expressWifi, wifi_connect, wifi_disconnect_and_forget + +setup_params_general = { + "mode": "NAT", + "ssid_modes": { + "open": [{"ssid_name": "XWF-OWF_DSx", "appliedRadios": ["2G"]}] + }, + "rf": {}, + "radius": False, + "express-wifi": True +} + + +@pytest.mark.parametrize( + 'setup_profiles', + [setup_params_general], + indirect=True, + scope="class" +) +@pytest.mark.usefixtures("setup_profiles") +class TestExpressWifiAndroid(object): + + @pytest.mark.twog + @pytest.mark.open + def test_ExpressWifi_Android(self, request, get_ToggleAirplaneMode_data, setup_perfectoMobile_android): + profile_data = setup_params_general["ssid_modes"]["open"][0] + ssidName = profile_data["ssid_name"] + ssidPassword = "" + print ("SSID_NAME: " + ssidName) + print ("SSID_PASS: " + ssidPassword) + + report = setup_perfectoMobile_android[1] + driver = setup_perfectoMobile_android[0] + connData = get_ToggleAirplaneMode_data + + #Set Wifi/AP Mode + wifi_connect(request, ssidName, ssidPassword, setup_perfectoMobile_android, connData) + + #Express Wifi + if expressWifi(request, ssidName, setup_perfectoMobile_android, connData): + assert True + else: + assert False + #ForgetWifi + wifi_disconnect_and_forget(request, ssidName, ssidPassword, setup_perfectoMobile_android, connData) + + + diff --git a/tests/e2e/interOp/Express_WiFi/iOS/__init__.py b/tests/e2e/interOp/Express_WiFi/iOS/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/e2e/interOp/Express_WiFi/iOS/test_ExpressWifi_ios.py b/tests/e2e/interOp/Express_WiFi/iOS/test_ExpressWifi_ios.py new file mode 100644 index 000000000..42e8800d0 --- /dev/null +++ b/tests/e2e/interOp/Express_WiFi/iOS/test_ExpressWifi_ios.py @@ -0,0 +1,68 @@ +from logging import exception +import unittest +import warnings +from perfecto.test import TestResultFactory +import pytest +import sys +import time +from selenium.common.exceptions import NoSuchElementException +from selenium.webdriver.common.by import By +from appium import webdriver +from selenium.common.exceptions import NoSuchElementException + +import sys +import allure + +if 'perfecto_libs' not in sys.path: + sys.path.append(f'../libs/perfecto_libs') + +pytestmark = [pytest.mark.sanity, pytest.mark.interop, pytest.mark.ios, pytest.mark.interop_ios, + pytest.mark.expressWifiConnection] + +from iOS_lib import closeApp, ForgetWifiConnection, set_APconnMobileDevice_iOS, Toggle_WifiMode_iOS, \ + verifyUploadDownloadSpeediOS, expressWifi, wifi_connect, wifi_disconnect_and_forget + +setup_params_general = { + "mode": "NAT", + "ssid_modes": { + "open": [{"ssid_name": "XWF-OWF_DSx", "appliedRadios": ["2G"]}] + }, + "rf": {}, + "radius": False, + "express-wifi": True +} + + +@pytest.mark.parametrize( + 'setup_profiles', + [setup_params_general], + indirect=True, + scope="class" +) +@pytest.mark.usefixtures("setup_profiles") +class TestExpressWifi(object): + + @pytest.mark.twog + @pytest.mark.open + def test_ExpressWifi(self, request, get_ToggleAirplaneMode_data, setup_perfectoMobile_iOS): + profile_data = setup_params_general["ssid_modes"]["open"][0] + ssidName = profile_data["ssid_name"] + ssidPassword = "" + print("SSID_NAME: " + ssidName) + print("SSID_PASS: " + ssidPassword) + + report = setup_perfectoMobile_iOS[1] + driver = setup_perfectoMobile_iOS[0] + connData = get_ToggleAirplaneMode_data + + # Set Wifi/AP Mode + wifi_connect(request, ssidName, ssidPassword, setup_perfectoMobile_iOS, connData) + + # Express Wifi + if expressWifi(request, setup_perfectoMobile_iOS, connData): + assert True + else: + assert False + + # ForgetWifi + wifi_disconnect_and_forget(request, ssidName, ssidPassword, setup_perfectoMobile_iOS, connData) diff --git a/tests/e2e/interOp/captive_portal/__init__.py b/tests/e2e/interOp/captive_portal/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/e2e/interOp/captive_portal/bridge_mode/__init__.py b/tests/e2e/interOp/captive_portal/bridge_mode/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/e2e/interOp/captive_portal/bridge_mode/android/__init__.py b/tests/e2e/interOp/captive_portal/bridge_mode/android/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/e2e/interOp/captive_portal/bridge_mode/android/test_captive_portal_modes.py b/tests/e2e/interOp/captive_portal/bridge_mode/android/test_captive_portal_modes.py new file mode 100644 index 000000000..3423ee54d --- /dev/null +++ b/tests/e2e/interOp/captive_portal/bridge_mode/android/test_captive_portal_modes.py @@ -0,0 +1,276 @@ +from logging import exception +import io +import unittest +import warnings +from perfecto.test import TestResultFactory +import pytest +import sys +import time +from selenium.common.exceptions import NoSuchElementException +from selenium.webdriver.common.by import By +from appium import webdriver +from selenium.common.exceptions import NoSuchElementException + +import sys +import allure + +if 'perfecto_libs' not in sys.path: + sys.path.append(f'../libs/perfecto_libs') + +from android_lib import closeApp, set_APconnMobileDevice_android, Toggle_AirplaneMode_android, ForgetWifiConnection, openApp, \ + get_ip_address_and, verifyUploadDownloadSpeed_android, wifi_connect, wifi_disconnect_and_forget, captive_portal_and + +pytestmark = [pytest.mark.sanity, pytest.mark.interop, pytest.mark.android, pytest.mark.interop_and, pytest.mark.captive_portal + ,pytest.mark.interop_uc_sanity, pytest.mark.bridge] + +setup_params_general = { + "mode": "BRIDGE", + "ssid_modes": { + "open": [{"ssid_name": "captive_open_2g", "appliedRadios": ["2G"]}, + {"ssid_name": "captive_open_5g", "appliedRadios": ["5G"]}], + "wpa": [{"ssid_name": "captive_wpa_2g", "appliedRadios": ["2G"], "security_key": "lanforge"}, + {"ssid_name": "captive_wpa_5g", "appliedRadios": ["5G"], + "security_key": "lanforge"}], + "wpa2_personal": [{"ssid_name": "captive_wpa2_2g", "appliedRadios": ["2G"], "security_key": "lanforge"}, + {"ssid_name": "captive_wpa2_5g", "appliedRadios": ["5G"], + "security_key": "lanforge"}], + "wpa3_personal": [ + {"ssid_name": "captive_wpa3_2g", "appliedRadios": ["2G"], "security_key": "lanforge"}, + {"ssid_name": "captive_wpa3_5g", "appliedRadios": ["5G"], + "security_key": "lanforge"}]}, + "rf": {}, + "radius": False +} + + +@allure.suite(suite_name="interop sanity") +@allure.sub_suite(sub_suite_name="Bridge Mode Captive Portal : Suite-A") +@pytest.mark.InteropsuiteA +@allure.feature("BRIDGE MODE CAPTIVE PORTAL") +@pytest.mark.parametrize( + 'setup_profiles', + [setup_params_general], + indirect=True, + scope="class" +) +@pytest.mark.usefixtures("setup_profiles") +class TestBridgeModeCaptivePortalSuiteOneBridge(object): + """ Captive Portal SuiteA + pytest -m "captive portal and bridge and InteropsuiteA" + """ + @allure.testcase(url="https://telecominfraproject.atlassian.net/browse/WIFI-5178", name="WIFI-5178") + @pytest.mark.twog + @pytest.mark.open + def test_Captive_Portal_Open_2g_BRIDGE(self, request, get_vif_state, get_ap_logs, get_APToMobileDevice_data, + setup_perfectoMobile_android): + + profile_data = setup_params_general["ssid_modes"]["open"][0] + ssidName = profile_data["ssid_name"] + ssidPassword = "[BLANK]" + print("SSID_NAME: " + ssidName) + print("SSID_PASS: " + ssidPassword) + get_vif_state.append(ssidName) + if ssidName not in get_vif_state: + allure.attach(name="retest,vif state ssid not available:", body=str(get_vif_state)) + pytest.xfail("SSID NOT AVAILABLE IN VIF STATE") + + report = setup_perfectoMobile_android[1] + driver = setup_perfectoMobile_android[0] + connData = get_APToMobileDevice_data + + # Set Wifi/AP Mode + ip, is_internet = captive_portal_and(request, ssidName, ssidPassword, setup_perfectoMobile_android, connData) + if is_internet: + if ip: + text_body = ("connected to " + ssidName + " (" + ip + ") " + "with internet") + else: + text_body = ("connected to " + ssidName + "with Internet, couldn't get IP address") + print(text_body) + allure.attach(name="Connection Status: ", body=str(text_body)) + + assert verifyUploadDownloadSpeed_android(request, setup_perfectoMobile_android, connData) + wifi_disconnect_and_forget(request, ssidName, ssidPassword, setup_perfectoMobile_android, connData) + else: + allure.attach(name="Connection Status: ", body=str("No Internet access")) + assert False + @allure.testcase(url="https://telecominfraproject.atlassian.net/browse/WIFI-5141", name="WIFI-5141") + @pytest.mark.fiveg + @pytest.mark.open + def test_Captive_Portal_Open_5g_BRIDGE(self, request, get_vif_state, get_ap_logs, get_APToMobileDevice_data, + setup_perfectoMobile_android): + + profile_data = setup_params_general["ssid_modes"]["open"][1] + ssidName = profile_data["ssid_name"] + ssidPassword = "[BLANK]" + print("SSID_NAME: " + ssidName) + print("SSID_PASS: " + ssidPassword) + get_vif_state.append(ssidName) + if ssidName not in get_vif_state: + allure.attach(name="retest,vif state ssid not available:", body=str(get_vif_state)) + pytest.xfail("SSID NOT AVAILABLE IN VIF STATE") + + report = setup_perfectoMobile_android[1] + driver = setup_perfectoMobile_android[0] + connData = get_APToMobileDevice_data + + # Set Wifi/AP Mode + ip, is_internet = captive_portal_and(request, ssidName, ssidPassword, setup_perfectoMobile_android, connData) + if is_internet: + if ip: + text_body = ("connected to " + ssidName + " (" + ip + ") " + "with internet") + else: + text_body = ("connected to " + ssidName + "with Internet, couldn't get IP address") + print(text_body) + allure.attach(name="Connection Status: ", body=str(text_body)) + + assert verifyUploadDownloadSpeed_android(request, setup_perfectoMobile_android, connData) + wifi_disconnect_and_forget(request, ssidName, ssidPassword, setup_perfectoMobile_android, connData) + else: + allure.attach(name="Connection Status: ", body=str("No Internet access")) + assert False + + @allure.testcase(url="https://telecominfraproject.atlassian.net/browse/WIFI-5180", name="WIFI-5180") + @pytest.mark.twog + @pytest.mark.wpa + def test_Captive_Portal_WPA_2g_Bridge(self, request, get_vif_state, get_ap_logs, get_APToMobileDevice_data, + setup_perfectoMobile_android): + + profile_data = setup_params_general["ssid_modes"]["wpa"][0] + ssidName = profile_data["ssid_name"] + ssidPassword = profile_data["security_key"] + print("SSID_NAME: " + ssidName) + print("SSID_PASS: " + ssidPassword) + get_vif_state.append(ssidName) + if ssidName not in get_vif_state: + allure.attach(name="retest,vif state ssid not available:", body=str(get_vif_state)) + pytest.xfail("SSID NOT AVAILABLE IN VIF STATE") + + report = setup_perfectoMobile_android[1] + driver = setup_perfectoMobile_android[0] + connData = get_APToMobileDevice_data + + # Set Wifi/AP Mode + ip, is_internet = captive_portal_and(request, ssidName, ssidPassword, setup_perfectoMobile_android, connData) + if is_internet: + if ip: + text_body = ("connected to " + ssidName + " (" + ip + ") " + "with internet") + else: + text_body = ("connected to " + ssidName + "with Internet, couldn't get IP address") + print(text_body) + allure.attach(name="Connection Status: ", body=str(text_body)) + + assert verifyUploadDownloadSpeed_android(request, setup_perfectoMobile_android, connData) + wifi_disconnect_and_forget(request, ssidName, ssidPassword, setup_perfectoMobile_android, connData) + else: + allure.attach(name="Connection Status: ", body=str("No Internet access")) + assert False + @allure.testcase(url="https://telecominfraproject.atlassian.net/browse/WIFI-5144", name="WIFI-5144") + @pytest.mark.fiveg + @pytest.mark.wpa + def test_Captive_Portal_WPA_5g_Bridge(self, request, get_vif_state, get_ap_logs, get_APToMobileDevice_data, + setup_perfectoMobile_android): + + profile_data = setup_params_general["ssid_modes"]["wpa"][1] + ssidName = profile_data["ssid_name"] + ssidPassword = profile_data["security_key"] + print("SSID_NAME: " + ssidName) + print("SSID_PASS: " + ssidPassword) + get_vif_state.append(ssidName) + if ssidName not in get_vif_state: + allure.attach(name="retest,vif state ssid not available:", body=str(get_vif_state)) + pytest.xfail("SSID NOT AVAILABLE IN VIF STATE") + + report = setup_perfectoMobile_android[1] + driver = setup_perfectoMobile_android[0] + connData = get_APToMobileDevice_data + + # Set Wifi/AP Mode + ip, is_internet = captive_portal_and(request, ssidName, ssidPassword, setup_perfectoMobile_android, connData) + if is_internet: + if ip: + text_body = ("connected to " + ssidName + " (" + ip + ") " + "with internet") + else: + text_body = ("connected to " + ssidName + "with Internet, couldn't get IP address") + print(text_body) + allure.attach(name="Connection Status: ", body=str(text_body)) + + assert verifyUploadDownloadSpeed_android(request, setup_perfectoMobile_android, connData) + wifi_disconnect_and_forget(request, ssidName, ssidPassword, setup_perfectoMobile_android, connData) + else: + allure.attach(name="Connection Status: ", body=str("No Internet access")) + assert False + + @allure.testcase(url="https://telecominfraproject.atlassian.net/browse/WIFI-5184", name="WIFI-5184") + @pytest.mark.twog + @pytest.mark.wpa2_personal + def test_Captive_Portal_WPA2_2g_Personal_Bridge(self, request, get_vif_state, get_ap_logs, + get_APToMobileDevice_data, + setup_perfectoMobile_android): + + profile_data = setup_params_general["ssid_modes"]["wpa2_personal"][0] + ssidName = profile_data["ssid_name"] + ssidPassword = profile_data["security_key"] + print("SSID_NAME: " + ssidName) + print("SSID_PASS: " + ssidPassword) + get_vif_state.append(ssidName) + if ssidName not in get_vif_state: + allure.attach(name="retest,vif state ssid not available:", body=str(get_vif_state)) + pytest.xfail("SSID NOT AVAILABLE IN VIF STATE") + + report = setup_perfectoMobile_android[1] + driver = setup_perfectoMobile_android[0] + connData = get_APToMobileDevice_data + + # Set Wifi/AP Mode + ip, is_internet = captive_portal_and(request, ssidName, ssidPassword, setup_perfectoMobile_android, connData) + if is_internet: + if ip: + text_body = ("connected to " + ssidName + " (" + ip + ") " + "with internet") + else: + text_body = ("connected to " + ssidName + "with Internet, couldn't get IP address") + print(text_body) + allure.attach(name="Connection Status: ", body=str(text_body)) + + assert verifyUploadDownloadSpeed_android(request, setup_perfectoMobile_android, connData) + wifi_disconnect_and_forget(request, ssidName, ssidPassword, setup_perfectoMobile_android, connData) + else: + allure.attach(name="Connection Status: ", body=str("No Internet access")) + assert False + + @allure.testcase(url="https://telecominfraproject.atlassian.net/browse/WIFI-5147", name="WIFI-5147") + @pytest.mark.fiveg + @pytest.mark.wpa2_personal + def test_Captive_Portal_WPA2_5g_Personal_Bridge(self, request, get_vif_state, get_ap_logs, + get_APToMobileDevice_data, + setup_perfectoMobile_android): + + profile_data = setup_params_general["ssid_modes"]["wpa2_personal"][1] + ssidName = profile_data["ssid_name"] + ssidPassword = profile_data["security_key"] + print("SSID_NAME: " + ssidName) + print("SSID_PASS: " + ssidPassword) + get_vif_state.append(ssidName) + if ssidName not in get_vif_state: + allure.attach(name="retest,vif state ssid not available:", body=str(get_vif_state)) + pytest.xfail("SSID NOT AVAILABLE IN VIF STATE") + + report = setup_perfectoMobile_android[1] + driver = setup_perfectoMobile_android[0] + connData = get_APToMobileDevice_data + + # Set Wifi/AP Mode + ip, is_internet = captive_portal_and(request, ssidName, ssidPassword, setup_perfectoMobile_android, connData) + if is_internet: + if ip: + text_body = ("connected to " + ssidName + " (" + ip + ") " + "with internet") + else: + text_body = ("connected to " + ssidName + "with Internet, couldn't get IP address") + print(text_body) + allure.attach(name="Connection Status: ", body=str(text_body)) + + assert verifyUploadDownloadSpeed_android(request, setup_perfectoMobile_android, connData) + wifi_disconnect_and_forget(request, ssidName, ssidPassword, setup_perfectoMobile_android, connData) + else: + allure.attach(name="Connection Status: ", body=str("No Internet access")) + assert False + diff --git a/tests/e2e/interOp/captive_portal/bridge_mode/ios/__init__.py b/tests/e2e/interOp/captive_portal/bridge_mode/ios/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/e2e/interOp/captive_portal/bridge_mode/ios/test_captive_portal_modes.py b/tests/e2e/interOp/captive_portal/bridge_mode/ios/test_captive_portal_modes.py new file mode 100644 index 000000000..979610a75 --- /dev/null +++ b/tests/e2e/interOp/captive_portal/bridge_mode/ios/test_captive_portal_modes.py @@ -0,0 +1,350 @@ +from logging import exception +import io +import unittest +import warnings +from perfecto.test import TestResultFactory +import pytest +import sys +import time +from selenium.common.exceptions import NoSuchElementException +from selenium.webdriver.common.by import By +from appium import webdriver +from selenium.common.exceptions import NoSuchElementException + +import sys +import allure + +if 'perfecto_libs' not in sys.path: + sys.path.append(f'../libs/perfecto_libs') + +from iOS_lib import closeApp, openApp, get_WifiIPAddress_iOS, ForgetWifiConnection, ping_deftapps_iOS, \ + Toggle_AirplaneMode_iOS, set_APconnMobileDevice_iOS, verify_APconnMobileDevice_iOS, Toggle_WifiMode_iOS, tearDown,\ + verifyUploadDownloadSpeediOS, get_ip_address_ios, captive_portal_ios, wifi_connect, wifi_disconnect_and_forget + +pytestmark = [pytest.mark.sanity, pytest.mark.interop, pytest.mark.ios, pytest.mark.interop_ios, + pytest.mark.captive_portal, pytest.mark.interop_uc_sanity, pytest.mark.bridge] + +setup_params_general = { + "mode": "BRIDGE", + "ssid_modes": { + "open": [{"ssid_name": "captive_open_2g", "appliedRadios": ["2G"]}, + {"ssid_name": "captive_open_5g", "appliedRadios": ["5G"]}], + "wpa": [{"ssid_name": "captive_wpa_2g", "appliedRadios": ["2G"], "security_key": "lanforge"}, + {"ssid_name": "captive_wpa_5g", "appliedRadios": ["5G"], + "security_key": "lanforge"}], + "wpa2": [{"ssid_name": "captive_wpa2_2g", "appliedRadios": ["2G"], "security_key": "lanforge"}, + {"ssid_name": "captive2_wpa_5g", "appliedRadios": ["5G"], + "security_key": "lanforge"}], + "wpa3_personal": [ + {"ssid_name": "captive_wpa3_2g", "appliedRadios": ["2G"], "security_key": "lanforge"}, + {"ssid_name": "captive_wpa3_5g", "appliedRadios": ["5G"], + "security_key": "lanforge"}]}, + "rf": {}, + "radius": False +} + + +@allure.suite(suite_name="interop sanity") +@allure.sub_suite(sub_suite_name="Bridge Mode Captive Portal : Suite-A") +@pytest.mark.InteropsuiteA +@allure.feature("BRIDGE MODE CAPTIVE PORTAL") +# @pytest.mark.parametrize( +# 'setup_profiles', +# [setup_params_general], +# indirect=True, +# scope="class" +# ) +#@pytest.mark.usefixtures("setup_profiles") +class TestBridgeModeCaptivePortalSuiteOneBridge(object): + """ Captive Portal SuiteA + pytest -m "captive portal and bridge and InteropsuiteA" + """ + + @allure.testcase(url="https://telecominfraproject.atlassian.net/browse/WIFI-5179", name="WIFI-5179") + @pytest.mark.twog + @pytest.mark.open + def test_Captive_Portal_Open_2g_BRIDGE(self, request, get_vif_state, get_ap_logs, get_APToMobileDevice_data, + setup_perfectoMobile_iOS): + + profile_data = setup_params_general["ssid_modes"]["open"][0] + ssidName = profile_data["ssid_name"] + ssidPassword = "[BLANK]" + print("SSID_NAME: " + ssidName) + print("SSID_PASS: " + ssidPassword) + get_vif_state.append(ssidName) + if ssidName not in get_vif_state: + allure.attach(name="retest,vif state ssid not available:", body=str(get_vif_state)) + pytest.xfail("SSID NOT AVAILABLE IN VIF STATE") + + report = setup_perfectoMobile_iOS[1] + driver = setup_perfectoMobile_iOS[0] + connData = get_APToMobileDevice_data + + # Set Wifi/AP Mode + ip, is_internet = captive_portal_ios(request, ssidName, ssidPassword, setup_perfectoMobile_iOS, connData) + if is_internet: + if ip: + text_body = ("connected to " + ssidName + " (" + ip + ") " + "with internet") + else: + text_body = ("connected to " + ssidName + "with Internet, couldn't get IP address") + print(text_body) + allure.attach(name="Connection Status: ", body=str(text_body)) + + assert verifyUploadDownloadSpeediOS(request, setup_perfectoMobile_iOS, connData) + wifi_disconnect_and_forget(request, ssidName, ssidPassword, setup_perfectoMobile_iOS, connData) + else: + allure.attach(name="Connection Status: ", body=str("No Internet access")) + assert False + @allure.testcase(url="https://telecominfraproject.atlassian.net/browse/WIFI-5146", name="WIFI-5146") + @pytest.mark.fiveg + @pytest.mark.open + def test_Captive_Portal_Open_5g_BRIDGE(self, request, get_vif_state, get_ap_logs, get_APToMobileDevice_data, + setup_perfectoMobile_iOS): + + profile_data = setup_params_general["ssid_modes"]["open"][1] + ssidName = profile_data["ssid_name"] + ssidPassword = "[BLANK]" + print("SSID_NAME: " + ssidName) + print("SSID_PASS: " + ssidPassword) + get_vif_state.append(ssidName) + if ssidName not in get_vif_state: + allure.attach(name="retest,vif state ssid not available:", body=str(get_vif_state)) + pytest.xfail("SSID NOT AVAILABLE IN VIF STATE") + + report = setup_perfectoMobile_iOS[1] + driver = setup_perfectoMobile_iOS[0] + connData = get_APToMobileDevice_data + + # Set Wifi/AP Mode + ip, is_internet = captive_portal_ios(request, ssidName, ssidPassword, setup_perfectoMobile_iOS, connData) + if is_internet: + if ip: + text_body = ("connected to " + ssidName + " (" + ip + ") " + "with internet") + else: + text_body = ("connected to " + ssidName + "with Internet, couldn't get IP address") + print(text_body) + allure.attach(name="Connection Status: ", body=str(text_body)) + + assert verifyUploadDownloadSpeediOS(request, setup_perfectoMobile_iOS, connData) + wifi_disconnect_and_forget(request, ssidName, ssidPassword, setup_perfectoMobile_iOS, connData) + else: + allure.attach(name="Connection Status: ", body=str("No Internet access")) + assert False + @allure.testcase(url="https://telecominfraproject.atlassian.net/browse/WIFI-5182", name="WIFI-5182") + @pytest.mark.twog + @pytest.mark.wpa + def test_Captive_Portal_WPA_2g_Bridge(self, request, get_vif_state, get_ap_logs, get_APToMobileDevice_data, + setup_perfectoMobile_iOS): + + profile_data = setup_params_general["ssid_modes"]["wpa"][0] + ssidName = profile_data["ssid_name"] + ssidPassword = profile_data["security_key"] + print("SSID_NAME: " + ssidName) + print("SSID_PASS: " + ssidPassword) + get_vif_state.append(ssidName) + if ssidName not in get_vif_state: + allure.attach(name="retest,vif state ssid not available:", body=str(get_vif_state)) + pytest.xfail("SSID NOT AVAILABLE IN VIF STATE") + + report = setup_perfectoMobile_iOS[1] + driver = setup_perfectoMobile_iOS[0] + connData = get_APToMobileDevice_data + + # Set Wifi/AP Mode + ip, is_internet = captive_portal_ios(request, ssidName, ssidPassword, setup_perfectoMobile_iOS, connData) + if is_internet: + if ip: + text_body = ("connected to " + ssidName + " (" + ip + ") " + "with internet") + else: + text_body = ("connected to " + ssidName + "with Internet, couldn't get IP address") + print(text_body) + allure.attach(name="Connection Status: ", body=str(text_body)) + + assert verifyUploadDownloadSpeediOS(request, setup_perfectoMobile_iOS, connData) + wifi_disconnect_and_forget(request, ssidName, ssidPassword, setup_perfectoMobile_iOS, connData) + else: + allure.attach(name="Connection Status: ", body=str("No Internet access")) + assert False + @allure.testcase(url="https://telecominfraproject.atlassian.net/browse/WIFI-5149", name="WIFI-5149") + @pytest.mark.fiveg + @pytest.mark.wpa + def test_Captive_Portal_WPA_5g_Bridge(self, request, get_vif_state, get_ap_logs, get_APToMobileDevice_data, + setup_perfectoMobile_iOS): + + profile_data = setup_params_general["ssid_modes"]["wpa"][1] + ssidName = profile_data["ssid_name"] + ssidPassword = profile_data["security_key"] + print("SSID_NAME: " + ssidName) + print("SSID_PASS: " + ssidPassword) + get_vif_state.append(ssidName) + if ssidName not in get_vif_state: + allure.attach(name="retest,vif state ssid not available:", body=str(get_vif_state)) + pytest.xfail("SSID NOT AVAILABLE IN VIF STATE") + + report = setup_perfectoMobile_iOS[1] + driver = setup_perfectoMobile_iOS[0] + connData = get_APToMobileDevice_data + + # Set Wifi/AP Mode + ip, is_internet = captive_portal_ios(request, ssidName, ssidPassword, setup_perfectoMobile_iOS, connData) + if is_internet: + if ip: + text_body = ("connected to " + ssidName + " (" + ip + ") " + "with internet") + else: + text_body = ("connected to " + ssidName + "with Internet, couldn't get IP address") + print(text_body) + allure.attach(name="Connection Status: ", body=str(text_body)) + + assert verifyUploadDownloadSpeediOS(request, setup_perfectoMobile_iOS, connData) + wifi_disconnect_and_forget(request, ssidName, ssidPassword, setup_perfectoMobile_iOS, connData) + else: + allure.attach(name="Connection Status: ", body=str("No Internet access")) + assert False + @allure.testcase(url="https://telecominfraproject.atlassian.net/browse/WIFI-5186", name="WIFI-5186") + @pytest.mark.twog + @pytest.mark.wpa2_personal + def test_Captive_Portal_WPA2_2g_Personal_Bridge(self, request, get_vif_state, get_ap_logs, + get_APToMobileDevice_data, + setup_perfectoMobile_iOS): + + profile_data = setup_params_general["ssid_modes"]["wpa2_personal"][0] + ssidName = profile_data["ssid_name"] + ssidPassword = profile_data["security_key"] + print("SSID_NAME: " + ssidName) + print("SSID_PASS: " + ssidPassword) + get_vif_state.append(ssidName) + if ssidName not in get_vif_state: + allure.attach(name="retest,vif state ssid not available:", body=str(get_vif_state)) + pytest.xfail("SSID NOT AVAILABLE IN VIF STATE") + + report = setup_perfectoMobile_iOS[1] + driver = setup_perfectoMobile_iOS[0] + connData = get_APToMobileDevice_data + + # Set Wifi/AP Mode + ip, is_internet = captive_portal_ios(request, ssidName, ssidPassword, setup_perfectoMobile_iOS, connData) + if is_internet: + if ip: + text_body = ("connected to " + ssidName + " (" + ip + ") " + "with internet") + else: + text_body = ("connected to " + ssidName + "with Internet, couldn't get IP address") + print(text_body) + allure.attach(name="Connection Status: ", body=str(text_body)) + + assert verifyUploadDownloadSpeediOS(request, setup_perfectoMobile_iOS, connData) + wifi_disconnect_and_forget(request, ssidName, ssidPassword, setup_perfectoMobile_iOS, connData) + else: + allure.attach(name="Connection Status: ", body=str("No Internet access")) + assert False + + @allure.testcase(url="https://telecominfraproject.atlassian.net/browse/WIFI-5153", name="WIFI-5153") + @pytest.mark.fiveg + @pytest.mark.wpa2_personal + def test_Captive_Portal_WPA2_5g_Personal_Bridge(self, request, get_vif_state, get_ap_logs, + get_APToMobileDevice_data, + setup_perfectoMobile_iOS): + + profile_data = setup_params_general["ssid_modes"]["wpa2_personal"][1] + ssidName = profile_data["ssid_name"] + ssidPassword = profile_data["security_key"] + print("SSID_NAME: " + ssidName) + print("SSID_PASS: " + ssidPassword) + get_vif_state.append(ssidName) + if ssidName not in get_vif_state: + allure.attach(name="retest,vif state ssid not available:", body=str(get_vif_state)) + pytest.xfail("SSID NOT AVAILABLE IN VIF STATE") + + report = setup_perfectoMobile_iOS[1] + driver = setup_perfectoMobile_iOS[0] + connData = get_APToMobileDevice_data + + # Set Wifi/AP Mode + ip, is_internet = captive_portal_ios(request, ssidName, ssidPassword, setup_perfectoMobile_iOS, connData) + if is_internet: + if ip: + text_body = ("connected to " + ssidName + " (" + ip + ") " + "with internet") + else: + text_body = ("connected to " + ssidName + "with Internet, couldn't get IP address") + print(text_body) + allure.attach(name="Connection Status: ", body=str(text_body)) + + assert verifyUploadDownloadSpeediOS(request, setup_perfectoMobile_iOS, connData) + wifi_disconnect_and_forget(request, ssidName, ssidPassword, setup_perfectoMobile_iOS, connData) + else: + allure.attach(name="Connection Status: ", body=str("No Internet access")) + assert False + + @allure.testcase(url="https://telecominfraproject.atlassian.net/browse/WIFI-5130", name="WIFI-5130") + @pytest.mark.twog + @pytest.mark.wpa3_personal + def test_Captive_Portal_WPA3_2g_Personal_Bridge(self, request, get_vif_state, get_ap_logs, + get_APToMobileDevice_data, + setup_perfectoMobile_iOS): + + profile_data = setup_params_general["ssid_modes"]["wpa3_personal"][0] + ssidName = profile_data["ssid_name"] + ssidPassword = profile_data["security_key"] + print("SSID_NAME: " + ssidName) + print("SSID_PASS: " + ssidPassword) + get_vif_state.append(ssidName) + if ssidName not in get_vif_state: + allure.attach(name="retest,vif state ssid not available:", body=str(get_vif_state)) + pytest.xfail("SSID NOT AVAILABLE IN VIF STATE") + + report = setup_perfectoMobile_iOS[1] + driver = setup_perfectoMobile_iOS[0] + connData = get_APToMobileDevice_data + + # Set Wifi/AP Mode + ip, is_internet = captive_portal_ios(request, ssidName, ssidPassword, setup_perfectoMobile_iOS, connData) + if is_internet: + if ip: + text_body = ("connected to " + ssidName + " (" + ip + ") " + "with internet") + else: + text_body = ("connected to " + ssidName + "with Internet, couldn't get IP address") + print(text_body) + allure.attach(name="Connection Status: ", body=str(text_body)) + + assert verifyUploadDownloadSpeediOS(request, setup_perfectoMobile_iOS, connData) + wifi_disconnect_and_forget(request, ssidName, ssidPassword, setup_perfectoMobile_iOS, connData) + else: + allure.attach(name="Connection Status: ", body=str("No Internet access")) + assert False + + @allure.testcase(url="https://telecominfraproject.atlassian.net/browse/WIFI-5140", name="WIFI-5140") + @pytest.mark.sg123 + @pytest.mark.fiveg + @pytest.mark.wpa3_personal + def test_Captive_Portal_WPA3_5g_Personal_Bridge(self, request, get_vif_state, get_ap_logs, + get_APToMobileDevice_data, + setup_perfectoMobile_iOS): + + profile_data = setup_params_general["ssid_modes"]["wpa3_personal"][1] + ssidName = profile_data["ssid_name"] + ssidPassword = profile_data["security_key"] + print("SSID_NAME: " + ssidName) + print("SSID_PASS: " + ssidPassword) + get_vif_state.append(ssidName) + if ssidName not in get_vif_state: + allure.attach(name="retest,vif state ssid not available:", body=str(get_vif_state)) + pytest.xfail("SSID NOT AVAILABLE IN VIF STATE") + + report = setup_perfectoMobile_iOS[1] + driver = setup_perfectoMobile_iOS[0] + connData = get_APToMobileDevice_data + + # Set Wifi/AP Mode + ip, is_internet = captive_portal_ios(request, ssidName, ssidPassword, setup_perfectoMobile_iOS, connData) + if is_internet: + if ip: + text_body = ("connected to " + ssidName + " (" + ip + ") " + "with internet") + else: + text_body = ("connected to " + ssidName + "with Internet, couldn't get IP address") + print(text_body) + allure.attach(name="Connection Status: ", body=str(text_body)) + + assert verifyUploadDownloadSpeediOS(request, setup_perfectoMobile_iOS, connData) + wifi_disconnect_and_forget(request, ssidName, ssidPassword, setup_perfectoMobile_iOS, connData) + else: + allure.attach(name="Connection Status: ", body=str("No Internet access")) + assert False \ No newline at end of file diff --git a/tests/e2e/interOp/conftest.py b/tests/e2e/interOp/conftest.py index 34683de52..0244f2e7f 100644 --- a/tests/e2e/interOp/conftest.py +++ b/tests/e2e/interOp/conftest.py @@ -433,7 +433,6 @@ def setup_perfectoMobile_android(request): try: params = {'property': 'model'} deviceModel = driver.execute_script('mobile:handset:info', params) - device_name_list.append(deviceModel) except: pass @@ -600,7 +599,6 @@ def setup_perfectoMobile_iOS(request): try: params = {'property': 'model'} deviceModel = driver.execute_script('mobile:handset:info', params) - device_name_list.append(deviceModel) except: pass diff --git a/tests/fixtures_2x.py b/tests/fixtures_2x.py index d0ab38050..e5f0d7bb0 100644 --- a/tests/fixtures_2x.py +++ b/tests/fixtures_2x.py @@ -318,6 +318,39 @@ class Fixtures_2x: version_list.append(version) return version_list + def get_uci_show(self, get_apnos, get_configuration): + version_list = [] + for access_point_info in get_configuration['access_point']: + ap_ssh = get_apnos(access_point_info) + connectivity_data = ap_ssh.run_generic_command(cmd="uci show ucentral.config.server") + # connectivity_data.pop(0) + # connectivity_data.pop(1) + break + # version_list.append(connectivity_data) + return connectivity_data[1] + + def get_ap_status_logs(self, get_configuration, get_apnos): + connected = 0 + redirector_data = None + for access_point_info in get_configuration['access_point']: + ap_ssh = get_apnos(access_point_info, sdk="2.x") + # for i in range(15): + connectivity_data = ap_ssh.run_generic_command(cmd="ubus call ucentral status") + if "disconnected" in str(connectivity_data): + print("AP in disconnected state, sleeping for 30 sec") + # time.sleep(30) + connected = 0 + # # if i == 10: + # print("rebooting AP") + # ap_ssh.reboot() + # print("sleep for 300 sec") + # time.sleep(300) + else: + connected = 1 + + redirector_data = ap_ssh.run_generic_command(cmd="cat /etc/ucentral/redirector.json") + return connected, redirector_data + def get_sdk_version(self): version = self.controller_obj.get_sdk_version() return version @@ -509,6 +542,12 @@ class Fixtures_2x: print(e) test_cases["wpa_eap"] = False + try: + if parameter['express-wifi']: + instantiate_profile_obj.set_express_wifi() + except: + pass + ap_ssh = get_apnos(get_configuration['access_point'][0], pwd="../libs/apnos/", sdk="2.x") # Get ucentral status @@ -701,4 +740,3 @@ class Fixtures_2x: pytest.fail("AP is disconnected from UC Gateway") - diff --git a/tests/test_connectivity.py b/tests/test_connectivity.py index 726924c58..826458340 100644 --- a/tests/test_connectivity.py +++ b/tests/test_connectivity.py @@ -1,10 +1,12 @@ """ Test Case Module: Testing Basic Connectivity with Resources """ +import time import allure import pytest import requests +import json pytestmark = [pytest.mark.test_resources, pytest.mark.sanity, pytest.mark.uc_sanity, pytest.mark.sanity_55] @@ -17,26 +19,133 @@ class TestResources(object): @pytest.mark.test_cloud_controller @pytest.mark.uc_sanity @allure.testcase(name="test_controller_connectivity", url="") - def test_controller_connectivity(self, setup_controller): + def test_controller_connectivity(self, setup_controller, get_configuration): """Test case to verify cloud Controller Connectivity""" + login_response_json = setup_controller.login_resp.json() response_code = setup_controller.login_resp.status_code - allure.attach(name="Login Response Code", body=str(response_code)) - allure.attach(name="Login Response JSON", - body=str(login_response_json), - attachment_type=allure.attachment_type.JSON) - version = setup_controller.get_sdk_version() - print(version) - assert response_code == 200 + request_url = setup_controller.login_resp.request.url + print("Login_Request_URL: ", str(request_url)) + allure.attach(name="Login_Request_URL: ", body=str(request_url)) + print("response_code: ", response_code) + allure.attach(name="Login Response Code: ", body=str(response_code)) + print("login_response_json: ", login_response_json) + allure.attach(name="Login Response JSON: ", body=str(setup_controller.login_resp.json())) + if response_code != 200: + pytest.exit( + "exiting from pytest, login response is no 200: " + str(setup_controller.login_resp.status_code)) + + gw_system_info = setup_controller.get_system_gw() + request_url = gw_system_info.request.url + allure.attach(name="get_system_gw_request: ", body=str(request_url)) + gw_system_status = gw_system_info.status_code + gw_system_status_json = gw_system_info.json() + print("gw_status_check response from gateway: ", gw_system_status) + allure.attach(name="gw_status_check response from gateway: ", body=str(gw_system_status) + + str(gw_system_status_json)) + if gw_system_status != 200: + allure.attach(name="Login_Request_URL: ", body=str(request_url)) + pytest.exit("gw_status_check response from gateway: " + str(gw_system_status)) + + fms_system_info = setup_controller.get_system_fms() + request_url = fms_system_info.request.url + allure.attach(name="get_system_fms_request: ", body=str(request_url)) + fms_system_status = fms_system_info.status_code + fms_system_status_json = fms_system_info.json() + print("fms_status_check response from fms: ", fms_system_status) + allure.attach(name="fms_status_check response from fms:", body=str(fms_system_status) + + str(fms_system_status_json)) + if fms_system_status != 200: + pytest.exit("fms_status_check response from fms: " + str(fms_system_status)) + + # if gw_status_check != 200: + # for i in range(10): + # if setup_controller.get_system_gw().status_code != 200 and i < 9: + # print("sleeping for 30 sec, gw service is down with response not equals to 200") + # time.sleep(30) + # elif setup_controller.get_system_gw().status_code != 200 and i == 9: + # pytest.exit("GW service is not up yet, exiting from pytest") + # else: + # break + # + # if fms_status_check != 200: + # for i in range(10): + # if setup_controller.get_system_fms().status_code != 200 and i < 9: + # print("sleeping for 30 sec, fms service is down with response not equals to 200") + # time.sleep(30) + # elif setup_controller.get_system_fms().status_code != 200 and i == 9: + # pytest.exit("fms service is not up yet, exiting from pytest") + # else: + # break + # + # available_device_list = [] + # devices = setup_controller.get_devices() + # number_devices = len(devices["devices"]) + # for i in range(number_devices): + # available_device_list.append(devices["devices"][i]["serialNumber"]) + # print("available_device_list: ", available_device_list) + # + # if get_configuration["access_point"][0]["serial"] not in available_device_list: + # for i in range(10): + # available_device_list = [] + # devices = setup_controller.get_devices() + # number_devices = len(devices["devices"]) + # for i in range(number_devices): + # available_device_list.append(devices["devices"][i]["serialNumber"]) + # print(available_device_list) + # + # if get_configuration["access_point"][0]["serial"] not in available_device_list and i < 9: + # print("unable to find device on UI, Sleeping for 30 sec") + # time.sleep(30) + # elif get_configuration["access_point"][0]["serial"] not in available_device_list and i == 9: + # pytest.exit("Device" + get_configuration["access_point"][0]["serial"] + "not found on UI") + # else: + # break + # + # for ap in get_configuration['access_point']: + # + # ap_ssh = get_apnos(ap, pwd="../libs/apnos/", sdk="2.x") + # uci_show_ucentral = ap_ssh.run_generic_command("uci show ucentral") + # print(uci_show_ucentral) + # print("AP is pointing to: ", ap_ssh.get_ap_uci_show_ucentral()) + # expected_sdk = str(get_configuration["controller"]['url'].replace("https://sec", "\'gw").replace(":16001","\'")) + # if ap_ssh.get_ap_uci_show_ucentral() != expected_sdk: + # for i in range(10): + # ucentral_show = str(ap_ssh.get_ap_uci_show_ucentral().strip()) + # print("AP pointing to: ", ucentral_show) + # print("AP should point to: ", expected_sdk) + # + # if ucentral_show != expected_sdk and i < 9: + # print("AP is not pointing to right SDK, retry after 30 sec") + # time.sleep(30) + # elif ucentral_show != expected_sdk and i == 9: + # assert False + # pytest.exit("AP is not pointing to right SDK") + # else: + # break + + assert True @pytest.mark.test_access_points_connectivity @allure.testcase(name="test_access_points_connectivity", url="") - def test_access_points_connectivity(self, test_access_point, fixtures_ver): + def test_access_points_connectivity(self, setup_controller, get_uci_show, test_access_point, get_configuration, + test_ap_connection_status, fixtures_ver): """Test case to verify Access Points Connectivity""" data = [] for status in test_access_point: data.append(status[0]) + connection, redirector = test_ap_connection_status allure.attach(name="AP - Cloud connectivity info", body=str(fixtures_ver.ubus_connection)) + print("test_ap_connection_status: ", connection, redirector) + expected_sdk = str(get_configuration["controller"]['url'].replace("https://sec", "\'gw").replace(":16001", "\'")) + print("Expected SDK: ", expected_sdk) + allure.attach(name="Exoected SDK: ", body=str(expected_sdk)) + print("SDK On AP: ", str(get_uci_show.split("=")[1])) + allure.attach(name="SDK Pointed by AP: ", body=str(get_uci_show.split("=")[1])) + if expected_sdk not in get_uci_show: + pytest.exit("AP has invalid Redirector") + if test_ap_connection_status[0] == 0: + pytest.exit("AP in Disconnected State") assert False not in data @pytest.mark.traffic_generator_connectivity @@ -135,9 +244,12 @@ class TestFMS(object): assert False not in PASS @pytest.mark.firmware_upgrade - def test_firmware_upgrade_request(self, firmware_upgrade, get_ap_logs): + def test_firmware_upgrade_request(self, firmware_upgrade, get_ap_logs, test_ap_connection_status): for update in firmware_upgrade: allure.attach(name='serial: ' + update[0], body="") + if test_ap_connection_status[0] == 0: + assert False + pytest.exit("AP in Disconnected State") assert True @pytest.mark.test_firmware_ap diff --git a/tools/lf_tools.py b/tools/lf_tools.py deleted file mode 100644 index bb47ad288..000000000 --- a/tools/lf_tools.py +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/python3.9 -""" - - lf_tools : Tools for LANforge - reboot, run_cmd, etc - ./lf_tools --host 10.28.3.8 --port 22 --username root --password lanforge --action reboot - ./lf_tools --host 10.28.3.8 --port 22 --username root --password lanforge --action run_cmd --cmd ls - -""" -import argparse -import paramiko - - -class LFTools: - - def __init__(self, host="", port=22, username="root", password="lanforge"): - self.host = host - self.port = port - self.username = username - self.password = password - - def ssh_cli_connect(self): - client = paramiko.SSHClient() - client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) - print("Connecting to LANforge: %s@%s:%s" % ( - self.username, self.host, self.port)) - client.connect(self.host, username=self.username, password=self.password, - port=self.port, timeout=10, allow_agent=False, banner_timeout=200) - - return client - - def run_cmd(self, cmd): - client = self.ssh_cli_connect() - stdin, stdout, stderr = client.exec_command(cmd) - output = "Output: " + str(stdout.read()) - error = "Error: " + str(stderr.read()) - client.close() - return output, error - - def run_action(self, action, cmd): - if action == "reboot": - output, error = self.run_cmd("reboot") - print(output, error) - elif action == "run_cmd": - output, error = self.run_cmd(cmd) - print(output, error) - else: - print("Invalid Action") - - -def main(): - parser = argparse.ArgumentParser(prog="lf_utils", - formatter_class=argparse.RawTextHelpFormatter, - allow_abbrev=True, - epilog="About lf_tools.py", - description="Tools for LANforge System") - parser.add_argument('--host', type=str, help=' --host : IP Address f LANforge System', default="localhost") - parser.add_argument('--port', type=int, help='--passwd of dut', default=22) - parser.add_argument('--username', type=str, help='--username to use on LANforge', default="root") - parser.add_argument('--password', type=str, help='--password to the given username', default="lanforge") - parser.add_argument('--action', type=str, help='--action to perform' - 'reboot | run_cmd', default="run_cmd") - parser.add_argument('--cmd', type=str, help='--cmd : used when action is "run_cmd"', default="pwd") - args = parser.parse_args() - lf_tools = LFTools(host=args.host, port=args.port, username=args.username, password=args.password) - lf_tools.run_action(args.action, args.cmd) - - -if __name__ == '__main__': - main() diff --git a/tools/scp_util.py b/tools/scp_util.py new file mode 100755 index 000000000..3b2c53177 --- /dev/null +++ b/tools/scp_util.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +import argparse + +import paramiko +from scp import SCPClient + + +class SCP_File: + def __init__(self, ip="localhost", port=22, username="lanforge", password="lanforge", remote_path="/home/lanforge/", + local_path="."): + self.ip = ip + self.port = port + self.remote_path = remote_path + self.local_path = local_path + self.username = username + self.password = password + + def pull_file(self): + ssh = paramiko.SSHClient() + ssh.load_system_host_keys() + ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + ssh.connect(hostname=self.ip, username=self.username, password=self.password, port=self.port, allow_agent=False, + look_for_keys=False) + # ssh.close() + + with SCPClient(ssh.get_transport()) as scp: + scp.get(remote_path=self.remote_path, local_path=self.local_path, recursive=True) + scp.close() + + +def main(): + parser = argparse.ArgumentParser(prog="lf_utils", + formatter_class=argparse.RawTextHelpFormatter, + allow_abbrev=True, + epilog="About lf_tools.py", + description="Tools for LANforge System") + parser.add_argument('--host', type=str, help=' --host : IP Address f LANforge System', default="localhost") + parser.add_argument('--port', type=int, help='--passwd of dut', default=22) + parser.add_argument('--username', type=str, help='--username to use on LANforge', default="lanforge") + parser.add_argument('--password', type=str, help='--password to use on LANforge', default="lanforge") + parser.add_argument('--remote_path', type=str, help='--password to the given username', + default="/home/lanforge/lf_kinstall.pl") + parser.add_argument('--local_path', type=str, help='--action to perform' + 'reboot | run_cmd', default=".") + args = parser.parse_args() + lf_tools = SCP_File(ip=args.host, port=args.port, + username=args.username, password=args.password, + remote_path=args.remote_path, local_path=args.local_path) + lf_tools.pull_file() + + + + +if __name__ == '__main__': + main()