# Copyright (c) Microsoft. All rights reserved.
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
schedules:
- cron: "0 0 * * *"
  displayName: Daily midnight build
  branches:
    include:
    - main

variables:
  ClientLibrary.Repo: $(Build.Repository.Uri)
  ClientLibrary.Commit: $(Build.SourceBranch)
  ClientLibrary.FrameworkRoot: $(Build.SourcesDirectory)

jobs:
- job: Cross_Compile
  pool:
    vmImage: ubuntu-20.04
  steps:
  - task: UsePythonVersion@0
    inputs:
      versionSpec: '3.x'
      architecture: 'x64'

  - script: |
      python3 -m pip install -r $(ClientLibrary.FrameworkRoot)/jenkins/raspberrypi/pyscripts/requirements.txt
    displayName: "pip install requirements.txt"
    condition: succeeded()

  - powershell: |
      $NormalizedRepo=$env:Repo
      if ($NormalizedRepo -like 'https://github.com/*') {
        $NormalizedRepo=$NormalizedRepo.Substring('https://github.com/'.length)
      }
      $IsPr = "no"
      $CommitToPass = $env:Commit
      if ("$env:SYSTEM_PULLREQUEST_TARGETBRANCH" -ne "") {
        $CommitToPass = $env:SYSTEM_PULLREQUEST_TARGETBRANCH
        $IsPr = "yes"
      }
      Write-Host "##vso[task.setvariable variable=normalizedRepo]${NormalizedRepo}"
      Write-Host "##vso[task.setvariable variable=IsPr]${IsPr}"
      Write-Host "##vso[task.setvariable variable=CommitToPass]${CommitToPass}"
      Write-Host "normalizedRepo=${NormalizedRepo}"
      Write-Host "IsPr=${IsPr}"
      Write-Host "CommitToPass=${CommitToPass}"
      Write-Host "$env:SYSTEM_PULLREQUEST_TARGETBRANCH"
    displayName: Custom task execution logic
    env:
      Commit: $(ClientLibrary.Commit)
      Repo: $(ClientLibrary.Repo)
    ignoreLASTEXITCODE: false
    errorActionPreference: Stop
    failOnStderr: true

  - script: |
      cd $(Build.SourcesDirectory) &&
      echo "saving patch from ${CommitToPass} to HEAD" &&
      git diff -p origin/${CommitToPass} --binary > ${AGENT_BUILDDIRECTORY}/patchfile &&
      mkdir -p $(Build.ArtifactStagingDirectory)/raspi-c &&
      cp ${AGENT_BUILDDIRECTORY}/patchfile $(Build.ArtifactStagingDirectory)/raspi-c &&
      mv ${AGENT_BUILDDIRECTORY}/patchfile ${CLIENTLIBRARY_FRAMEWORKROOT}/jenkins/raspberrypi
    displayName: "pack local language repo"
    condition: and(
      succeeded(),
      eq(variables['IsPr'],'yes'))
    env:
      CommitToPass: $(CommitToPass)

  - script: |
      python3 $(ClientLibrary.FrameworkRoot)/jenkins/raspberrypi/pyscripts/build_docker_image.py --repo ${NormalizedRepo}  --commit $(CommitToPass)
    displayName: "build raspi-c docker image"
    condition: succeeded()
    env:
      AZURECR_REPO_ADDRESS: $(IOTHUB-E2E-REPO-ADDRESS)
      AZURECR_REPO_USER: $(IOTHUB-E2E-REPO-USER)
      AZURECR_REPO_PASSWORD: $(IOTHUB-E2E-REPO-PASSWORD)
      NormalizedRepo: $(NormalizedRepo)
      CommitToPass: $(CommitToPass)

  - task: ExtractFiles@1
    inputs:
      archiveFilePatterns: '*.tar'
      destinationFolder: '$(Build.SourcesDirectory)/source_artifacts'

  - script: |
      cd $(Build.SourcesDirectory)/source_artifacts/
      ls -al
    displayName: "list Build.SourcesDirectory"

  - script: |
      find $(Build.SourcesDirectory)/source_artifacts/ -type f | grep -i e2e_exe$ | xargs -i cp {} $(Build.ArtifactStagingDirectory)
    displayName: "Copy Files Manually"

  - task: PublishBuildArtifacts@1
    displayName: 'Publish Artifacts: drop'
    inputs:
      pathtoPublish: '$(Build.ArtifactStagingDirectory)'
      artifactName: 'drop'
      publishLocation: 'Container'
    condition: succeeded()

