mirror of
https://github.com/espressif/ESP8266_RTOS_SDK.git
synced 2025-08-06 15:15:15 +08:00

1. Add libssc.a, simple serial console lib. 2. Add libspiffs.a, SPI file system. 3. Add libwps.a to support WPS. 4. Add libespconn.a, Espressif connection lib. 5. Add libespnow.a to support Espressif ESP-NOW. 6. Add libmesh.a, Espressif mesh. 7. Add libnopoll.a, websocket. 8. Add make_lib.sh in "third_party" folder. 9. Add modem-sleep & light-sleep supported. 10. Update libcirom.a to support float IO. 11. Update gen_misc.sh & gen_misc.bat. 12. Update header files, add comments in doxygen style. 13. Update libsmartconfig.a to version 2.5.2. 14. Update libssl.a. 15. Updates driver (PWM/UART/GPIO/SPI/Hardware timer). 16. Update open source codes of third_party. 17. Modify "ld" files, "dram0 len" should be 0x18000 in RTOS SDK. 18. Remove header files in extra_include, which are already in compile folder. 19. Other APIs sync from non-OS SDK, more details in documentation "20B-ESP8266__RTOS_SDK_API Reference". 20. Other optimization to make the SDK more stable.
332 lines
7.8 KiB
C
332 lines
7.8 KiB
C
/*
|
|
* test_bugreports.c
|
|
*
|
|
* Created on: Mar 8, 2015
|
|
* Author: petera
|
|
*/
|
|
|
|
|
|
|
|
#include "testrunner.h"
|
|
#include "test_spiffs.h"
|
|
#include "spiffs_nucleus.h"
|
|
#include "spiffs.h"
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <fcntl.h>
|
|
//#include <dirent.h>
|
|
#include <unistd.h>
|
|
|
|
SUITE(bug_tests)
|
|
void setup() {
|
|
_setup_test_only();
|
|
}
|
|
void teardown() {
|
|
_teardown();
|
|
}
|
|
|
|
TEST(nodemcu_full_fs_1) {
|
|
fs_reset_specific(0, 1280*1024, 4096*20, 4096, 4096, 128);
|
|
|
|
int res;
|
|
spiffs_file fd;
|
|
|
|
printf(" fill up system by writing one byte a lot\n");
|
|
fd = SPIFFS_open(FS, "test1.txt", SPIFFS_RDWR | SPIFFS_CREAT | SPIFFS_TRUNC, 0);
|
|
TEST_CHECK(fd > 0);
|
|
int i;
|
|
spiffs_stat s;
|
|
res = SPIFFS_OK;
|
|
for (i = 0; i < 100*1000; i++) {
|
|
u8_t buf = 'x';
|
|
res = SPIFFS_write(FS, fd, &buf, 1);
|
|
}
|
|
|
|
int errno = SPIFFS_errno(FS);
|
|
int res2 = SPIFFS_fstat(FS, fd, &s);
|
|
TEST_CHECK(res2 == SPIFFS_OK);
|
|
printf(" >>> file %s size: %i\n", s.name, s.size);
|
|
|
|
TEST_CHECK(errno == SPIFFS_ERR_FULL);
|
|
SPIFFS_close(FS, fd);
|
|
|
|
printf(" remove big file\n");
|
|
res = SPIFFS_remove(FS, "test1.txt");
|
|
|
|
printf("res:%i errno:%i\n",res, SPIFFS_errno(FS));
|
|
|
|
TEST_CHECK(res == SPIFFS_OK);
|
|
res2 = SPIFFS_fstat(FS, fd, &s);
|
|
TEST_CHECK(res2 == -1);
|
|
TEST_CHECK(SPIFFS_errno(FS) == SPIFFS_ERR_FILE_CLOSED);
|
|
res2 = SPIFFS_stat(FS, "test1.txt", &s);
|
|
TEST_CHECK(res2 == -1);
|
|
TEST_CHECK(SPIFFS_errno(FS) == SPIFFS_ERR_NOT_FOUND);
|
|
|
|
printf(" create small file\n");
|
|
fd = SPIFFS_open(FS, "test2.txt", SPIFFS_RDWR | SPIFFS_CREAT | SPIFFS_TRUNC, 0);
|
|
TEST_CHECK(fd > 0);
|
|
res = SPIFFS_OK;
|
|
for (i = 0; res >= 0 && i < 1000; i++) {
|
|
u8_t buf = 'x';
|
|
res = SPIFFS_write(FS, fd, &buf, 1);
|
|
}
|
|
TEST_CHECK(res >= SPIFFS_OK);
|
|
|
|
res2 = SPIFFS_fstat(FS, fd, &s);
|
|
TEST_CHECK(res2 == SPIFFS_OK);
|
|
printf(" >>> file %s size: %i\n", s.name, s.size);
|
|
|
|
TEST_CHECK(s.size == 1000);
|
|
SPIFFS_close(FS, fd);
|
|
|
|
return TEST_RES_OK;
|
|
|
|
} TEST_END(nodemcu_full_fs_1)
|
|
|
|
TEST(nodemcu_full_fs_2) {
|
|
fs_reset_specific(0, 1280*1024, 4096*22, 4096, 4096, 128);
|
|
|
|
int res;
|
|
spiffs_file fd;
|
|
|
|
printf(" fill up system by writing one byte a lot\n");
|
|
fd = SPIFFS_open(FS, "test1.txt", SPIFFS_RDWR | SPIFFS_CREAT | SPIFFS_TRUNC, 0);
|
|
TEST_CHECK(fd > 0);
|
|
int i;
|
|
spiffs_stat s;
|
|
res = SPIFFS_OK;
|
|
for (i = 0; i < 100*1000; i++) {
|
|
u8_t buf = 'x';
|
|
res = SPIFFS_write(FS, fd, &buf, 1);
|
|
}
|
|
|
|
int errno = SPIFFS_errno(FS);
|
|
int res2 = SPIFFS_fstat(FS, fd, &s);
|
|
TEST_CHECK(res2 == SPIFFS_OK);
|
|
printf(" >>> file %s size: %i\n", s.name, s.size);
|
|
|
|
TEST_CHECK(errno == SPIFFS_ERR_FULL);
|
|
SPIFFS_close(FS, fd);
|
|
|
|
res2 = SPIFFS_stat(FS, "test1.txt", &s);
|
|
TEST_CHECK(res2 == SPIFFS_OK);
|
|
|
|
SPIFFS_clearerr(FS);
|
|
printf(" create small file\n");
|
|
fd = SPIFFS_open(FS, "test2.txt", SPIFFS_RDWR | SPIFFS_CREAT | SPIFFS_TRUNC, 0);
|
|
#if 0
|
|
// before gc in v3.1
|
|
TEST_CHECK(SPIFFS_errno(FS) == SPIFFS_OK);
|
|
TEST_CHECK(fd > 0);
|
|
|
|
for (i = 0; i < 1000; i++) {
|
|
u8_t buf = 'x';
|
|
res = SPIFFS_write(FS, fd, &buf, 1);
|
|
}
|
|
|
|
TEST_CHECK(SPIFFS_errno(FS) == SPIFFS_ERR_FULL);
|
|
res2 = SPIFFS_fstat(FS, fd, &s);
|
|
TEST_CHECK(res2 == SPIFFS_OK);
|
|
printf(" >>> file %s size: %i\n", s.name, s.size);
|
|
TEST_CHECK(s.size == 0);
|
|
SPIFFS_clearerr(FS);
|
|
#else
|
|
TEST_CHECK(SPIFFS_errno(FS) == SPIFFS_ERR_FULL);
|
|
SPIFFS_clearerr(FS);
|
|
#endif
|
|
printf(" remove files\n");
|
|
res = SPIFFS_remove(FS, "test1.txt");
|
|
TEST_CHECK(res == SPIFFS_OK);
|
|
#if 0
|
|
res = SPIFFS_remove(FS, "test2.txt");
|
|
TEST_CHECK(res == SPIFFS_OK);
|
|
#endif
|
|
|
|
printf(" create medium file\n");
|
|
fd = SPIFFS_open(FS, "test3.txt", SPIFFS_RDWR | SPIFFS_CREAT | SPIFFS_TRUNC, 0);
|
|
TEST_CHECK(SPIFFS_errno(FS) == SPIFFS_OK);
|
|
TEST_CHECK(fd > 0);
|
|
|
|
for (i = 0; i < 20*1000; i++) {
|
|
u8_t buf = 'x';
|
|
res = SPIFFS_write(FS, fd, &buf, 1);
|
|
}
|
|
TEST_CHECK(SPIFFS_errno(FS) == SPIFFS_OK);
|
|
|
|
res2 = SPIFFS_fstat(FS, fd, &s);
|
|
TEST_CHECK(res2 == SPIFFS_OK);
|
|
printf(" >>> file %s size: %i\n", s.name, s.size);
|
|
TEST_CHECK(s.size == 20*1000);
|
|
|
|
return TEST_RES_OK;
|
|
|
|
} TEST_END(nodemcu_full_fs_2)
|
|
|
|
TEST(magic_test) {
|
|
// one obj lu page, not full
|
|
fs_reset_specific(0, 1280*1024, 4096*16, 4096, 4096*1, 128);
|
|
TEST_CHECK(SPIFFS_CHECK_MAGIC_POSSIBLE(FS));
|
|
// one obj lu page, full
|
|
fs_reset_specific(0, 1280*1024, 4096*16, 4096, 4096*2, 128);
|
|
TEST_CHECK(!SPIFFS_CHECK_MAGIC_POSSIBLE(FS));
|
|
// two obj lu pages, not full
|
|
fs_reset_specific(0, 1280*1024, 4096*16, 4096, 4096*4, 128);
|
|
TEST_CHECK(SPIFFS_CHECK_MAGIC_POSSIBLE(FS));
|
|
|
|
return TEST_RES_OK;
|
|
|
|
} TEST_END(magic_test)
|
|
|
|
TEST(nodemcu_309) {
|
|
fs_reset_specific(0, 1280*1024, 4096*20, 4096, 4096, 128);
|
|
|
|
int res;
|
|
spiffs_file fd;
|
|
int j;
|
|
|
|
for (j = 1; j <= 3; j++) {
|
|
char fname[32];
|
|
sprintf(fname, "20K%i.txt", j);
|
|
fd = SPIFFS_open(FS, fname, SPIFFS_RDWR | SPIFFS_CREAT | SPIFFS_TRUNC | SPIFFS_DIRECT, 0);
|
|
TEST_CHECK(fd > 0);
|
|
int i;
|
|
spiffs_stat s;
|
|
res = SPIFFS_OK;
|
|
u8_t err = 0;
|
|
for (i = 1; i <= 1280; i++) {
|
|
char *buf = "0123456789ABCDE\n";
|
|
res = SPIFFS_write(FS, fd, buf, strlen(buf));
|
|
if (!err && res < 0) {
|
|
printf("err @ %i,%i\n", i, j);
|
|
err = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
int errno = SPIFFS_errno(FS);
|
|
TEST_CHECK(errno == SPIFFS_ERR_FULL);
|
|
|
|
u32_t total;
|
|
u32_t used;
|
|
|
|
SPIFFS_info(FS, &total, &used);
|
|
printf("total:%i\nused:%i\nremain:%i\nerrno:%i\n", total, used, total-used, errno);
|
|
TEST_CHECK(total-used < 11000);
|
|
|
|
spiffs_DIR d;
|
|
struct spiffs_dirent e;
|
|
struct spiffs_dirent *pe = &e;
|
|
|
|
SPIFFS_opendir(FS, "/", &d);
|
|
int spoon_guard = 0;
|
|
while ((pe = SPIFFS_readdir(&d, pe))) {
|
|
printf("%s [%04x] size:%i\n", pe->name, pe->obj_id, pe->size);
|
|
TEST_CHECK(spoon_guard++ < 3);
|
|
}
|
|
TEST_CHECK(spoon_guard == 3);
|
|
SPIFFS_closedir(&d);
|
|
|
|
return TEST_RES_OK;
|
|
|
|
} TEST_END(nodemcu_309)
|
|
|
|
|
|
TEST(robert) {
|
|
// create a clean file system starting at address 0, 2 megabytes big,
|
|
// sector size 65536, block size 65536, page size 256
|
|
fs_reset_specific(0, 1280*1024, 128*1024, 4096, 4096, 128);
|
|
|
|
int res;
|
|
spiffs_file fd;
|
|
char fname[32];
|
|
|
|
sprintf(fname, "test.txt");
|
|
fd = SPIFFS_open(FS, fname, SPIFFS_RDWR | SPIFFS_CREAT | SPIFFS_TRUNC, 0);
|
|
TEST_CHECK(fd > 0);
|
|
int i;
|
|
res = SPIFFS_OK;
|
|
char buf[500];
|
|
memset(buf, 0xaa, 500);
|
|
res = SPIFFS_write(FS, fd, buf, 500);
|
|
TEST_CHECK(res >= SPIFFS_OK);
|
|
SPIFFS_close(FS, fd);
|
|
|
|
int errno = SPIFFS_errno(FS);
|
|
TEST_CHECK(errno == SPIFFS_OK);
|
|
|
|
//SPIFFS_vis(FS);
|
|
// unmount
|
|
SPIFFS_unmount(FS);
|
|
|
|
// remount
|
|
res = fs_mount_specific(1280*1024, 256*1024, 4096, 4096, 128);
|
|
TEST_CHECK(res== SPIFFS_OK);
|
|
|
|
//SPIFFS_vis(FS);
|
|
|
|
spiffs_stat s;
|
|
TEST_CHECK(SPIFFS_stat(FS, fname, &s) == SPIFFS_OK);
|
|
printf("file %s stat size %i\n", s.name, s.size);
|
|
TEST_CHECK(s.size == 500);
|
|
|
|
return TEST_RES_OK;
|
|
|
|
} TEST_END(robert)
|
|
|
|
|
|
TEST(spiffs_12) {
|
|
fs_reset_specific(0, 1280*1024, 128*1024, 4096, 4096, 128);
|
|
|
|
int res;
|
|
spiffs_file fd;
|
|
int j = 1;
|
|
|
|
while (1) {
|
|
char fname[32];
|
|
sprintf(fname, "file%i.txt", j);
|
|
fd = SPIFFS_open(FS, fname, SPIFFS_RDWR | SPIFFS_CREAT | SPIFFS_TRUNC | SPIFFS_DIRECT, 0);
|
|
if (fd <=0) break;
|
|
|
|
int i;
|
|
res = SPIFFS_OK;
|
|
for (i = 1; i <= 100; i++) {
|
|
char *buf = "0123456789ABCDE\n";
|
|
res = SPIFFS_write(FS, fd, buf, strlen(buf));
|
|
if (res < 0) break;
|
|
}
|
|
SPIFFS_close(FS, fd);
|
|
j++;
|
|
}
|
|
|
|
int errno = SPIFFS_errno(FS);
|
|
TEST_CHECK(errno == SPIFFS_ERR_FULL);
|
|
|
|
u32_t total;
|
|
u32_t used;
|
|
|
|
SPIFFS_info(FS, &total, &used);
|
|
printf("total:%i (%iK)\nused:%i (%iK)\nremain:%i (%iK)\nerrno:%i\n", total, total/1024, used, used/1024, total-used, (total-used)/1024, errno);
|
|
|
|
spiffs_DIR d;
|
|
struct spiffs_dirent e;
|
|
struct spiffs_dirent *pe = &e;
|
|
|
|
SPIFFS_opendir(FS, "/", &d);
|
|
while ((pe = SPIFFS_readdir(&d, pe))) {
|
|
printf("%s [%04x] size:%i\n", pe->name, pe->obj_id, pe->size);
|
|
}
|
|
SPIFFS_closedir(&d);
|
|
|
|
//SPIFFS_vis(FS);
|
|
|
|
//dump_page(FS, 0);
|
|
//dump_page(FS, 1);
|
|
|
|
return TEST_RES_OK;
|
|
|
|
} TEST_END(spiffs_12)
|
|
|
|
|
|
SUITE_END(bug_tests)
|