Skip to content

Commit 2115f82

Browse files
committed
tests/drivers: add mtd_eeprom test
1 parent c81e209 commit 2115f82

3 files changed

Lines changed: 156 additions & 0 deletions

File tree

tests/drivers/mtd_eeprom/Makefile

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
include ../Makefile.drivers_common
2+
3+
USEMODULE += mtd_eeprom
4+
USEMODULE += embunit
5+
6+
include $(RIOTBASE)/Makefile.include

tests/drivers/mtd_eeprom/main.c

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2026 ML!PA Consulting GmbH
3+
* SPDX-License-Identifier: LGPL-2.1-only
4+
*/
5+
6+
/**
7+
* @ingroup tests
8+
* @{
9+
*
10+
* @file
11+
* @brief Application for testing MTD EEPROM implementations
12+
*
13+
* @author Fabian Hüßler <fabian.huessler@ml-pa.com>
14+
*
15+
* @}
16+
*/
17+
18+
#include <string.h>
19+
#include <errno.h>
20+
21+
#include "embUnit.h"
22+
23+
#include "mtd.h"
24+
#include "mtd_eeprom.h"
25+
26+
#define TEST_ADDRESS 22
27+
28+
static mtd_eeprom_t _dev = MTD_EEPROM_INIT_VAL;
29+
static mtd_dev_t *dev = &_dev.base;
30+
31+
static void setup(void)
32+
{
33+
int ret = mtd_init(dev);
34+
TEST_ASSERT_EQUAL_INT(0, ret);
35+
mtd_erase(dev, TEST_ADDRESS, dev->pages_per_sector * dev->page_size);
36+
}
37+
38+
static void teardown(void)
39+
{
40+
/* Erase whole EEPROM */
41+
mtd_erase(dev, 0, EEPROM_SIZE);
42+
}
43+
44+
static void test_mtd_init(void)
45+
{
46+
int ret = mtd_init(dev);
47+
TEST_ASSERT_EQUAL_INT(0, ret);
48+
}
49+
50+
static void test_mtd_erase(void)
51+
{
52+
int ret;
53+
54+
/* Unaligned erase */
55+
ret = mtd_erase(dev, 1, EEPROM_SIZE -1);
56+
TEST_ASSERT_EQUAL_INT(0, ret);
57+
58+
/* Erase out of memory area */
59+
ret = mtd_erase(dev, 1, EEPROM_SIZE);
60+
TEST_ASSERT_EQUAL_INT(-EOVERFLOW, ret);
61+
}
62+
63+
static void test_mtd_write_erase(void)
64+
{
65+
const char buf[] = "ABCDEFGHIJKLMNO";
66+
67+
uint8_t buf_empty[sizeof(buf)];
68+
memset(buf_empty, EEPROM_CLEAR_BYTE, sizeof(buf_empty));
69+
70+
uint8_t buf_read[sizeof(buf)];
71+
memset(buf_read, 0, sizeof(buf_read));
72+
73+
/* write */
74+
int ret = mtd_write(dev, buf, TEST_ADDRESS, sizeof(buf));
75+
TEST_ASSERT_EQUAL_INT(0, ret);
76+
77+
/* erase */
78+
ret = mtd_erase(dev, TEST_ADDRESS, sizeof(buf));
79+
TEST_ASSERT_EQUAL_INT(0, ret);
80+
81+
/* read */
82+
ret = mtd_read(dev, buf_read, TEST_ADDRESS, sizeof(buf_read));
83+
TEST_ASSERT_EQUAL_INT(0, ret);
84+
TEST_ASSERT_EQUAL_INT(0, memcmp(buf_empty, buf_read, sizeof(buf_empty)));
85+
}
86+
87+
static void test_mtd_write_read(void)
88+
{
89+
const char buf[] = "ABCDEFGHIJKLMNO";
90+
91+
uint8_t buf_read[sizeof(buf)];
92+
memset(buf_read, 0, sizeof(buf_read));
93+
94+
/* Basic write / read */
95+
int ret = mtd_write(dev, buf, TEST_ADDRESS, sizeof(buf));
96+
TEST_ASSERT_EQUAL_INT(0, ret);
97+
98+
/* read */
99+
ret = mtd_read(dev, buf_read, TEST_ADDRESS, sizeof(buf_read));
100+
TEST_ASSERT_EQUAL_INT(0, ret);
101+
TEST_ASSERT_EQUAL_INT(0, memcmp(buf, buf_read, sizeof(buf)));
102+
103+
/* Out of bounds read */
104+
ret = mtd_read(dev, buf_read, TEST_ADDRESS + EEPROM_SIZE, sizeof(buf_read));
105+
TEST_ASSERT_EQUAL_INT(-EOVERFLOW, ret);
106+
107+
/* Out of bounds write */
108+
ret = mtd_write(dev, buf, TEST_ADDRESS + EEPROM_SIZE, sizeof(buf));
109+
TEST_ASSERT_EQUAL_INT(-EOVERFLOW, ret);
110+
111+
/* Unaligned write / read */
112+
ret = mtd_write(dev, &buf[1],
113+
TEST_ADDRESS + !(TEST_ADDRESS % dev->page_size), sizeof(buf) - 1);
114+
TEST_ASSERT_EQUAL_INT(0, ret);
115+
ret = mtd_read(dev, &buf_read[1],
116+
TEST_ADDRESS + !(TEST_ADDRESS % dev->page_size), sizeof(buf_read) - 1);
117+
TEST_ASSERT_EQUAL_INT(0, ret);
118+
}
119+
120+
Test *tests_mtd_eeprom_tests(void)
121+
{
122+
EMB_UNIT_TESTFIXTURES(fixtures) {
123+
new_TestFixture(test_mtd_init),
124+
new_TestFixture(test_mtd_erase),
125+
new_TestFixture(test_mtd_write_erase),
126+
new_TestFixture(test_mtd_write_read),
127+
};
128+
129+
EMB_UNIT_TESTCALLER(mtd_eeprom_tests, setup, teardown, fixtures);
130+
131+
return (Test *)&mtd_eeprom_tests;
132+
}
133+
134+
int main(void)
135+
{
136+
TESTS_START();
137+
TESTS_RUN(tests_mtd_eeprom_tests());
138+
TESTS_END();
139+
return 0;
140+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#!/usr/bin/env python3
2+
3+
# SPDX-FileCopyrightText: 2026 ML!PA Consulting GmbH
4+
# SPDX-License-Identifier: LGPL-2.1-only
5+
6+
import sys
7+
from testrunner import run_check_unittests
8+
9+
if __name__ == "__main__":
10+
sys.exit(run_check_unittests())

0 commit comments

Comments
 (0)