- job: 'Run_AMQP_DT_E2E_Test'
  dependsOn: Cross_Compile
  #disable raspberrypi jobs until raspberrypi image is rebuilt
  #condition: succeeded()
  condition: 'false'
  pool: 
    name: devicelab-02
  steps:  
  - task: DownloadBuildArtifacts@0
    displayName: 'Download Build Artifacts'
    inputs:
      artifactName: drop
      itemPattern: 'drop/**/*e2e_exe'

  - script: |
      cd $(Build.SourcesDirectory)/testtools/UART_interface/
      ls
      . rpi_e2e_env_setup.sh
      python3 serial_connect.py -i setup.txt -o output.txt -b 115200 -p $(RASPI_PORT) -d rpi
      rm setup.txt
    displayName: 'Setup Environment Variables'
    env:
      RASPI_USER: $(RASPI_USER)
      RASPI_PWD: $(RASPI_PWD)
      RASPI_PORT: $(RASPI_PORT)
      IOTHUB_CONNECTION_STRING: $(IOTHUB-CONNECTION-STRING)
      IOTHUB_EVENTHUB_CONNECTION_STRING: $(IOTHUB-EVENTHUB-CONNECTION-STRING)
      IOTHUB_E2E_X509_CERT_BASE64: $(IOTHUB-E2E-X509-CERT-BASE64)
      IOTHUB_E2E_X509_PRIVATE_KEY_BASE64: $(IOTHUB-E2E-X509-PRIVATE-KEY-BASE64)
      IOTHUB_E2E_X509_THUMBPRINT: $(IOTHUB-E2E-X509-THUMBPRINT)
      IOTHUB_POLICY_KEY: $(IOTHUB-POLICY-KEY)
      STORAGE_ACCOUNT_CONNECTION_STRING: $(STORAGE-ACCOUNT-CONNECTION-STRING)
      IOT_DPS_CONNECTION_STRING: $(IOT-DPS-CONNECTION-STRING)
      IOT_DPS_ID_SCOPE: $(IOT-DPS-ID-SCOPE)
      IOTHUB_CA_ROOT_CERT: $(IOTHUB-CA-ROOT-CERT)
      IOTHUB_CA_ROOT_CERT_KEY: $(IOTHUB-CA-ROOT-CERT-KEY)
      IOT_DPS_GLOBAL_ENDPOINT: $(IOT-DPS-GLOBAL-ENDPOINT)
      IOTHUB_DEVICE_CONN_STRING_INVALIDCERT: $(IOTHUB-DEVICE-CONN-STRING-INVALIDCERT)
      IOTHUB_CONN_STRING_INVALIDCERT: $(IOTHUB-CONN-STRING-INVALIDCERT)
      DPS_GLOBALDEVICEENDPOINT_INVALIDCERT: $(DPS-GLOBALDEVICEENDPOINT-INVALIDCERT)
      PROVISIONING_CONNECTION_STRING_INVALIDCERT: $(PROVISIONING-CONNECTION-STRING-INVALIDCERT)

  - script: |
      cd $(Build.ArtifactStagingDirectory)
      ls
      echo $(NEWTIN) | sudo -S chmod -R 777 drop
      echo $(NEWTIN) | sudo -S setcap cap_net_raw,cap_net_admin+ep drop/$RASPI_TEST_FILE
      cp drop/$RASPI_TEST_FILE $(Build.SourcesDirectory)/testtools/UART_interface/
      cd $(Build.SourcesDirectory)/testtools/UART_interface/
      ls
      . rpi_input.sh
      python3 serial_connect.py -i input.txt -o output.txt -b 115200 -p $(RASPI_PORT) -d rpi -t 620 $(RESET_RASPI) -s
      rm input.txt
      unset RASPI_TEST_FILE
      
    displayName: 'Execute Test'
    env:
      RASPI_USER: $(RASPI_USER)
      RASPI_PWD: $(RASPI_PWD)
      RASPI_PORT: $(RASPI_PORT)
      RASPI_TEST_FILE: iothubclient_amqp_dt_e2e_exe
      RASPI_SERIAL_TASK: $(RASPI_SERIAL_TASK)
      RESET_RASPI: $(RESET_RASPI)

