Skip to content

ci(wokwi): Add Wokwi emulator to workflow #9540

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

Merged
merged 27 commits into from
May 7, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
759974e
ci(wokwi): Add wokwi emulator to CI
lucasssvaz Apr 19, 2024
1695e79
feat(wokwi): Support scenario
P-R-O-C-H-Y Apr 29, 2024
296a9a4
feat(wokwi): Add simple CI test for push button
P-R-O-C-H-Y Apr 29, 2024
0107545
sudo apt command
P-R-O-C-H-Y Apr 29, 2024
831eab6
sudo both apt commands
P-R-O-C-H-Y Apr 29, 2024
c4d3ad7
Add missing test.py file
P-R-O-C-H-Y Apr 29, 2024
d40d17e
Test pytest path changes
P-R-O-C-H-Y Apr 30, 2024
d3d807c
empty push
P-R-O-C-H-Y Apr 30, 2024
f723247
move wokwi cli token variable
P-R-O-C-H-Y Apr 30, 2024
bddf692
move token back to wokwi job
P-R-O-C-H-Y Apr 30, 2024
fe20ae0
Update hil.yml
P-R-O-C-H-Y Apr 30, 2024
685383b
Update hil.yml
P-R-O-C-H-Y Apr 30, 2024
b1cd645
revert run on pr
P-R-O-C-H-Y Apr 30, 2024
9df5f5f
run on PR target
P-R-O-C-H-Y Apr 30, 2024
ca03917
run only on master
P-R-O-C-H-Y Apr 30, 2024
140cb2f
Merge branch 'master' into ci/wokwi
P-R-O-C-H-Y May 7, 2024
01752c6
ci(wokwi): Support wokwi
P-R-O-C-H-Y May 7, 2024
cad222f
Merge branch 'master' into ci/wokwi
P-R-O-C-H-Y May 7, 2024
186e17e
ci(wokwi): Skip unsupported and performance test
P-R-O-C-H-Y May 7, 2024
b1c714d
ci(wokwi): run wokwi tests without label
P-R-O-C-H-Y May 7, 2024
bc085e5
debug: run build on windows
P-R-O-C-H-Y May 7, 2024
99af207
RUN WIFI WITH PSRAM ON-OFF
P-R-O-C-H-Y May 7, 2024
9ccead0
fix psram for S3
P-R-O-C-H-Y May 7, 2024
71fe262
Revert "debug: run build on windows"
P-R-O-C-H-Y May 7, 2024
9cdd132
ci(wokwi): Run workflow only if build was sucessful
P-R-O-C-H-Y May 7, 2024
6f4880c
ci(pre-commit): Apply automatic fixes
pre-commit-ci-lite[bot] May 7, 2024
ba3a549
ci(wokwi): Add generated files to gitignore
lucasssvaz May 7, 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
Prev Previous commit
Next Next commit
ci(wokwi): Support wokwi
  • Loading branch information
P-R-O-C-H-Y committed May 7, 2024
commit 01752c6411f8f00c95a9d8e5ae5292fec3e62766
26 changes: 17 additions & 9 deletions .github/workflows/hil.yml
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
name: Run tests

on:
pull_request_target:
pull_request:
types: [opened, reopened, synchronize, labeled]
branches:
- master

schedule:
- cron: '0 2 * * *'

env:
MAX_CHUNKS: 15
WOKWI_TIMEOUT: 120000 # Milliseconds
WOKWI_CLI_TOKEN: ${{ secrets.WOKWI_CLI_TOKEN }}

concurrency:
group: hil-${{github.event.pull_request.number || github.ref}}
Expand All @@ -32,8 +31,6 @@ jobs:
steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }} # Check out the code of the PR

- name: Generate Chunks matrix
id: gen-chunks
Expand Down Expand Up @@ -87,10 +84,12 @@ jobs:
path: |
~/.build_skipped
~/.arduino/tests/**/build*.tmp/*.bin
~/.arduino/tests/**/build*.tmp/*.elf
~/.arduino/tests/**/build*.tmp/*.json

wokwi-test:
needs: [gen_chunks, build]
if: github.event_name == 'schedule'
name: ${{matrix.chip}}-Wokwi_Test#${{matrix.chunks}}
strategy:
fail-fast: false
Expand All @@ -106,8 +105,8 @@ jobs:
uses: actions/download-artifact@v4
with:
name: ${{matrix.chip}}-${{matrix.chunks}}.artifacts
path: ~/.arduino/tests/

path: ~/
- name: Install Wokwi CLI
run: curl -L https://wokwi.com/ci/install.sh | sh

Expand All @@ -123,12 +122,21 @@ jobs:
run: |
bash .github/scripts/tests_run.sh -c -t ${{matrix.chip}} -i ${{matrix.chunks}} -m ${{env.MAX_CHUNKS}} -w ${{env.WOKWI_TIMEOUT}}

- name: Check if tests were skipped
id: check-test-skipped
run: |
if [ -f ~/.test_skipped ]; then
echo "skipped=true" >> $GITHUB_OUTPUT
else
echo "skipped=false" >> $GITHUB_OUTPUT
fi

- name: Upload test result artifacts
uses: actions/upload-artifact@v4
if: always()
if: ${{ always() && steps.check-test-skipped.outputs.skipped == 'false' }}
with:
name: wokwi_results-${{matrix.chip}}-${{matrix.chunks}}
path: tests/*/*.xml
path: tests/**/*.xml

