Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[test] CI pipeline for automated tests. #56

Merged
merged 24 commits into from
Oct 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
def8b1c
First attemp to implement test automation CI.
Fabricio-ESP Oct 3, 2024
222851c
Fix guthub actions name.
Fabricio-ESP Oct 3, 2024
a4351c2
Adding trigger to autotest ci
Fabricio-ESP Oct 3, 2024
f1d8ec9
Adding fixes to the CI script.
Fabricio-ESP Oct 3, 2024
40ddafb
Fix to test results file path.
Fabricio-ESP Oct 3, 2024
3f1bb3d
Add test results publish step
Fabricio-ESP Oct 3, 2024
016ca52
Enabled all tests.
Fabricio-ESP Oct 3, 2024
c2d1e04
(test commit) Added debug messages, rearrange test
Fabricio-ESP Oct 3, 2024
a7e17cb
rename artifacts
Fabricio-ESP Oct 3, 2024
4c6c0f7
Change archive extract for windows
Fabricio-ESP Oct 3, 2024
bc63b4e
Fix archive extract for linux
Fabricio-ESP Oct 3, 2024
ed25372
Increase Logging and debug workflow.
Fabricio-ESP Oct 4, 2024
29e46c7
Enabling eim verbose mode.
Fabricio-ESP Oct 4, 2024
4807d20
Disabling windows runner.
Fabricio-ESP Oct 4, 2024
f614584
Re-enable windows runner for debug.
Fabricio-ESP Oct 4, 2024
7366536
Transfer test command to workflow file
Fabricio-ESP Oct 4, 2024
7552e9a
Fix env variable writing.
Fabricio-ESP Oct 4, 2024
be89bac
Fix Path
Fabricio-ESP Oct 4, 2024
d924da6
Re-enable all tests
Fabricio-ESP Oct 4, 2024
238e0c3
Install ninja on windows as prerequisite
Fabricio-ESP Oct 4, 2024
2294b5b
Remove all prerequisites test
Fabricio-ESP Oct 4, 2024
13571d3
Re-enable CI Build job, remove debug msgs
Fabricio-ESP Oct 4, 2024
0628874
Fix artifact extract step.
Fabricio-ESP Oct 4, 2024
b353e10
Improve results publishing in github
Fabricio-ESP Oct 4, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
297 changes: 297 additions & 0 deletions .github/workflows/build_and_test.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,297 @@
name: Autotest

on:
pull_request:
branches:
- autotest
workflow_dispatch:

jobs:
build:
name: Build for multiple platforms
runs-on: ${{ matrix.os }}
strategy:
matrix:
# os: [ubuntu-latest, windows-latest, macos-latest, macos-12]
os: [ubuntu-latest, windows-latest]

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set up Rust
uses: actions-rs/toolchain@v1
with:
toolchain: stable
override: true

- name: Install OpenSSL (Windows)
if: runner.os == 'Windows'
shell: powershell
run: |
echo "VCPKG_ROOT=$env:VCPKG_INSTALLATION_ROOT" | Out-File -FilePath $env:GITHUB_ENV -Append
vcpkg install openssl:x64-windows-static-md

- name: Install OpenSSL (Macos)
if: matrix.os == 'macos-latest'
run: brew install openssl

- name: Cache cargo registry
uses: actions/cache@v4
with:
path: ~/.cargo/registry
key: ${{ runner.os }}-cargo-registry
restore-keys: |
${{ runner.os }}-cargo-registry

- name: Cache cargo index
uses: actions/cache@v4
with:
path: ~/.cargo/git
key: ${{ runner.os }}-cargo-index
restore-keys: |
${{ runner.os }}-cargo-index

- name: Build
run: cargo build --release

# - name: Run tests
# run: cargo test --release

- name: Create release directory
run: mkdir -p release

- name: Create release system directory
run: mkdir -p release/${{ matrix.os }}

- name: Copy binary to release directory Windows
if: matrix.os == 'windows-latest'
run: cp target/release/idf-im-cli.exe release/${{ matrix.os }}/eim.exe

- name: Copy binary to release directory POSIX
if: matrix.os != 'windows-latest'
run: |
cp target/release/idf-im-cli release/${{ matrix.os }}/eim
chmod +x release/${{ matrix.os }}/eim

- name: Codesign macOS eim executables
if: startsWith(matrix.os, 'macos')
env:
MACOS_CERTIFICATE: ${{ secrets.MACOS_CERTIFICATE }}
MACOS_CERTIFICATE_PWD: ${{ secrets.MACOS_CERTIFICATE_PWD }}
run: |
echo $MACOS_CERTIFICATE | base64 --decode > certificate.p12
/usr/bin/security create-keychain -p espressif build.keychain
/usr/bin/security default-keychain -s build.keychain
/usr/bin/security unlock-keychain -p espressif build.keychain
/usr/bin/security import certificate.p12 -k build.keychain -P $MACOS_CERTIFICATE_PWD -T /usr/bin/codesign
/usr/bin/security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k espressif build.keychain

