brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.0 KiB · f55b8e2 Raw
110 lines · cpp
1//===-- Unittests for setvbuf ---------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "src/stdio/fclose.h"10#include "src/stdio/fopen.h"11#include "src/stdio/fread.h"12#include "src/stdio/fwrite.h"13#include "src/stdio/setvbuf.h"14#include "test/UnitTest/ErrnoCheckingTest.h"15#include "test/UnitTest/Test.h"16 17#include "hdr/stdio_macros.h"18 19using LlvmLibcSetvbufTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest;20 21TEST_F(LlvmLibcSetvbufTest, SetNBFBuffer) {22  // The idea in this test is that we open a file for writing and reading, and23  // then set a NBF buffer to the write handle. Since it is NBF, the data24  // written using the write handle should be immediately readable by the read25  // handle.26  constexpr char FILENAME[] = APPEND_LIBC_TEST("testdata/setvbuf_nbf.test");27 28  ::FILE *fw = LIBC_NAMESPACE::fopen(FILENAME, "w");29  ASSERT_FALSE(fw == nullptr);30  char buffer[BUFSIZ];31  ASSERT_EQ(LIBC_NAMESPACE::setvbuf(fw, buffer, _IONBF, BUFSIZ), 0);32 33  ::FILE *fr = LIBC_NAMESPACE::fopen(FILENAME, "r");34  ASSERT_FALSE(fr == nullptr);35 36  constexpr char CONTENT[] = "abcdef";37  constexpr size_t CONTENT_SIZE = sizeof(CONTENT);38  for (size_t i = 0; i < CONTENT_SIZE; ++i) {39    ASSERT_EQ(size_t(1), LIBC_NAMESPACE::fwrite(CONTENT + i, 1, 1, fw));40    char c;41    ASSERT_EQ(size_t(1), LIBC_NAMESPACE::fread(&c, 1, 1, fr));42    ASSERT_EQ(c, CONTENT[i]);43  }44 45  ASSERT_EQ(0, LIBC_NAMESPACE::fclose(fw));46  ASSERT_EQ(0, LIBC_NAMESPACE::fclose(fr));47 48  // Make sure NBF buffer has no effect for reading.49  fr = LIBC_NAMESPACE::fopen(FILENAME, "r");50  char data[CONTENT_SIZE];51  ASSERT_EQ(LIBC_NAMESPACE::setvbuf(fr, buffer, _IONBF, BUFSIZ), 0);52  ASSERT_EQ(CONTENT_SIZE, LIBC_NAMESPACE::fread(data, 1, CONTENT_SIZE, fr));53  ASSERT_STREQ(CONTENT, data);54  ASSERT_EQ(0, LIBC_NAMESPACE::fclose(fr));55}56 57TEST_F(LlvmLibcSetvbufTest, SetLBFBuffer) {58  // The idea in this test is that we open a file for writing and reading, and59  // then set a LBF buffer to the write handle. Since it is LBF, the data60  // written using the write handle should be available right after a '\n' is61  // written.62  constexpr char FILENAME[] = APPEND_LIBC_TEST("testdata/setvbuf_lbf.test");63 64  ::FILE *fw = LIBC_NAMESPACE::fopen(FILENAME, "w");65  ASSERT_FALSE(fw == nullptr);66  char buffer[BUFSIZ];67  ASSERT_EQ(LIBC_NAMESPACE::setvbuf(fw, buffer, _IOLBF, BUFSIZ), 0);68 69  ::FILE *fr = LIBC_NAMESPACE::fopen(FILENAME, "r");70  ASSERT_FALSE(fr == nullptr);71 72  constexpr char CONTENT[] = "abcdef\n";73  constexpr size_t CONTENT_SIZE = sizeof(CONTENT);74  ASSERT_EQ(CONTENT_SIZE, LIBC_NAMESPACE::fwrite(CONTENT, 1, CONTENT_SIZE, fw));75 76  // Note that CONTENT_SIZE worth of data written also includes the77  // null-terminator '\0'. But, since it is after the new line character,78  // it should not be availabe for reading.79  char data[CONTENT_SIZE];80  ASSERT_EQ(CONTENT_SIZE - 1, LIBC_NAMESPACE::fread(data, 1, CONTENT_SIZE, fr));81  char c;82  ASSERT_EQ(size_t(0), LIBC_NAMESPACE::fread(&c, 1, 1, fr));83 84  data[CONTENT_SIZE - 1] = '\0';85  ASSERT_STREQ(CONTENT, data);86 87  ASSERT_EQ(0, LIBC_NAMESPACE::fclose(fw));88  ASSERT_EQ(0, LIBC_NAMESPACE::fclose(fr));89 90  // Make sure LBF buffer has no effect for reading.91  fr = LIBC_NAMESPACE::fopen(FILENAME, "r");92  ASSERT_EQ(LIBC_NAMESPACE::setvbuf(fr, buffer, _IOLBF, BUFSIZ), 0);93  ASSERT_EQ(CONTENT_SIZE, LIBC_NAMESPACE::fread(data, 1, CONTENT_SIZE, fr));94  ASSERT_STREQ(CONTENT, data);95  ASSERT_EQ(0, LIBC_NAMESPACE::fclose(fr));96}97 98TEST(LlvmLibcSetbufTest, InvalidBufferMode) {99  constexpr char FILENAME[] =100      APPEND_LIBC_TEST("testdata/setvbuf_invalid_bufmode.test");101  ::FILE *f = LIBC_NAMESPACE::fopen(FILENAME, "w");102  ASSERT_FALSE(f == nullptr);103  char buf[BUFSIZ];104  ASSERT_NE(LIBC_NAMESPACE::setvbuf(f, buf, _IOFBF + _IOLBF + _IONBF, BUFSIZ),105            0);106  ASSERT_ERRNO_EQ(EINVAL);107 108  ASSERT_EQ(0, LIBC_NAMESPACE::fclose(f));109}110