Skip to content

Commit 7b5939c

Browse files
committed
Add ftruncate / fstat(st_size) unit test
1 parent ae17f6e commit 7b5939c

File tree

2 files changed

+83
-2
lines changed

2 files changed

+83
-2
lines changed

TESTS/mbed_platform/FileHandle/TestFile.h

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class TestFile : public mbed::FileHandle {
3030
~TestFile() {}
3131

3232
enum FunctionName {
33-
fnNone, fnRead, fnWrite, fnSeek, fnClose, fnIsatty
33+
fnNone, fnRead, fnWrite, fnSeek, fnClose, fnIsatty, fnTruncate
3434
};
3535

3636
virtual ssize_t read(void *buffer, size_t size)
@@ -107,6 +107,24 @@ class TestFile : public mbed::FileHandle {
107107
return 0;
108108
}
109109

110+
virtual off_t size()
111+
{
112+
return _end;
113+
}
114+
115+
virtual int truncate(off_t length)
116+
{
117+
_fnCalled = fnTruncate;
118+
if (!NEW_POS_IS_VALID(length)) {
119+
return -EINVAL;
120+
}
121+
while (_end < length) {
122+
_data[_end++] = 0;
123+
}
124+
_end = length;
125+
return 0;
126+
}
127+
110128

111129
static void resetFunctionCallHistory()
112130
{

TESTS/mbed_platform/FileHandle/main.cpp

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,68 @@ void test_fseek_ftell()
451451
std::fclose(file);
452452
}
453453

454+
/** Test ftruncate and fstat (st_size)
455+
*
456+
* Check we get EBADF for illegal handles
457+
*
458+
* Given already opened file is empty
459+
*
460+
* Check initial size is returned as 0
461+
* Call ftruncate with negative value - check our EINVAL is passed back
462+
* Call ftruncate with positive value to increase size - check no error return
463+
* Check fstat st_size now reads back as the value we set.
464+
* Call ftruncate with smaller positive value to decrease size - check no error return
465+
* Check fstat st_size now reads back as the value we set.
466+
*/
467+
void test_ftruncate_fstat()
468+
{
469+
int fildes;
470+
int ret;
471+
struct stat st;
472+
const uint32_t FS = 128;
473+
TestFile<FS> fh;
474+
475+
ret = ftruncate(12345678, 24);
476+
TEST_ASSERT_EQUAL(-1, ret);
477+
TEST_ASSERT_EQUAL(EBADF, errno);
478+
479+
ret = fstat(12345678, &st);
480+
TEST_ASSERT_EQUAL(-1, ret);
481+
TEST_ASSERT_EQUAL(EBADF, errno);
482+
483+
fildes = bind_to_fd(&fh);
484+
TEST_ASSERT_TRUE(fildes >= 0);
485+
486+
ret = fstat(fildes, &st);
487+
TEST_ASSERT_EQUAL(0, ret);
488+
TEST_ASSERT_EQUAL(0, st.st_size);
489+
490+
TestFile<FS>::resetFunctionCallHistory();
491+
ret = ftruncate(fildes, -3);
492+
TEST_ASSERT_TRUE(TestFile<FS>::functionCalled(TestFile<FS>::fnTruncate));
493+
TEST_ASSERT_EQUAL(-1, ret);
494+
TEST_ASSERT_EQUAL(EINVAL, errno);
495+
496+
TestFile<FS>::resetFunctionCallHistory();
497+
ret = ftruncate(fildes, 24);
498+
TEST_ASSERT_TRUE(TestFile<FS>::functionCalled(TestFile<FS>::fnTruncate));
499+
TEST_ASSERT_EQUAL(0, ret);
500+
501+
ret = fstat(fildes, &st);
502+
TEST_ASSERT_EQUAL(0, ret);
503+
TEST_ASSERT_EQUAL(24, st.st_size);
504+
505+
ret = ftruncate(fildes, 12);
506+
TEST_ASSERT_TRUE(TestFile<FS>::functionCalled(TestFile<FS>::fnTruncate));
507+
TEST_ASSERT_EQUAL(0, ret);
508+
509+
ret = fstat(fildes, &st);
510+
TEST_ASSERT_EQUAL(0, ret);
511+
TEST_ASSERT_EQUAL(12, st.st_size);
512+
513+
close(fildes);
514+
}
515+
454516
utest::v1::status_t test_setup(const size_t number_of_cases)
455517
{
456518
GREENTEA_SETUP(10, "default_auto");
@@ -463,7 +525,8 @@ Case cases[] = {
463525
Case("Test fputc/fgetc", test_fputc_fgetc),
464526
Case("Test fputs/fgets", test_fputs_fgets),
465527
Case("Test fprintf/fscanf", test_fprintf_fscanf),
466-
Case("Test fseek/ftell", test_fseek_ftell)
528+
Case("Test fseek/ftell", test_fseek_ftell),
529+
Case("Test ftruncate/fstat", test_ftruncate_fstat)
467530
};
468531

469532
utest::v1::Specification specification(test_setup, cases);

0 commit comments

Comments
 (0)