/usr/bin/codesign --entitlements eim.entitlement --options runtime --force -s "ESPRESSIF SYSTEMS (SHANGHAI) CO., LTD. (QWXF6GB4AV)" release/${{ matrix.os }}/eim -v
/usr/bin/codesign -v -vvv --deep release/${{ matrix.os }}/eim

- name: Zip eim executable for notarization
if: startsWith(matrix.os, 'macos')
run: |
cd release/${{ matrix.os }}
zip -r eim.zip eim

- name: Notarization of macOS eim executables
# && github.ref == 'refs/heads/master'
if: startsWith(matrix.os, 'macos')
env:
NOTARIZATION_USERNAME: ${{ secrets.NOTARIZATION_USERNAME }}
NOTARIZATION_PASSWORD: ${{ secrets.NOTARIZATION_PASSWORD }}
NOTARIZATION_TEAM_ID: ${{ secrets.NOTARIZATION_TEAM_ID }}
run: |
echo "Create notary keychain"
/usr/bin/security create-keychain -p espressif notary.keychain
/usr/bin/security default-keychain -s notary.keychain
/usr/bin/security unlock-keychain -p espressif notary.keychain

echo "Create keychain profile"
xcrun notarytool store-credentials "eim-notarytool-profile" --apple-id $NOTARIZATION_USERNAME --team-id $NOTARIZATION_TEAM_ID --password $NOTARIZATION_PASSWORD
xcrun notarytool submit release/${{ matrix.os }}/eim.zip --keychain-profile "eim-notarytool-profile" --wait

echo "Unzipping the executable"
unzip -o release/${{ matrix.os }}/eim.zip -d release/${{ matrix.os }}

# echo "Attach staple for eim executable"
# xcrun stapler staple release/${{ matrix.os }}/eim

- name: Zip artifacts (Windows)
if: matrix.os == 'windows-latest'
run: |
cd release/${{ matrix.os }}
7z a -tzip eim.zip eim.exe

- name: Zip artifacts (POSIX)
if: matrix.os != 'windows-latest'
run: |
cd release/${{ matrix.os }}
zip -r eim.zip eim

- name: Upload build artifacts
uses: actions/upload-artifact@v4
with:
name: eim-${{ github.run_id }}-${{ matrix.os }}
path: release/${{ matrix.os }}/eim.zip

- name: Upload artifact for tag
if: startsWith(github.ref, 'refs/tags/')
uses: actions/upload-artifact@v4
with:
name: eim-${{ github.ref_name }}-${{ matrix.os }}
path: release/${{ matrix.os }}/eim.zip

- name: Upload Release Asset
if: github.event_name == 'release' && github.event.action == 'created'
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ github.event.release.upload_url }}
asset_path: release/${{ matrix.os }}/eim.zip
asset_name: eim-${{ github.ref_name }}-${{ matrix.os }}.zip
asset_content_type: application/zip

- name: Create aarch64-linux build
if: matrix.os == 'ubuntu-latest'
run: |
rustup target add aarch64-unknown-linux-gnu
cargo install cross
cross build --target aarch64-unknown-linux-gnu --release
mkdir -p release/aarch64-unknown-linux-gnu
cp target/aarch64-unknown-linux-gnu/release/idf-im-cli release/aarch64-unknown-linux-gnu/eim
chmod +x release/aarch64-unknown-linux-gnu/eim
cd release/aarch64-unknown-linux-gnu
zip -r eim.zip eim

- name: Upload build artifacts for aarch64-linux
uses: actions/upload-artifact@v4
if: matrix.os == 'ubuntu-latest'
with:
name: eim-${{ github.run_id }}-linux-arm64
path: release/aarch64-unknown-linux-gnu/eim.zip

- name: Upload artifact for tag on aarch64-linux
if: startsWith(github.ref, 'refs/tags/') && runner.os == 'Linux'
uses: actions/upload-artifact@v4
with:
name: eim-${{ github.ref_name }}-linux-arm64
path: release/aarch64-unknown-linux-gnu/eim.zip

- name: Upload Release Asset on aarch64-linux
if: github.event_name == 'release' && github.event.action == 'created' && runner.os == 'Linux'
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ github.event.release.upload_url }}
asset_path: release/aarch64-unknown-linux-gnu/eim.zip
asset_name: eim-${{ github.ref_name }}-linux-arm64.zip
asset_content_type: application/zip

test:
name: Automated test scripts
needs: build
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Install dependencies (Ubuntu)
if: runner.os == 'Linux'
run: |
sudo apt-get install -y git cmake ninja-build wget flex bison gperf ccache libffi-dev libssl-dev dfu-util libusb-1.0-0-dev python3 python3-venv python3-pip

- name: Install dependencies (Windows)
if: runner.os == 'windows'
run: |
choco install ninja -y

- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: "20"

- name: Download artifacts
uses: actions/download-artifact@v4
with:
path: ./artifacts