- job: 'Run_MQTT_DT_E2E_Test'
  dependsOn: Cross_Compile
  #disable raspberrypi jobs until raspberrypi image is rebuilt
  #condition: succeeded()
  condition: 'false'
  pool: 
    name: devicelab-02
  steps:  
  - task: DownloadBuildArtifacts@0
    displayName: 'Download Build Artifacts'
    inputs:
      artifactName: drop
      itemPattern: 'drop/**/*e2e_exe'

  - script: |
      cd $(Build.SourcesDirectory)/testtools/UART_interface/
      ls
      . rpi_e2e_env_setup.sh
      python3 serial_connect.py -i setup.txt -o output.txt -b 115200 -p $(RASPI_PORT) -d rpi
      rm setup.txt
    displayName: 'Setup Environment Variables'
    env:
      RASPI_USER: $(RASPI_USER)
      RASPI_PWD: $(RASPI_PWD)
      RASPI_PORT: $(RASPI_PORT)
      IOTHUB_CONNECTION_STRING: $(IOTHUB-CONNECTION-STRING)
      IOTHUB_EVENTHUB_CONNECTION_STRING: $(IOTHUB-EVENTHUB-CONNECTION-STRING)
      IOTHUB_E2E_X509_CERT_BASE64: $(IOTHUB-E2E-X509-CERT-BASE64)
      IOTHUB_E2E_X509_PRIVATE_KEY_BASE64: $(IOTHUB-E2E-X509-PRIVATE-KEY-BASE64)
      IOTHUB_E2E_X509_THUMBPRINT: $(IOTHUB-E2E-X509-THUMBPRINT)
      IOTHUB_POLICY_KEY: $(IOTHUB-POLICY-KEY)
      STORAGE_ACCOUNT_CONNECTION_STRING: $(STORAGE-ACCOUNT-CONNECTION-STRING)
      IOT_DPS_CONNECTION_STRING: $(IOT-DPS-CONNECTION-STRING)
      IOT_DPS_ID_SCOPE: $(IOT-DPS-ID-SCOPE)
      IOTHUB_CA_ROOT_CERT: $(IOTHUB-CA-ROOT-CERT)
      IOTHUB_CA_ROOT_CERT_KEY: $(IOTHUB-CA-ROOT-CERT-KEY)
      IOT_DPS_GLOBAL_ENDPOINT: $(IOT-DPS-GLOBAL-ENDPOINT)
      IOTHUB_DEVICE_CONN_STRING_INVALIDCERT: $(IOTHUB-DEVICE-CONN-STRING-INVALIDCERT)
      IOTHUB_CONN_STRING_INVALIDCERT: $(IOTHUB-CONN-STRING-INVALIDCERT)
      DPS_GLOBALDEVICEENDPOINT_INVALIDCERT: $(DPS-GLOBALDEVICEENDPOINT-INVALIDCERT)
      PROVISIONING_CONNECTION_STRING_INVALIDCERT: $(PROVISIONING-CONNECTION-STRING-INVALIDCERT)

  - script: |
      cd $(Build.ArtifactStagingDirectory)
      ls
      echo $(NEWTIN) | sudo -S chmod -R 777 drop
      echo $(NEWTIN) | sudo -S setcap cap_net_raw,cap_net_admin+ep drop/$RASPI_TEST_FILE
      cp drop/$RASPI_TEST_FILE $(Build.SourcesDirectory)/testtools/UART_interface/
      cd $(Build.SourcesDirectory)/testtools/UART_interface/
      ls
      . rpi_input.sh
      python3 serial_connect.py -i input.txt -o output.txt -b 115200 -p $(RASPI_PORT) -d rpi -t 620 $(RESET_RASPI)
      rm input.txt
      unset RASPI_TEST_FILE
    displayName: 'Execute Test'
    env:
      RASPI_USER: $(RASPI_USER)
      RASPI_PWD: $(RASPI_PWD)
      RASPI_PORT: $(RASPI_PORT)
      RASPI_TEST_FILE: iothubclient_mqtt_dt_e2e_exe
      RASPI_SERIAL_TASK: $(RASPI_SERIAL_TASK)
      RESET_RASPI: $(RESET_RASPI)

