|  | //===-- VASprintfTest.cpp ---------------------------------------*- C++ -*-===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "lldb/Utility/VASPrintf.h" | 
|  | #include "llvm/ADT/SmallString.h" | 
|  |  | 
|  | #include "gtest/gtest.h" | 
|  |  | 
|  | #include <locale.h> | 
|  |  | 
|  | #if defined (_WIN32) | 
|  | #define TEST_ENCODING ".932"  // On Windows, test codepage 932 | 
|  | #else | 
|  | #define TEST_ENCODING "C"     // ...otherwise, any widely available uni-byte LC | 
|  | #endif | 
|  |  | 
|  | using namespace lldb_private; | 
|  | using namespace llvm; | 
|  |  | 
|  | static bool Sprintf(llvm::SmallVectorImpl<char> &Buffer, const char *Fmt, ...) { | 
|  | va_list args; | 
|  | va_start(args, Fmt); | 
|  | bool Result = VASprintf(Buffer, Fmt, args); | 
|  | va_end(args); | 
|  | return Result; | 
|  | } | 
|  |  | 
|  | TEST(VASprintfTest, NoBufferResize) { | 
|  | std::string TestStr("small"); | 
|  |  | 
|  | llvm::SmallString<32> BigBuffer; | 
|  | ASSERT_TRUE(Sprintf(BigBuffer, "%s", TestStr.c_str())); | 
|  | EXPECT_STREQ(TestStr.c_str(), BigBuffer.c_str()); | 
|  | EXPECT_EQ(TestStr.size(), BigBuffer.size()); | 
|  | } | 
|  |  | 
|  | TEST(VASprintfTest, BufferResize) { | 
|  | std::string TestStr("bigger"); | 
|  | llvm::SmallString<4> SmallBuffer; | 
|  | ASSERT_TRUE(Sprintf(SmallBuffer, "%s", TestStr.c_str())); | 
|  | EXPECT_STREQ(TestStr.c_str(), SmallBuffer.c_str()); | 
|  | EXPECT_EQ(TestStr.size(), SmallBuffer.size()); | 
|  | } | 
|  |  | 
|  | TEST(VASprintfTest, EncodingError) { | 
|  | // Save the current locale first. | 
|  | std::string Current(::setlocale(LC_ALL, nullptr)); | 
|  |  | 
|  | // Ensure tested locale is successfully set | 
|  | ASSERT_TRUE(setlocale(LC_ALL, TEST_ENCODING)); | 
|  |  | 
|  | wchar_t Invalid[2]; | 
|  | Invalid[0] = 0x100; | 
|  | Invalid[1] = 0; | 
|  | llvm::SmallString<32> Buffer; | 
|  | EXPECT_FALSE(Sprintf(Buffer, "%ls", Invalid)); | 
|  | EXPECT_EQ("<Encoding error>", Buffer); | 
|  |  | 
|  | // Ensure we've restored the original locale once tested | 
|  | ASSERT_TRUE(setlocale(LC_ALL, Current.c_str())); | 
|  | } |