1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format 2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc. All rights reserved. 3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// http://code.google.com/p/protobuf/ 4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without 6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are 7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met: 8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions of source code must retain the above copyright 10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer. 11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions in binary form must reproduce the above 12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer 13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the 14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution. 15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Neither the name of Google Inc. nor the names of its 16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from 17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission. 18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: kenton@google.com (Kenton Varda) 32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// emulates google3/testing/base/public/googletest.cc 33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/testing/googletest.h> 35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/testing/file.h> 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/strutil.h> 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <sys/stat.h> 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <sys/types.h> 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <errno.h> 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <stdlib.h> 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifdef _MSC_VER 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <io.h> 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <direct.h> 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#else 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <unistd.h> 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <stdio.h> 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <fcntl.h> 49d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#include <iostream> 50d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#include <fstream> 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google { 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf { 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifdef _WIN32 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define mkdir(name, mode) mkdir(name) 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifndef O_BINARY 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifdef _O_BINARY 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define O_BINARY _O_BINARY 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#else 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define O_BINARY 0 // If this isn't defined, the platform doesn't need it. 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring TestSourceDir() { 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifdef _MSC_VER 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Look for the "src" directory. 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string prefix = "."; 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville while (!File::Exists(prefix + "/src/google/protobuf")) { 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (!File::Exists(prefix)) { 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_LOG(FATAL) 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville << "Could not find protobuf source code. Please run tests from " 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "somewhere within the protobuf source package."; 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville prefix += "/.."; 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return prefix + "/src"; 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#else 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // automake sets the "srcdir" environment variable. 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville char* result = getenv("srcdir"); 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (result == NULL) { 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Otherwise, the test must be run from the source directory. 86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return "."; 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace { 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring GetTemporaryDirectoryName() { 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // tmpnam() is generally not considered safe but we're only using it for 97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // testing. We cannot use tmpfile() or mkstemp() since we're creating a 98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // directory. 99d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville char b[L_tmpnam + 1]; // HPUX multithread return 0 if s is 0 100d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville string result = tmpnam(b); 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifdef _WIN32 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // On Win32, tmpnam() returns a file prefixed with '\', but which is supposed 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // to be used in the current working directory. WTF? 104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (HasPrefixString(result, "\\")) { 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result.erase(0, 1); 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif // _WIN32 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Creates a temporary directory on demand and deletes it when the process 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// quits. 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass TempDirDeleter { 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TempDirDeleter() {} 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ~TempDirDeleter() { 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (!name_.empty()) { 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville File::DeleteRecursively(name_, NULL, NULL); 119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string GetTempDir() { 123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (name_.empty()) { 124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville name_ = GetTemporaryDirectoryName(); 125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_CHECK(mkdir(name_.c_str(), 0777) == 0) << strerror(errno); 126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Stick a file in the directory that tells people what this is, in case 128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // we abort and don't get a chance to delete it. 129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville File::WriteStringToFileOrDie("", name_ + "/TEMP_DIR_FOR_PROTOBUF_TESTS"); 130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return name_; 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private: 135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string name_; 136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTempDirDeleter temp_dir_deleter_; 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace 141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring TestTempDir() { 143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return temp_dir_deleter_.GetTempDir(); 144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// TODO(kenton): Share duplicated code below. Too busy/lazy for now. 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestatic string stdout_capture_filename_; 149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestatic string stderr_capture_filename_; 150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestatic int original_stdout_ = -1; 151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestatic int original_stderr_ = -1; 152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid CaptureTestStdout() { 154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_CHECK_EQ(original_stdout_, -1) << "Already capturing."; 155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville stdout_capture_filename_ = TestTempDir() + "/captured_stdout"; 157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int fd = open(stdout_capture_filename_.c_str(), 159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville O_WRONLY | O_CREAT | O_EXCL | O_BINARY, 0777); 160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_CHECK(fd >= 0) << "open: " << strerror(errno); 161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville original_stdout_ = dup(1); 163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville close(1); 164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville dup2(fd, 1); 165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville close(fd); 166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid CaptureTestStderr() { 169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_CHECK_EQ(original_stderr_, -1) << "Already capturing."; 170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville stderr_capture_filename_ = TestTempDir() + "/captured_stderr"; 172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int fd = open(stderr_capture_filename_.c_str(), 174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville O_WRONLY | O_CREAT | O_EXCL | O_BINARY, 0777); 175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_CHECK(fd >= 0) << "open: " << strerror(errno); 176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville original_stderr_ = dup(2); 178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville close(2); 179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville dup2(fd, 2); 180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville close(fd); 181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring GetCapturedTestStdout() { 184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_CHECK_NE(original_stdout_, -1) << "Not capturing."; 185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville close(1); 187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville dup2(original_stdout_, 1); 188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville original_stdout_ = -1; 189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string result; 191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville File::ReadFileToStringOrDie(stdout_capture_filename_, &result); 192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville remove(stdout_capture_filename_.c_str()); 194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring GetCapturedTestStderr() { 199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_CHECK_NE(original_stderr_, -1) << "Not capturing."; 200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville close(2); 202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville dup2(original_stderr_, 2); 203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville original_stderr_ = -1; 204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string result; 206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville File::ReadFileToStringOrDie(stderr_capture_filename_, &result); 207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville remove(stderr_capture_filename_.c_str()); 209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleScopedMemoryLog* ScopedMemoryLog::active_log_ = NULL; 214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleScopedMemoryLog::ScopedMemoryLog() { 216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_CHECK(active_log_ == NULL); 217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville active_log_ = this; 218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville old_handler_ = SetLogHandler(&HandleLog); 219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleScopedMemoryLog::~ScopedMemoryLog() { 222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville SetLogHandler(old_handler_); 223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville active_log_ = NULL; 224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst vector<string>& ScopedMemoryLog::GetMessages(LogLevel dummy) const { 227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_CHECK_EQ(dummy, ERROR); 228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return messages_; 229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid ScopedMemoryLog::HandleLog(LogLevel level, const char* filename, 232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int line, const string& message) { 233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_CHECK(active_log_ != NULL); 234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (level == ERROR) { 235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville active_log_->messages_.push_back(message); 236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace { 240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Force shutdown at process exit so that we can test for memory leaks. To 242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// actually check for leaks, I suggest using the heap checker included with 243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// google-perftools. Set it to "draconian" mode to ensure that every last 244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// call to malloc() has a corresponding free(). 245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestruct ForceShutdown { 246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ~ForceShutdown() { 247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ShutdownProtobufLibrary(); 248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} force_shutdown; 250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace 252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace protobuf 254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace google 255