- job: 'Run_AMQP_DM_E2E_Test'
  dependsOn: Cross_Compile
  #disable raspberrypi jobs until raspberrypi image is rebuilt
  #condition: succeeded()
  condition: 'false'
  pool: 
    name: devicelab-02
  steps:  
  - task: DownloadBuildArtifacts@0
    displayName: 'Download Build Artifacts'
    inputs:
      artifactName: drop
      itemPattern: 'drop/**/*e2e_exe'

  - script: |
      cd $(Build.SourcesDirectory)/testtools/UART_interface/
      ls
      . rpi_e2e_env_setup.sh
      python3 serial_connect.py -i setup.txt -o output.txt -b 115200 -p $(RASPI_PORT) -d rpi
      rm setup.txt
    displayName: 'Setup Environment Variables'
    env:
      RASPI_USER: $(RASPI_USER)
      RASPI_PWD: $(RASPI_PWD)
      RASPI_PORT: $(RASPI_PORT)
      IOTHUB_CONNECTION_STRING: $(IOTHUB-CONNECTION-STRING)
      IOTHUB_EVENTHUB_CONNECTION_STRING: $(IOTHUB-EVENTHUB-CONNECTION-STRING)
      IOTHUB_E2E_X509_CERT_BASE64: $(IOTHUB-E2E-X509-CERT-BASE64)
      IOTHUB_E2E_X509_PRIVATE_KEY_BASE64: $(IOTHUB-E2E-X509-PRIVATE-KEY-BASE64)
      IOTHUB_E2E_X509_THUMBPRINT: $(IOTHUB-E2E-X509-THUMBPRINT)
      IOTHUB_POLICY_KEY: $(IOTHUB-POLICY-KEY)
      STORAGE_ACCOUNT_CONNECTION_STRING: $(STORAGE-ACCOUNT-CONNECTION-STRING)
      IOT_DPS_CONNECTION_STRING: $(IOT-DPS-CONNECTION-STRING)
      IOT_DPS_ID_SCOPE: $(IOT-DPS-ID-SCOPE)
      IOTHUB_CA_ROOT_CERT: $(IOTHUB-CA-ROOT-CERT)
      IOTHUB_CA_ROOT_CERT_KEY: $(IOTHUB-CA-ROOT-CERT-KEY)
      IOT_DPS_GLOBAL_ENDPOINT: $(IOT-DPS-GLOBAL-ENDPOINT)
      IOTHUB_DEVICE_CONN_STRING_INVALIDCERT: $(IOTHUB-DEVICE-CONN-STRING-INVALIDCERT)
      IOTHUB_CONN_STRING_INVALIDCERT: $(IOTHUB-CONN-STRING-INVALIDCERT)
      DPS_GLOBALDEVICEENDPOINT_INVALIDCERT: $(DPS-GLOBALDEVICEENDPOINT-INVALIDCERT)
      PROVISIONING_CONNECTION_STRING_INVALIDCERT: $(PROVISIONING-CONNECTION-STRING-INVALIDCERT)

  - script: |
      cd $(Build.ArtifactStagingDirectory)
      ls
      echo $(NEWTIN) | sudo -S chmod -R 777 drop
      echo $(NEWTIN) | sudo -S setcap cap_net_raw,cap_net_admin+ep drop/$RASPI_TEST_FILE
      cp drop/$RASPI_TEST_FILE $(Build.SourcesDirectory)/testtools/UART_interface/
      cd $(Build.SourcesDirectory)/testtools/UART_interface/
      ls
      . rpi_input.sh
      python3 serial_connect.py -i input.txt -o output.txt -b 115200 -p $(RASPI_PORT) -d rpi -t 720 $(RESET_RASPI)
      rm input.txt
      unset RASPI_TEST_FILE
    displayName: 'Execute Test'
    env:
      RASPI_USER: $(RASPI_USER)
      RASPI_PWD: $(RASPI_PWD)
      RASPI_PORT: $(RASPI_PORT)
      RASPI_TEST_FILE: iothubclient_amqp_device_method_e2e_exe
      RASPI_SERIAL_TASK: $(RASPI_SERIAL_TASK)
      RESET_RASPI: $(RESET_RASPI)

