#define _GNU_SOURCE
#include "test-common.h"
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int test_fstat(const char *base_path) {
char path[512];
struct stat st;
int fd, result;
snprintf(path, sizeof(path), "%s/test.txt", base_path);
fd = open(path, O_RDONLY);
TEST_ASSERT_ERRNO(fd >= 0, "open should succeed");
result = fstat(fd, &st);
TEST_ASSERT_ERRNO(result == 0, "fstat should succeed");
TEST_ASSERT(S_ISREG(st.st_mode), "should be a regular file");
TEST_ASSERT(st.st_size > 0, "file size should be greater than 0");
struct stat st2;
result = stat(path, &st2);
TEST_ASSERT_ERRNO(result == 0, "stat should succeed");
TEST_ASSERT(st.st_size == st2.st_size, "fstat and stat should return same size");
TEST_ASSERT(st.st_ino == st2.st_ino, "fstat and stat should return same inode");
close(fd);
result = fstat(fd, &st);
TEST_ASSERT(result < 0 && errno == EBADF, "fstat on closed fd should fail with EBADF");
fd = open(base_path, O_RDONLY | O_DIRECTORY);
TEST_ASSERT_ERRNO(fd >= 0, "open directory should succeed");
result = fstat(fd, &st);
TEST_ASSERT_ERRNO(result == 0, "fstat on directory fd should succeed");
TEST_ASSERT(S_ISDIR(st.st_mode), "should be a directory");
close(fd);
return 0;
}