1441606f5SSiva Chandra Reddy //===-- Unittests for file operations like fopen, flcose etc --------------===//
2441606f5SSiva Chandra Reddy //
3441606f5SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4441606f5SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information.
5441606f5SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6441606f5SSiva Chandra Reddy //
7441606f5SSiva Chandra Reddy //===----------------------------------------------------------------------===//
8441606f5SSiva Chandra Reddy 
9*9db0037bSSiva Chandra Reddy #include "src/stdio/clearerr.h"
10441606f5SSiva Chandra Reddy #include "src/stdio/fclose.h"
11*9db0037bSSiva Chandra Reddy #include "src/stdio/feof.h"
12*9db0037bSSiva Chandra Reddy #include "src/stdio/ferror.h"
1322f9dca1SSiva Chandra Reddy #include "src/stdio/fflush.h"
14441606f5SSiva Chandra Reddy #include "src/stdio/fopen.h"
15441606f5SSiva Chandra Reddy #include "src/stdio/fread.h"
16441606f5SSiva Chandra Reddy #include "src/stdio/fseek.h"
17441606f5SSiva Chandra Reddy #include "src/stdio/fwrite.h"
18441606f5SSiva Chandra Reddy #include "utils/UnitTest/Test.h"
19441606f5SSiva Chandra Reddy 
20*9db0037bSSiva Chandra Reddy #include <errno.h>
21441606f5SSiva Chandra Reddy #include <stdio.h>
22441606f5SSiva Chandra Reddy 
TEST(LlvmLibcFILETest,SimpleFileOperations)23*9db0037bSSiva Chandra Reddy TEST(LlvmLibcFILETest, SimpleFileOperations) {
24441606f5SSiva Chandra Reddy   constexpr char FILENAME[] = "testdata/simple_operations.test";
25441606f5SSiva Chandra Reddy   ::FILE *file = __llvm_libc::fopen(FILENAME, "w");
26441606f5SSiva Chandra Reddy   ASSERT_FALSE(file == nullptr);
27441606f5SSiva Chandra Reddy   constexpr char CONTENT[] = "1234567890987654321";
28441606f5SSiva Chandra Reddy   ASSERT_EQ(sizeof(CONTENT) - 1,
29441606f5SSiva Chandra Reddy             __llvm_libc::fwrite(CONTENT, 1, sizeof(CONTENT) - 1, file));
30*9db0037bSSiva Chandra Reddy 
31*9db0037bSSiva Chandra Reddy   // This is not a readable file.
32*9db0037bSSiva Chandra Reddy   char read_data[sizeof(CONTENT)];
33*9db0037bSSiva Chandra Reddy   ASSERT_EQ(__llvm_libc::fread(read_data, 1, sizeof(CONTENT), file), size_t(0));
34*9db0037bSSiva Chandra Reddy   ASSERT_NE(__llvm_libc::ferror(file), 0);
35*9db0037bSSiva Chandra Reddy   EXPECT_NE(errno, 0);
36*9db0037bSSiva Chandra Reddy   errno = 0;
37*9db0037bSSiva Chandra Reddy 
38*9db0037bSSiva Chandra Reddy   __llvm_libc::clearerr(file);
39*9db0037bSSiva Chandra Reddy   ASSERT_EQ(__llvm_libc::ferror(file), 0);
40*9db0037bSSiva Chandra Reddy 
41441606f5SSiva Chandra Reddy   ASSERT_EQ(0, __llvm_libc::fclose(file));
42441606f5SSiva Chandra Reddy 
43441606f5SSiva Chandra Reddy   file = __llvm_libc::fopen(FILENAME, "r");
44441606f5SSiva Chandra Reddy   ASSERT_FALSE(file == nullptr);
45441606f5SSiva Chandra Reddy 
46441606f5SSiva Chandra Reddy   constexpr size_t READ_SIZE = 5;
47441606f5SSiva Chandra Reddy   char data[READ_SIZE];
48441606f5SSiva Chandra Reddy   data[READ_SIZE - 1] = '\0';
49441606f5SSiva Chandra Reddy   ASSERT_EQ(__llvm_libc::fread(data, 1, READ_SIZE - 1, file), READ_SIZE - 1);
50441606f5SSiva Chandra Reddy   ASSERT_STREQ(data, "1234");
51441606f5SSiva Chandra Reddy   ASSERT_EQ(__llvm_libc::fseek(file, 5, SEEK_CUR), 0);
52441606f5SSiva Chandra Reddy   ASSERT_EQ(__llvm_libc::fread(data, 1, READ_SIZE - 1, file), READ_SIZE - 1);
53441606f5SSiva Chandra Reddy   ASSERT_STREQ(data, "0987");
54441606f5SSiva Chandra Reddy   ASSERT_EQ(__llvm_libc::fseek(file, -5, SEEK_CUR), 0);
55441606f5SSiva Chandra Reddy   ASSERT_EQ(__llvm_libc::fread(data, 1, READ_SIZE - 1, file), READ_SIZE - 1);
56441606f5SSiva Chandra Reddy   ASSERT_STREQ(data, "9098");
57441606f5SSiva Chandra Reddy 
58*9db0037bSSiva Chandra Reddy   // Reading another time should trigger eof.
59*9db0037bSSiva Chandra Reddy   ASSERT_NE(sizeof(CONTENT),
60*9db0037bSSiva Chandra Reddy             __llvm_libc::fread(read_data, 1, sizeof(CONTENT), file));
61*9db0037bSSiva Chandra Reddy   ASSERT_NE(__llvm_libc::feof(file), 0);
62*9db0037bSSiva Chandra Reddy 
63*9db0037bSSiva Chandra Reddy   // Should be an error to write.
64*9db0037bSSiva Chandra Reddy   ASSERT_EQ(size_t(0), __llvm_libc::fwrite(CONTENT, 1, sizeof(CONTENT), file));
65*9db0037bSSiva Chandra Reddy   ASSERT_NE(__llvm_libc::ferror(file), 0);
66*9db0037bSSiva Chandra Reddy   ASSERT_NE(errno, 0);
67*9db0037bSSiva Chandra Reddy   errno = 0;
68*9db0037bSSiva Chandra Reddy 
69*9db0037bSSiva Chandra Reddy   __llvm_libc::clearerr(file);
70*9db0037bSSiva Chandra Reddy   ASSERT_EQ(__llvm_libc::ferror(file), 0);
71*9db0037bSSiva Chandra Reddy 
72441606f5SSiva Chandra Reddy   ASSERT_EQ(__llvm_libc::fclose(file), 0);
73441606f5SSiva Chandra Reddy }
7422f9dca1SSiva Chandra Reddy 
TEST(LlvmLibcFILETest,FFlush)75*9db0037bSSiva Chandra Reddy TEST(LlvmLibcFILETest, FFlush) {
7622f9dca1SSiva Chandra Reddy   constexpr char FILENAME[] = "testdata/fflush.test";
7722f9dca1SSiva Chandra Reddy   ::FILE *file = __llvm_libc::fopen(FILENAME, "w+");
7822f9dca1SSiva Chandra Reddy   ASSERT_FALSE(file == nullptr);
7922f9dca1SSiva Chandra Reddy   constexpr char CONTENT[] = "1234567890987654321";
8022f9dca1SSiva Chandra Reddy   ASSERT_EQ(sizeof(CONTENT),
8122f9dca1SSiva Chandra Reddy             __llvm_libc::fwrite(CONTENT, 1, sizeof(CONTENT), file));
8222f9dca1SSiva Chandra Reddy 
8322f9dca1SSiva Chandra Reddy   // Flushing at this point should write the data to disk. So, we should be
8422f9dca1SSiva Chandra Reddy   // able to read it back.
8522f9dca1SSiva Chandra Reddy   ASSERT_EQ(0, __llvm_libc::fflush(file));
8622f9dca1SSiva Chandra Reddy 
8722f9dca1SSiva Chandra Reddy   char data[sizeof(CONTENT)];
8822f9dca1SSiva Chandra Reddy   ASSERT_EQ(__llvm_libc::fseek(file, 0, SEEK_SET), 0);
8922f9dca1SSiva Chandra Reddy   ASSERT_EQ(__llvm_libc::fread(data, 1, sizeof(CONTENT), file),
9022f9dca1SSiva Chandra Reddy             sizeof(CONTENT));
9122f9dca1SSiva Chandra Reddy   ASSERT_STREQ(data, CONTENT);
9222f9dca1SSiva Chandra Reddy 
9322f9dca1SSiva Chandra Reddy   ASSERT_EQ(__llvm_libc::fclose(file), 0);
9422f9dca1SSiva Chandra Reddy }
95