1*ba7e1cddSMichael Jones //===-- Unittests for fprintf ---------------------------------------------===// 2*ba7e1cddSMichael Jones // 3*ba7e1cddSMichael Jones // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*ba7e1cddSMichael Jones // See https://llvm.org/LICENSE.txt for license information. 5*ba7e1cddSMichael Jones // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*ba7e1cddSMichael Jones // 7*ba7e1cddSMichael Jones //===----------------------------------------------------------------------===// 8*ba7e1cddSMichael Jones 9*ba7e1cddSMichael Jones #include "src/stdio/fclose.h" 10*ba7e1cddSMichael Jones #include "src/stdio/ferror.h" 11*ba7e1cddSMichael Jones #include "src/stdio/fopen.h" 12*ba7e1cddSMichael Jones #include "src/stdio/fread.h" 13*ba7e1cddSMichael Jones 14*ba7e1cddSMichael Jones #include "src/stdio/fprintf.h" 15*ba7e1cddSMichael Jones 16*ba7e1cddSMichael Jones #include "utils/UnitTest/Test.h" 17*ba7e1cddSMichael Jones 18*ba7e1cddSMichael Jones #include <errno.h> 19*ba7e1cddSMichael Jones #include <stdio.h> 20*ba7e1cddSMichael Jones 21*ba7e1cddSMichael Jones TEST(LlvmLibcFPrintfTest, WriteToFile) { 22*ba7e1cddSMichael Jones constexpr char FILENAME[] = "testdata/fprintf_output.test"; 23*ba7e1cddSMichael Jones ::FILE *file = __llvm_libc::fopen(FILENAME, "w"); 24*ba7e1cddSMichael Jones ASSERT_FALSE(file == nullptr); 25*ba7e1cddSMichael Jones 26*ba7e1cddSMichael Jones int written; 27*ba7e1cddSMichael Jones 28*ba7e1cddSMichael Jones constexpr char simple[] = "A simple string with no conversions.\n"; 29*ba7e1cddSMichael Jones written = __llvm_libc::fprintf(file, simple); 30*ba7e1cddSMichael Jones EXPECT_EQ(written, 37); 31*ba7e1cddSMichael Jones 32*ba7e1cddSMichael Jones constexpr char numbers[] = "1234567890\n"; 33*ba7e1cddSMichael Jones written = __llvm_libc::fprintf(file, "%s", numbers); 34*ba7e1cddSMichael Jones EXPECT_EQ(written, 11); 35*ba7e1cddSMichael Jones 36*ba7e1cddSMichael Jones constexpr char format_more[] = "%s and more\n"; 37*ba7e1cddSMichael Jones constexpr char short_numbers[] = "1234"; 38*ba7e1cddSMichael Jones written = __llvm_libc::fprintf(file, format_more, short_numbers); 39*ba7e1cddSMichael Jones EXPECT_EQ(written, 14); 40*ba7e1cddSMichael Jones 41*ba7e1cddSMichael Jones ASSERT_EQ(0, __llvm_libc::fclose(file)); 42*ba7e1cddSMichael Jones 43*ba7e1cddSMichael Jones file = __llvm_libc::fopen(FILENAME, "r"); 44*ba7e1cddSMichael Jones ASSERT_FALSE(file == nullptr); 45*ba7e1cddSMichael Jones 46*ba7e1cddSMichael Jones char data[50]; 47*ba7e1cddSMichael Jones ASSERT_EQ(__llvm_libc::fread(data, 1, sizeof(simple) - 1, file), 48*ba7e1cddSMichael Jones sizeof(simple) - 1); 49*ba7e1cddSMichael Jones data[sizeof(simple) - 1] = '\0'; 50*ba7e1cddSMichael Jones ASSERT_STREQ(data, simple); 51*ba7e1cddSMichael Jones ASSERT_EQ(__llvm_libc::fread(data, 1, sizeof(numbers) - 1, file), 52*ba7e1cddSMichael Jones sizeof(numbers) - 1); 53*ba7e1cddSMichael Jones data[sizeof(numbers) - 1] = '\0'; 54*ba7e1cddSMichael Jones ASSERT_STREQ(data, numbers); 55*ba7e1cddSMichael Jones ASSERT_EQ(__llvm_libc::fread( 56*ba7e1cddSMichael Jones data, 1, sizeof(format_more) + sizeof(short_numbers) - 4, file), 57*ba7e1cddSMichael Jones sizeof(format_more) + sizeof(short_numbers) - 4); 58*ba7e1cddSMichael Jones data[sizeof(format_more) + sizeof(short_numbers) - 4] = '\0'; 59*ba7e1cddSMichael Jones ASSERT_STREQ(data, "1234 and more\n"); 60*ba7e1cddSMichael Jones 61*ba7e1cddSMichael Jones ASSERT_EQ(__llvm_libc::ferror(file), 0); 62*ba7e1cddSMichael Jones 63*ba7e1cddSMichael Jones written = 64*ba7e1cddSMichael Jones __llvm_libc::fprintf(file, "Writing to a read only file should fail."); 65*ba7e1cddSMichael Jones EXPECT_EQ(written, -1); 66*ba7e1cddSMichael Jones 67*ba7e1cddSMichael Jones ASSERT_EQ(__llvm_libc::fclose(file), 0); 68*ba7e1cddSMichael Jones } 69