- job: 'Run_MQTT_DM_E2E_Test'
  dependsOn: Cross_Compile
  #disable raspberrypi jobs until raspberrypi image is rebuilt
  #condition: succeeded()
  condition: 'false'
  pool: 
    name: devicelab-02
  steps:  
  - task: DownloadBuildArtifacts@0
    displayName: 'Download Build Artifacts'
    inputs:
      artifactName: drop
      itemPattern: 'drop/**/*e2e_exe'

  - script: |
      cd $(Build.SourcesDirectory)/testtools/UART_interface/
      ls
      . rpi_e2e_env_setup.sh
      python3 serial_connect.py -i setup.txt -o output.txt -b 115200 -p $(RASPI_PORT) -d rpi
      rm setup.txt
    displayName: 'Setup Environment Variables'
    env:
      RASPI_USER: $(RASPI_USER)
      RASPI_PWD: $(RASPI_PWD)
      RASPI_PORT: $(RASPI_PORT)
      IOTHUB_CONNECTION_STRING: $(IOTHUB-CONNECTION-STRING)
      IOTHUB_EVENTHUB_CONNECTION_STRING: $(IOTHUB-EVENTHUB-CONNECTION-STRING)
      IOTHUB_E2E_X509_CERT_BASE64: $(IOTHUB-E2E-X509-CERT-BASE64)
      IOTHUB_E2E_X509_PRIVATE_KEY_BASE64: $(IOTHUB-E2E-X509-PRIVATE-KEY-BASE64)
      IOTHUB_E2E_X509_THUMBPRINT: $(IOTHUB-E2E-X509-THUMBPRINT)
      IOTHUB_POLICY_KEY: $(IOTHUB-POLICY-KEY)
      STORAGE_ACCOUNT_CONNECTION_STRING: $(STORAGE-ACCOUNT-CONNECTION-STRING)
      IOT_DPS_CONNECTION_STRING: $(IOT-DPS-CONNECTION-STRING)
      IOT_DPS_ID_SCOPE: $(IOT-DPS-ID-SCOPE)
      IOTHUB_CA_ROOT_CERT: $(IOTHUB-CA-ROOT-CERT)
      IOTHUB_CA_ROOT_CERT_KEY: $(IOTHUB-CA-ROOT-CERT-KEY)
      IOT_DPS_GLOBAL_ENDPOINT: $(IOT-DPS-GLOBAL-ENDPOINT)
      IOTHUB_DEVICE_CONN_STRING_INVALIDCERT: $(IOTHUB-DEVICE-CONN-STRING-INVALIDCERT)
      IOTHUB_CONN_STRING_INVALIDCERT: $(IOTHUB-CONN-STRING-INVALIDCERT)
      DPS_GLOBALDEVICEENDPOINT_INVALIDCERT: $(DPS-GLOBALDEVICEENDPOINT-INVALIDCERT)
      PROVISIONING_CONNECTION_STRING_INVALIDCERT: $(PROVISIONING-CONNECTION-STRING-INVALIDCERT)

  - script: |
      cd $(Build.ArtifactStagingDirectory)
      ls
      echo $(NEWTIN) | sudo -S chmod -R 777 drop
      echo $(NEWTIN) | sudo -S setcap cap_net_raw,cap_net_admin+ep drop/$RASPI_TEST_FILE
      cp drop/$RASPI_TEST_FILE $(Build.SourcesDirectory)/testtools/UART_interface/
      cd $(Build.SourcesDirectory)/testtools/UART_interface/
      ls
      . rpi_input.sh
      python3 serial_connect.py -i input.txt -o output.txt -b 115200 -p $(RASPI_PORT) -d rpi -t 620 $(RESET_RASPI)
      rm input.txt
      unset RASPI_TEST_FILE
    displayName: 'Execute Test'
    env:
      RASPI_USER: $(RASPI_USER)
      RASPI_PWD: $(RASPI_PWD)
      RASPI_PORT: $(RASPI_PORT)
      RASPI_TEST_FILE: iothubclient_mqtt_device_method_e2e_exe
      RASPI_SERIAL_TASK: $(RASPI_SERIAL_TASK)
      RESET_RASPI: $(RESET_RASPI)

