Skip to content

Commit 706b313

Browse files
committed
load / save mock spiffs
1 parent 6565a99 commit 706b313

File tree

3 files changed

+96
-17
lines changed

3 files changed

+96
-17
lines changed

tests/host/common/spiffs_mock.cpp

Lines changed: 67 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@
2222

2323
#include <spiffs_api.h>
2424

25+
#include <sys/types.h>
26+
#include <sys/stat.h>
27+
#include <fcntl.h>
28+
#include <unistd.h>
29+
30+
#define SPIFFS_FILE_NAME "spiffs.bin"
31+
2532
extern "C"
2633
{
2734
static uint32_t s_phys_addr = 0;
@@ -33,32 +40,89 @@ extern "C"
3340

3441
FS SPIFFS(nullptr);
3542

36-
SpiffsMock::SpiffsMock(size_t fs_size, size_t fs_block, size_t fs_page)
43+
SpiffsMock::SpiffsMock(size_t fs_size, size_t fs_block, size_t fs_page, bool storage)
3744
{
38-
m_fs.resize(fs_size, 0xff);
45+
fprintf(stderr, "SPIFFS: %d bytes\n", (int)fs_size);
46+
47+
m_storage = storage;
48+
m_fs = new uint8_t[m_fs_size = fs_size];
49+
memset(&m_fs[0], 0xff, m_fs_size);
50+
3951
s_phys_addr = 0;
4052
s_phys_size = static_cast<uint32_t>(fs_size);
4153
s_phys_page = static_cast<uint32_t>(fs_page);
4254
s_phys_block = static_cast<uint32_t>(fs_block);
43-
s_phys_data = m_fs.data();
55+
s_phys_data = &m_fs[0];
4456
reset();
4557
}
4658

4759
void SpiffsMock::reset()
4860
{
4961
SPIFFS = FS(FSImplPtr(new SPIFFSImpl(0, s_phys_size, s_phys_page, s_phys_block, 5)));
62+
if (m_storage)
63+
load();
5064
}
5165

5266
SpiffsMock::~SpiffsMock()
5367
{
68+
if (m_storage)
69+
save();
5470
s_phys_addr = 0;
5571
s_phys_size = 0;
5672
s_phys_page = 0;
5773
s_phys_block = 0;
5874
s_phys_data = nullptr;
75+
delete [] m_fs;
76+
m_fs = nullptr;
77+
m_fs_size = 0;
5978
SPIFFS = FS(FSImplPtr(nullptr));
6079
}
6180

81+
void SpiffsMock::load ()
82+
{
83+
if (!m_fs_size)
84+
return;
85+
86+
const char* fname = getenv("SPIFFS_PATH");
87+
if (!fname)
88+
fname = DEFAULT_SPIFFS_FILE_NAME;
89+
int fs = ::open(SPIFFS_FILE_NAME, O_RDONLY);
90+
if (fs == -1)
91+
{
92+
fprintf(stderr, "SPIFFS: loading '%s': %s\n", fname, strerror(errno));
93+
return;
94+
}
95+
fprintf(stderr, "SPIFFS: loading %i bytes from '%s'\n", (int)m_fs_size, fname);
96+
if (::read(fs, &m_fs[0], m_fs_size) != (ssize_t)m_fs_size)
97+
fprintf(stderr, "SPIFFS: reading %i bytes: %s\n", (int)m_fs_size, strerror(errno));
98+
::close(fs);
99+
}
100+
101+
void SpiffsMock::save ()
102+
{
103+
if (!m_fs_size)
104+
return;
105+
106+
const char* fname = getenv("SPIFFS_PATH");
107+
if (!fname)
108+
fname = DEFAULT_SPIFFS_FILE_NAME;
109+
int fs = ::open(SPIFFS_FILE_NAME, O_CREAT | O_TRUNC | O_WRONLY, 0644);
110+
if (fs == -1)
111+
{
112+
fprintf(stderr, "SPIFFS: saving '%s': %s\n", fname, strerror(errno));
113+
return;
114+
}
115+
fprintf(stderr, "SPIFFS: saving %i bytes to '%s'\n", (int)m_fs_size, fname);
116+
117+
// this can be a valgrind error, I don't understand how it happens
118+
//for (size_t i = 0; i < m_fs_size; i++) printf("\r%d:%d ",(int)i, (int)m_fs[i]);
119+
120+
if (::write(fs, &m_fs[0], m_fs_size) != (ssize_t)m_fs_size)
121+
fprintf(stderr, "SPIFFS: writing %i bytes: %s\n", (int)m_fs_size, strerror(errno));
122+
if (::close(fs) == -1)
123+
fprintf(stderr, "SPIFFS: closing %s: %s\n", fname, strerror(errno));
124+
}
125+
62126
int32_t spiffs_hal_read(uint32_t addr, uint32_t size, uint8_t *dst) {
63127
memcpy(dst, s_phys_data + addr, size);
64128
return SPIFFS_OK;

tests/host/common/spiffs_mock.h

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,32 @@
2121
#include <vector>
2222
#include <FS.h>
2323

24+
#define DEFAULT_SPIFFS_FILE_NAME "spiffs.bin"
25+
2426
class SpiffsMock {
2527
public:
26-
SpiffsMock(size_t fs_size, size_t fs_block, size_t fs_page);
28+
SpiffsMock(size_t fs_size, size_t fs_block, size_t fs_page, bool storage = true);
2729
void reset();
2830
~SpiffsMock();
2931

3032
protected:
31-
std::vector<uint8_t> m_fs;
33+
void load ();
34+
void save ();
35+
36+
// it was a vector, but CI tests & valgrind complain with:
37+
// Syscall param write(buf) points to uninitialised byte(s)
38+
// by 0x43E9FF: SpiffsMock::save() (spiffs_mock.cpp:116)
39+
// = if (::write(fs, &m_fs[0], m_fs_size) != (ssize_t)m_fs_size)
40+
// so switched to a regular array
41+
// and that bug is still here
42+
// XXXWIPTODO
43+
44+
uint8_t* m_fs;
45+
size_t m_fs_size;
46+
bool m_storage;
3247
};
3348

34-
#define SPIFFS_MOCK_DECLARE(size_kb, block_kb, page_b) SpiffsMock spiffs_mock(size_kb * 1024, block_kb * 1024, page_b)
49+
#define SPIFFS_MOCK_DECLARE(size_kb, block_kb, page_b, storage) SpiffsMock spiffs_mock(size_kb * 1024, block_kb * 1024, page_b, storage)
3550
#define SPIFFS_MOCK_RESET() spiffs_mock.reset()
3651

3752

tests/host/fs/test_fs.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,33 +50,33 @@ static std::set<String> listDir (const char* path)
5050

5151
TEST_CASE("FS can begin","[fs]")
5252
{
53-
SPIFFS_MOCK_DECLARE(64, 8, 512);
53+
SPIFFS_MOCK_DECLARE(64, 8, 512, false);
5454
REQUIRE(SPIFFS.begin());
5555
}
5656

5757
TEST_CASE("FS can't begin with zero size","[fs]")
5858
{
59-
SPIFFS_MOCK_DECLARE(0, 8, 512);
59+
SPIFFS_MOCK_DECLARE(0, 8, 512, false);
6060
REQUIRE_FALSE(SPIFFS.begin());
6161
}
6262

6363
TEST_CASE("Before begin is called, open will fail","[fs]")
6464
{
65-
SPIFFS_MOCK_DECLARE(64, 8, 512);
65+
SPIFFS_MOCK_DECLARE(64, 8, 512, false);
6666
REQUIRE_FALSE(SPIFFS.open("/foo", "w"));
6767
}
6868

6969
TEST_CASE("FS can create file","[fs]")
7070
{
71-
SPIFFS_MOCK_DECLARE(64, 8, 512);
71+
SPIFFS_MOCK_DECLARE(64, 8, 512, false);
7272
REQUIRE(SPIFFS.begin());
7373
createFile("/test", "");
7474
REQUIRE(SPIFFS.exists("/test"));
7575
}
7676

7777
TEST_CASE("Files can be written and appended to","[fs]")
7878
{
79-
SPIFFS_MOCK_DECLARE(64, 8, 512);
79+
SPIFFS_MOCK_DECLARE(64, 8, 512, false);
8080
REQUIRE(SPIFFS.begin());
8181
{
8282
File f = SPIFFS.open("config1.txt", "w");
@@ -100,7 +100,7 @@ TEST_CASE("Files can be written and appended to","[fs]")
100100

101101
TEST_CASE("Files persist after reset", "[fs]")
102102
{
103-
SPIFFS_MOCK_DECLARE(64, 8, 512);
103+
SPIFFS_MOCK_DECLARE(64, 8, 512, false);
104104
REQUIRE(SPIFFS.begin());
105105
createFile("config1.txt", "file 1");
106106

@@ -112,7 +112,7 @@ TEST_CASE("Files persist after reset", "[fs]")
112112

113113
TEST_CASE("Filesystem is empty after format", "[fs]")
114114
{
115-
SPIFFS_MOCK_DECLARE(64, 8, 512);
115+
SPIFFS_MOCK_DECLARE(64, 8, 512, false);
116116
REQUIRE(SPIFFS.format());
117117
REQUIRE(SPIFFS.begin());
118118
createFile("/1", "first");
@@ -128,7 +128,7 @@ TEST_CASE("Filesystem is empty after format", "[fs]")
128128

129129
TEST_CASE("Dir lists all files", "[fs]")
130130
{
131-
SPIFFS_MOCK_DECLARE(64, 8, 512);
131+
SPIFFS_MOCK_DECLARE(64, 8, 512, false);
132132
REQUIRE(SPIFFS.begin());
133133
createFile("/empty", "");
134134
createFile("/not_empty", "some text");
@@ -146,7 +146,7 @@ TEST_CASE("Dir lists all files", "[fs]")
146146

147147
TEST_CASE("File names which are too long are rejected", "[fs]")
148148
{
149-
SPIFFS_MOCK_DECLARE(64, 8, 512);
149+
SPIFFS_MOCK_DECLARE(64, 8, 512, false);
150150
REQUIRE(SPIFFS.begin());
151151
const char* emptyName = "";
152152
const char* longName_31 = "/234567890123456789012345678901";
@@ -164,7 +164,7 @@ TEST_CASE("File names which are too long are rejected", "[fs]")
164164

165165
TEST_CASE("#1685 Duplicate files", "[fs][bugreport]")
166166
{
167-
SPIFFS_MOCK_DECLARE(64, 8, 512);
167+
SPIFFS_MOCK_DECLARE(64, 8, 512, false);
168168
REQUIRE(SPIFFS.begin());
169169
createFile("/config", "some text");
170170
createFile("/data", "");
@@ -175,7 +175,7 @@ TEST_CASE("#1685 Duplicate files", "[fs][bugreport]")
175175

176176
TEST_CASE("#1819 Can list all files with openDir(\"\")", "[fs][bugreport]")
177177
{
178-
SPIFFS_MOCK_DECLARE(64, 8, 512);
178+
SPIFFS_MOCK_DECLARE(64, 8, 512, false);
179179
REQUIRE(SPIFFS.begin());
180180
createFile("/file1", "some text");
181181
createFile("/file2", "other text");

0 commit comments

Comments
 (0)