Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:31

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /*
0004  *  COPYRIGHT (c) 2013 Andrey Mozzhuhin
0005  *
0006  * Redistribution and use in source and binary forms, with or without
0007  * modification, are permitted provided that the following conditions
0008  * are met:
0009  * 1. Redistributions of source code must retain the above copyright
0010  *    notice, this list of conditions and the following disclaimer.
0011  * 2. Redistributions in binary form must reproduce the above copyright
0012  *    notice, this list of conditions and the following disclaimer in the
0013  *    documentation and/or other materials provided with the distribution.
0014  *
0015  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0016  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0017  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0018  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0019  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0020  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0021  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0022  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0023  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0024  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0025  * POSSIBILITY OF SUCH DAMAGE.
0026  */
0027 
0028 #ifdef HAVE_CONFIG_H
0029 #include "config.h"
0030 #endif
0031 
0032 #include <sys/statvfs.h>
0033 #include <string.h>
0034 #include <fcntl.h>
0035 #include <unistd.h>
0036 
0037 #include "fstest.h"
0038 #include "fs_config.h"
0039 #include <tmacros.h>
0040 
0041 const char rtems_test_name[] = "FSSTATVFS " FILESYSTEM;
0042 const RTEMS_TEST_STATE rtems_test_state = TEST_STATE;
0043 
0044 static void statvfs_validate(struct statvfs *stat)
0045 {
0046   rtems_test_assert(stat->f_bsize > 0);
0047   rtems_test_assert(stat->f_frsize > 0);
0048   rtems_test_assert(stat->f_blocks > 0);
0049   rtems_test_assert(stat->f_bfree <= stat->f_blocks);
0050   rtems_test_assert(stat->f_bavail <= stat->f_blocks);
0051   rtems_test_assert(stat->f_ffree <= stat->f_files);
0052   rtems_test_assert(stat->f_favail <= stat->f_files);
0053   rtems_test_assert(stat->f_namemax > 0);
0054 }
0055 
0056 static void statvfs_test01(void)
0057 {
0058   struct statvfs statbuf1, statbuf2;
0059   int status;
0060   int fd;
0061   ssize_t n;
0062   const char *databuf = "STATVFS";
0063   int datalen = strlen(databuf);
0064   const char *filename = __func__;
0065 
0066   /*
0067    * Get current filesystem statistics
0068    */
0069   status = statvfs("/", &statbuf1);
0070   rtems_test_assert(status == 0);
0071   statvfs_validate(&statbuf1);
0072 
0073   /*
0074    * Create one file
0075    */
0076   fd = open(filename, O_CREAT | O_WRONLY, 0775);
0077   rtems_test_assert(fd >= 0);
0078   n = write(fd, databuf, datalen);
0079   rtems_test_assert(n == datalen);
0080   status = close(fd);
0081   rtems_test_assert(status == 0);
0082 
0083   /*
0084    * Get new filesystem statistics
0085    */
0086   status = statvfs("/", &statbuf2);
0087   rtems_test_assert(status == 0);
0088   statvfs_validate(&statbuf2);
0089 
0090   /*
0091    * Compare old and new statistics
0092    */
0093   rtems_test_assert(statbuf1.f_bsize == statbuf2.f_bsize);
0094   rtems_test_assert(statbuf1.f_frsize == statbuf2.f_frsize);
0095   rtems_test_assert(statbuf1.f_blocks == statbuf2.f_blocks);
0096   rtems_test_assert(statbuf1.f_bfree >= statbuf2.f_bfree);
0097   rtems_test_assert(statbuf1.f_bavail >= statbuf2.f_bavail);
0098   rtems_test_assert(statbuf1.f_ffree >= statbuf2.f_ffree);
0099   rtems_test_assert(statbuf1.f_favail >= statbuf2.f_favail);
0100   rtems_test_assert(statbuf1.f_namemax == statbuf2.f_namemax);
0101 }
0102 
0103 /*
0104  * These tests only get time_t value, and test
0105  * if they are changed. Thest tests don't check atime
0106  */
0107 void test(void)
0108 {
0109   statvfs_test01();
0110 }