- job: 'Run_EXTRA_Test'
  dependsOn: Cross_Compile
  # Disabling extra task for now until feedback on use of Library Variables in conditional statements
  condition: 'false'
  pool: 
    name: devicelab-02
  steps:
  - task: DownloadBuildArtifacts@0
    displayName: 'Download Build Artifacts'
    inputs:
      artifactName: drop
      itemPattern: 'drop/**/*e2e_exe'

  - script: |
      cd $(Build.SourcesDirectory)/testtools/UART_interface/
      ls
      . rpi_e2e_env_setup.sh
      python3 serial_connect.py -i setup.txt -o output.txt -b 115200 -p $(RASPI_PORT) -d rpi
      rm setup.txt
    displayName: 'Setup Environment Variables'
    env:
      RASPI_USER: $(RASPI_USER)
      RASPI_PWD: $(RASPI_PWD)
      RASPI_PORT: $(RASPI_PORT)
      IOTHUB_CONNECTION_STRING: $(IOTHUB-CONNECTION-STRING)
      IOTHUB_EVENTHUB_CONNECTION_STRING: $(IOTHUB-EVENTHUB-CONNECTION-STRING)
      IOTHUB_E2E_X509_CERT_BASE64: $(IOTHUB-E2E-X509-CERT-BASE64)
      IOTHUB_E2E_X509_PRIVATE_KEY_BASE64: $(IOTHUB-E2E-X509-PRIVATE-KEY-BASE64)
      IOTHUB_E2E_X509_THUMBPRINT: $(IOTHUB-E2E-X509-THUMBPRINT)
      IOTHUB_POLICY_KEY: $(IOTHUB-POLICY-KEY)
      STORAGE_ACCOUNT_CONNECTION_STRING: $(STORAGE-ACCOUNT-CONNECTION-STRING)
      IOT_DPS_CONNECTION_STRING: $(IOT-DPS-CONNECTION-STRING)
      IOT_DPS_ID_SCOPE: $(IOT-DPS-ID-SCOPE)
      IOTHUB_CA_ROOT_CERT: $(IOTHUB-CA-ROOT-CERT)
      IOTHUB_CA_ROOT_CERT_KEY: $(IOTHUB-CA-ROOT-CERT-KEY)
      IOT_DPS_GLOBAL_ENDPOINT: $(IOT-DPS-GLOBAL-ENDPOINT)
      IOTHUB_DEVICE_CONN_STRING_INVALIDCERT: $(IOTHUB-DEVICE-CONN-STRING-INVALIDCERT)
      IOTHUB_CONN_STRING_INVALIDCERT: $(IOTHUB-CONN-STRING-INVALIDCERT)
      DPS_GLOBALDEVICEENDPOINT_INVALIDCERT: $(DPS-GLOBALDEVICEENDPOINT-INVALIDCERT)
      PROVISIONING_CONNECTION_STRING_INVALIDCERT: $(PROVISIONING-CONNECTION-STRING-INVALIDCERT)

  - script: |
      cd $(Build.ArtifactStagingDirectory)
      ls
      echo $(NEWTIN) | sudo -S chmod -R 777 drop
      echo $(NEWTIN) | sudo -S setcap cap_net_raw,cap_net_admin+ep drop/$RASPI_TEST_FILE
      cp drop/$RASPI_TEST_FILE $(Build.SourcesDirectory)/testtools/UART_interface/
      cd $(Build.SourcesDirectory)/testtools/UART_interface/
      ls
      . rpi_input.sh
      python3 serial_connect.py -i input.txt -o output.txt -b 115200 -p $(RASPI_PORT) -d rpi -t 620 $(RESET_RASPI)
      rm input.txt
      unset RASPI_TEST_FILE
    displayName: 'Execute Test'
    env:
      RASPI_USER: $(RASPI_USER)
      RASPI_PWD: $(RASPI_PWD)
      RASPI_PORT: $(RASPI_PORT)
      RASPI_TEST_FILE: $(RASPI_TEST_FILE)
      RASPI_SERIAL_TASK: $(RASPI_SERIAL_TASK)
      RESET_RASPI: $(RESET_RASPI)
