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