1*71db0c75SAndroid Build Coastguard Worker //===-- Unittests for vasprintf--------------------------------------------===//
2*71db0c75SAndroid Build Coastguard Worker //
3*71db0c75SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*71db0c75SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information.
5*71db0c75SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*71db0c75SAndroid Build Coastguard Worker //
7*71db0c75SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
8*71db0c75SAndroid Build Coastguard Worker
9*71db0c75SAndroid Build Coastguard Worker #include "src/stdio/sprintf.h"
10*71db0c75SAndroid Build Coastguard Worker #include "src/stdio/vasprintf.h"
11*71db0c75SAndroid Build Coastguard Worker #include "src/string/memset.h"
12*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/Test.h"
13*71db0c75SAndroid Build Coastguard Worker
call_vasprintf(char ** __restrict buffer,const char * __restrict format,...)14*71db0c75SAndroid Build Coastguard Worker int call_vasprintf(char **__restrict buffer, const char *__restrict format,
15*71db0c75SAndroid Build Coastguard Worker ...) {
16*71db0c75SAndroid Build Coastguard Worker va_list vlist;
17*71db0c75SAndroid Build Coastguard Worker va_start(vlist, format);
18*71db0c75SAndroid Build Coastguard Worker int ret = LIBC_NAMESPACE::vasprintf(buffer, format, vlist);
19*71db0c75SAndroid Build Coastguard Worker va_end(vlist);
20*71db0c75SAndroid Build Coastguard Worker return ret;
21*71db0c75SAndroid Build Coastguard Worker }
22*71db0c75SAndroid Build Coastguard Worker
TEST(LlvmLibcVASPrintfTest,SimpleNoConv)23*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcVASPrintfTest, SimpleNoConv) {
24*71db0c75SAndroid Build Coastguard Worker char *buff = nullptr;
25*71db0c75SAndroid Build Coastguard Worker int written;
26*71db0c75SAndroid Build Coastguard Worker written = call_vasprintf(&buff, "A simple string with no conversions.");
27*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(written, 36);
28*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ(buff, "A simple string with no conversions.");
29*71db0c75SAndroid Build Coastguard Worker free(buff);
30*71db0c75SAndroid Build Coastguard Worker }
31*71db0c75SAndroid Build Coastguard Worker
TEST(LlvmLibcVASPrintfTest,PercentConv)32*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcVASPrintfTest, PercentConv) {
33*71db0c75SAndroid Build Coastguard Worker char *buff = nullptr;
34*71db0c75SAndroid Build Coastguard Worker int written;
35*71db0c75SAndroid Build Coastguard Worker
36*71db0c75SAndroid Build Coastguard Worker written = call_vasprintf(&buff, "%%");
37*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(written, 1);
38*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ(buff, "%");
39*71db0c75SAndroid Build Coastguard Worker free(buff);
40*71db0c75SAndroid Build Coastguard Worker
41*71db0c75SAndroid Build Coastguard Worker written = call_vasprintf(&buff, "abc %% def");
42*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(written, 9);
43*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ(buff, "abc % def");
44*71db0c75SAndroid Build Coastguard Worker free(buff);
45*71db0c75SAndroid Build Coastguard Worker
46*71db0c75SAndroid Build Coastguard Worker written = call_vasprintf(&buff, "%%%%%%");
47*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(written, 3);
48*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ(buff, "%%%");
49*71db0c75SAndroid Build Coastguard Worker free(buff);
50*71db0c75SAndroid Build Coastguard Worker }
51*71db0c75SAndroid Build Coastguard Worker
TEST(LlvmLibcVASPrintfTest,CharConv)52*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcVASPrintfTest, CharConv) {
53*71db0c75SAndroid Build Coastguard Worker char *buff = nullptr;
54*71db0c75SAndroid Build Coastguard Worker int written;
55*71db0c75SAndroid Build Coastguard Worker
56*71db0c75SAndroid Build Coastguard Worker written = call_vasprintf(&buff, "%c", 'a');
57*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(written, 1);
58*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ(buff, "a");
59*71db0c75SAndroid Build Coastguard Worker free(buff);
60*71db0c75SAndroid Build Coastguard Worker
61*71db0c75SAndroid Build Coastguard Worker written = call_vasprintf(&buff, "%3c %-3c", '1', '2');
62*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(written, 7);
63*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ(buff, " 1 2 ");
64*71db0c75SAndroid Build Coastguard Worker free(buff);
65*71db0c75SAndroid Build Coastguard Worker
66*71db0c75SAndroid Build Coastguard Worker written = call_vasprintf(&buff, "%*c", 2, '3');
67*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(written, 2);
68*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ(buff, " 3");
69*71db0c75SAndroid Build Coastguard Worker free(buff);
70*71db0c75SAndroid Build Coastguard Worker }
71*71db0c75SAndroid Build Coastguard Worker
TEST(LlvmLibcVASPrintfTest,LargeStringNoConv)72*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcVASPrintfTest, LargeStringNoConv) {
73*71db0c75SAndroid Build Coastguard Worker char *buff = nullptr;
74*71db0c75SAndroid Build Coastguard Worker char long_str[1001];
75*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::memset(long_str, 'a', 1000);
76*71db0c75SAndroid Build Coastguard Worker long_str[1000] = '\0';
77*71db0c75SAndroid Build Coastguard Worker int written;
78*71db0c75SAndroid Build Coastguard Worker written = call_vasprintf(&buff, long_str);
79*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(written, 1000);
80*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ(buff, long_str);
81*71db0c75SAndroid Build Coastguard Worker free(buff);
82*71db0c75SAndroid Build Coastguard Worker }
83*71db0c75SAndroid Build Coastguard Worker
TEST(LlvmLibcVASPrintfTest,ManyReAlloc)84*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcVASPrintfTest, ManyReAlloc) {
85*71db0c75SAndroid Build Coastguard Worker char *buff = nullptr;
86*71db0c75SAndroid Build Coastguard Worker const int expected_num_chars = 600;
87*71db0c75SAndroid Build Coastguard Worker int written = call_vasprintf(&buff, "%200s%200s%200s", "", "", "");
88*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(written, expected_num_chars);
89*71db0c75SAndroid Build Coastguard Worker
90*71db0c75SAndroid Build Coastguard Worker bool isPadding = true;
91*71db0c75SAndroid Build Coastguard Worker for (int i = 0; i < expected_num_chars; i++) {
92*71db0c75SAndroid Build Coastguard Worker if (buff[i] != ' ') {
93*71db0c75SAndroid Build Coastguard Worker isPadding = false;
94*71db0c75SAndroid Build Coastguard Worker break;
95*71db0c75SAndroid Build Coastguard Worker }
96*71db0c75SAndroid Build Coastguard Worker }
97*71db0c75SAndroid Build Coastguard Worker EXPECT_TRUE(isPadding);
98*71db0c75SAndroid Build Coastguard Worker free(buff);
99*71db0c75SAndroid Build Coastguard Worker }
100