brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.6 KiB · b035b6d Raw
110 lines · cpp
1//===-- Unittests for fprintf ---------------------------------------------===//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#ifndef LIBC_COPT_STDIO_USE_SYSTEM_FILE10#include "src/stdio/fclose.h"11#include "src/stdio/ferror.h"12#include "src/stdio/fopen.h"13#include "src/stdio/fread.h"14#endif // LIBC_COPT_STDIO_USE_SYSTEM_FILE15 16#include "src/stdio/fprintf.h"17 18#include "src/__support/CPP/limits.h"19#include "src/__support/macros/properties/architectures.h"20#include "test/UnitTest/ErrnoCheckingTest.h"21#include "test/UnitTest/ErrnoSetterMatcher.h"22#include "test/UnitTest/Test.h"23 24namespace printf_test {25#ifndef LIBC_COPT_STDIO_USE_SYSTEM_FILE26using LIBC_NAMESPACE::fclose;27using LIBC_NAMESPACE::ferror;28using LIBC_NAMESPACE::fopen;29using LIBC_NAMESPACE::fread;30#else  // defined(LIBC_COPT_STDIO_USE_SYSTEM_FILE)31using ::fclose;32using ::ferror;33using ::fopen;34using ::fread;35#endif // LIBC_COPT_STDIO_USE_SYSTEM_FILE36} // namespace printf_test37 38using LlvmLibcFPrintfTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest;39 40TEST(LlvmLibcFPrintfTest, WriteToFile) {41  const char *FILENAME = APPEND_LIBC_TEST("fprintf_output.test");42  auto FILE_PATH = libc_make_test_file_path(FILENAME);43 44  ::FILE *file = printf_test::fopen(FILE_PATH, "w");45  ASSERT_FALSE(file == nullptr);46 47  int written;48 49  constexpr char simple[] = "A simple string with no conversions.\n";50  written = LIBC_NAMESPACE::fprintf(file, simple);51  EXPECT_EQ(written, 37);52 53  constexpr char numbers[] = "1234567890\n";54  written = LIBC_NAMESPACE::fprintf(file, "%s", numbers);55  EXPECT_EQ(written, 11);56 57  constexpr char format_more[] = "%s and more\n";58  constexpr char short_numbers[] = "1234";59  written = LIBC_NAMESPACE::fprintf(file, format_more, short_numbers);60  EXPECT_EQ(written, 14);61 62  ASSERT_EQ(0, printf_test::fclose(file));63 64  file = printf_test::fopen(FILE_PATH, "r");65  ASSERT_FALSE(file == nullptr);66 67  char data[50];68  ASSERT_EQ(printf_test::fread(data, 1, sizeof(simple) - 1, file),69            sizeof(simple) - 1);70  data[sizeof(simple) - 1] = '\0';71  ASSERT_STREQ(data, simple);72  ASSERT_EQ(printf_test::fread(data, 1, sizeof(numbers) - 1, file),73            sizeof(numbers) - 1);74  data[sizeof(numbers) - 1] = '\0';75  ASSERT_STREQ(data, numbers);76  ASSERT_EQ(printf_test::fread(77                data, 1, sizeof(format_more) + sizeof(short_numbers) - 4, file),78            sizeof(format_more) + sizeof(short_numbers) - 4);79  data[sizeof(format_more) + sizeof(short_numbers) - 4] = '\0';80  ASSERT_STREQ(data, "1234 and more\n");81 82  ASSERT_EQ(printf_test::ferror(file), 0);83 84  written =85      LIBC_NAMESPACE::fprintf(file, "Writing to a read only file should fail.");86  EXPECT_LT(written, 0);87  ASSERT_ERRNO_FAILURE();88 89  ASSERT_EQ(printf_test::fclose(file), 0);90}91 92#if !defined(LIBC_COPT_PRINTF_NO_NULLPTR_CHECKS) &&                            \93    !defined(LIBC_COPT_PRINTF_DISABLE_WRITE_INT) &&                            \94    !defined(LIBC_TARGET_ARCH_IS_GPU)95TEST(LlvmLibcFPrintfTest, NullPtrCheck) {96  const char *FILENAME = APPEND_LIBC_TEST("fprintf_nullptr.test");97  auto FILE_PATH = libc_make_test_file_path(FILENAME);98 99  ::FILE *file = printf_test::fopen(FILE_PATH, "w");100  ASSERT_FALSE(file == nullptr);101 102  int ret =103      LIBC_NAMESPACE::fprintf(file, "hello %n", static_cast<int *>(nullptr));104  EXPECT_LT(ret, 0);105  ASSERT_ERRNO_FAILURE();106 107  ASSERT_EQ(printf_test::fclose(file), 0);108}109#endif // LIBC_COPT_PRINTF_NO_NULLPTR_CHECKS110