1// Copyright 2016 The Fuchsia Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include <fcntl.h> 6#include <stdio.h> 7#include <stdlib.h> 8#include <sys/stat.h> 9#include <unistd.h> 10 11#include "filesystems.h" 12#include "misc.h" 13 14// TODO(smklein): Create a more complex test, capable of mocking a block device 15// and ensuring that data is actually being flushed to a block device. 16// For now, test that 'fsync' and 'fdatasync' don't throw errors for file and 17// directories. 18bool test_sync(void) { 19 BEGIN_TEST; 20 21 int fd = open("::alpha", O_RDWR | O_CREAT | O_EXCL, 0644); 22 ASSERT_GT(fd, 0, ""); 23 ASSERT_STREAM_ALL(write, fd, "Hello, World!\n", 14); 24 ASSERT_EQ(fsync(fd), 0, ""); 25 ASSERT_EQ(lseek(fd, 0, SEEK_SET), 0, ""); 26 ASSERT_STREAM_ALL(write, fd, "Adios, World!\n", 14); 27 ASSERT_EQ(fdatasync(fd), 0, ""); 28 ASSERT_EQ(close(fd), 0, ""); 29 ASSERT_EQ(unlink("::alpha"), 0, ""); 30 31 ASSERT_EQ(mkdir("::dirname", 0755), 0, ""); 32 fd = open("::dirname", O_RDONLY | O_DIRECTORY, 0644); 33 ASSERT_GT(fd, 0, ""); 34 ASSERT_EQ(fsync(fd), 0, ""); 35 ASSERT_EQ(fdatasync(fd), 0, ""); 36 ASSERT_EQ(close(fd), 0, ""); 37 ASSERT_EQ(unlink("::dirname"), 0, ""); 38 39 END_TEST; 40} 41 42RUN_FOR_ALL_FILESYSTEMS(sync_tests, 43 RUN_TEST_MEDIUM(test_sync) 44) 45