- name: Extract artifact (non-Windows)
if: runner.os != 'Windows'
run: |
mkdir -p test-bin
unzip ./artifacts/eim-${{ github.run_id }}-${{ matrix.os }}/eim.zip -d test-bin
# unzip ./test-bin/eim.zip -d test-bin

- name: Extract artifact (Windows)
if: runner.os == 'Windows'
run: |
mkdir -p test-bin
7z x ./artifacts/eim-${{ github.run_id }}-${{ matrix.os }}/eim.zip -otest-bin
# 7z x ./test-bin/eim.zip -otest-bin

- name: Set executable permissions (non-Windows)
if: runner.os != 'Windows'
run: |
chmod +x ./test-bin/eim
chmod +x ./tests/run_test.sh

- name: Set executable permissions (Windows)
if: runner.os == 'Windows'
run: |
icacls .\tests\run_test.ps1 /grant:r Everyone:F
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
$PSVersionTable
[System.Environment]::OSVersion.Version

- name: Run test script (non-Windows)
if: runner.os != 'Windows'
run: |
export EIM_FILE_PATH="../../test-bin/eim"
export EIM_VERSION="idf-im-cli 0.1.0"
cd tests/script
npm ci
npx mocha --exit --reporter mocha-junit-reporter --reporter-options mochaFile=../results.xml main.test.js

- name: Run test script (Windows)
if: runner.os == 'Windows'
run: |
$env:EIM_FILE_PATH = "..\..\test-bin\eim.exe"
$env:EIM_VERSION = "idf-im-cli 0.1.0"
7z x ./tests/script/node_modules.zip -otests/script/node_modules
Set-Location -Path "./tests/script"
npx mocha --exit --reporter mocha-junit-reporter --reporter-options mochaFile=../results.xml main.test.js

- name: Upload test results
uses: actions/upload-artifact@v4
if: always()
with:
name: test-results-${{ matrix.os }}.zip
path: ./tests/results.xml

publish-test-results:
name: Automated Test Results
needs: test
runs-on: ubuntu-latest
if: always()

steps:
- name: Download Artifacts
uses: actions/download-artifact@v4
with:
path: ./artifacts

- name: Publish Test Results
uses: EnricoMi/publish-unit-test-result-action@v2
with:
action_fail: true
files: "./artifacts/**/*.xml"
11 changes: 5 additions & 6 deletions tests/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@ The pre-requisites tests have been commented out of the test scripts.
## Commands summary

Navigate to the idf-im-cli folder, where the repository was cloned.
Navigate to the test folder inside the repository and execute the commands below to run the automated tests.
The scripts should be executed passing as arguments the path to the `eim` application and the version of the file being tested.

#### Windows
Expand All @@ -64,21 +63,21 @@ Open Powershell, and enable script execution:
`Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass`

To execute tests on windows, use the script
`.\run_test.ps1 "<PATH TO EIM.EXE>" "<Version being tested>"`
`.\tests\run_test.ps1 "<PATH TO EIM.EXE>" "<Version being tested>"`

Default arguments are:
`.\run_test.ps1 "$env:USERPROFILE\espressif\eim.exe" "idf-im-cli 0.1.0"`
`.\tests\run_test.ps1 "$env:USERPROFILE\espressif\eim.exe" "idf-im-cli 0.1.0"`

#### Linux

(if needed) Give execution permission to the test script
`chmod +x run_test.sh`
`chmod +x ./tests/run_test.sh`

To execute tests on linux, use the script:
`. ./run_test.sh "<PATH TO EIM>" "<Version being tested>"`
`. ./tests/run_test.sh "<PATH TO EIM>" "<Version being tested>"`

Default arguments are:
`. ./run_test.sh "$HOME/espressif/eim" "idf-im-cli 0.1.0"`
`. ./tests/run_test.sh "$HOME/espressif/eim" "idf-im-cli 0.1.0"`

#### MacOS

Expand Down
2 changes: 1 addition & 1 deletion tests/run_test.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ $env:EIM_FILE_PATH = $Path_to_eim
$env:EIM_VERSION = $Version

# Navigate to the AutoTest directory
Set-Location -Path "./script"
Set-Location -Path "./tests/script"

#Expand Node modules folder
Expand-Archive node_modules.zip
Expand Down
2 changes: 1 addition & 1 deletion tests/run_test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ export EIM_FILE_PATH="$1"
export EIM_VERSION="$2"

#Enter test folder
cd script
cd tests/script

# install node modules
npm ci
Expand Down
3 changes: 2 additions & 1 deletion tests/script/commandLineArguments.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,9 @@ if (process.env.EIM_VERSION) {
} else {
eimVersion = "idf-im-cli 0.1.0";
}

export function runLineArgumentsTests() {
describe("CLI Line Arguments Tests", function () {
describe("CLI Arguments Tests", function () {
let testRunner;

before(function () {
Expand Down
Loading
Loading