Skip to content

Commit 2a697da

Browse files
tests: on_target: add memfault test
Add memfault test. Test check that coredump are uploaded to memfault. Signed-off-by: Giacomo Dematteis <giacomo.dematteis@nordicsemi.no>
1 parent 7cb2c7a commit 2a697da

File tree

2 files changed

+87
-3
lines changed

2 files changed

+87
-3
lines changed

.github/workflows/target-test.yml

+3-3
Original file line numberDiff line numberDiff line change
@@ -127,9 +127,9 @@ jobs:
127127
NRFCLOUD_API_KEY: ${{ secrets.NRF_CLOUD_API_KEY }}
128128
LOG_FILENAME: att_test_log
129129
TEST_REPORT_NAME: ATT Firwmare Test Report
130-
# MEMFAULT_ORGANIZATION_TOKEN: ${{ secrets.MEMFAULT_ORGANIZATION_TOKEN }}
131-
# MEMFAULT_ORGANIZATION_SLUG: ${{ vars.MEMFAULT_ORGANIZATION_SLUG }}
132-
# MEMFAULT_PROJECT_SLUG: ${{ vars.MEMFAULT_PROJECT_SLUG }}
130+
MEMFAULT_ORGANIZATION_TOKEN: ${{ secrets.MEMFAULT_ORGANIZATION_TOKEN }}
131+
MEMFAULT_ORGANIZATION_SLUG: ${{ secrets.MEMFAULT_ORGANIZATION_SLUG }}
132+
MEMFAULT_PROJECT_SLUG: ${{ secrets.MEMFAULT_PROJECT_SLUG }}
133133

134134
- name: Results
135135
if: always()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
##########################################################################################
2+
# Copyright (c) 2025 Nordic Semiconductor
3+
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
4+
##########################################################################################
5+
6+
import pytest
7+
import os
8+
import requests
9+
import datetime
10+
import time
11+
from utils.flash_tools import flash_device, reset_device
12+
from utils.logger import get_logger
13+
14+
MEMFAULT_ORG_TOKEN = os.getenv('MEMFAULT_ORGANIZATION_TOKEN')
15+
MEMFAULT_ORG = os.getenv('MEMFAULT_ORGANIZATION_SLUG')
16+
MEMFAULT_PROJ = os.getenv('MEMFAULT_PROJECT_SLUG')
17+
IMEI = os.getenv('IMEI')
18+
MEMFAULT_TIMEOUT = 5 * 60
19+
20+
logger = get_logger()
21+
22+
url = "https://api.memfault.com/api/v0"
23+
auth = ("", MEMFAULT_ORG_TOKEN)
24+
25+
26+
def get_traces(family, device_id):
27+
r = requests.get(
28+
f"{url}/organizations/{MEMFAULT_ORG}/projects/{MEMFAULT_PROJ}/traces", auth=auth)
29+
r.raise_for_status()
30+
data = r.json()["data"]
31+
latest_traces = [
32+
x
33+
for x in data
34+
if x["device"]["device_serial"] == str(device_id) and x["source_type"] == family
35+
]
36+
return latest_traces
37+
38+
def get_latest_coredump_traces(device_id):
39+
return get_traces("coredump", device_id)
40+
41+
def timestamp(event):
42+
return datetime.datetime.strptime(
43+
event["captured_date"], "%Y-%m-%dT%H:%M:%S.%f%z"
44+
)
45+
46+
47+
def test_memfault(t91x_board, hex_file):
48+
# Save timestamp of latest coredump
49+
coredumps = get_latest_coredump_traces(IMEI)
50+
logger.debug(f"Found coredumps: {coredumps}")
51+
timestamp_old_coredump = timestamp(coredumps[0]) if coredumps else None
52+
logger.debug(f"Timestamp old coredump: {timestamp_old_coredump}")
53+
54+
55+
flash_device(os.path.abspath(hex_file))
56+
t91x_board.uart.xfactoryreset()
57+
t91x_board.uart.flush()
58+
reset_device()
59+
t91x_board.uart.wait_for_str("Connected to Cloud", timeout=120)
60+
61+
time.sleep(10)
62+
63+
# Trigger usage fault to generate coredump
64+
t91x_board.uart.write("mflt test usagefault\r\n")
65+
66+
# Wait for upload to be reported to memfault api
67+
start = time.time()
68+
while time.time() - start < MEMFAULT_TIMEOUT:
69+
time.sleep(5)
70+
coredumps = get_latest_coredump_traces(IMEI)
71+
logger.debug(f"Found coredumps: {coredumps}")
72+
timestamp_new_coredump = timestamp(coredumps[0]) if coredumps else None
73+
logger.debug(f"Timestamp new coredump: {timestamp_new_coredump}")
74+
75+
if not coredumps:
76+
continue
77+
# Check that we have an upload with newer timestamp
78+
if not timestamp_old_coredump:
79+
break
80+
if timestamp(coredumps[0]) > timestamp_old_coredump:
81+
break
82+
else:
83+
raise RuntimeError(f"No new coredump observed")
84+

0 commit comments

Comments
 (0)