@@ -451,6 +451,68 @@ void test_fseek_ftell()
451
451
std::fclose (file);
452
452
}
453
453
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
+
454
516
utest::v1::status_t test_setup (const size_t number_of_cases)
455
517
{
456
518
GREENTEA_SETUP (10 , " default_auto" );
@@ -463,7 +525,8 @@ Case cases[] = {
463
525
Case (" Test fputc/fgetc" , test_fputc_fgetc),
464
526
Case (" Test fputs/fgets" , test_fputs_fgets),
465
527
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)
467
530
};
468
531
469
532
utest::v1::Specification specification (test_setup, cases);
0 commit comments