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