hardware-test:
needs: [gen_chunks, build]
Expand Down
2 changes: 0 additions & 2 deletions tests/gpio/test_gpio.py

This file was deleted.

File renamed without changes.
File renamed without changes.
5 changes: 1 addition & 4 deletions tests/gpio/gpio.ino → tests/validation/gpio/gpio.ino
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,13 @@ void test_button()
}
delay(10);
}
TEST_ASSERT_EQUAL(3, count);
}

void setup()
{
Serial.begin(115200);
UNITY_BEGIN();
pinMode(BTN, INPUT_PULLUP);
RUN_TEST(test_button);
UNITY_END();
test_button();
}

void loop()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@ author: Jan Prochazka ([email protected])
steps:
- wait-serial: 'Button test'

# Delay 1s (to make sure the test is ready to start)
# Need for 1s delay for scenario to run properly
- delay: 1000ms

# Press once
- set-control:
part-id: btn1
Expand Down
5 changes: 5 additions & 0 deletions tests/validation/gpio/test_gpio.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
def test_gpio(dut):
dut.expect_exact("Button test")
dut.expect_exact("Button pressed 1 times")
dut.expect_exact("Button pressed 2 times")
dut.expect_exact("Button pressed 3 times")
File renamed without changes.
Empty file.
Empty file.
3 changes: 3 additions & 0 deletions tests/validation/wifi/test_wifi.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
def test_wifi(dut):
dut.expect_exact("WiFi connected")
dut.expect_exact("IP address:")
124 changes: 124 additions & 0 deletions tests/validation/wifi/wifi.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
/*
* This sketch shows the WiFi event usage
*
*/

/*
* WiFi Events

0 ARDUINO_EVENT_WIFI_READY < ESP32 WiFi ready
1 ARDUINO_EVENT_WIFI_SCAN_DONE < ESP32 finish scanning AP
2 ARDUINO_EVENT_WIFI_STA_START < ESP32 station start
3 ARDUINO_EVENT_WIFI_STA_STOP < ESP32 station stop
4 ARDUINO_EVENT_WIFI_STA_CONNECTED < ESP32 station connected to AP
5 ARDUINO_EVENT_WIFI_STA_DISCONNECTED < ESP32 station disconnected from AP
6 ARDUINO_EVENT_WIFI_STA_AUTHMODE_CHANGE < the auth mode of AP connected by ESP32 station changed
7 ARDUINO_EVENT_WIFI_STA_GOT_IP < ESP32 station got IP from connected AP
8 ARDUINO_EVENT_WIFI_STA_LOST_IP < ESP32 station lost IP and the IP is reset to 0
9 ARDUINO_EVENT_WPS_ER_SUCCESS < ESP32 station wps succeeds in enrollee mode
10 ARDUINO_EVENT_WPS_ER_FAILED < ESP32 station wps fails in enrollee mode
11 ARDUINO_EVENT_WPS_ER_TIMEOUT < ESP32 station wps timeout in enrollee mode
12 ARDUINO_EVENT_WPS_ER_PIN < ESP32 station wps pin code in enrollee mode
13 ARDUINO_EVENT_WIFI_AP_START < ESP32 soft-AP start
14 ARDUINO_EVENT_WIFI_AP_STOP < ESP32 soft-AP stop
15 ARDUINO_EVENT_WIFI_AP_STACONNECTED < a station connected to ESP32 soft-AP
16 ARDUINO_EVENT_WIFI_AP_STADISCONNECTED < a station disconnected from ESP32 soft-AP
17 ARDUINO_EVENT_WIFI_AP_STAIPASSIGNED < ESP32 soft-AP assign an IP to a connected station
18 ARDUINO_EVENT_WIFI_AP_PROBEREQRECVED < Receive probe request packet in soft-AP interface
19 ARDUINO_EVENT_WIFI_AP_GOT_IP6 < ESP32 ap interface v6IP addr is preferred
19 ARDUINO_EVENT_WIFI_STA_GOT_IP6 < ESP32 station interface v6IP addr is preferred
20 ARDUINO_EVENT_ETH_START < ESP32 ethernet start
21 ARDUINO_EVENT_ETH_STOP < ESP32 ethernet stop
22 ARDUINO_EVENT_ETH_CONNECTED < ESP32 ethernet phy link up
23 ARDUINO_EVENT_ETH_DISCONNECTED < ESP32 ethernet phy link down
24 ARDUINO_EVENT_ETH_GOT_IP < ESP32 ethernet got IP from connected AP
19 ARDUINO_EVENT_ETH_GOT_IP6 < ESP32 ethernet interface v6IP addr is preferred
25 ARDUINO_EVENT_MAX
*/

