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