Skip to content

Commit dad3717

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 dad3717

File tree

2 files changed

+80
-3
lines changed

2 files changed

+80
-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,77 @@
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+
timestamp_old_coredump = timestamp(coredumps[0]) if coredumps else None
51+
52+
flash_device(os.path.abspath(hex_file))
53+
t91x_board.uart.xfactoryreset()
54+
t91x_board.uart.flush()
55+
reset_device()
56+
t91x_board.uart.wait_for_str("Connected to Cloud", timeout=120)
57+
58+
time.sleep(10)
59+
60+
# Trigger usage fault to generate coredump
61+
t91x_board.uart.write("mflt test usagefault\r\n")
62+
63+
# Wait for upload to be reported to memfault api
64+
start = time.time()
65+
while time.time() - start < MEMFAULT_TIMEOUT:
66+
time.sleep(5)
67+
coredumps = get_latest_coredump_traces(IMEI)
68+
if not coredumps:
69+
continue
70+
# Check that we have an upload with newer timestamp
71+
if not timestamp_old_coredump:
72+
break
73+
if timestamp(coredumps[0]) > timestamp_old_coredump:
74+
break
75+
else:
76+
raise RuntimeError(f"No new coredump observed")
77+

0 commit comments

Comments
 (0)