#include <WiFi.h>

const char *ssid = "Wokwi-GUEST";
const char *password = "";

// WARNING: This function is called from a separate FreeRTOS task (thread)!
void WiFiEvent(WiFiEvent_t event) {
Serial.printf("[WiFi-event] event: %d\n", event);

switch (event) {
case ARDUINO_EVENT_WIFI_READY: Serial.println("WiFi interface ready"); break;
case ARDUINO_EVENT_WIFI_SCAN_DONE: Serial.println("Completed scan for access points"); break;
case ARDUINO_EVENT_WIFI_STA_START: Serial.println("WiFi client started"); break;
case ARDUINO_EVENT_WIFI_STA_STOP: Serial.println("WiFi clients stopped"); break;
case ARDUINO_EVENT_WIFI_STA_CONNECTED: Serial.println("Connected to access point"); break;
case ARDUINO_EVENT_WIFI_STA_DISCONNECTED: Serial.println("Disconnected from WiFi access point"); break;
case ARDUINO_EVENT_WIFI_STA_AUTHMODE_CHANGE: Serial.println("Authentication mode of access point has changed"); break;
case ARDUINO_EVENT_WIFI_STA_GOT_IP:
Serial.print("Obtained IP address: ");
Serial.println(WiFi.localIP());
break;
case ARDUINO_EVENT_WIFI_STA_LOST_IP: Serial.println("Lost IP address and IP address is reset to 0"); break;
case ARDUINO_EVENT_WPS_ER_SUCCESS: Serial.println("WiFi Protected Setup (WPS): succeeded in enrollee mode"); break;
case ARDUINO_EVENT_WPS_ER_FAILED: Serial.println("WiFi Protected Setup (WPS): failed in enrollee mode"); break;
case ARDUINO_EVENT_WPS_ER_TIMEOUT: Serial.println("WiFi Protected Setup (WPS): timeout in enrollee mode"); break;
case ARDUINO_EVENT_WPS_ER_PIN: Serial.println("WiFi Protected Setup (WPS): pin code in enrollee mode"); break;
case ARDUINO_EVENT_WIFI_AP_START: Serial.println("WiFi access point started"); break;
case ARDUINO_EVENT_WIFI_AP_STOP: Serial.println("WiFi access point stopped"); break;
case ARDUINO_EVENT_WIFI_AP_STACONNECTED: Serial.println("Client connected"); break;
case ARDUINO_EVENT_WIFI_AP_STADISCONNECTED: Serial.println("Client disconnected"); break;
case ARDUINO_EVENT_WIFI_AP_STAIPASSIGNED: Serial.println("Assigned IP address to client"); break;
case ARDUINO_EVENT_WIFI_AP_PROBEREQRECVED: Serial.println("Received probe request"); break;
case ARDUINO_EVENT_WIFI_AP_GOT_IP6: Serial.println("AP IPv6 is preferred"); break;
case ARDUINO_EVENT_WIFI_STA_GOT_IP6: Serial.println("STA IPv6 is preferred"); break;
case ARDUINO_EVENT_ETH_GOT_IP6: Serial.println("Ethernet IPv6 is preferred"); break;
case ARDUINO_EVENT_ETH_START: Serial.println("Ethernet started"); break;
case ARDUINO_EVENT_ETH_STOP: Serial.println("Ethernet stopped"); break;
case ARDUINO_EVENT_ETH_CONNECTED: Serial.println("Ethernet connected"); break;
case ARDUINO_EVENT_ETH_DISCONNECTED: Serial.println("Ethernet disconnected"); break;
case ARDUINO_EVENT_ETH_GOT_IP: Serial.println("Obtained IP address"); break;
default: break;
}
}

// WARNING: This function is called from a separate FreeRTOS task (thread)!
void WiFiGotIP(WiFiEvent_t event, WiFiEventInfo_t info) {
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(IPAddress(info.got_ip.ip_info.ip.addr));
}

void setup() {
Serial.begin(115200);

// delete old config
WiFi.disconnect(true);

delay(1000);

// Examples of different ways to register wifi events;
// these handlers will be called from another thread.
WiFi.onEvent(WiFiEvent);
WiFi.onEvent(WiFiGotIP, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_GOT_IP);
WiFiEventId_t eventID = WiFi.onEvent(
[](WiFiEvent_t event, WiFiEventInfo_t info) {
Serial.print("WiFi lost connection. Reason: ");
Serial.println(info.wifi_sta_disconnected.reason);
},
WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_DISCONNECTED
);

// Remove WiFi event
Serial.print("WiFi Event ID: ");
Serial.println(eventID);
// WiFi.removeEvent(eventID);

WiFi.begin(ssid, password);

Serial.println();
Serial.println();
Serial.println("Wait for WiFi... ");
}

void loop() {
delay(1000);
}
2 changes: 0 additions & 2 deletions tests/wifi/test_wifi.py

This file was deleted.

132 changes: 0 additions & 132 deletions tests/wifi/wifi.ino

This file was deleted.