xref: /llvm-project/libc/test/integration/src/stdio/gpu/printf_test.cpp (revision 40effc7af5679b7d54d3176a5eef2cdee1962ecd)
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