1*40effc7aSJoseph Huber //===-- RPC test to check args to printf ----------------------------------===// 2*40effc7aSJoseph Huber // 3*40effc7aSJoseph Huber // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*40effc7aSJoseph Huber // See https://llvm.org/LICENSE.txt for license information. 5*40effc7aSJoseph Huber // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*40effc7aSJoseph Huber // 7*40effc7aSJoseph Huber //===----------------------------------------------------------------------===// 8*40effc7aSJoseph Huber 9*40effc7aSJoseph Huber #include "test/IntegrationTest/test.h" 10*40effc7aSJoseph Huber 11*40effc7aSJoseph Huber #include "src/__support/GPU/utils.h" 12*40effc7aSJoseph Huber #include "src/stdio/fopen.h" 13*40effc7aSJoseph Huber #include "src/stdio/fprintf.h" 14*40effc7aSJoseph Huber 15*40effc7aSJoseph Huber using namespace LIBC_NAMESPACE; 16*40effc7aSJoseph Huber 17*40effc7aSJoseph Huber FILE *file = LIBC_NAMESPACE::fopen("testdata/test_data.txt", "w"); 18*40effc7aSJoseph Huber 19*40effc7aSJoseph Huber TEST_MAIN(int argc, char **argv, char **envp) { 20*40effc7aSJoseph Huber ASSERT_TRUE(file && "failed to open file"); 21*40effc7aSJoseph Huber // Check basic printing. 22*40effc7aSJoseph Huber int written = 0; 23*40effc7aSJoseph Huber written = LIBC_NAMESPACE::fprintf(file, "A simple string\n"); 24*40effc7aSJoseph Huber ASSERT_EQ(written, 16); 25*40effc7aSJoseph Huber 26*40effc7aSJoseph Huber const char *str = "A simple string\n"; 27*40effc7aSJoseph Huber written = LIBC_NAMESPACE::fprintf(file, "%s", str); 28*40effc7aSJoseph Huber ASSERT_EQ(written, 16); 29*40effc7aSJoseph Huber 30*40effc7aSJoseph Huber // Check printing a different value with each thread. 31*40effc7aSJoseph Huber uint64_t thread_id = gpu::get_thread_id(); 32*40effc7aSJoseph Huber written = LIBC_NAMESPACE::fprintf(file, "%8ld\n", thread_id); 33*40effc7aSJoseph Huber ASSERT_EQ(written, 9); 34*40effc7aSJoseph Huber 35*40effc7aSJoseph Huber written = LIBC_NAMESPACE::fprintf(file, "%d%c%.1f\n", 1, 'c', 1.0); 36*40effc7aSJoseph Huber ASSERT_EQ(written, 6); 37*40effc7aSJoseph Huber 38*40effc7aSJoseph Huber written = LIBC_NAMESPACE::fprintf(file, "%032b%s\n", 1, "A simple string\n"); 39*40effc7aSJoseph Huber ASSERT_EQ(written, 49); 40*40effc7aSJoseph Huber 41*40effc7aSJoseph Huber // Check that the server correctly handles divergent numbers of arguments. 42*40effc7aSJoseph Huber const char *format = gpu::get_thread_id() % 2 ? "%s" : "%20ld\n"; 43*40effc7aSJoseph Huber written = LIBC_NAMESPACE::fprintf(file, format, str); 44*40effc7aSJoseph Huber ASSERT_EQ(written, gpu::get_thread_id() % 2 ? 16 : 21); 45*40effc7aSJoseph Huber 46*40effc7aSJoseph Huber format = gpu::get_thread_id() % 2 ? "%s" : str; 47*40effc7aSJoseph Huber written = LIBC_NAMESPACE::fprintf(file, format, str); 48*40effc7aSJoseph Huber ASSERT_EQ(written, 16); 49*40effc7aSJoseph Huber 50*40effc7aSJoseph Huber // Check that we handle null arguments correctly. 51*40effc7aSJoseph Huber written = LIBC_NAMESPACE::fprintf(file, "%p", nullptr); 52*40effc7aSJoseph Huber ASSERT_EQ(written, 9); 53*40effc7aSJoseph Huber 54*40effc7aSJoseph Huber #ifndef LIBC_COPT_PRINTF_NO_NULLPTR_CHECKS 55*40effc7aSJoseph Huber written = LIBC_NAMESPACE::fprintf(file, "%s", nullptr); 56*40effc7aSJoseph Huber ASSERT_EQ(written, 6); 57*40effc7aSJoseph Huber #endif // LIBC_COPT_PRINTF_NO_NULLPTR_CHECKS 58*40effc7aSJoseph Huber 59*40effc7aSJoseph Huber // Check for extremely abused variable width arguments 60*40effc7aSJoseph Huber written = LIBC_NAMESPACE::fprintf(file, "%**d", 1, 2, 1.0); 61*40effc7aSJoseph Huber ASSERT_EQ(written, 4); 62*40effc7aSJoseph Huber written = LIBC_NAMESPACE::fprintf(file, "%**d%6d", 1, 2, 1.0); 63*40effc7aSJoseph Huber ASSERT_EQ(written, 10); 64*40effc7aSJoseph Huber written = LIBC_NAMESPACE::fprintf(file, "%**.**f", 1, 2, 1.0); 65*40effc7aSJoseph Huber ASSERT_EQ(written, 7); 66*40effc7aSJoseph Huber 67*40effc7aSJoseph Huber return 0; 68*40effc7aSJoseph Huber } 69