From 40d0c7aead38971a99cfcf6af4235623154f8c7a Mon Sep 17 00:00:00 2001 From: Spencer Low Date: Fri, 31 Jul 2015 20:21:35 -0700 Subject: [PATCH] libbase_test: win32: get some tests working * Get it building on Win32 by implementing mkstemp() and mkdtemp(). * Run StringPrintf %z test on Windows because it passes because we build with __USE_MINGW_ANSI_STDIO which implements %z. Change-Id: Ia01f94e8258503381a1df6d3da6e40de59e57125 Signed-off-by: Spencer Low --- base/include/base/test_utils.h | 2 -- base/stringprintf_test.cpp | 3 -- base/test_utils.cpp | 56 +++++++++++++++++++++++----------- 3 files changed, 39 insertions(+), 22 deletions(-) diff --git a/base/include/base/test_utils.h b/base/include/base/test_utils.h index 83f0f1ceb..402e0a5cd 100644 --- a/base/include/base/test_utils.h +++ b/base/include/base/test_utils.h @@ -35,7 +35,6 @@ class TemporaryFile { DISALLOW_COPY_AND_ASSIGN(TemporaryFile); }; -#if !defined(_WIN32) class TemporaryDir { public: TemporaryDir(); @@ -48,6 +47,5 @@ class TemporaryDir { DISALLOW_COPY_AND_ASSIGN(TemporaryDir); }; -#endif #endif // TEST_UTILS_H diff --git a/base/stringprintf_test.cpp b/base/stringprintf_test.cpp index 54b2b6c9e..5cc20864f 100644 --- a/base/stringprintf_test.cpp +++ b/base/stringprintf_test.cpp @@ -20,14 +20,11 @@ #include -// The z size sepcifier isn't supported on Windows, so this test isn't useful. -#if !defined(_WIN32) TEST(StringPrintfTest, HexSizeT) { size_t size = 0x00107e59; EXPECT_EQ("00107e59", android::base::StringPrintf("%08zx", size)); EXPECT_EQ("0x00107e59", android::base::StringPrintf("0x%08zx", size)); } -#endif TEST(StringPrintfTest, StringAppendF) { std::string s("a"); diff --git a/base/test_utils.cpp b/base/test_utils.cpp index dceb8b788..b0c5a12c0 100644 --- a/base/test_utils.cpp +++ b/base/test_utils.cpp @@ -14,7 +14,9 @@ * limitations under the License. */ +#include "base/logging.h" #include "base/test_utils.h" +#include "utils/Compat.h" // For OS_PATH_SEPARATOR. #include #include @@ -24,17 +26,47 @@ #if defined(_WIN32) #include +#include #endif #include +#ifdef _WIN32 +int mkstemp(char* template_name) { + if (_mktemp(template_name) == nullptr) { + return -1; + } + // Use open() to match the close() that TemporaryFile's destructor does. + // Note that on Windows, this does CR/LF translation and _setmode() should + // be used to change that if appropriate. + return open(template_name, O_CREAT | O_EXCL | O_RDWR, S_IRUSR | S_IWUSR); +} + +char* mkdtemp(char* template_name) { + if (_mktemp(template_name) == nullptr) { + return nullptr; + } + if (_mkdir(template_name) == -1) { + return nullptr; + } + return template_name; +} +#endif + static std::string GetSystemTempDir() { #if defined(__ANDROID__) return "/data/local/tmp"; #elif defined(_WIN32) - char wd[MAX_PATH] = {}; - _getcwd(wd, sizeof(wd)); - return wd; + char tmp_dir[MAX_PATH]; + DWORD result = GetTempPathA(sizeof(tmp_dir), tmp_dir); + CHECK_NE(result, 0ul) << "GetTempPathA failed, error: " << GetLastError(); + CHECK_LT(result, sizeof(tmp_dir)) << "path truncated to: " << result; + + // GetTempPath() returns a path with a trailing slash, but init() + // does not expect that, so remove it. + CHECK_EQ(tmp_dir[result - 1], '\\'); + tmp_dir[result - 1] = '\0'; + return tmp_dir; #else return "/tmp"; #endif @@ -50,21 +82,11 @@ TemporaryFile::~TemporaryFile() { } void TemporaryFile::init(const std::string& tmp_dir) { - snprintf(path, sizeof(path), "%s/TemporaryFile-XXXXXX", tmp_dir.c_str()); -#if !defined(_WIN32) + snprintf(path, sizeof(path), "%s%cTemporaryFile-XXXXXX", tmp_dir.c_str(), + OS_PATH_SEPARATOR); fd = mkstemp(path); -#else - // Windows doesn't have mkstemp, and tmpfile creates the file in the root - // directory, requiring root (?!) permissions. We have to settle for mktemp. - if (mktemp(path) == nullptr) { - abort(); - } - - fd = open(path, O_RDWR | O_NOINHERIT | O_CREAT, _S_IREAD | _S_IWRITE); -#endif } -#if !defined(_WIN32) TemporaryDir::TemporaryDir() { init(GetSystemTempDir()); } @@ -74,7 +96,7 @@ TemporaryDir::~TemporaryDir() { } bool TemporaryDir::init(const std::string& tmp_dir) { - snprintf(path, sizeof(path), "%s/TemporaryDir-XXXXXX", tmp_dir.c_str()); + snprintf(path, sizeof(path), "%s%cTemporaryDir-XXXXXX", tmp_dir.c_str(), + OS_PATH_SEPARATOR); return (mkdtemp(path) != nullptr); } -#endif