1*80814287SRaphael Isemann //===-- VASprintfTest.cpp -------------------------------------------------===//
224ae6294SZachary Turner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
624ae6294SZachary Turner //
724ae6294SZachary Turner //===----------------------------------------------------------------------===//
824ae6294SZachary Turner
9d9c0e15fSZachary Turner #include "lldb/Utility/VASPrintf.h"
1024ae6294SZachary Turner #include "llvm/ADT/SmallString.h"
1124ae6294SZachary Turner
1224ae6294SZachary Turner #include "gtest/gtest.h"
1324ae6294SZachary Turner
1424ae6294SZachary Turner #include <locale.h>
1524ae6294SZachary Turner
165706f1e6STim Hammerquist #if defined (_WIN32)
175706f1e6STim Hammerquist #define TEST_ENCODING ".932" // On Windows, test codepage 932
185706f1e6STim Hammerquist #else
195706f1e6STim Hammerquist #define TEST_ENCODING "C" // ...otherwise, any widely available uni-byte LC
205706f1e6STim Hammerquist #endif
215706f1e6STim Hammerquist
2224ae6294SZachary Turner using namespace lldb_private;
2324ae6294SZachary Turner using namespace llvm;
2424ae6294SZachary Turner
Sprintf(llvm::SmallVectorImpl<char> & Buffer,const char * Fmt,...)2524ae6294SZachary Turner static bool Sprintf(llvm::SmallVectorImpl<char> &Buffer, const char *Fmt, ...) {
2624ae6294SZachary Turner va_list args;
2724ae6294SZachary Turner va_start(args, Fmt);
2824ae6294SZachary Turner bool Result = VASprintf(Buffer, Fmt, args);
2924ae6294SZachary Turner va_end(args);
3024ae6294SZachary Turner return Result;
3124ae6294SZachary Turner }
3224ae6294SZachary Turner
TEST(VASprintfTest,NoBufferResize)3324ae6294SZachary Turner TEST(VASprintfTest, NoBufferResize) {
3424ae6294SZachary Turner std::string TestStr("small");
3524ae6294SZachary Turner
3624ae6294SZachary Turner llvm::SmallString<32> BigBuffer;
3724ae6294SZachary Turner ASSERT_TRUE(Sprintf(BigBuffer, "%s", TestStr.c_str()));
3824ae6294SZachary Turner EXPECT_STREQ(TestStr.c_str(), BigBuffer.c_str());
3924ae6294SZachary Turner EXPECT_EQ(TestStr.size(), BigBuffer.size());
4024ae6294SZachary Turner }
4124ae6294SZachary Turner
TEST(VASprintfTest,BufferResize)4224ae6294SZachary Turner TEST(VASprintfTest, BufferResize) {
4324ae6294SZachary Turner std::string TestStr("bigger");
4424ae6294SZachary Turner llvm::SmallString<4> SmallBuffer;
4524ae6294SZachary Turner ASSERT_TRUE(Sprintf(SmallBuffer, "%s", TestStr.c_str()));
4624ae6294SZachary Turner EXPECT_STREQ(TestStr.c_str(), SmallBuffer.c_str());
4724ae6294SZachary Turner EXPECT_EQ(TestStr.size(), SmallBuffer.size());
4824ae6294SZachary Turner }
4924ae6294SZachary Turner
TEST(VASprintfTest,EncodingError)5024ae6294SZachary Turner TEST(VASprintfTest, EncodingError) {
5124ae6294SZachary Turner // Save the current locale first.
5224ae6294SZachary Turner std::string Current(::setlocale(LC_ALL, nullptr));
5324ae6294SZachary Turner
545706f1e6STim Hammerquist // Ensure tested locale is successfully set
555706f1e6STim Hammerquist ASSERT_TRUE(setlocale(LC_ALL, TEST_ENCODING));
5624ae6294SZachary Turner
5724ae6294SZachary Turner wchar_t Invalid[2];
586673afb2SPavel Labath Invalid[0] = 0x100;
5924ae6294SZachary Turner Invalid[1] = 0;
6024ae6294SZachary Turner llvm::SmallString<32> Buffer;
6124ae6294SZachary Turner EXPECT_FALSE(Sprintf(Buffer, "%ls", Invalid));
6224ae6294SZachary Turner EXPECT_EQ("<Encoding error>", Buffer);
6324ae6294SZachary Turner
645706f1e6STim Hammerquist // Ensure we've restored the original locale once tested
655706f1e6STim Hammerquist ASSERT_TRUE(setlocale(LC_ALL, Current.c_str()));
6624ae6294SZachary Turner }
67