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 <CompareAndSwap@gmail.com>
This commit is contained in:
Spencer Low 2015-07-31 20:21:35 -07:00 committed by Elliott Hughes
parent 11ca81fc3c
commit 40d0c7aead
3 changed files with 39 additions and 22 deletions

View File

@ -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

View File

@ -20,14 +20,11 @@
#include <string>
// 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");

View File

@ -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 <fcntl.h>
#include <stdio.h>
@ -24,17 +26,47 @@
#if defined(_WIN32)
#include <windows.h>
#include <direct.h>
#endif
#include <string>
#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