Serenity Operating System
1/*
2 * Copyright (c) 2022, Daniel Bertalan <dani@danielbertalan.dev>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include <LibTest/TestCase.h>
8#include <stdio.h>
9#include <sys/wait.h>
10#include <unistd.h>
11
12// Test whether file writes are flushed to disk at program termination,
13// even if we do not close the files or call fflush().
14TEST_CASE(flush_on_exit)
15{
16 static constexpr auto test_str = "peekaboo";
17 auto pid = fork();
18 VERIFY(pid >= 0);
19
20 if (pid == 0) {
21 auto* fp = fopen("/tmp/flushtest", "w");
22 VERIFY(fp != nullptr);
23 auto nwritten = fwrite(test_str, 1, strlen(test_str), fp);
24 VERIFY(nwritten != 0);
25 // We intentionally leak `fp` here.
26 exit(0);
27 } else {
28 int wstatus;
29 auto rc = waitpid(pid, &wstatus, 0);
30 VERIFY(rc >= 0);
31
32 char buf[256];
33 auto* fp = fopen("/tmp/flushtest", "r");
34 VERIFY(fp != nullptr);
35 auto* sp = fgets(buf, sizeof(buf), fp);
36 VERIFY(sp != nullptr);
37 fclose(fp);
38 unlink("/tmp/flushtest");
39
40 EXPECT_EQ(strcmp(test_str, buf), 0);
41 }
42}
43
44TEST_CASE(sprintf_sign)
45{
46 char buf1[128];
47 int ret1 = sprintf(buf1, "%+d", 12);
48 EXPECT_EQ(ret1, 3);
49
50 char buf2[128];
51 int ret2 = sprintf(buf2, "%+d", -12);
52 EXPECT_EQ(ret2, 3);
53
54 EXPECT_EQ(buf1, "+12"sv);
55 EXPECT_EQ(buf2, "-12"sv);
56}